zg>^4gs^7ExhYX*mBovIM%##yIJg_N&FJF+C%v6=JL#lB>vWJ(a0st~yf6cT^8{Uc7
zat)&KNw&dz2RQ*-L}OQ^-dYF9OIU-W
zUn=WU4vR70cdo*Rx-LvHA|mmSZq{jnKND*SmrdW?Gk$$e#z@#c4a=&Elp%C#yWq~2
zWSinL$uv-R5$9Pn!#RrsWHBb}^*E{gqNWp)8=g0gF_Gb9HpPzcp1J}TeuRd~*#V=N
zI@~O&SpBV1Hs!7mU8ESQ1Tc2!E`(IgL#_^NWcDA1JuOlxP(f+At1r0f^!aEf@@w=}jo?cZ%VeP6Cv?@rp>dHYj3uyCKrW>V2lRcxS8-^Wp1s
z-*QJ5H`k3i%I^;L#rS+NsM>%A8_FHjGgBa|wwa8tYWq>$U5U+|`mNdJNuzke
zR%wFr3m{7z@^0VQEsUPQUkQtCB+re5=7;^PCXRF(%Lz*;_0mOju-v(!Yb_%kVLY7!
zS0p0l-fRdi>oRL88y}^CAi-JGEE{0~%EqI(?KGjy#!&ze*Xf3X*Ou5>(z9MKO}>kU
z>503sc3R)zu4Tb;V9UNq)`T-2wUiWUG_71ak~P!G+|SwzTuII})|oJZF+-!f3SW*i
zaxS$19HLSNQN)n7zFd83f@u}27rQYVtS4QIUuM(+iy1&h^JkQgOp)zXdQ62Br`vO^
z)J($7*yHgm4^z0gZb!n3k(Ox?5k16AH~!CDqV|tKcm4U#rqFZ8;+9M_0w6;7rT~GV
z&wR7j^&T}TIX#)aJ*c4ZjGp#N9DKH?3huP*n^(`VWNdP(+A$Yzx?weNN+&SD&q;l%
z!?EH0vhZfE!wPp~Ing48+BO+n!u69%xuPGuU)Ex!pQn^hBB+YdWQW9XK>*dK1O3k2$=enReU(tB++9<0L~SNG
z19npSCy*QQn<4R9>~O)Jrf`f_lr^=;uc#eUOjZMqUcvKtSb1T@v^XhhLmf)%g!|P*
zccemmlqkHkdF$Ha#!(2jPzL^?VJFY%QgN%w9bloDJ5RZuwLOnb_O$;v>z-^+Zm!&H
z{H@|$>HEd~Gkr=bJJbmd2_2_~0)#^X!r^5@!(hD?3^zcKC6TI_iLO$`&Gj@b>|-*!
zX&esHe#j=AqVv1Z$boHO-KTg2t3{b)=1gD=9iY6d;9Ll14K&ub0}w}iT9m4`?>2<(
z{Oxx1@EKgp#BGvWUYCbT{@3W&esYecPm)O%$2ApzNY*S}Zd&q^njift53!{Rj#n*;
zPUBG#@UQ8ZSl5(@CWNUa-?|7zr46lDtLHH73$b$9O!A~E>$dvWc>7~V-fK)P*yPd2
zGU+s%;GEmXMaoD9^_0fSXzY6Lu>%vh^;(v?3!Q3>JcaL1uzju)a6r=#4j3h-TqWym
zKy`{ce0)&?r%O`~En0l-hnk8)HbBGZ>1uaxaf>2i|20`vH{Xb!qsmzImm4#k%jS+G
zyKk7mW-?_Sgyj6`p66V299hY}%9ZDT
zH0{D`cJ*S48s~`#C39WroHT?fho5q0UFUsnytcvk{o!L;Z2Zvr+*0dv{;|nYHWiLI
zS*>^99bFvU6_VmTVGZgz+NStt9?rxa&dh?5pkCNGXa5aD-}`*~(CI0!!~r-U2pgXH
zy54mxHH&XID0e^N!7eD>r@qq*JaK7rzu>2Ya69OWUdsW1_s}KKrLK*O$UwFcI?p`w
z@!FpG{v?OP|CHS09Z4~le{P9-jvuor_ov1c4KfcZ8?bwV$%4;CS@{y`=U;ynU+NOL
zGHft%AGizkQDlgcV)07<1y%Zx44^SPl)$To9y_RNY0e9Zmg9&aG#mQYpm&-Xb5}s!
z<`|Ct>O7E8cKAGamr!Z2gv8}HJGMLFMyvKo-t0m{`@1Nn#H8#aRLc_o15*x2%+w?&
za1d3~MH&cjqnO@w)OBHriS_zwl+Ha3ji!}ijKPp8H*Qs0^T>2q<=
zQ|SIRii@azhdnkSw#@n>4piLgv7wDKCT@+rk^7OnT#yt^4@JqOuEYU`p|`gD^>XS#
zMdJyyzZ^WRGs_zR?5Mx6q_~^^$tfUeU}|J5o@&=XDO|>RSOA5CR3ZuIhl*eSYnuWW
zb$_FUB-H_NQhvX}+e7WcQ={Q+=>Qxg7r;$!>in*(!yCfR5Rp|SU1~~@?Mx|7$Z3|xlyb0R7rk2|p
z%9aXtPDj)GWQ89-A$AY}oVHjTg{|-Xu-}Hr8vGfx3&zkINP!RJ>E^9DUT$ThII;0&
zQk|^;Si;xP38@ho%C*dvamFIMno@*KsN7yRbIk!7<37C+TFiG7+rWWmv)O3DE9RsC
z4ATO*+T)~n2&hv~wE-z|LBHm$X8TJftbnIPyHfQFF`1j{9T(X&+ARnN3NMfgD=&yl
z)T1u^*@k9~QAr0jhxUi!MvCNO$`lpS)35{n#vMX#{lX)^XB&~Bd^mTySS{R&PTnjh
z#*t!LCM>Tr(fhGyzR-r+M5VMyk*bydmUtj3IjX_7aq?lyx(c=+PqEtw;lQ~wDe@|>
zCA)%PGkEStXZRs6S*C!I$6qK;!atIayODSoJ_33me^N5^}n
z91Z|Gmj1%QYlrH9+%A(>_6TX9FY3GEE%f!Pg&2uG@VXsp85ZxL7@gF58{fi
z`4a)^$<|_sgvJjBU_XMmr*51E_nb?1gM5@uN8)L_^3($E^b4T2XET4_ba+GH=k-Tt
z;XvVtc_uj^*d{P`F`J@_vuXWU8VG
z*^FQTu8Q;0KFinsn{S9MT;||UW~+0h)*1{C!WRg9Dhd_|vq*__*!|g0s*l(DQFu8*
zo1d22t_0_%Dw^jZ`0wjkkbs||U8sCmtq%Jx5O!%jiPlIU(#Bhd*a}*^!peD}$T)%f
z`0@wPc~}4+6SV$IUIiqTTwqdnRJq+?wV2iKYnK{NT%xnefF->1I~A-e4*DQAjPu!A
zJ!dm=oZ+$v;^Z2Ne8t>e1hj)=N_yX~!NRV4{-oOnwlL3
z;#8hkUUYAY1&>hF3kq5W3U{`J*IFBFKl1AhHUFxes8mvlT}63#Q?NSZA|3_2NRl#e
zDt#-3EjC4&+0Jlp?{dtkZLqLpU{55T|3LhkHz5q4(05!#8H1EwWhn1=$9OV5fPd3P
zR2d)LxybbUU9sR-lkhP0A*{WL$$X^wd9g6
zCjMTLp*#PN+BLwlu;>jzoNu{@u0sS32fwRKYh--N1-za1u}o~8X^7b9-dCNoyJ9zn^+ZTt+KsF8nzgke(@rsI;-z%*@V+7gD3Y@+lNBoZS$
zp39WhpEz3X)Au~&w`>`_bLO_Kf&PYt!p5mMgbb4TkOe?0QmTzh{u9FPpcn!txqJTQ=4dKd@<23gcAb5_y*{%zot#d#L`tr0SO$eQZVK}Yp6$czVl4^
zdU~G)z=5a@vco$s>67bmMa0@R0D~G!lFD=*BtBx3O%2e!8
zphncq9aZ_gu2w};>W3a1rg9PILjQOOWt#7HjwP@qKW16UV(JZmTgn?2$vW@AAKzTG
zfrIR%(M+Ymdw1Gt?3z4DUBJkP63Yc)r9bb&q@OsD8ubSL=loHLa{x^XhfdeAF|FJZ
ze}{#C3ApVDG4id~oH#mGwkl%uGge~CkJN+|Q*wCBKCL!fkeW)^@#ApKdb=Dcopv^J
z{9Jr1U1U49j?~uRqJ@r#flF1?qh2@;lUd~aoKfkiTSq8FywKE(c*7&lj_&cTm}Gr6
zuOSDdnGz*WFq7WP)3!I(S2$F{>CA!ImMiPcYG{
z9H(Ul>)7`KC%af93m!Qo3lm1ug2saNfCiI
z1RgnX6)I;*U429qyMvT2W*$p_Bt@F|_OlXARGr-M?7;+d&tBLOV3}r;RK9m!Qj0>r
zKKbWA6_2O@?54YrB%f}g&H53hHvEkaz{FtAkX*pjG0xsn#D^qfhwyyz`t{{Q3G7+M
zMUJY1({=MwGm*2fWQH2%%Mqm?RA#+|+P8AA^tFD>6|QcY;08`GU&(B+FXHl}$V<>f
z#K}*O0As2VXE;ZEmEa2PaH%-?@L9RR**0K*^@S&tnqn?mfc+B{!PT#%=45_g8O&G4
zIF@(Lp1ca`XK+z)vP}zH%yI}goJ|581B`E`zv!khyGA!+N#nHYIyF3*aB7ugQ^-t3
zaQ*aqVN<*sCH6XpCB+xrYfMGuTk6uLyQ+_UwJSpGoj}#-KIULpbxDJQ$$U!9bV8P{)!{+*>PN)B~eM}o22RW_7ZF>)Oag=_?a7tASS*kxd8l(FQEGadl`a{_>Txhv;+^p|>ZxYAN
z4Iz$z-1fCmJQ1-nXOoYaGN$p>MYpn6cY!J(^EpAUL`8IvQ246;)=}V90hPQbRZlBn
zrg3nA#A`Z?2YVFtoU3!$VHKkNLtqFK!jN!vHWnI@sctZ5=t@yC|C)i7BzN{AEO%?J
z$qM&0lmN6#fXJdaqdzanz&Trwi?sOjm>)gmW1$jCi6--|v?B|mH!Wlka4Xv-CxdgQ
zo22~D&6wUoM~qnWpN6q%L!?ywCpzq0KwSX%ErAmFZrsGoj_|1-@C0roeX|q$J{^6{
zXWuaSH%<%Nh~R9ZF_DkpW4a8HsNHGU$5|`Ym)UJLJjzwzD!qNrpmz7sCt9x-4xUJ9
zesitr`<^WP>Z{~X;>GnS1~vY#Z{((1?!1fx$7F=Dd-TjB6**mb_6RRa7SOVU+0iE>
z5a*cNP+&k2VvAy}P{<~`ik_G3TW?+4iA%kcID)rxX$57RCnyjwIP;Rao5pwznCBYD
zfqz5@{p8j;I+&L0mN;a6Uqa;El*tfi{$W<*_>n|(^zjv9719UAU`dzd9R6@l>+R7jG9CO$G1}!^=I|BsO4lmkYF*_S;kc*xI?>D1ODrzv`
zh6PA45MZ-@{ws)FBZv)R;`Ui|x%IcxrNP{@^0K_uucK@^3RJ$f6rg_$t&V6Z9j}yL
zs_u=~*{gfj)g8l}noGN90M*Th=_9&7<9-TFBtAeTt8##rPjG|s`dKuP0?e9?H#Y$b
zjlzB5ik6@&w7$9Djx=8qRQ$?%!VS;E|y&a|NWM8Gr!IE0B^jdDZ<=Ppn6
zcj9b7{M{vuk+fwI=^FR)PJ(cWXz%3z)5qPL@$G6WR5d#MutJOEr1f=9^%rn}BGF8I
z9XgcULcO1+=KqQPG?PgnAs^^!Z|W26$`~{pRhvR-0NqHikUDzxL!Mq
zbjFxQ{1yr26?sQh(uQC70Df##`H~2{5MaHVI#&Q%K$S_}37=vLn-SWaY`(rrxSvLWH2VFi$T)@-
z0R-0k&TBp3rg(yC=7}R$xgcH7Lh9vX%`opUYyF{u9jybG>ZU6f^l)pIci%%uf2NTC
zDgZt{1qgxUR}EbDQm>;#z0|oe++2_WlXhQRiDnG|5Z0j-u6P%uq|L0!F)cy4y~Odm
zF9f8M?VbVgPa;7kHmK&^=7Oj#{+Kn;r0265i%(gtNy2&qMW?)_#bRv**BSRTmd!Ah
zNWy!xUSvIo_#2U5)$})0B*d-0RN2caof{-zX1t_e#;wp_cnpI>O0xfHyCTiL~U#DsY_n*%A{V27dn1
zX;RUal%0#fad8y`^P9trf1AMPl{erbhgZ~VHt$qtvgh^0Xq#lohS{B`JF;Syp>eb8
z)@$1CCv~ZcN@D{Im*W*w9!V@izCL;!)4>%qr{tX}G;{$Uh>U$XcI0z4H3$^z(|etP
z<5-UKl1u-Jz4N1{qwwc{7?Pi^HyM&y2QwRd(`TI-W3i}+Hh@8KUmo+04ed1#j=q@W
zL`S!SQ}|n*Nn?={w(S-xS?d_1|w9i-UBQ;m8C3NJxyz3HRM5qd}3
z^uUoqn-6|m_$1uyxGiQ^NUazcW&iXYk#G(|B}kNG3Sg@(m6IM
z;Sp#yF_ZaGzc95hjQk28c)1qyPetDx0
zfN>M$y~u&5YsMw;75H=Rrpp8Aw5R6cY<`q0a!GFiMX9EQX1*UBFVUi_gyr^lollpSPo~s_4GJWOV=8;(kotPX4Cv{-EAw6V{v?pD011=j<8G
z`3{lSth^))U>7uC+MrSENg|bS$q@Pbs+_X1W}h-RXFxXzzC-R*-Axkr3BqfB)-!+V4?&Z9
z47YUhX6)=-8kqp)J~woqXr=0${hbIzrI|%QEy?GvqTTYlu5t43d3q0!a^fX$$Fv-<
zaAaa!(E*do79%9G%Vg^)b+(@PuYa^qD&xV)x?NAkMw-^x%AHuGHMO=ga5b^G)dKLU
z03)!hob$WvewzgSx~jQhuBnv=4hCo{-=ta|KJ1XVyDupvQz+G{0
z!|irx6KtvEBJXT5I;Ocg`5i@K+Rx
zV!B=bgv96w`DrkN3M&KjnQBu$05n||6V~G<^pyXmfT^sP)5-w))EKoKKjnR+FB#Z)
zQU2^u)FN3vj=|RzcQIR_X4Z_zUQpkyxQ2;+4{Ne9sfrJIRNs?k_!NHyluHL}_PC%6
z4*YOU0Q)+HPL8^uMBrUD&)ye8e@Z0@hNjBPQUFxF#$8NKzNgM}bdq_T7?Nl{&%#iQU&r`P}xYC5u*fS)Iy;t|1
zn3=7+bE#Ps_pK
zBsc_jSRg=fcbA0(2yVeGxVwkouE9xQAtAvvxVtaz1c$|8fuO%R_xC>MeqO+{pZRa6
zr>m={tE;ZMss}vvm?i+Nl>y=3yUlkZZId^RG<2~dNXi$c?nFrxv604&y80sl#zrWL348v!nIAti~gB6A&GwAsrWRp*w
z(cRW6s}pCH;(1|QA3oCDAlVq~brTKJ-@O6KdhO$IY+@eAQ!{+hnk(Ni*MEarzi-Mu
z2DlC^j;b;zt4b%@1I&&=G|D#-H9*;&j_tIO`MNgf;QB)gUi8&Kvp3UGetowd9CKq2?zPonF(ZFl8b0%r>r8M~bxCW;
zA}ME`!&20F2E?kt3uLv`mp-6BytvgZ9`i9}tvT~;2#qvOKrbL%7s8Qo!XTk_EVnz*
zE#TiG3sLYRy}e8m!2IYC-T6wp_a|%mCoSb$_Ckd=d39sevp
zdkm-xeqoR`&wFr51yEjqY)_OrmHdYcy5#Hv#b^Jxg6W+8Rfh<=EI}J!KdaC&Fx^|G
z5wNm+6h_c*Ot&P0NBN^Q|^nwqevCSR?}Eg6IN|#TZ`vIHRP6s
zpKi}UhxH)pDA4mO>RS-jSrO#k7Qgr;bt_H4M7m4rsZ
z*XAU5S35D#SjF?TG!Km*Ue^Q(1?}7&h24mpat|8>vcE>KH%4{Ual;{pgx{x{^;?$L
zz&@y~+f_G(&CpuuXpbsQz~b286g$OUDS+Y6wMy4NCh+=$+$FRes|GKIShlvuQe61$
z7^1tGCT2Qj(sQx;ctpu;H~^s6LU*?Y&F|6gKWeeA`9XF@Z-yZqRE`DC$P$Y7aaYY9
zniQ*))-@l|c*7Hh7D*ZJm(%Y8x;y8A91_y{JE3jf5LqC(h}8IH
zDx1X$;+#Ej^el!V+?epygU
zMyW66&v38-3R%5DQ+e`H9J1{2pdD!Qvqq1f1eEWKd0Ev_FFu(ID6t|fDY@A5Lb
zz;`}F0tP@4*^jyd8HoXaQD5Zr?`kR@}Zu(=rZ+>wr$W-WpED+$aTV|>VCd}{izlVLJVA;7f
z7T%)l%*cN*oErHBod2R9{x~69C(Q&(=n))oxG{jH(B>RmqR-)@2dLOy3c2uVJf$R
zogL#^BcIDb(
zOGEZ@Ren5_1?+Kvk-aQZjCL*qfJVEbgMWQ^7s&>`vp7=YAU|gjo{AIW)4YYceJ6k=
zLqGp?{2elm5o~Bvw2nrL6aTpHxx%iq6wr?P8UaDzlipk9ty~};eRKXKJs3b3Eutz_
z==nN4w4fp0K$FToDnm|ui6nlLw0H~(yoq*jDf*)us_62u+AI!##s&E_lxZ+VR7EEc
z@&XK|d8m~+i<_FmbsLZ)9go_uD3bgV6%zrFuD>ulKE=slq>_I`=`~&YwiI!dm`Pkq
zK9&BvVeW64HZwrN|22`6(Gr3g!@G6VUQp5iel+d`>h3vbV3Sq0kFLo4*we{zAu&c?
zX#!|d!R2$|b>(FZsCfyw&XGv#jU6|Wl2R#J>5`iS49mPV@-%WhQo8S3lGiK-(nakA
zpppT9`VC`E3@^9n!jf{H^E+SG4UUlg3GB2Ote`=dK&}kYP1=j65SV=2<5)AA>=UhR
zUZ@%-JE}L8;L074s21(G+hg&F%O73plI=o1GoLWFM`K}=J0vnewSKgAk=^E)kAn
z;!D^48QcsOZWCA5rJefmLuG_O?y+Iwce=p6w(v}-K)8$j{p|}4G=7{WGY?Sy2qr58
zubwr>`XxQvbXt2?-vW7!%~282sJzpMJ%9yO#ou4yuz6mQ$zGKuk`K+ENzJ>V$-(wN9|B!b?
z8}B^&4lY@%4U4|_k{K^m?uOL6v26CLuu8QM4_P(=bKhXm7j|XxCZ8BkN2_k0!
zkX9<+FX5|w?@(1Jbx8R68OnO@u$}wj?@Dlri=f)h?9{g7N@iZy-HoASU8?RGNADX-
z`K~t`zCPifNZrDJ|2YZ`6z73dSL!aU#kQ$-)pjf&7u_f<55#$3h;KNCbfbz1oShVU
z{~h3L@wHK<9vL#2aF!H_&S?;j`O<&X+Y&C_7VT>yIDrciL>lh3XU7sD_<)n$;p
zX=hr#YM*OSDLrnbp4j^KX<#;ZU^2w|6HI
zoVW>o&oOGs&2f2eJHXt~aHxFw=I6E00qm{-QB~C~RcGlaTnG*7;!b*NqrLcS3BfAN
zcvtTaFmPTs0OSf3C0`C*=y|eo1h6w=oGllASqGvYUj8_iS4Wh0g4y;Aj8^z(Syj%k
zZy9DIz6~f12;__f;!eKY*3Y_e*Ysk=oO5cqC7EQX}$t
z?!B3M>^QsT^xMCa{e_l}`?MdNa;l;}N?C7YA}bm!_Ts~Z30eTdydY-F$6w7ZnoDsC
z^wg;#0=-+Jp+_2GuW1EKRgSa%sicML?<|4&Kk=5E&V>w=Bqu032`n$}f#JWQV{T{+
z*mt#2XCvdCKoLtlc&2tr;SPhrJeMi#&r1gQt(v7KCK@zYq&^fUN9;h9ek$5o<37-l
zrO@x;eahBi+Gd@4mJ~`S@?bO>4|!ZVh?BaMEbBWd6z_|cc_6OCx7ZJ-x}BiTP)%#OLazO
zc-#b+#nDSXts1wedC-#m0Z%w`H;q^0G68B$aB#(D4ay3d#cKSKigb02_!{fsi}pc-
z7d{HZ)?qiH1x%Loc7nyRJwz^LMA)twZ|ebY==Wx8Op3=Ezxq^@<&aZf5&YX!=&n^S_n8QRse!?;uT8zO*Eii!E=T(<_e;C4vSAuVk$LTY_%2sV
zqK|<|A`#Z)Nc_C}1%G--9Jlk<;Z@fONaDZT?b8I(Ji{W+9w+jXuW
z-(%wZbXH%tI~w!wHdTZ$3IEDoQU+lAra=rxECu>R{Tq8uZ5zVx#XDTK)j&NY83Efy5%9sufP#wZC_s8@+eU+|qW|+Wpb#K1T`54@TzVfoL$8hw15Q
z!FY>;`rQe5kk5qXa@(}P2~KX(>NqWgZ-?k}@VgVZ>07wXJEQ3OL+BE?`|$=uEJ!0<
zDXqt8CJYY_^ACR>*8hAx5oi<$_fYYKFB`2ow@qC8T|K_QAo|dbew-S4nK9z5JSve{JiA_%CeF~+MTgS&zafs1qc7drJw(G
zoV-5i6QkN8ak*qadOXn?nOqjj)u>z4U7+by(#)1C!7zRNGfkgrIr2$j+3Rs2scD#Q
zvE5FO#yi!wx;A=)CP4^ifOgN9%q5VBK7IjOcx{74B7K6Au~hMlSK~y65VS2k$NzGx
zrO)eeg0A!_GSiT-C~1Q6VG(PoVm-W!VvgQ^^ktM0nX&UVeL_V6Jz^ru`DuzVM0SAc
z<-L`%CQN-G??m!^F7K6>oS0a-osu>`MW90zcH=#X^I8?+W30fSpAfs%!R?LP?ixw;
z(W;@@#q8y9Pv_MV)i^`iP1;I4Ba=4A
zFyq?N1t^J++QzHhAQJNRPfiqScfKc~q*j`?4*{*DrErHqnUS=&TIIcK%3=csh`GqQ
z7B%vp;?k%gCjrv@JFok{dC{j3>8N@9q`+VF75D>he?ggXk%{Yv|Jba;`n1SBLBU`&
zX8c#iPM?VXKAv8W!3)~$70+*qXoIjm;z!$$FN&>i`F*J0C(HcB2@k{8Pkna5tp&or
zYbE$8_KYNS^PxW)Eb3h_H9+E(`Uj6p1_s>bcDV`C-U%u!G1w8pV_uJf$uKA?*7M^d
z=F8men*4dM$D+~-*|7k~QE4{T*crb+ea}eP<_`s5F`|CN-0c?$eULLr`73X8wlf;5
zWv@n~;BR|+6R#=nzzodl$M+{v63ahe&a@#d-EodQTvV<>a1d;zG);s;ht_`X4T08y
zyY#etk-%RET|t)_!<%;wp7EO69u6YCx6co+#k~^>y;bu^*2xD_4TG@!D=ROqBPguI
z(-_*@AJE@$mVV|pYk4BvAj_U!Vq)+5RGuGojKISp@oC1?6ZM%3{#F7i%NJ8O)sz&6pf9IVt;`
z(w?rWYH5$GCx9GYJQ=Q!L7887%j+&@fU>DAS7*y3@~RPcz3p?8(hg1ub=yOmNr9U~
zJVR#fT*`As_3IP>T)S^QzEhlBQhjBH^V&wCc~8%%0d|U>
z8v>a-k=v;$39>XcwsmUZdhm0zO3C&T&veTjB1ExVkA28^O{eew3crYP=pemeY}sHL
zu69icJI_X45#vy8GNEya-qU;59P3iaGHjk?o$=gSW{o-A>ESp3BxHt2kn+UYn=Ud}f0fkQE!g%Suuar*;8RzOsTmw`XjX
zJ7>B@ly-9SRpj%U5*K3Smh^7uLFKv7lB3kL49;d5M2XvzH~ELD5X2#Glb!jxWEx1g
zL&%jRQ!vQuU;$KFAl;m0gRifnyvVm~C~Fp$QHS1TOLK45
z$v3lTR~d@^Du3fOy?#e@2x>|OQ1c|Jl+@#ttAyS=&aYQzjYryXb?4YFjj|)DzBBwz
zCGzwo*`do%V(+JM?ILN{vds_n?t)=5r%wd_%N4-_g~cgMzv?g#n9tr=Qi(`1Yw`|6
zzp55TxJ9Aw*K-ui`7o(5amDny+{@pl&4#ZgX^=gK@=}eIbhG?kaNLhs<%CG
z#CD!cek~fJkaM4n!sk#NdUP**_|0Kix>Z_(st8_bcQUvDPv_yHs4LI!DHr
zZvkhF;_joeAiMDQLDA3TR9G@DQ56)x>~V58#1R9Qu4kt^7myUIlBCv#~9G*3LstEmJIHbItD~TkQS4YaV
z_Kb-aIW8CT$=Uc5YY-zSuua92b07dsA{z3GTFPC!y8yKWO?{Zv2SxZ46F(hR$t6~N
z%}7to#5A`0RwzgkU-=9_SM9*LKK3X#R=V8YG{hsd9o9#Cwq`v?<(Dw)SUB0ilS9tl
zzsMst;J4uQctdwb-@2!#
zj6Vwgby*3~wm?+q2?%Gv|KsBw{RZALT+|J!;5_j8*(6DzZPjuzPBCt1nasGo3ISj4
zR|HX~inhde7SiuWyjtro&G8QEgM8yFa}@UIDqam6GsO0wP%7k*AL#4bk>~YN@qM>S98dCz83knK@p9W>p
z{$$Q39*oqDO9f;9raX{s2gbuIHjtguEhR}cWGsZ@y8ohEA`&riq2f8t^@kjO{f|qE
zsW49lQ~J?L5N2}abEx}HM
zdSn`{Bf|{C`)n<2-)X6gI%KvS50%HFs2
z*jTXKlHOVj`VLim+8cndI0U#dx~>oI_-J$KyZ(A(r$tk7MXrt(Fh&mAvvNMvX25Pa
z%y*Fayt<`G;eI7B>7VRSny6`X{f;KZyukN0y2V#XdH8&<)3*4GaQaMdQ{lTY@
z7*pRUtpud*_)!&N&wWN)bBoct#m%UpwaQOz@s^vy26DAKdwvs2uSB
zMVY9sA(X|;rRv)BVLZ^}d4)}^sT;s+&g@Co(K9mLu!~uZ=i0q%9L|qoYw(pH`WHXH
zu?Fw813D9tpDx4CJ6Cra#!jNWK{Cu0hn6R~iR$*OO{*~UlOCqcoHWF#cc{tra@0}x
zIEtS6EL{N^l0`LiLKM;c-q`~Kp!qB{Cdy_sp?>$W(Xce8`$HSZuT@-Lv?+b1RVe#r
zy`+?zQa9DhuJ|9s-#`hYGCwW8mw#9k_5T$+^cT|F1wrhmUhXlJ4A7mEEsY&$TuS}E
zemPYZnH&-O>^ExN~}D0SaX;J<;i*g|_&+E>txbJ!>|=3c?}C@e0H(
zlCq!Ihp}A>pmpEWXE>mIrY%oia;@qgKmgd}4gLFsPWxkQzVCmvP
zq$l@vrr?3UoyD4dDtthj;(5iC@5@nu^;{3Qhkjd>d-IIaKK%IZHOQQY8t{
zYI}$F{aBXD8qWvO2jM_%^(E}^XFmOqYI60zTmXY~e=!20z{)+no+YcSz0(j<+ApBe
z1*OzcMLd*?MXTkJiTT=>1Nt-zFI^=(=}`4RC<+<$o=ZEb1=0RQw^Cjk%WHc{NjtzRIDCDVtT6
z(+V?GNRS*Zp~iO;2tM>W;buQ(Yl2O}X<%Gr(AyBtyb-m9WukI80SW#nR3*LHv3m%vnpCn*UJn4+*cw50+rQ*D06II!WloK@M@W#Yt_7(PitZ$GG^|oT@
zt9K%s=Yukmjx>`T+vd+7!-=V>hx*sE8er@DO6wFxVi;*gUx
zOPf05Qavwd^7z~dTQcxHu
z#xQ!n%`3O%>Akb`H|dQgPp@f5nHnFHwtR$#X7(h?V66xf8Mn}ss!wQtiR6Kj^2R1X
zL-etUk#m(EvP%m*WQwpCDSUEwQ1FmAa8fmgO)pH-*l+0%EC{AyfoL6bI?Q%@=gC;m0td4f|aY5K?>m~86
z%z&?8quIpK05Bk{T8{4uz(4lW-KNVm#7&T{`%aWc1=q6~?CkP7r29
zAb!ujUJCZ}1*YELzwwvMm1?bVq+>Lfl&}_Hw~C#i)!ot#CcjlJK0zOBLT{|F)mGVs
zgN=3;KuPV?&YMwG1)j@p~r#l~)|!+2-B3!vCbtQ5X%%)RE)Jj7vLk
zUI@^SAvF<)^3X&-JR#XCHGPe+upGjQneTT`ZYo|>@N*D|-_sj$ocB(KJwFTF)}tl;
zxS-#dAFOvXlliOS#MS>7CrW38bz_J%_v2%)$?GTaUH$=j_}{Ewjk?`s(Ip`J@UN}s
z(sK6@%RFljwND23XEtuYdhen23Q31}_j=KFF^dfx)*E#s4)^~iKk#%D
zOwmb(?XFr}!)!%CkL@h?*5aRmQ>bpN#iJA~n2umdPsXP)q!-DaBM~OL3)G~^1DW?|
z$Yul+)gq4b1!_Ctz1&fu`lS{>AlI7w!#Kbp>tKDIo~4a)ng=;h6LJu0(SxT=4m
zUAhJU0(TJMT#sIqUglSJ-tV3d{;pJ
z0pA3;_%i$yxm}@EFc?9<>H|LO%Tl=}w2p)Rau)l)d}q(eSfNG9@>@z^%WXHn9m?Mn
zng_++hs=jOiVY0M%J3rOTd)HLho1{@QQMN3-;;yH-HdCEo_WE3E`)mw5E4avODeJV
zz;>_PwnP^QhB&_5yz)iiHn{le{2up@@q${4ac7kdaq$Ctexi_>qq%hAL=W#yET2@pX{wX$l=&NKg9`GNge{1K9|Y$
zWe}PBd2U0mx$q6^>
z+ixWLWm@z#qclbaxdsv3FqduU+W~U2^?KPoY&x0kM9y)ct0ycfZ8_Q{m8*1e|
zpjbET7vWobMm1X2BVIi1O};irr2J>cc^Z`+=DRS!1<@V*8s~mWyWQF-zvM;0wCc^C
zz6^l1@Ck{+7pEZibqrJagbrCaK>~e(bgsN>fo2<|bObv$`5uJRIE^<8qrFZf#>X7oe(zcEZ{bAk@C}%_G00*2Q;*e4$t+(d3(y
zM&fPBS)PB_58V+SdEX65R~$=C#Ya2)9w}}sG?3H{R?HoAWp}ZWPfP8qPJ+U9QY@^H
zv^_{`jDktz7A~&YMl#*ZAQbtGdkP|*`+0t7>p}F5<*RRRczYU-ZZ@_2uBbmG+VRGEx^=0u1RUx2PHEPxXNLcmrL;&JC&9YFP?p=8BpO|1kl0a3kTCgzKKvB!4x1o|?wfTDnpLfW}=;Nzn(&A_{qV)KQ
z;(QAgLDn(R%;kYl44gh3mJOJLXO-4a>fIOH
z{=&80&!W+~L!6w&!YtP7uHfsrXaJRXdsvsu57_R|7nqwbqIw`if7)nwgWr?}Jq0F1
z^KW9KIEixOMx~VM)opmG0##9|-wn33)C{uxR-7
z1MK%9-dAb^3-SD@zn-5g-clFq?O&eFkbA`MAk4@!AHO8Gq}Vr*P1L=+24>kVugB7;
zL+6cmw*n;@_JRLktPQYWbk`875TBWOT73fC_XU&2zNqitdhm-4G*5Uv0>?X8Yi<+^
zc{+gnJXwlWW284)25(qT{b(R(0%rOxP$T$5W+1lp;#ExYt~2nLP`tCJa0uy=E2@fJT+cT0ZUeRk
zajpC!J8M$yn-oV)On)-L7f>4x}(?A(l7P_eX!<%?NSYl|=82z8`4E`4#K)iWu
zY+K-GYQ(oKupv;CD+bVOL|;L-{qTymhtCvJYp$tcNGc>u{Y2|T?D&|
zH?Tg+zDQmWkObxj!}X3*p%mE>JLP2YB1)G%Gi_}-**(cyaVifi
z=Rxl#{v>XdCtznu
zk+Xt(kmkXj-hoE4R1xf4{EnLUX8m0$$e%yOcLBUw@^dggx&1sj_`~1pBEuVKrc$M?
z0~d=fBV+Z$A0yWtnx=0z!HGFZ3Mvg$`XOuyjfmFCxhw>)^*l@$w^~LH=PRY4($g7&
zR|G%Dt{_B)APs1daj-G<;grQf!k^3W5f+lSwaJ)0`hzGPsZgy=Hw8rR#flE^4@=*<
z(KY0+#Rf#6UXRt%%{AvyCZC0{kcuq%T`VbBS@-fT08;!g`a6i=PnBgVu*sI!+lhAK
zTl#}Saz^(o{8SNU^A7pWy-^7h1>%5Yg&+8TTG58=7Ww%S-V|LsyBo}MxC=6rUx@*E
zhlDB1Axh0gaVpnlZ#)wd!)T{oT9Xi=VB*gx@9crK2};s&@YUdVst0eF?FJzz<>jYb
z_^P`j^(H;vewYqE|F^E>$#;<+vlZOrBK
zxbDu`91Pqa{s*@q5g%wCNAC-2=x)~x0bnIb@m8Fg;=uERs0yj~6+-AMpM~&v*e8Yz
zA^bO=K;cuect$k2qRsuSqA)rL-OXMr&I!-WcRKtrNKj!%+!C;kozgIT${=i3OU!#E
z$BtrAa#}fmD5H6xmlb}L+SYiw6zw>?p}{mm<_js7aE&CbYsENv2U#x6LDvS@GYLJ$
zm3E9mufs-<-B-bI{xpS&OG0e1`lIu=VE_ID$B$nv;#p
zzT-wa6oBbVHIFPD8ZAX>KOBpcJ%;i;P^&Ps7>#S~7+&-KI4
z0wJ@9=_O^H=xJJ;VV#u#E(ZkuHh_Vkq7U*#mPdX>fjGj1^(pp~BthbrxD1Sr+~aH4
zc;B33Cu$U|LDZMXAt14VC1mw(0Gfs4e@n7$O~O@wD6c@oiT|l05Zh-#S|LVm&CXSB
zK(ximEC@v#>Ns@O!u&i_C=R|VM{DwtjPWr|&BS<^%Uy2<_O=xD#7ADJ1)pA3xlCM=
zEs@<~x(N3j_Mdgbe2sD^DGgN;gh)Ui+?p-(;~!!k`dO#2DNUHhJ@|Wy^25N*&u*`j
z?#ziSs*>0sm`cooA1$)YEa7yE=Bsj|wGEJ(iy$X1)WygUL%guBG``NUctwBMt!k!L!|^VkB+WiPpj?U_{fR2nr!o%@_V$ZwV?W^1+0w7NP;jcOQ5
z9Z^Fq$Md}4l3Es-6mc!I$8Y*#RrN&>&I;fLwSzxjqeT3AKaMru2JB1PmKQHEJKN&k
zIS@@(i4XWqdOf~Q9(p#la0X&lNbNjo$?5F}
zZJW0tr)#z%HJ}CoPZsO_s$7oeXg7x|P0y#vk~h+lG#Y=J#e-VhG+Od|!H;bu^z%6-
z%xUAKY+wpJT6hFb-So%O_{kHq`JkiW4lFl1IeX6l06ZBOTemHgR(~g7n7LC7c1+yU
z%L6dT_ePJtBpM^_So#dleGV|BjPUT@cW+ut!HK6X9p?ZJF8O9}N8Kl(KJF^Zehi`y
z`!40fEmTmM)A0p)q%FYn6T0ZvM&w-}o{T)cLza_k8zH4F9G%?1!r~E2@_ow~**G;O
zgrVdwi4wg)eJDJq(r^WOChNJ6r@>($Z&9(-GzAu)C=fdFRB3lVxg)m3u#Ns`^5kF&
zD~)m0=}pB^ya&N5X%N?CKf86jy6>f5wO+Ts_-)LJg}pPd6mUOPUhu}lBOpZvQ3T`t
z{?|!$DQfTc=#JluOsTyGpD|G|sHk?I|Ll254bT#2aF?>VzP0
zWB!(~j^&%$&szb+>Was5g%qGt7Gwtwk8OtulwmqCWo|~${R77gp5*eT-;?a3Qp9iN2yMU%C5IF{kwNI|J*
zGk^0f0_it>UWEz{3)~=`UTS!Ra_#V%@J$FWx|c;d&Px)zZbs^F3eQERB+RqDYpFL(
z=DT^DbS__Rn1S%cPy32naFx%vm@kBjLa2HT-7kE8nZPv(a&U}eo*Rt&8#?l%&4B!Z
zSV=bxKQell8h9-Q1`BQId3-q$^EpjcGBHOf8K7Kf_?3EdQ0aM9A$Ub(?)PSj^xdk^
zHQX7ke?rl`5~4LDEI};jWa!KAU#RCGKa-y*b~L?$XXHW24Bj)cyleo&0pe;{
z9dRB~t9i@QC74BuK=MbG`0#
z{2&HOANMV9cmbdiOfunq*Z(Z9XT8J5&JlAFb+zJm*a#R6z@NAQ86R*a8#{Iw7%On_
z-P9)|E2(S~kuvWGtK@uu!v04wi6Be@vKx@~
zE@7oJ
z*o6Rl59eElqQU1zM$&-`cKt-q8?gf?H^MWlgZ6?|Ej*4|qmD4>+CiS&jfPrJDR`rB
zWgjhidzXHC65WwQb)~x5f4aNZ!`@6ZlSSqMF!BB!w{30D?^Avb?B?)#+_JEE%KxbwZNd+yH123R6ssEthx8Dzd#2HeC+A&WCl$JpV|
z0k5dv{^`J*lVWCWAE>zpO@xhgS}m5Xynbm|*B54ySzV-iKmLYcUe%DEWa^c!hiT-1
z*gxz%L{_BaO1gx_$t$1a5~o@1trPT31+`bkh1lrxh=Jb5TWG%)*1eq9%nqU^-OuBm
zXhL<32*fMxdip1P&fbTH%@J9Z*0{;M(Sx1!22ZJDXgDZlsAdlP&ktaB!JYHynTeLOf*F0
zQ(67F&MbOK*I(YoAK%>|Hi9rFG2`*Hw64FAR69b>2z%l^M!X(*LvMIj&80EOE
zUSL7bwsK{0d0XMdoT#C|k#FG%WLRm=WLlzQSwJNGP$J;j^0qb{MGMO3C>tAg{_Esj
z1DXJX577mMKpi;6bwE*UM^(+8HV(jov}$3xk`
zS7x(+Ma}z*4gF+?!&RO?mk4<0FOPsUs#6sHlWol7+&qFBQX}Al1q8}EQE*5%8^hAB~GK3>}5PqGM
z{#FzscJdW(Nma2+>?G-#1cOjSWc0ab;y5HhnzhwL=job>!oH))kO-T1f)n1$H
zzCbMLCP+WnSjmC=nC>rIX8;od(FtZa#xht)VdZ?g{e9AVImK^Mir;)WqXAdAf
z`g0cV3FXO#w#(I;jVI^Rd%-pluzc_}>3EFJz7YKBD@ohB^f5reh218c`_chZeND!-;^@6Z~rz-QFOD1P;iU`lJqn&08;+ja6A121u!y$J02JBxvlr){i}hmo!hzo
zf4ltWj)+Udf5h;dj?aDj@0baTk(vadf+8C?_95;y)R7v3ymxAg0V=?-{vFT|FK`E<
zz*6uK+eS&*z_*!EcI5A>x#{qKUe^D2U8ow89zr?
z{_Q2r>svWc13jflQjUV7U_Wy?s?ymd`~6XpfAYVX|7ofb`Xacl36?)hHj)
z=|x#wBm`Z8%VPhE{RE(*{;M|TWAL&(w8!E1eD{6Gaj0l5b!>ND=e6wgtki$AS(@G;
z01STRvY4OZYjUsQLpI#>zhNt2fcn9>r1db)FG##-#3!B-E_f~sF6dQO
zCCK){I*9HeiXlz1Hmc-|MW{JKlIWL@}D(fR#pWJ-2e6I_6cws|9fo8tN(v>`Hbc!70_qxB{_}&{FLNX
K 86400000L)) {
+ log.info("文件不存在或者文件存在时间超过1天进入...");
+ try {
+ InputStream inputStream = new ClassPathResource("ip2region/ip2region.db").getInputStream();
+ IOUtils.copy(inputStream, new FileOutputStream(file));
+ } catch (IOException exception) {
+ exception.printStackTrace();
}
-
- dataBlock = (DataBlock) method.invoke(searcher, ip);
-
- return dataBlock.getRegion();
-
- } catch (Exception e) {
- e.printStackTrace();
}
- }catch (Exception e) {
- e.printStackTrace();
}
+ //查询算法
+ int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree
+ try {
+ DbConfig config = new DbConfig();
+ DbSearcher searcher = new DbSearcher(config, dbPath);
+ //define the method
+ Method method = null;
+ switch (algorithm) {
+ case DbSearcher.BTREE_ALGORITHM:
+ method = searcher.getClass().getMethod("btreeSearch", String.class);
+ break;
+ case DbSearcher.BINARY_ALGORITHM:
+ method = searcher.getClass().getMethod("binarySearch", String.class);
+ break;
+ case DbSearcher.MEMORY_ALGORITYM:
+ method = searcher.getClass().getMethod("memorySearch", String.class);
+ break;
+ }
+ DataBlock dataBlock = null;
+ if (Util.isIpAddress(ip) == false) {
+ log.error("Error: Invalid ip address");
+ }
+ dataBlock = (DataBlock) method.invoke(searcher, ip);
+ return dataBlock.getRegion();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
return null;
}