From dd6d8839020bf56efb5452da5e9a5e10d4a87013 Mon Sep 17 00:00:00 2001 From: zhaojiahui Date: Wed, 30 Jul 2025 18:50:17 +0800 Subject: [PATCH 1/2] Initial commit --- README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..3cbff17 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# DP-enterprise-fuiou-payment-push + +DP企微支付 \ No newline at end of file -- 2.49.0 From 9a923a67b9f781da84be216b405331102b37c81f Mon Sep 17 00:00:00 2001 From: jefferyzhao <375696853@qq.com> Date: Wed, 30 Jul 2025 18:53:06 +0800 Subject: [PATCH 2/2] first commit --- .DS_Store | Bin 0 -> 6148 bytes .idea/.gitignore | 8 + .idea/enterprise-wechat-payment-push.iml | 18 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 4 + .idea/modules.xml | 8 + 1.py | 4 + FuiouPay.py | 71 + __pycache__/FuiouPay.cpython-36.pyc | Bin 0 -> 2087 bytes __pycache__/FuiouPay.cpython-37.pyc | Bin 0 -> 2194 bytes __pycache__/app.cpython-37.pyc | Bin 0 -> 5883 bytes __pycache__/config.cpython-36.pyc | Bin 0 -> 1343 bytes __pycache__/config.cpython-37.pyc | Bin 0 -> 1492 bytes __pycache__/dpapp.cpython-37.pyc | Bin 0 -> 8828 bytes __pycache__/utils.cpython-36.pyc | Bin 0 -> 24468 bytes __pycache__/utils.cpython-37.pyc | Bin 0 -> 25338 bytes config.py | 56 + dg_priv_key.pem | 3 + dg_pub_key.pem | 3 + dpapp.py | 333 +++++ logs/dpapp.log | 46 + logs/payapp.log | 35 + priv_key.pem | 3 + pub_key.pem | 3 + test.py | 20 + utils.py | 1328 +++++++++++++++++ 26 files changed, 1949 insertions(+) create mode 100644 .DS_Store create mode 100644 .idea/.gitignore create mode 100644 .idea/enterprise-wechat-payment-push.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 1.py create mode 100644 FuiouPay.py create mode 100644 __pycache__/FuiouPay.cpython-36.pyc create mode 100644 __pycache__/FuiouPay.cpython-37.pyc create mode 100644 __pycache__/app.cpython-37.pyc create mode 100644 __pycache__/config.cpython-36.pyc create mode 100644 __pycache__/config.cpython-37.pyc create mode 100644 __pycache__/dpapp.cpython-37.pyc create mode 100644 __pycache__/utils.cpython-36.pyc create mode 100644 __pycache__/utils.cpython-37.pyc create mode 100644 config.py create mode 100644 dg_priv_key.pem create mode 100644 dg_pub_key.pem create mode 100644 dpapp.py create mode 100644 logs/dpapp.log create mode 100644 logs/payapp.log create mode 100644 priv_key.pem create mode 100644 pub_key.pem create mode 100644 test.py create mode 100644 utils.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a25e5132d1b687c919209306da8518e3d8ccfa7b GIT binary patch literal 6148 zcmeHK%Sr=55Ufc;9*PieUWEMt1D?FDF&?}L9`qJXj4>KbKm+Esckvhe1;57c(dwQd zZ1!;#(QfFec~sA%X4u&Q;JSY`jA!JABaRCr-ZBw&+~TfyCY3R{>6tXhT$ZvwGwdc7JgXC~`>ALqI3)i)HTSI) zzpv|<2aPhTt{&w^I>!Z0sgu_cWZ8Oa@R)mOS+iw5|678X7nm1SFYk6x*F>v$q?g!iAUDZ>_ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a2e120d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..4adf23a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/1.py b/1.py new file mode 100644 index 0000000..30efd8a --- /dev/null +++ b/1.py @@ -0,0 +1,4 @@ +from utils import * + +a = query_pay_details("231002197204291515") +logger.info(fa) \ No newline at end of file diff --git a/FuiouPay.py b/FuiouPay.py new file mode 100644 index 0000000..cb8c922 --- /dev/null +++ b/FuiouPay.py @@ -0,0 +1,71 @@ +import json +from datetime import datetime + +import requests +from Crypto.PublicKey import RSA +import base64 +from Crypto.Cipher import PKCS1_v1_5 +import logging + +logger = logging.getLogger(__name__) + +# 使用公钥加密 +def rsa_long_encrypt(public_key,msg, length=100): + """ + 单次加密串的长度最大为 (key_size/8)-11 + 1024bit的证书用100, 2048bit的证书用 200 + """ + pub_key = RSA.importKey(open(public_key).read()) + # pub_key = RSA.importKey(open('E:/YinJian/银建支付对接维护说明/富友/fy-enterprise-wechat-payment-push/pub_key.pem').read()) + pubobj = PKCS1_v1_5.new(pub_key) + res = [] + for i in range(0, len(msg), length): + res.append(pubobj.encrypt(msg[i:i + length].encode('GBK'))) + return base64.b64encode(b"".join(res)).decode('GBK') + + +class H5Main: + def __init__(self, sub_mchnt_cd): + self.mchnt_cd = "0001000F7152279" + self.sub_mchnt_cd = sub_mchnt_cd + self.url = 'https://aggpcpay.fuioupay.com/aggh5Gate.fuiou' + self.notify_url = "http://web.jiyuankeshang.com/api2/paymentCallBack" + # self.notify_url = "http://172.16.6.15:3006/paymentCallBack" + + def unified_order(self, order_no, total, description): + if self.sub_mchnt_cd == '0001000F7152364': + param = { + "mchnt_cd": self.sub_mchnt_cd, + "order_date": datetime.now().strftime("%Y%m%d"), + "order_id": order_no, + "order_amt": total, + "page_notify_url": self.notify_url, + "back_notify_url": self.notify_url, + "ver": "4.0.0", + "goods_name": "履约服务费", + "goods_detail": description, + "fee_type": "CNY", + } + pub_key_location = 'dg_pub_key.pem' + # pub_key_location = 'E:\YinJian\银建支付对接维护说明\DP\DP-enterprise-wechat-payment-push\dg_pub_key.pem' + else: + param = { + "mchnt_cd": self.mchnt_cd, + "sub_mchnt_cd": self.sub_mchnt_cd, + "order_date": datetime.now().strftime("%Y%m%d"), + "order_id": order_no, + "order_amt": total, + "page_notify_url": self.notify_url, + "back_notify_url": self.notify_url, + "ver": "4.0.0", + "goods_name": "承包金", + "goods_detail": description, + "fee_type": "CNY", + } + pub_key_location = 'pub_key.pem' + # pub_key_location = 'E:\YinJian\银建支付对接维护说明\DP\DP-enterprise-wechat-payment-push\pub_key.pem' + logger.info(f"======================发起支付===================={param}") + # 加密 + message = json.dumps(param) + encrypted_message = rsa_long_encrypt(pub_key_location,message,100) + return json.dumps({"message": encrypted_message}) \ No newline at end of file diff --git a/__pycache__/FuiouPay.cpython-36.pyc b/__pycache__/FuiouPay.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7aa9d46bef6cd67df4619bd20018c05091b4dcc0 GIT binary patch literal 2087 zcmah~-ESL35Z}EopU+OxA_SDr07|KWIJTRlr2jwEFhq8?aalC*~Hb z&Z(+1vrRy)E`5?CH=J{@CJcZhA9E!|J?yJJz;%^tzMiT;X$`clzki4u1oK>qdpK2k z>QVIG-gP6@eKXbke2P;89_3MVTG@kqizq$N>%kdUYwsXl@QXzCM^at#{81?d&$ad{ zeApU?(LZ-_>$@xcGhg(teYAP~hufDnwlCi5-@LkY`GfwKUvFN&Ilga&cAUiP(y4=` z$!ayTs#a>#OCAU9JJ&wkym9sRg>R~r${)X;9j{fU58fvMUL~_)7``gh<3~>X2?Q#Q zF&Pw*_kuWL`~>X?EsAL!hjtcylLk^Ai1^yM6~1!mC;0C z?_0zk2QU7rP90r<-y{t=Wij&-I=M#cO_xu`ZYKclWZX`gQ^(p~)Lw8q<+vkuvBY&+ zQP^;Xj#{u$QUpNyLyCnp{0QEQ*^}^Im(06E0pc*sL`o>KF+p%mF;O;O>MK5u)>IY%N+;kk|MN(wwBp5aFQ$! z19$>nh3Pn6=yAu{18<25fUuE0-LXMb%6B#D@*>G0wPXUa@LU2SMLvXRMPY{|#j&sS zkgv)bfsjGCd`(Un^i(A}F)mx{8p*BeVGa2D|JazBP5yELY^-%1YPgVUJq074la&kA zZSZ`mrv@qZ)b*U?l94p$L7hT!M(4#n$=N?U-8CjoP6QLAt526J++c!)Q&I31`c)eY0nQH;A4NWgc>&`AHNCowS2E$%?gPvgbg_9!4~b zgw7-GwnTx@q|UsUd(t3wnH$)x4FX^(5WMUmhSdJ4!q}`Hq z(Q#JWZfhW6&%=k=0SU4h?f_Yd>?wf9U?#H6Ol;;dP6=m0hgjF7QWk5I(bYChcp`Sq z$<`f}7qWf~jX(P%V7oz8j0|OSUfiTC`xnRppKZJ2?wOEQ|dQB+Jg JH%!$U{TmQgJ6-?) literal 0 HcmV?d00001 diff --git a/__pycache__/FuiouPay.cpython-37.pyc b/__pycache__/FuiouPay.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af53a57f3383ea6cb2841a1ce63c1eaf3342bc04 GIT binary patch literal 2194 zcmah~-H#MS5bvI^ot@qLfEW#miW-nrZ`nPL&!_4E!CUe_;dvmw*LC-9> zo4G`CfRR9y1QMf|>={K(3`BzwkjNk5TfchC9ZxsTm6p+N8bWP2#s=B+Xx@z_e z3|IsPU$b`Rw*n!*qHdJ4;wLYfXI$&DE z@N;&qkD0c~%}$Z=0S`AN$BL_1Na~x(YfFz_t6D1`Jw4*MPMLMr0T1QV+ z;IulK*Wcfn7>p*llrGRzSy1k_YQUpBMoubgNXKHzBE^T2Bctz< zq|hlcwKI_Fh;;^03Mbc^M_^-X9gObT3%9>t?4Is)ubf)C_T%zrC+=Lh)xB})_Qemn zUwyN5?Z&!|bG+rmUYl>)UK*)ZGplN4bZp8?KzrrN@ulmRmd}4%tyKQFd1l>cWo-Kc z62K~%m7uVzRQK;W@Fy^&G$b%6GVl3OD3SxbCABc(fz$+dnb0!jfFF~(aDzIRY6E13 z8-WUwIUdwRD@vpROvt!2rrels9h3Q~tz&&in+-j%U>p@nIcY`BsfJf`z#*ynaa|g) zVm+C$b09#}Hh>AIW~C~4EUEV$5s$+u{(1+q^3%Li~IYQ{5@`w%+lw#rdU z4vW}z8evd(`tA(CPH_IZ1tZ8Y|{wYiceO}{o1Bug$Z zr@@mfTRrjwd`i=CyueEw2i=TKAcPv((;n(YrF>VThSv=TYGDGh@N|Gl$t;9uP7yni zOK3+~Bpnqi2|@V(&{LJ^%(!UHYb-af2cv-N|6^ljHu;MMu(9U##OUN$A=N%7 zU%>j5B+!Xc4LX65SgD>Gthk`g=MZHBY0iV1h7=7>$oo>XdFxo)SbuoEzn-=Av2vwc zX%2xO-5uI9#&CQy`L7C>R$GwlQh;c#p|^k8}M*4n=OAJO74V z4oyLx?giANTu7@PhAegh*XOd>;~7s}uOZE8&Yh$c@%A9AJNGraxLt?rqV zcRoBa06dxiBP)gU}3%{UR$*y_bIfc2thG{Slvyw|*7I+WUM90pQnO+SjW z$}O4VS0?WP$OxCcG%|&>(V!>)XS9H=rxjToi~h+OF#N2hN=S(H^|( z1I@sj_CTH`?Kv=tw*w*6QZ!nm3OpJ-_*ST?7#e>47uS?w=sQK)exzR@_boe7(y^#8 zzm6j<$MHkfY#?8BoFh%Q(US<=Uf}lkoDw^!z_Jui0zoFmnlq`H%a9VyVqY2*n^7qX zxheROCXbU?4v%BE56cI$77qW4?B5|)fvOzn%f`KEhKt^hBZoQhg1XGtdGcnKAF%`1 jts=pGkZt;~^GWmNo?EZt|0-S$#H2+9Ce5Z|sn+1%42Wov literal 0 HcmV?d00001 diff --git a/__pycache__/app.cpython-37.pyc b/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd68221e8b5a3d97ec88ff6ff7fd3031a127fab4 GIT binary patch literal 5883 zcmeHL>vJ2`72mrLy(PYYLz=M}pzW6e)AT_?+mG$vuwRSp_z&n8rXTt{cO_XdrX}sPpDKIL z-aUICd(ZjZ-#Pc5$YxUtet&*>wEXRx73Ht=(EAxEJdDftn4)lnv#L^KCabBYTGLFe zrki@rFbziU)M~62H{-IbRTHO4r&p7;q?wdDqna{P&>7XVnU?pAnQ@qtU14UBu{Z0G}Qomd3zu4FB=Qm4zLF#Ym>u=?^ zN&SS>-`@Y81N;uD-{WNYoeS!#Ow6OkUS8w}G2^=~Xt0(ss}v7yk{60bXgpfA{e>_t zoadU3AA||va922`AT;b}>mmr_zT^9D-7B(CpL*iSS=`w{2;*B%pR$)`HVfz{OwCSD zJvn{a`sVaAr;E%S^P7zZ8v9lW-8o+1+Eu@mnZyuc=_%h4-{7J4*fgq!@tPA<>fA5U z_s~zrMVOhw<$DlIj|R#-TU9w*W6MgQwc(#-7U*rZ!nnG?#F4S7Xjwa_J*_;Wcw$_Rehn__v*_SJq#D z@8hd)bl&@L{grn%u3lb$>FsOpU0#3Vl`|(#;r}qc*bxok`p)4+r&O_n!Z>RF^WF|p=c`0u!OvHwuj}Jn1HsG+VXhczhsZTe;>!g(k(mtm#gq9 zR%ko&odMsSgzuo~`%XOvuMPN4gYU?ytMrb?>NrIq^DLLE>;1SzghfE*-2a_B)21T-F>P*!6+vBr3E0=5g{WXol= z;we1qK?0>TT4pB5{zlv2*}V$xjOU;oT2RF&Jii=6kHc-Ft+q8jGNC}CH^@;b$E4f^ zsq^uR3HqKOxta>npQlAT#&=&#mf0FwdGoyRZ;q9@(Xsdh-{VFLF}sjLSa}6_Lpbg) z#rV1SbxU#Yj5%>n|F_MfEu$Hf58vO+z=fUj=R41T)OqvLwf9%dbRcZ*Sbks!P8gqk zYHDhFcD6~YaP!H_tCPy99 zsFf<9)zm#lkKTLVeMcX-_wMEp4f4S|8&}?4zj&eZ(%QAlA2x~G1_$oE{ldnpFK*H> zo5atXF%p!=6cb^J7DzOfTo|ER_Cs}kF4R4{=7f6LFSkOy(x}wL?bISE4&xTBp(9k9 zByl&1dq{kV1l0_)UGrIP;MDwP61w#t{HgQ9^PAs$O$LF@zd%*Y$>kcYWn!-|#vO`e zq3(Rwu9_p!ljYR|w~VDsVZ-nnRW}H;Ww#3Qx90hhRe`0-)w+$yZv_?M*gVX`A0n_k zXR)Wr*_>Owuc|JF>4E2n91@{c^XE)$vC@d9xC>t-ry~wf>B}T`qSv8qSh*h+{YN1b zjhKSMOoF9Y4st|Is0pwwY3bbvi{U9H@8gnN1~p@{hIj})wT#IC$xfeAROtFK>Fan{ zD)h*BE9Z!)7g>Z3x;+8-gECqfP#2wMPth`;wu;;a+VA@>SuGP z-uuq$f((Ti(B;GE26PGAdv&W;_Z%5%`m@sTnvxhvly9T3)EJzV3@|F!DA*uq5TPOH z5HaEz0frlr5Fk5FC&2UtwlN4rEYM_2PvKb zEwUA4U|oxC4^Y{j#jtLg)oQ5EU}DlhVcg|b$rfC$b5X>M#6c2wkvIf_NcOMSR5-NF zV8!%y*X*YbkCGtti3dr1mBeup^M z;mG&iu^n16J}hw(VTJ-DlOd6Dgv7ztgbb{+lngXuzz*f>dCYWIo3j5c>}=27$9ve3 z%)S28_d9Q0iufC8?#9&@#Un7LI6*?DceFBO>W5T^NL>*%)2O3lOYA4{PoamzUw*tqos1MaLGLm2a~_vZ>mq_)s!N^`1a-9l2#&CE zm1GQ;jtfwvmaQy7vAXzwFiM*GpMg9_c#OVD#;wlk{WU3ii%A{ zbaIg&Lk7`Sc>hU$G;9v&v||*#;49Yj`RuY0 z z8;%flu}KNgCgpbGPKYKEX6Hw*UHi@NqT#o4X!=e$pKHH*t8?Ke(R`Z3$Ak5^?GB2= z1NnCUP(eI^Ry(E*l(w7MrstMjhg)^Q9T93cbO`mprTszRoDC%No5Q_I<;8MTFbzNXzD6m6PgvO}t&?E|SS!ymS|L}+6ow0T;XYQ_SGcKgM~eLeF8@V~ literal 0 HcmV?d00001 diff --git a/__pycache__/config.cpython-36.pyc b/__pycache__/config.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cabcab6263692fb797d77d3ad438d7139482b07c GIT binary patch literal 1343 zcmZ8h&2Jk;6n7kd#7>hoNk7s;A=jv~Jv+Ozvl}6l5G+WfI9AgSWiHn2yjk0c?Op73 zT>A9=X5q593|GVzm=kj_FXl030T#qnxGJu}HE|uTiyLr5EW#q(gj?_qybHH~ zOpBZF-cDlq{SnQp0GgfpN&X>ny5 z#1nV6s*+VI`)nsHGh_W>ceC8J*Z21xZjV%W|Iu14*w|XPxYyoeYIG+UZF=Pg)k5^? zXnS*5+3@vRrF9^9Yh&B3_Q@xky9Y)%y5HXGl||MdxLkU!5GIx!&TL0hMz~a-YY}E^ zj$J5MQR%tBMzaPnik4ZV#3>pU6N|QGaz&}Bwc|3tdX7P*$pIPW7|b^e4%%`lvpqxG zT=O`GxzeZLaBgUq8;UumO{rAK*u-=U?kLbcPy$$8YOc<5Y+Kp%B8U1W81XrngEMn9 z@flIRVJo0mRh}{gh_){n&vy(jW|-?soH-B^+jLyTIV03|U*~ui9Z+ugZrmG_hKKK* zG0Sy*P7JNN*4m62oSA8A?)WxH4M0FLOW8P2>a~nkqgUS>HNcgPk9H5_R^`E3NA2$3 z-S^6vOC7DHRGRzLQStm-X%iKnXW0$|#o&XYY|3uV+8XH?J)n=sCehP87wvr}HbTfR5W ziQU?{nnzaFbtl5e>?K@aUAITURVNe@AQHbn#U*1w=@Ehqi~y?1E4&0~rEc4oer;kN_w;>buj zhwIOu-*5a?%;o;hoc|X3xeK`CTL_R7IT#QFFenCLNDM(<b(yN}`LH|V)o#pJlJ~loXV&K~`MNsSTobH$>9RYY8t=|5teH{w`s#9A6T_x~ z%O$&pLB%*{)Zv;?gGuGNwm}`uP=#_8k)8{*J8Bx{gl$a_gHM4`SglNlkJ%{_+=fEvD z)8_gTXAXviGP#S5s6m{J!5SN*FV|=sQ^xof_igz?fd`D(PSy=)W?7nX-vOxs43N}T z8N&_KZ@^18^(FTWoHX&8X0s75Eq5E>%ErZoH90$XquNpn3s+XW8rIqtQ-oMrbC&{2 z;3kn4gN$)F1xmGJP*WnKK?1chjgI8h0L!x!Hw@+Y)HXd${4M;Ia$5r#3}!HtK_1~; zAsxeG^UmX~`?nA`KYQB$;`Y|3-=w81{EGMdmyi3u{qX$JuiMp4^=~ccwR7uS2Nn^pH`i?2e$jT+%N&*nWyGF0HX6^F5!651lM-r2ws8?=wu=kF=x2=^9)-=@d9ivFR z;-@VYHk(={JN!Z9Uki<9jX)cnRsGKQFSs`>`&UV6-$)_yZNPd+SK(pY$reE+GlaJ+wjj7v}#j} z3qflpkgdgPwYu^9NBut@Y~Fde@#NdZ=a269Kfm|v!M$f+f3o<_d<6%m+fh4+b;VDE zFsN_O+@RxJ#VdsfG>Qzfc;~RkRQqq<_G?N^62H!%VIC~Alg}8 J_GEFye*ub*(0>2` literal 0 HcmV?d00001 diff --git a/__pycache__/dpapp.cpython-37.pyc b/__pycache__/dpapp.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..825b2fb1e1d3632e916c3696f1cc056c4606e4e1 GIT binary patch literal 8828 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 literal 0 HcmV?d00001 diff --git a/__pycache__/utils.cpython-37.pyc b/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3635a32604962056a1fe948990111cc7cf7e172 GIT binary patch literal 25338 zcmd^odvsjInP>OC{Z>nA$-MXDr*wW+pk=-GA6Q zJNx^6b^EF%%h*mh+1VYLu3NWmRo%K(U)A^f9#!mWZcc^p_rGr0)%Vg*LZQFmP5sYC zlLa)U4rXUb)A~87CacvE>oRqAySsBMe0&qSE$R>Vq90M zCF*iquTg#r8#z|18`V|nYQ)y4oobC* zi`ZJVPOV3-b!vm!i0gW_No~e;gW96D;<`~?qqgC?NnNY9g=yEewr? zoN#}5!g4_X$E~rj8^*n@A}V?$ydX4Y$s%PkqdeO>Ispx16IlV;1(L?M6FUe3oOcD=B z&qT7VgSyyTEa%u+Ib_Zzs!osGWmBcWo_xu~Tc+d8^{tR@NA>^n(+F7x(dz5BK`g|bu7L%LWgtT|9E z4p!F;ASn?6ib!0L!(~mz@Q$;JGp9)GaoOg$ixh{;9mwm-GQ{A_tUsx zpGfaNhlmq;2EBg_eeHxDOIb>K+YR-GRczcw7$3J(VmyMrx81O79hQEt?C1^M9&&A! z#F$|mR0`J!u1&Z`aZTeIQ_W*>#9I(g;M$6764%VakbclyRolW)*;4IeDcsM)^Cmaq zM%|bjcN1>XO}S0I35;<^brYI;`rFS;-T&z6m+zl?;E9tb9-ln=$mG$-&K!SX^2nc^ zeB;|w-+E{2Tdz+({`BN4KbSo6XXBF`)40qdJ^gyvtQeJGJ;PeeDFM4mjR4st0Z4kQ`=@~4m?uZvdZ8;Q4 zNR5m|OT~erC3L#wC$!Xd$wJ>XZ_ZjZ`!)`n%!GA zU%P4R&dq!FtlxdpwVQTs+<48dJvVLGxXp`{^B}-T-%#Ix7dcQlQ1jxdFy!RQgI);K z+IOJHHYE4wD}~%p-s!_zt2wkN8|`!0mZVeFWjyIEbf@(K`Npa)c}=EmB+z^|iL9#N z z{Ie{Z*N$i^9KpYYW&TBMUOU5yuwIYc0bw@bCW)UAW(?DLZo*VC6<3K~5Z*Y5PBjUk zBHnAMGzhiX5ULZY6Y>S*x1Fd@*b#}@An_>45DQLhV!@Nj2Y1 z%}4#nlX7Ef!MFv|@7()=G^{T{pJ`5eFM-t|=Zp>&K+WYUCpuOZP6Jt7s;x*c(aD#O zHKbuCO?~M_EI%f#+tv$Np*ER?{qiG1k!6*U@Z%@G|Zx0=}@+5`pp{}Z#L>{nLS+eBE|B7L9QPa`HtE1 zC^=j$=+S>xDd<~JpmH06kUet_rOix=HO?zP4YMnSxs(cbNFFoi5{S3QIPVf*0qL;5 z8FdCTjmv*9)850)?=sWsECKVxmU$9!B5uT=C%9ssd|c*9^sIT(q%vSHoX2g%PM9-b z8<@i#m@`q#wy+z;oQbJRz(itdKIY5`bLD(d3ovKmn0=jYT;@z1EW=g{WzHfLGyAZINS7L{!X;0JMSLp9vj{P)4~E@{LN2Med8-75WTH-Gv|1 z&?8Bq?9=bQId%Mdr@r?5nOB}QL_@wY^$+;-Y%Z8_F1(1;ngZ~!x=@R*?!vOQw>v7t z;@PD_*-PF$(gQS794vdW(qM0IL1TH>dQc;mER#Z$0o{1v!mOSZI{c4#eT6G<$chjx zUUDl*q|fLe?U zMu@8xz^v{!R|4AGL#hcqn647}oca9sC%^F2=_g+}^~m=x09y)6ZdeLtbJZDqbT%*a zB2`Q%GftcVdKCh2Tk<@8HG*suh!1>>QyASY7%xKB-!O+|($2%0RdO}YuSKy^MCQq5}N5uj9~onWs3 zfhLL&#YVEyNBhRoZdzT28k;6k$3q8WM=hOjn@k#7yLe#;wWnEod8u058!CqDPw{=} z-r$aTcZAR)4{KBVSo6{F$Ww09Zlv7v*jO4VEf|?rr^!jz(R)A%mw{?flZd3#lwbwO zJ>xVRZHk*=`|$;BBkwycY=>##;V^pY)ZNw?Ma>j@8DH^^iIroxVq|%T-tEGb6c9UV z>st}O0yQi>X!&;-LAR}wc~L@AQ*JB1zn$NI)Ea&cPml+>FEcTr52T?l%v)I6v};+A zCS{~nw7_jfPPWk2e{5p)7J_>;yDh=f`_6jW!WLkJ>tDVcwPpObtpLSzxvl7j&arvZ zJu}hj&Xcy=!!O;*FW7-OLke#u)wxY-CCY7fPzy(2`f)krqo`U5%C_|{QB&0P@lm@X zch{li!@oo;xO!fB!B}h>H_cuwA?p@PB|%8S%}&1Y;>i;y&b;;wNd8`;JeV68EEgzV zoJTa-bBDi}pL+83sb?QVcYqPeB_f`Acjh~XCr^Ci%xgc8XD8o1Hu=z- zyrcAs>**Ihj|#vO)=WP1`pGw+l3b_XeC_1BFW1YQdH2}q6W?I%6rH9O6yJRw$*0DT zK-t5rX*`_#!sDl(f8q4oUpe*CJ5tl+1LJ4jmbY^aKY8N0sr$cz`cD1%pPhR2>&!%X zjyc|W*eHxplb1eFJy^|`D}BY$!KxRPZZXKvh*vg*6=5dD)+>R6B9%ey1Zz4u4H3=l z_*Ez*KnVxLf-$uAdZ`{=fFySZ5fmFl9pK0;#_lC{l=1`nRsQ-__M159()-A@ng7P95{fZastBEWh#TAIuu2cuSWT9LI#ZiY~4-F1^5sq1R z$833JCti?kYkW1~>;@TksL)FJ-m{->^fI#xKoSuBL%83IRm&2!s%1^gsZ0EZ1QfzK zHo;4ykph|JE>`Q$vANM=SrtaSu$ncFUfWqCMip1(EmS&NVMc+-3diOU`OT9K2=)~1 z)A+>@OW?|T0%)cXPIrYj;~&)mE#Y?jBH?xmAz)s6xYNqu7m-u}eF5zA>yM_ac8EAj ztjoglS#xBO)nRpnmxPz&4QZq-0YpbVi0g;Z{($@`Sy7EAV$dl}gbM+MhN;hhdNW`l z#GSND9d)y7A#6D&FeYI9HXuU;Kms5hjO~5ExmGCcu2O&j_bdhEi-S=?#|$`kA7brb zRPz{D9Rd&U1CxqXUK}36Gbk1GkHGlmo460T7Vr*CG^#pLmW$1A{P;q~{rq^=kiS#% z6UZ4TxDq9JhZ2BiEB!J^X(&VBu?YDtZGd&tttYJ80ayokYw`d@fla%S0M-rhZp;R( zvyFKPW~e2Ab+)=(bv+32Qed48SeF2-V_)rqEl*S3tQ!ZcTQHWwXguozMgrD74VCADu_laBdQMm;Vu4QqR{-LnR)Khp z6i`>rHUr`RW;ZpMdr5C%Xy z|63rQuWp7QaJ3Kdgc2Gc-qix}PM{`2Jk$h;CwBtzPM{T3F|7U&AfDcXg+nx;`ZI`~ zAInu~n3#O){>g9t3!~OJHU1*-81>jsfBy8F53la>)z;g)YAvf9l(yTu-Vb-}`TrXT z>MVQnE(B-c9!0LAef`YQ3}Y1`cBPxqsmv%sD{$QKgW=m7@AIgKDs4>ENh z1G03ZKfaN%VFsE3p{{lqR2kgM;1Gim2BQpW2v9ARR1NAWm$zdKb}{%92KO=eEQ9+Q z1h`8-z}r7%aG1e^3?5=Iv$wpCxq9abcHeWzJvY*-qn=J;9l=mUQjJ(@{cnw>>UCcP zqIv}F4CtPp7pU2uyC6hWSDC;7nSgRFIn#1av^4S?;s3t?R!RXYEm2UxK=ozN2Gk|M zM|b(Eue-3q$0{Sk9|!7y=~EwtVYSu7ee9Cq9XODnEWt-V^yBToM?duQgV#3XZhSm}r#efG5HbNfoHz>b>ji3-D*P{VS zun`SJm#F!o@>(F+NE~y{iH#NsHcE)fE3BU+KUGLWTQ3Dqjk$GfbZLN%@D$%x$3}i$ zY0&{-ql{pqr+jSm7_d>s$3{sfb(YF&Q3D>D9?NF&!f1v%v&CsLNY91pQdC~8z(Z-D z>!XDM9?A$FLjM4nWJF+m#`QQo0Qlf& zF&|S{!|PE3BaE^ym>BR-hB5Son9QZLK`U1TX;MaNMGFKEnHK&MWg1!-;2}P>HF49- zr^G|+F~W5`v=p_q_`LuH+envd@KD=y&rCGCZ9X2_CV1#4z(b^LF~0*3L2U+=7iyWn z=r`b@<${MsP!sVG`WSdf?gS5wpcTYJD?SW7bYUoH59~W!B>r(JwAiAvHC6&je$Vh@ zD_Hsr_%YKLU@l$M{}uSL4egu-KhE9K-!uHUyWX~G_;Jp*{m$^C)##Y0PSUX2{%)Y7 zy#aLWWMvl*I@Yq-g(Hud9n-{~dlEIwjXbEynM-%GKD_?-p}Tn$?V4d^4UooBJW()C zQ-5>JDu!Xqc1L%^_Y!`YFqejnkKmE$gnb;|e=tYGC`~S@_c_rCIB1Ds+Tsf9#3x{w zX6#Ug-kLCHCt=Qh*f(c)AU{kUG-n@^{NR%K7Z|cLFl1+#hE+AS*K6Kcg;Sm`*5GwI zSgyr)74o{EyQVtO-aT-Mi}w}s3L0dnSK+DZ#cAJ%bB`B;S{Z(;bl<~c8cnA#GND>r z?AEKhx|_1_=qpkOoq!WiwNP`s^9$)bbnt%_s0M;&ei=Ey5I7M{`k&edgJQ{bC*@5saK zx(w4@p6?KS+V}=E( zmA@R`hg29F^%--eVoqFm!fi~+`Z#{PE`)^KuZesHLuQuwpYKza|*<2lhU7~Q#$HtCVOPkUg z#4oxQ_g$lrEJh8OISO!N76JSkv`L`b2O2T;USzvN97c^o$;YpEv$Vux4Gy25LaLW3 zR^S_-*G|rXPd)vJ+JclrgZdyGFb^3Y7_JR)a)ucvCmzwcATqYcVHJ4 ztEbavR5Sf7*w$eA+7Gw;fxMTl6#I)Ku!7MNX1tp>F>8wEz54^qWtde)&uE*Y1UVjOtB6 z>VfSVenh7}_dOVMJqyOKWNB1Y%l)v=iQ3Lfz~dIqu0yai!ROr3`5yRxR|mQm%lGO( zKy^mRH_n*oq4=@-7=y1e=w`sL${NRDT5i9_vxWd@|7Dm~6X*^|$H)sXUa z^*=FXPd+j+_2uX4N!Qh^)m<{Gliz$|^5~J8)xR2yhIFG@ZB-!%GM^m@rVn5B#zUvy zdJXf)ydrpH^u%YEosqKFcQrO{l!JUf*|+%r8C-B9ZnNM|Jq7NB$ziMmqyX<>nLTTe z#f#^a%Fz!W&io}tjN(glUgS}9WH@9z5!vBhg89XDSgekW%>oi$tC{QA7+^dgzDUlv zABE}Am4fxI1vt{eHBB2IVli?|JnOJi;TY_D9k}l_?)pg2;JyRpIsiZz>wpz-5v+bo zYyy)ds4WxD*s*ZpvQ${Vg0}>`mdM~z{Djwj{9<`+r_XC!X7JkZ$luT4wc&f9vBHXK zc&&Z$ycU+kHaAvZtHpvSyqE4<6ER=Q^B$~h!c)O@!}>iF2iFZ!D?b;mOBep%;3=-O zD}n1mg9fgf2)HgBl*yx1r_ZUTx$bYzYopZ6`1M^VmjynM62hm|a%s~FzYf^F5W8}G zo>~R2m=NdEZdzLn8b=>l+_(UILbuba@V$mBUX2*|_$;otTDW3b@~)YKE26{g6CpOX)2VGOf)0@;CK z48i)Jjg!-WwRq|L{{8U4DT;6<9Kkpu)mPBqPWY_wobGvZvZI-A&CU}p3V)LWg>sE< zCw<^@!k&Uw7%uc3Hm{d~zy>aZ*|=ds8{jNrxDk2X2eFyucs^qZuirHC9+(M#8?M6- zt5-M2b#kU-*YD1IlC!lT0c$Z_$U%GbjR>+W&^$EoAaJdK^XM0u>t8b1#US7~hJwD$ zw3ivQ2f;kVymp_vpyoP*`6U_5AK~Ho84Os)oD7DHi7bW=B{Z}wn$29mp7g7DLr;Y7 z!5;-VHb|HYGzajia;*iBdOM*g2!y&Q1uvsShngSiS>LSyyTxDx;eIURYix_yg)N5S z5iDwN{g+ZpGXz4I5vT~Kv4cLKZixQE^cxOR;q|G%IP)Hhe;e{epcamxO-T^}r%Q;_ ziJGT6T#7RtZc@Ss!b{)}J)eSL`8l#WmW3lhU6}$ijqGwsl_RPX;seEzg>0jI={%`X zzEtWQD0BTtvL2DkyA>g}z8! zARFWqG)9)0ZOr@U2)bvBC}tfN7%Q`hON$5{=X|}9u4JY39ZX+(M>bd**9HOHD_ILQ z6S4+&H=90^x}`mAN;WO~(#nvH=+!SxT*@MQ7zo^+tFA`$Exlp}) z(mOI&tV?Y$rjT z5T+ZPOOJ*tWx0>a^rN*-wxL4B1|J?QG%4A1(geLu8kulxbQRIOw4U?2HqZeV!pg6{WIQdjvB6*;lm7GS$!{-KfGG??p8MV;Q zGyTNqc$mj53mL^_A)^*cPTS9qZ$oU!c$>PM=n%Q_7NBA^{YKcz@O|8jfN#bEC|I!> zIq?l}!cW46mYis%4UKO16B&Llu5GG|h!6SjU1Lp7dr%?`J6@U|Xt4V=!TEgYLE`YA zOaCovK&Fj-$5CD0@T@+b^Nxp{4z)t9JOWnXk8U%a>&5S@AN$MMcKl#Vy~J%%SE^O8 z4R;@bZ52Ljn`u{t58G8^tuAbgdN1&AD?O#uYFyX&*3!R5ds`K>O9Y zH>QBGa1%fVZL{@_cye)VTh6jG+cW)cY%h?nfE9K-?4OqOZbbhCy=%?r-Hjj6yS9F5 zj^2%+t+V<7Ul7sOMSsDE+q<@Y`W(F*(OxYBHH&>GK&yhW8bZJXdfveHYwt;{C? z>YBZx5j0MWb#a3F*II0K7x{iIDhHaJ2W@=t`2a*=UNaPkXt)+G-2(%^b|`PHasX>^TT6 zZ_jYG2&?q8q|VXuY$$hS>$%Y!Ph;_q;HhA7ZhtBjaHfl<3!r#S8U-^Qa=n-?3=G1I z{ZT&K!XVC|!hot+LBN;`BBzjEy(HDiVv*1m#hWQa1EdmcZf?_({V$Byd zb^`BU9mr|7BPA82QmjBesqx}VwV+NqiOx~dp7VXSd0z+KPeErs-mQOv-Ux&h8nP)q zvG*%K1+APdtoX`UG8s5vKrF#QOmhe?ky*kEg%u;b+$F+GED&BqCxUeY#z_b-O(MLQ z({pAEFMx3RRbg8YUMRS*j4--J0DjTJi(404pgQ-3jq?jIb+H63K$%73X?3YDmcS$n zAz`nGC1R?ESVHi5*+q*bi{;xWjzBPh(9$H|zT}+31vc0C!UcOjJ@RwHvwQvuyL63k zfmZm!#T9BPgo|YqE=FE;x!e3j6>S~A@Yo+XJDU139*au~p$1ekT$ue-KJtIz% zKk@<4nmGVaBfwe9ng!sj+bc`uOn_tbHy<*>5ymXIMt>g@>Egi5#p4*WEN;M?j2?R_ zV}e=;Sj?UaY(#nKol}n-o&4O_a17TpMv3A;Hz--8umBR#gwL!YD`y?~3hxU79)fD9 zkg0YdFtB2lI=W$1_Q8ez0rGx$%=No<=347&coz;yIw!c$C(r<6(g=`5^;V?SLDI!v z{Uffv^M#WqK0o=+Ls0aK`+-0c(EwII^&!-M@{J>t4X>CJP0WE37U(zm!EZ5`2@v$# zOrz$i0U+$)?R5-9S@#ZOk20t+pzh8fzIPeBk-;ov@G8=}Gt;0z|B#siIH3O(Z-2yK zHv{q@{jVAPn1S&Af5X@=27kfe-!dS-GQm8=yq1}xy$)nhaq)mGKXZ{xpO)v$Sxi3- z_POMilx7(uB_wML|jyd z(Enqbptw5@uf}SbgmWX#m8mQI?hKW0gac#~Jn&wH2VN5A`7A}AG#&lxd7Ngd%y2SL z>?z?ARdmc|9W!#P?6#oahd9NtOL2MX(!rj6lFUAuJw{F(#bT0}C z6h1z;F%FQ~qetP}5;JFmnyp0B6XMgzBsJ@(R0cmxxO5H{%iSqBv*_ZzIl5}v1C?GJ zK?HlE)0d4id2oNf5OOw-6G(G-Y#?g1r>|N*h|^%rTj8W333K^odKq2G=SuMPf%A>D z@jsKADXN7cJfw*Jy7NJG+*M6V%>bh6zrxdC8Kt=@ATvU}(W8J95Ygm(Q;?g)Z4eN^ zoW$Wz2z@hLIZ1%fS%&&?!YN}o_0;CUL=&)#^PY^A2crQ9#*Xul6Z%8okX#{0`US!- z(I?Hw1o!jslvEr)IDx}nxW^ZyodgkX^oj6CAVNU%T8ERKXjTa~RVP9+Z+PLR?n~9l z&P{^gl6&bMTftdaJvbzwr#RGC!1nzS$BUK+aay0(ny*v_dtg6C4^xc+^7v2q{#vx^ z99Xlh_-hmM#APHD>T|E}TvAHBB9Nh|h z$4AM1kDkJ zO~X@Wbx4{gP#qdE<^O?Q5kuAxJ{qS9{0(CN=ssEhHClx)P1Z(p{>LV>pYh4_yx%LQ z$f0EYlOtHs8bA3YKN-uX{IM(elTq$R#0kL^1@CUkdq(!dSYymxczerO!~P2!I3+_k z;UiC6Bo*+7FiwYp1y`J<=&FoUQ@B`&J1U%TxS&AA8+bPaRBmKyTOoJ=fbg6yxqC&9Kbm`eR*w^5iSrnQv zYLV&2q&Q^E6tZGMrx9>~cA2hv3aP>Haf0$E!*>-T=N~={kv~;MS9o^!n?9@Ux{!|N zQpJv!GBCZ)8h{ukwJOZ$eypW3CYZ57-=QCmqV4)LgLBT~)}WV64GY*wT)^v{r2iY@ zLD&2frEH;(_rt68Bs=pIgXIX$Nx)nU<|g3T!*PZ=1(weu-+5+W%#!0zrzIai!GDX2 zf?@i9kAn3t(0-6_&~q0?zU_^@WGMLRvncrQSaoJY-hs9@ZB8VMa zds}rs9Kt_Q7}YkO>i>YiYxbYrBq&KhvDp#xF=jc!ERkvz3mncF&Q}f^pbKVNK2Yq< z&Zq8`$Gfkcal*c+d~v#WACBTua9sD|@FFf1_ir-DDao2stU1neIhi4e)!aNd-u#cjyS=BX3;WD&s5?z2FLEn%+(w4& z;M>+SxS7F68BlUJrv%)|*uxASVelvekzt7sjKca=#^|>p`cRSA1V{_;G0Tw*DwkMU zOf*SVb5I&kmQcS)p@|(hMi)m+T~BUWp$eSPic;Y!|C*3HQN&s;R>Dps65WYUB(^7_ siI&uriO+^w5+jKL#MAg+PTY|Abn3IA&G@ZJwI|w