From 1f5ac5e0ca625462f464f85b1cbde4e4ef116c3b Mon Sep 17 00:00:00 2001 From: admin <3364509428@qq.com> Date: Fri, 17 Oct 2025 23:32:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=20More/t.php.bak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .htaccess | 1 + .user.ini | 1 + ...-ZsCxEnxBF8w8EmIGEjyzXwjruHy6xjD7214zN8BBY | 1 + 404.html | 130 ++ 404.html.bak | 130 ++ Dashboard/MaterialIcons-Regular.woff | Bin 0 -> 57620 bytes Dashboard/MaterialIcons-Regular.woff2 | Bin 0 -> 44300 bytes Dashboard/app.css | 1058 ++++++++++++++++ Dashboard/app.css.bak | 1058 ++++++++++++++++ Dashboard/app.js | 93 ++ Dashboard/app.js.bak | 91 ++ Dashboard/b.php | 49 + Dashboard/bing.html | 49 + Dashboard/bing.html.bak | 53 + Dashboard/bing.js | 49 + Dashboard/bing.js.bak | 47 + Dashboard/index.html | 267 ++++ Dashboard/index.html.bak | 267 ++++ Dashboard/msg.js | 235 ++++ Dashboard/msg.js.bak | 235 ++++ Dashboard/t.html | 984 +++++++++++++++ Dashboard/t.html.bak | 983 +++++++++++++++ Log/ExpiryReminder/.last_clean | 0 .../ExpiryReminder_2025-03-01.log | 3 + Main/BuyGoods/generated_strings.txt | 63 + Main/BuyGoods/index.php | 98 ++ Main/BuyGoods/index.php.bak | 93 ++ Main/BuyGoods/product_codes.txt | 22 + Main/CheckIn/index.php | 17 + Main/CheckIn/index.php.bak | 17 + Main/GetGoods/index.php | 50 + Main/GetGoods/index.php.bak | 46 + Main/GetInfo/index.php | 5 + Main/GetInfo/index.php.bak | 5 + Main/GetProducts/index.php | 33 + Main/GetProducts/index.php.bak | 26 + Main/Hv4.Function.php | 234 ++++ Main/Hv4.Function.php.bak | 179 +++ Main/Hv4.Logged.php | 64 + Main/Hv4.Logged.php.bak | 63 + Main/Login/CallBack.php | 31 + Main/Login/CallBack.php.bak | 31 + Main/Login/index.php | 53 + Main/Login/index.php.bak | 53 + Main/Login/product_codes.txt | 30 + Main/ProductsModule/HK-FREE-EP/Main.php | 120 ++ Main/ProductsModule/HK-FREE-EP/Main.php.bak | 120 ++ Main/ProductsModule/HK-FREE-EP/s.html | 374 ++++++ Main/ProductsModule/HK-FREE-EP/s.html.bak | 375 ++++++ Main/System/ExpiredProductsCleaner.php | 211 ++++ Main/System/ExpiredProductsCleaner.php.bak | 211 ++++ Main/System/ExpiryReminder.php | 212 ++++ Main/System/ExpiryReminder.php.bak | 202 +++ Main/System/Log/.last_clean | 0 .../Log/ExpiredProductsCleaner/.last_clean | 0 .../ExpiredProductsCleaner_2025-03-01.log | 1083 +++++++++++++++++ Main/System/Log/ExpiryReminder/.last_clean | 0 .../ExpiryReminder_2025-03-01.log | 1069 ++++++++++++++++ Main/System/Res/ExpiredProductsCleaner.html | 74 ++ .../Res/ExpiredProductsCleaner.html.bak | 73 ++ Main/System/Res/ExpiryReminder.html | 86 ++ Main/System/Res/ExpiryReminder.html.bak | 117 ++ Main/System/try.php | 74 ++ Main/System/try.php.bak | 74 ++ Main/ViewProduct/index.php | 28 + Main/ViewProduct/index.php.bak | 28 + More/Get.php | 50 + More/Get.php.bak | 50 + More/jwt.txt | 1 + More/t.php | 16 + app.js | 200 +++ app.js.bak | 145 +++ bbg.png | Bin 0 -> 117920 bytes favicon.ico | Bin 0 -> 234932 bytes inde.php | 311 +++++ index.html | 380 ++++++ index.html.bak | 380 ++++++ index.js | 0 index.php.bak | 432 +++++++ 79 files changed, 13493 insertions(+) create mode 100644 .htaccess create mode 100644 .user.ini create mode 100644 .well-known/acme-challenge/o-ZsCxEnxBF8w8EmIGEjyzXwjruHy6xjD7214zN8BBY create mode 100644 404.html create mode 100644 404.html.bak create mode 100644 Dashboard/MaterialIcons-Regular.woff create mode 100644 Dashboard/MaterialIcons-Regular.woff2 create mode 100644 Dashboard/app.css create mode 100644 Dashboard/app.css.bak create mode 100644 Dashboard/app.js create mode 100644 Dashboard/app.js.bak create mode 100644 Dashboard/b.php create mode 100644 Dashboard/bing.html create mode 100644 Dashboard/bing.html.bak create mode 100644 Dashboard/bing.js create mode 100644 Dashboard/bing.js.bak create mode 100644 Dashboard/index.html create mode 100644 Dashboard/index.html.bak create mode 100644 Dashboard/msg.js create mode 100644 Dashboard/msg.js.bak create mode 100644 Dashboard/t.html create mode 100644 Dashboard/t.html.bak create mode 100644 Log/ExpiryReminder/.last_clean create mode 100644 Log/ExpiryReminder/ExpiryReminder_2025-03-01.log create mode 100644 Main/BuyGoods/generated_strings.txt create mode 100644 Main/BuyGoods/index.php create mode 100644 Main/BuyGoods/index.php.bak create mode 100644 Main/BuyGoods/product_codes.txt create mode 100644 Main/CheckIn/index.php create mode 100644 Main/CheckIn/index.php.bak create mode 100644 Main/GetGoods/index.php create mode 100644 Main/GetGoods/index.php.bak create mode 100644 Main/GetInfo/index.php create mode 100644 Main/GetInfo/index.php.bak create mode 100644 Main/GetProducts/index.php create mode 100644 Main/GetProducts/index.php.bak create mode 100644 Main/Hv4.Function.php create mode 100644 Main/Hv4.Function.php.bak create mode 100644 Main/Hv4.Logged.php create mode 100644 Main/Hv4.Logged.php.bak create mode 100644 Main/Login/CallBack.php create mode 100644 Main/Login/CallBack.php.bak create mode 100644 Main/Login/index.php create mode 100644 Main/Login/index.php.bak create mode 100644 Main/Login/product_codes.txt create mode 100644 Main/ProductsModule/HK-FREE-EP/Main.php create mode 100644 Main/ProductsModule/HK-FREE-EP/Main.php.bak create mode 100644 Main/ProductsModule/HK-FREE-EP/s.html create mode 100644 Main/ProductsModule/HK-FREE-EP/s.html.bak create mode 100644 Main/System/ExpiredProductsCleaner.php create mode 100644 Main/System/ExpiredProductsCleaner.php.bak create mode 100644 Main/System/ExpiryReminder.php create mode 100644 Main/System/ExpiryReminder.php.bak create mode 100644 Main/System/Log/.last_clean create mode 100644 Main/System/Log/ExpiredProductsCleaner/.last_clean create mode 100644 Main/System/Log/ExpiredProductsCleaner/ExpiredProductsCleaner_2025-03-01.log create mode 100644 Main/System/Log/ExpiryReminder/.last_clean create mode 100644 Main/System/Log/ExpiryReminder/ExpiryReminder_2025-03-01.log create mode 100644 Main/System/Res/ExpiredProductsCleaner.html create mode 100644 Main/System/Res/ExpiredProductsCleaner.html.bak create mode 100644 Main/System/Res/ExpiryReminder.html create mode 100644 Main/System/Res/ExpiryReminder.html.bak create mode 100644 Main/System/try.php create mode 100644 Main/System/try.php.bak create mode 100644 Main/ViewProduct/index.php create mode 100644 Main/ViewProduct/index.php.bak create mode 100644 More/Get.php create mode 100644 More/Get.php.bak create mode 100644 More/jwt.txt create mode 100644 More/t.php create mode 100644 app.js create mode 100644 app.js.bak create mode 100644 bbg.png create mode 100644 favicon.ico create mode 100644 inde.php create mode 100644 index.html create mode 100644 index.html.bak create mode 100644 index.js create mode 100644 index.php.bak diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/.htaccess @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.user.ini b/.user.ini new file mode 100644 index 0000000..1116656 --- /dev/null +++ b/.user.ini @@ -0,0 +1 @@ +open_basedir=/www/wwwroot/hv4.fuxsto.cn/:/tmp/ \ No newline at end of file diff --git a/.well-known/acme-challenge/o-ZsCxEnxBF8w8EmIGEjyzXwjruHy6xjD7214zN8BBY b/.well-known/acme-challenge/o-ZsCxEnxBF8w8EmIGEjyzXwjruHy6xjD7214zN8BBY new file mode 100644 index 0000000..dc05b00 --- /dev/null +++ b/.well-known/acme-challenge/o-ZsCxEnxBF8w8EmIGEjyzXwjruHy6xjD7214zN8BBY @@ -0,0 +1 @@ +o-ZsCxEnxBF8w8EmIGEjyzXwjruHy6xjD7214zN8BBY.rsG2PpWul6LvK6yzgH7E1PafqwKFm6HWKVE8X0AgD-U \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..cc3dd95 --- /dev/null +++ b/404.html @@ -0,0 +1,130 @@ + + + + + 超值数字资产转让 - 限时特惠 + + + +
+

✉️ 超值数字资产转让 ✉️

+

📌【云端资源特惠专区】📌

+
+ +
+

🔒 高防云服务器集群 🔒

+
+
+

📍 中国·成都节点

+

✅ 16核16G | 100G SSD

+

🛡️ 100Gbps防护 | 📶 20M/50M

+

💰 特惠价:80元

+ 2025-05-17 到期 剩余约2个月 +
+
+

📍 中国·香港节点

+

✅ 4核4G | 40G SSD

+

🛡️ 2Gbps防护 | 📶 7M独享

+

💰 清仓价:8.8元 (续费 25)

+ 2025-04-05 到期 剩余约1个月 +
+
+

📍 美国·纽约节点

+

✅ 2核2G | 30G+80G双盘

+

🌐 100M带宽 | 🔢 3+5 IP

+

💰 特惠价:20元 (续费同价)

+ 2025-04-23 到期 剩余约2个月 +
+
+
+ +
+

💻 精品源码资产包 💻

+
+
+

🔖 OAuth认证系统 💰25元

+

🔖 Fuxsto Host系列:

+

V3工单版 💰25元
+ V4 CMS版 💰20元
+ V5数据库版 💰25元

+
+
+

🔖 技术文档系统 💰10元

+

🔖 Ruaka源码 💰15元

+

🔖 MyBT主机系统 💰5元

+

🔖 全套CSS/JS 💰1元

+
+
+
+ +
+

⚠️ 重要提示 ⚠️

+

1️⃣ 支付方式:支付宝/微信
+ 2️⃣ 售出概不退换
+ 3️⃣ BUG终身维护
+ 4️⃣ 同类别两件7折!
+ 5️⃣ 直接联系:📞 QQ 3220257676

+
+ +
+

🔥 限时特惠 先到先得 🔥

+
+ + diff --git a/404.html.bak b/404.html.bak new file mode 100644 index 0000000..e9df61c --- /dev/null +++ b/404.html.bak @@ -0,0 +1,130 @@ + + + + + 超值数字资产转让 - 限时特惠 + + + +
+

✉️ 超值数字资产转让 ✉️

+

📌【云端资源特惠专区】📌

+
+ +
+

🔒 高防云服务器集群 🔒

+
+
+

📍 中国·成都节点

+

✅ 16核16G | 100G SSD

+

🛡️ 100Gbps防护 | 📶 20M/50M

+

💰 特惠价:80元

+ 2025-05-17 到期 剩余约2个月 +
+
+

📍 中国·香港节点

+

✅ 4核4G | 40G SSD

+

🛡️ 2Gbps防护 | 📶 7M独享

+

💰 清仓价:8.8元 (续费 25)

+ 2025-04-05 到期 剩余约1个月 +
+
+

📍 美国·纽约节点

+

✅ 2核2G | 30G+80G双盘

+

🌐 100M带宽 | 🔢 3+5 IP

+

💰 特惠价:20元 (续费同价)

+ 2025-04-23 到期 剩余约2个月 +
+
+
+ +
+

💻 精品源码资产包 💻

+
+
+

🔖 OAuth认证系统 💰25元

+

🔖 Fuxsto Host系列:

+

V3工单版 💰25元
+ V4 CMS版 💰20元
+ V5数据库版 💰25元

+
+
+

🔖 技术文档系统 💰10元

+

🔖 Ruaka源码 💰15元

+

🔖 MyBT主机系统 💰5元

+

🔖 全套CSS/JS 💰1元

+
+
+
+ +
+

⚠️ 重要提示 ⚠️

+

1️⃣ 支付方式:支付宝/微信
+ 2️⃣ 售出概不退换
+ 3️⃣ BUG终身维护
+ 4️⃣ 同类别两件7折!
+ 5️⃣ 技术咨询:📞 QQ 3220257676

+
+ +
+

🔥 限时特惠 先到先得 🔥

+
+ + diff --git a/Dashboard/MaterialIcons-Regular.woff b/Dashboard/MaterialIcons-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 zcmY&^NelVwr$(CZQHhO+t!`$=Dp;-onGnG%1YJl`q9)OmoxnxQ~!cx z7yTwvL_vxFmrDfzAms%BFq1u;FO!o|pk)96AY1*_{QHG2qyvG0ft8*u0022U001yH z001b^-7WpDiJrqRN5%B30sjv_KLEfcmTtzs92WpU*)#y4J?2lST9B!co*@9hGW4&8 z`4=pp>u1uYzvM6XUw$aRAo>Fc^vBf7(e;Ws_PPwU|4;c6vAY`D4U;s#9fGPn0SECQP7GZX@2I3WUo4pB*5bE|8|@Fm_rEMeislDJkxA(b z7tCUlVW`i$#DWbQZsJMnX?Wci4^U?JYSLP9^{854ZTD(mZmHb5Kg#0WKDy&x2*LAw zTo>W>_}n7h_S_HghvODJCnAQCPwY%2)^GlIWGK?6;jNOlF0WOptuo*kv8|j_g}1_c zE+(DP(B{zS(DhLNP{BA|<)Y%`;w0l_Q6WO2EZKL|*ys_L#EFFrpqv(C%GE%Zc>Y>~HgyL!|@;oHhHQP}pO{tpwUsv%B#6 zd!u<`WFA2+30r%fO!U*(zhn@xA;rJNv7)dPqcC&`Gkpup)6p#8t-&S%`VH#+Vw47 z1ZrYVoekY6m!+MmkfSl@=(83Jh>RM=6@_BZ@#m2@gjSQDm~M#;i*tlcAUFkg;=PQs zMJnWEk_2tyBE8hNCL`jfI6N%DY2a%&bpE?0I6k{55d>M94FoUL_axD8r2MZ;xv-@Hvaw zq9i|4u;P4|nOd?89&S@e7$fg9w5ik7{;s1p<$%{Px^pXA)ZiJ*T_`9A%ZsrKN$)%D ztOb7M#2uWj)1nwnb0-iLgR~WM*q`jEA@w~(cU<3;TcGz6UD5z$GW#O`20df8;pRVY zzoC4zzo)g|0FvRy)=K0+BCPi)KabsDwpTdF%AsoFeo@XLYf`R3tW(N(V4APa8VTqO zYaFp!PT=^&)H+bv3U5T*5vk{AeXej$R;Oewpd^)uVn0)o;zmt7lRTM9REl*{mONZN z<|S<4WFKxe0$E{t$xn2nCGWG0$W{E${W(Sw*BQ{1U**^A&8 zI$rVs&Q8tZEFBp*nancPz{--(mmK4uN7@+{1uq?=-Qk{v}Ai(*JQ<Qb) ziI9oKiR_8ziS&uliH3S=!6yBgeC6Harr>SJm)-bB1PpopT0sz{MF16qoR^V~HVCLue&LVU6e$yTtP$;v!eHTHBEyb|!?`@o*sevdTrHJeop zwT0oAcEND0l*idnVa$A8P(K0ZVSeX`ivqs>8G5=X`&lYF5ee)Be(wuIckU$q*}<;@ z4r2#7nhUhaoUJcj*VC0s$-JYm=`HaJpLeRxTzn;J_aSv6KyL2}I@N-Vcnp-x5iQOX zh|qORY8E5lSTmQTC|@~e(_QfIL@S-9IHiq1PS)wZ*$t!IY(~`< z@a6PU3WzmFyeT?es(00UuAHM@*;!`}3SHx%=v)j#UpfM9*n2$NSKt9wR?y-h;`3^0 zlYNOTiCjHHknv2F8#vP^LJ`;lRH+t>(JB&-@R!sXn&Y*hje6bmXmdd%}w>*#3>A))z4~D%XF*+~}&sYg%I=ANO zz+0?E;B}3LCnPO}qgGQ!*}YM8HpXcy0t)~RdNRI{N?XQk$esPOG6h--f1AR(K2Yziif%z`E-CQd|Vjt8W*X++>o7Rd;B-rq6B<{d^Zlfz}sJqYrNd!pa_ zv~xQf91*{23mLP% z=BlE92usq)WUw6&Ro)nNR3PVL#>GlTLTK{`kJK^8KKJLHq&ZVA4;v&*36q<~QinCH z8E8{4&WTw=(-taC8{*&Y)m>{mW;<|X=qQp<-?&t`l^B*7m*i@fXMII|Q+)w_3;ssi z%qnt_Hr$~Zm1?=m@E-RRyV`{IWmoBEdvGCKTzT8TS91N#R<1Np$x??E36qMGdv<18 z-6C$)sM&E&c*s)~p)A_WQ4HKo+H)oAY8H!rC62qL1M);9P+;YW0|eykR*VC;U+M$b ztVo>Ecpx6C5U+sWXwHg;;i@n-q2H3Oeh+`um{bho(vHgJ^=3xK-bvtgD!Q+M%U>PP zQpY9F=}<8`)-ouvWJa~Y#!7b;#NGKhR^V@_k;Io-OE|z-BG$LdgV;o>~$$`2S05D;l@z?Bzz6w^+;vkT0VL`Ae&SJ zB7L8(p|q!#^NJ=dXA143B}42VU%KTfd%-Y_rKfmqA9`_DiO*O)Ij*dIQDvIVs0itZ>oVwYF~0%fjhehYKuIl;r$d0Z{9rb$9%=i zll)UXq1#cW|ECVFNqkfDd4YUbD+D05 zKJhAu2Ew|aPfc~ZCwAyQQIaVTo!aw5f0++2`+ zfh+wx1C4~2ezj|#t5caIHkncw<$=cm+JOvG0#m%$7+%6#0!l(uf>y#n0%Jl&f=7Z$ zLQ4YeM6o70Tq0?r$v#Hbi&S>oK*JS54wtBrT`Vs1WpP4tXE5gz9&el z<)-MSY1?K(>7M;TV#DV1BQd6`oqLQz>u%LYpC1Rvxm6ceTY_XuJ75~{Ri=3s%%yL4 z6#hikAX3@&grZH&61yjBtJqUC;@0^)_q%a0ZOcqWj3q!fZc&6{W!}EwL@8JOWf7;1 zoQZNbbVuXgqUc6R3poRBwF2_1*5G{UT9_g>pDmxZ=^WXsVIr-I@^#YnJ7jA-{r=6I&hH zN#!;#6L&mW<`MItoSS0tjqbmAvUogwxJflVDmDxZ*!0wKp7%)JmTY3p!_` zuHK_rDjtS~%J(<3mhcsP630pGaY|{xrTNUfkyAR2e)g|4d9Cps5uy_j7CP@6?Ks@& zD@oo9BS^C+ub8IcqJ0ttGfTxPO*MC3*);KI7SZWza^_vsPrlMgp+5&xU}>sG!wO{^ zR|1U!mknKuS7M8-wzvmTE^0?UT`PZ#$+IFUc4!P(5pCp z7b^|QjLrMQ$J5ibz-r3ga%PbOV#S%pE>P3v!h1SancBz>cSRYh9a=?~s;+s)!5DC* zhs}NNBxPb9{(sAtkPxmn)jm0+ne-N z2lo(C_W<2mr`PV|o*5!yugWoq57fBC^<~`xOZF1oV+Rm#!ZGsuSX|=0F%UyrA$%G| zty?ztS=*)7-2(-Vb5h7{7p#o(s;ls{VtRUJRB1_!?*J5fg}XrBY(FT1<1q@kF3-Y^ zhnto$jkY<0=g>?wnXk=`bXj66^8t?xUgLvG)2^uBq_m?G_vxMFH=`a4q-<@Kqbmp| zB>9l;CEI=+e-Y0nbj@oJ-|5m&y!eb})kCwC1|#U3#rTIz7s+a~y&WitVNrTy^J0QP zwIFd`$;0bb+`Qs*0EC3WQS1V8ibwY_8okmt%#-<84>$><$U7m0&Sf-WAIODLRZMEX z6z4JIJ>naiAf+1$V0b5GQ)-z#?pw6t_le&)} zV-DC~dpZj<`;$9K@y1FXhCI1<#^4?rl&@3QgD*^iA64x0!*B$+-7#UBWae z8y+5zDNDMW@1WS~!l&nI3&`zv23(b{R@kq!TJ?G{OPeS2z68QOa^h?zb6Fm#g5F+o z)565l!C0(>i90JJxK{xo!7Z9YB%l;G^8e{zs}KkH=E%>ead@Px{N;^xTF(Aih(%-(+? zaga~hD5!tGa;2Ed?Y7$VXPHjdNo>w;!jS;vL-J0eGAf_jEREX|t+DS-aJAM>a5*}7 znxOS_w%Y_v2!zBtliWNgr))mBt4GFNwi!;Gh3WME*}6}k3xFV`x< zLD6p(sai1gKU<~W5+)pyia28fSaQrTgkHOh4BzM%63Nh#v#v?$&}`kf48&L3fT`n} zq#E?+Nb_Xm?Xz(|{OZrxw>rH#%R1G<7`Fc2_ev)>5@uLnxCqhCGGIhAxt`=o za^rrmYEHK@DluA_x=!V0@^BC3fAe}SyPQ~?ad?~UXb`nlw!Yfj+{|txbSMd7OU!U^ z31UYoXj2)e46Auaq&@O5RqM+HH=mYQ{FHa^371(K-{zS5*J4HcUZbAtFDM_a62_-6 zhtjg78Cbj7yhMLTeqNnor!6X?j?v`G^whuBA<@G&WVQfbwss6WNV-0pTo@PYS(Z53 zCa2LF9}m@0K*EJ7gjNp06~1p~Dy68fV_%EYSZFn8Gv{>>FAAwXWTt18!lvP?EY%Dj zJ{}%)BNQKEpm@w2jH8EjF{LIST~-emATQdZTNhm$@1yqG(mxH9+IGf>Oayn;ho zgr3_1dOlpex`UYIRWQ*kUV$b(>T*L78OOW=L{D2zt8r#2)vTRS+NJPn4!cD2l=Qm> zCDT3vdEa6wLRLjfiTICBfIoE$nOu4he>^|toeqZ@MbCguI=8ItwBIdT)m|eG?Oi6W z`WU%V4M`Q~4ttQ(q8WLKZu z)AEbW>s2UiCgjd}(H4BydS_(kb;>oqjG*>GE|Maax~k(xvc8e}G4&zh&cjs3^pD#^ z@PkjZ^}lIv7cOrzZHM!QMzVVPn}?c1-aE(K4e)59b(9Ah2J^b*sf$s;f?FSaq%4I8 z3a%*hEijojCk&wi*oT_EGG22(GR*KWRjiK#{>^|Cm^6fj&b4K1D;idpG`RPFgi!&PcXzh}kwqAiwc$otwH-YVRm!q#YQJ%P&Lnt={ZWph5NFkx&SH>mQ z9R0T#;KyrtihYj6#PX~5KB7cR z=?sG$Sp{=PnlU!0s;KO#GxD8*}K%1W8<)k#|ooe|xCu5dRvXaU1MaI1r2So1D)!R|?Qa!}` zxlhNyu~9KGrfH1xF|+c>b%|O~;B%B!EPI|KN`=_4Qc1Yp1==k*xOyE&NUkN5mlY&V zzh$6;NIedWNI<4KD%EZtUn4p+(tYL5Kw7C7wed;|XI9emiYee@onsC2S%OA}siLnl z!S+<^Lf(0UMLl|=aC01W2;u=7WzJ>{ zCOnJCQjx|}GGWCScuq%(aeLgQ0<^m-b0x;3!Lpct?iI=ul-&Z|^fH?u+=054X>(WL zn>NGRNDmPHi=JT2!JkQy?1(1tP+uS`hCK5cv-^~R!vpy>lmEo-_Vuz76Pagjpc2=O z8S)vwxs()yw7TDz!{?|Dp;-&H5|;V?vO8#9Mcg_)`w?WlyUHCt9hN)hQxnLf=!?t< zE6X8qqtoFLWT?@4biJW>>KM-xl#~fL_k$Z$Q*^lA4g^YIGxaqaaP{?Q2aeO>(NjxFMOT>DrUj#tD|h-~DZ z+t(`cessRx)1Ncd?Y_c+#?C6f3c5ebY$1a!M_9Mxg6KNWaP;(PFG1zj?ea>=6H#A% zFd%fbE;F_1gl@k&tzMy(jZ(brs$XX}RmE7N_rRqzwf3;!xiT)Wm_%T1r=bt2Dbym9 zDkv@Hu6sKC06mUy>~J#@xR+c!LN+T@Ipx(Zh?Bx1*1&br5(;UX!y7!eZOmBYuvi_4 zF1nMcm?9z~krDCw_86JSPu>L|B5tq9rEZc^P_81~)Cze+Y+^AlYG9dB`W$e*2&=PS zdcWqCi6MNFa;yNWi9V9Ml9b2}G&kWnF_OKStk{z*H<%VY{{6boH(=8aCKLAm5gN*t zeu5{QWszDudu;9I2BP`!bZYO}%78#G&XA3M5hBZsU2TOta=alk=9kIC-U%ev>2H`G zwQAymG3vN3mLIz&l95`39l1cts_>&+Xb?X|T_F?aXBtD7DJ@;Tk+V+WEVo*k9bz@# z37+M5pP;60!T5spyVwhD2y$Zp;yl2OKub{etR6o}-ujDm#Pl(Wj_Q^%>Bss(C|aZN zw3!88I9;>;cFcK2df{w^$}td)k#l?(&dU3{XD8=5CPU2DxX@V`E3NNYYb#}EVJ~x@ z5%F0$6Hk=+Og3eL2M0XWQik1p^l}Q(_CHg06Bisv6n-YagwuLAE)BW&(~ zY8&0+G6Yx>fbN)UsVrPj7#AY2KhbRCo>7vGCXS2@b3AkIqk^e;nS@q`S&wWC?ZG76 za5BaVGco-O%-aAm#v6jtTvZ$Us+wURw`iH9r|-CXvcZlnDsbGcc zng6y^2tPHL_U$;kT_0(ghBIq8SGr^!hA-t~lnGd4ZR8zqWIYaN-d%=+kjtZ=gqku~ z{}H2TAxs9m!+!^fhaiBy84nqU;usmE9y}HW{8mwh4Fac^pji`U zeV7w>w55Iy9zV;rii7Xt!lbCS_IW>sXasYt)Z~YpA(fIcAIZMBHbnOIOTca63;grI zhq0SOY1>+-q?3B~b4i6+BDc2x$$gn8TF=Fkt3&5j7gU!>Kii|M@z7*;p4OM_@s}lG zB)3flH@%0&bJ1)*F66<~#<4WG14QyR84(F>t zJKwUP&Pz!#tg`QyL{BW zq&#q%U5FDtB7@T!?hqtgrN+X*skIAOv;b=zZBB-ER?C=Y+FCc$9q3kuEqD zyIEA-9LCD+IH1UYh}kwjYYs2HlzEG!6@F2rlGiKC|oLYe}fe zMNTJ;f{1#%58fpE1)P?&3(K7oMNPk%V$IYxgjyJXu-ppe86kDvmI2{o^ zEMV15dI-8`$+R`4U)P4($zoo{F4nC~b#OLQTC_sygyfj>?l!QleK$e;S!t1%o*pCm=VN~xwzT+le6Qq|bE&So zAnwtuG&1RkMDZIpDfRkHp;s@sqvGRYoB8iS8WqLEw$ag{l&qbKnH(O!3Wv({tZx(9 zrVG-Fh}u!&`2mB;R|cyvJM*)x;n=-!**cN9;ew-;rIoC(ay~fUia@`{U-Sr(Nxic6 zV4+!?uwHc#lnM|i?eH8~?ehpzOPxQ~^F!dn>jtnR*b@u`>)?i+dT9yg511ZXTEk_9 z4;OQX%m{^K1@_@IiEYsN>B0wl{fq0=P2>^sk}{+`-U#B(f+NcLDzb>uk_Q;oB4*q5 z1eXenJkr(JGeUp^6c$xV;wJ^ZfKBLwHTVp+oXD4D4RJu;*dSYZ?)zFP0)>jFI5ns; z`MbmMhaJ4&%i9DLOBwcR`xZ)8YlT&Eu?m#)tLu7|MMfTQffpqmvaz%=Y`E1ZO^%rf zB^|h)Yc6*YtO0R>N_*kNd54@5&QbqB`3$ zGxc6r%uWtB(G2a(H|=GJbi%E8e)UQG2OHe4oej(3FH{(QNe$gC#%85G^mpwV2{cP+ zWYoo??vPGz|NdOn#EZND+(h6v;igqoGHaFCcrOr>ot@3Mb}a!vi_BdWF}Z>YMev9U zdQFK-yTw$t1(V!_`xhBV_7KX6&dcoRv;lRCYQ?R*BMJiOkn1xm-CL>k90M(qla^>L z7u)BGp}ZzDI#zoEd^%Iy^W1JYEW5HEUUeEBDK59j?{Ai96-ITV6O&f@dg?dhrrJb_ zTLx0aWXe*63u#&Z*o<#=K-e>24OJ^3v<;@J{kGa-BI+k6_eO^snJVy+#?&bOB0Uva z9dt5nD|p`QbJK~8x!L52ZS*Ce0xJfQW@?;tRjzo!(FMyMW%b7I*fN3lC#Ubhqk!i zBY@}MCB;}M@2vF-Gbzjo@+>|td`#wFyuaZ`g+8nDD(5;Klt#;MxCbvCbRvj9Tjam2 zv*QNjKO<;Sm&Zv}doO!Y0diJcN(7VF$6@=f3p2mgmLp`=R1lNf5{9+09AGiB3xu z9U0v^z3hM7sJ^cA4#(nPq^z-3iW+7qAcJi{dw-%NMFosfx`@mT3=|0pEASo#k9K%S zs^G`yjm+Hfj+%+#otuh9U%s!RnH)HC1-QVZ;WqfD=`AyFWB^Zv9rHVMy%o6iN2aGt zbsQ`3@O2m6)J%SKDV-;)5IupQM`&6Imt+kvqQt~`(=Q^+Ha{P~u2SZnhT4k!EszM~ zy!Rmt6>-*?KinXOMO>r!dX`=j(ML);EE`t2RWKb=a}R+b)yBKq+eo7bDg)FJu2@Hd z)_C->k4dsxo^d_r(^h9b!bKN^(jh$2Me2wZAij(4l^ErF6_uF<8inX$N*KfrkZk1P zLC7}t*nyNWX=O*><2XZwFQ>bGC1P3x&A{h8HTGUYx_PbZMD9YiN(xmKlUbq)euF;T z!sNkeD-|>ry^R$@joo5C9RP`ou0mKW^eC!Z|~_q>TqxGE^JW` zgD68I9UUEgEdygOKmmNLuHHW&7--O+A4b14Nm*vmdPwMXfIvmiFIT|9Dd1Qt737dR zM%9guE0d{fMrRlOUke^q&}wr6zifDpRYpq(Sc?Ig|1=ubkW0Du(+?`6ilBHbKWGwx zm;_>CVb5MmqTydv!}7Y~-E1#`B9b+mQ74*cwvn_vVe~i6UTeT(&FO83$w?ZG~rF^Q=s^Y5r zZA6^(srpvF$0Oi7!B?<0wwNO3lF-2R4rjEG;UC(Z+`ts6B^elHE%U~6rI6B8xp-X{%|#>F;Up=Z|NP=H>|JzW4F>e)sM6)%MxX{!K$` zCRTLHsG?zPgXFvTJ72pVyBxb3yBNC`yA(T<52yIpDyOB`Ld56^{Xgw-{dT++eGsjP zO$6e-J4SRHfTF?7b0OD;A9=jo!8no7+|gJ4qU|X-QP%F9&1hhA9rYo*K<{kN%#wvQ z#-s+2UX+}`jAt8bYoiM;;jbOL*zZcu)?EK;^zgt8kv_1EXEWB?duZ1~f>V>$n+Cm2(X^CTUf`&zZu6m_X*tPSIlDwKta>5jV!(K-cNO-mK( z8L~#4y{Xms^Vm^In@bvwObEyw_9ZGvdOBu_Vt#gH39Np)bcy~ri?!-y3xHD#wnxxD zs_oAzD1UURp(=SZMuQR-$m1uKpV*y3ErRm}zu~L*s6cS@qHpt#Qx?;MG7BYySOmYf zS{S+umlE5fNuedLuB-JMrg)>hP1)ippzz47LK4;d~#PEl@t4jljp z0HBEy)ck8t1^o5p0=WWSx`ViGs5akrg;NjF58;zHBPHll#>KbSQBw+(iJv*jXJWY7 z{?G!SSzjD&O;b4uPfT9WFpf+_?%d$v(gZxDwrLwX?zE}cQ*oXdc+Z4Y7gkg_Omn~7 zqUg*1`TJ;YnNL6XS20YHz@C^uDBIyDjdAs|iJ;Y=&i*TT_Gj~F=8N~j8@fz%2xl{o z0Zq6xSF95pOaXP@vRieiGoK8M*LJTTjK-0=qPl#w_1|@D$q$JaZLnaV`H^~4s>y-e ziB?y?1Q&LWd*ARd6pMBKzjesZNtpQn1!Vb2d8OWILSPph4iZpD+d6b&y^4*i#f#!{ z%+@uFUNYdjR+xh?vH(a&u1JzoigdDjcBz$eX8S~tY_vbw74Y%3W@N#6T(zqWs8L0) zj-F$$ms4S$`|;-Jw?6K2$Y?q8>{oCh`**UdKJD{iL{NDUL(HbC}$2sXg*i=+26DI`coUniD8kh006JaS3WX zG>I1KO=J)9n;7OG`F*;NV2xfhKId~W-U|gWJxpJ(o76IGN5Sd*bL)?VW*hz|F+5G) zDBfo8b`R_0)Gd`%J6t?JB8OK1MpduT8KDZFQc32DV#6#bL0RbXt0X|W{&J*P|~e-Ycu^>GyjV)cXW`i`}0ND5j#f3 zB{DXVVO@R?N zj$H%A-%eL^S+Vj$U0q3K%vh$#p#$w&+Q~W340=zT2RXL_N!xA|Mn*G=Byt3?Y{r^4 zzgS7Al&~hIlbfd0pw>e7Rj2oQ5e;C};OARprmNX*{Wt$&WMJLV?}9N9Hg2IbJxp*! z-`t;vr2@T4Uh+nfMX-5flgtZL)ctDz$#Mv%9C0)2CyVdL2>=^!7 zY64g&U=d9NA|I)T5mu3Cn+w>s=oZN#**S!z|p-)!@HIMB|zQA_7&R z(TnGDn#je1v%^+~;b#&bSr$z{jg z3}Z41!#>bf;|OXnuA0mjqzC*>m+2@Rxt^>6txplh;xfM-8e4*qu}rFqLm4zDxx-Sz zk4}VRZ@XXCK4=6?U2hGY#g_c&FGA<8i zgQxYOh7}rb6K6v4tQ$(S8m+C=D=)ie&O;!L<`1LTAk5W%DRIU)YB7Ru;N=D*e#g3? zr0wPFxVXdUNN8JF1!NfuByZI-50{k;Z%hn1i;-wS5rRiQZ0-pZY-S~2MHeuUo2^Yj z^d{eJlG%yg@^H~rG?Q}9n6VRS8FY7lRy+i4OM{YRV1 zxLrT&@c=S^*TmW{Y8w%ar213h2Y_}c+udPyU@9egcHDC(_31ygMa>C=*6!iq`g3BI zGkFqj>4Xjd9Dwm7dsnJ_hZF)1fD4UbaqA!KO??S$$nU)~`3eei+s2NNgh;u~;fDyu zxa=N82tjSVlJw$)w6a?OQWo->7({>5Mp2&jJg1hg&tYRA>~VnKhQEPVa9uU+jEmVE z!e2)wLfPaj$;!)FNP`UJQ$Lq5?q5;gp@nr#%SdK{>7^t2DkTP!Pq1G_v;&-G5YQl> z&lqBBbWPKpZsUsUjB;jIpF5~zc|dHC)aEGnrSZ959e(>ki!31B%+N6HaeQB_VQJ$) zYWyQm&tA`Q9(?voO%4_o>cGe++e?Hm+a7`%0nzRSd(i}H$b}6EPTKQE@CFzYsRsbV zO<-u(8f;|SEwdkdm|(b)ycAz0jVCpk*#WZwrNni$LQj5I8i)u31kOC+)C8=_7SI8z zm{9S0IUlD+h2^)IkSo0gpDg!)LJ&*>h2)^n`=X;&F~=AnxpA{=&Cz%*(KXyhsG)Cg zJz<6bt!eF?Pi-9vE&=?=HY!IO>n-smT_c@)^f7J&b(>Oamr-k2eu`*EWXTbSRQ#ZM z7^ZfOn_=}~jWCz(e?mYp)zOn0mzR~b*2%O1>i{v-D19Oder!9v#p(bFlzyEx~NR(#3&6kQe7&=O>N#+a8#GMFS^dilnJn4 zi1c4$t8A)Fs0-6%6pW>|!n#jG?2|=n`QGwX1Q@=mW@?)1ZoW%rp`KM|mpwrvJcozr zjVBHB!GofNn7JM-@U@JB*%4p^{vgCUW-gL04|Wk+#fMF|o6lLgg?RdM5#y)h>7~Oo zP$QCwbfC36|2?-qV+sO{?LOw(9AKxw^Mz;2#?X`Bs@fF`70IW;616T3O;jHK>076j zgi&_!yl(I2n~bH&cZ2W(mPN{-$yUBujL``fI*dt`cA|*HYsITX?KB`V*qPrnP!lzg z$BVLIXfd(cK2cr&5D`v}`}zoO>uulmg|$4vd^@&}pyu}>_tCiUo7UUn$U|8PxA_cQ zxl&mqo;Hd67$J&_-A3^G32blFA%Smy9#3&Zs}vc-6mH@A;dt#oJTf0d$U0tefBUi( ze2n^uX_YzV)8BSUNT2{14~iMUsNVt7BU@$>my~q`!`vTqIr4#?RAWKE5Xp34odH0= z!2ve8S}kaCX;%!mf!EYJ`kB>L>;Ze+);l+JRB7ysO3!YJXV)w&QI zg}xroV1rIv;V0Kl16=!P5N^I?y;?92q`hxuB;Bud3M|+{Ni{u@&7bo-FzSn)l zY~`^@>=K}BBQ;}Q+#XZu4(=Fn`)2m+u)!k-G_>)UdJ*78UUl(<>*P2>@BVZQV5hAo zWdV$`;yyP3TZ3{RTFtno>T&DA(sXUt+4TmfK_BXYdXVNN5I_(bXG|D1LSh^9VT;y| zCpA&nrqT^h!G~aZWlz}4#k;5_=GaNjYLL@SqR-NUh5~Zl{)Hw@HTgsK$Y98DgS&r# z7rj>}&o-u{u_3iYVfUxYv{`wdIo8er;YDxyMH zVX!28fL8)SiwiLX+HepTd@VBLGF7d<_zh#^tukHsh1-u2Ye?|!@S~rvvlbOZm;8p7 z_!SdfyIusPt5*6}RMk=Ui-?i*|lhrKy2hiCCH} z{a@(TFv_2pG+_@}jHS$RHm6yAp=!JK!LfKU&a9(#Q(Y>cnBTL=nW-^ZO0c1BH6%jK zZw3{1(BHzM5B(T|nmeLVO=*Y=+nWa>q&%LQN!wKMn0Vf5)FMS|o;K+Yr5zQ#$P5 zFg~G|Y?1Fk+3ZAhIV;!-LmP_7*dU&ibWyQ9Uk-$m(!wHBRdOY90tYPT8hK;Z@ca6@ zJ1{})hP<-4q?DDag~ja-ab^K@&~kA(pdz!`Fryzo(ZD{WdNj$ZHfJBtiiN@UrPkny zJ6cCDpFD|>U-B`ilxv1+2wOV;0vXgig#$y$gQ3>PoVA+oXIybK!Q@rU3#xoj3<)7B zOgDj;Q^M!^@b;zl1c4;sl!>DJTnlnw3*$fQ+6Vm<&Pzn_C^Jdb57e?<=#d0m6E15i z9iK1zIz@_Sma~f2t31w|4#q}!F53sc-JfDx&3kc%DeNK8@?!QTFp4@t$~g*>Hd$au z_?_Z=aec1!ZeVe^8ChBqD6XmTsXTxg#>5tIruKxle$imQ2u6155Gkkv?^5x8<%CgQ zWRml$ff*laDKm9|_n!oQ5uNe&)qFLesnj~~u@dmO3tchZ6szr|t(^UX`cNRK3<<&qNnWx&VOqIInKK3wkQr+F@BM>gLl1 z=JIi4g7!8DJ42l?txuQp1oU3_8dFjh`ksh5Sr=A#D)oO*y$>~nyptk=jLuS^RubVP zk!Sv+0+0muLTV=LWyJ!ND~@u8?3-?fX7wue?;2mEnItj1YUxvo&)fhviuaF2Eh*x$JdD-csIjW~)&=oKD=Y@5D zzWA(k@|86e<`*}GkT9?1StV&jCI6!vG@n`co_ z?y3XSG8TvQcKAHIG`4%nm|6R};Ry3Wmk=OT(ciG+uh$H!}vG-N{$SsUD>zWAl!;I-|wfQ|y-z)@~rFB28`08RtSLizn}dG1lpvbu(MM4b2fdt0Vj zMn~rDo_`bcozzlB&xZ|vzol?Ps>$i)s}&HsCRyxp*0ZfjP7MMG$XoT$dCzR!Rad(iGWZZ|i7E3C%M_4yu=Y2%y zDD6U}$xYoHzk+*+qZwr=!lY$84wBMXv5FKJC98E}ZX|&~z6&WS1_3aNa6X|};8wx& z4Amf)I!IiBKA0vDf)cV*@kH0G0{A!_=D+18Xfas>fspz;a!CHr?>!(w$Q`|@xyo33 zumRun9>55_n0bAxa{?lGnHkyH8Q%33*6KG_EDZ{0kBZMP#bW~+o6-4ThIFBV7Bo1c z`T011(VUflrkCOCzsx#3(^>-L?FEoATY{eo6yJ4-b!?rbcVUuPPb)9_MMN5l98cuO zP9Q$(@MR4^4BYsL)A|K{a(32OCjn%{MMXYx*X`|Ptxz)^tPZ(TsrrEX%R(^Jtx`&sZFOlrsKxnJH{TUwey9>m{ysJ@I z{AAACnmx3%Ji__ZCkPP`Pr!+35kncGdc#)#c;O&v0^LCIPwP5+0Zt}p6>unz?V|(g z)WFOvv8;bnzdBHBU% zNlF%UbQ7$ia7qQiBkDCK^1Kb|E4p5#9oE^{msLot;F90$9oLBIq4aptx-FA+9b3S0 zC#Y16$RCtdL>$d8Oso{ThTSH{)~N^%Nws5ffvoRZHX%bq!y6d?q45$wYRCdu(ya?SFth-rGjSg|D)B0Xn((j%D-ITWgS-J z1U^4K7Z~4)B$n~r-z#4P3;o{S3#RAUWaQh+V?X^~Ir*;_Cy>1=jm|NT%IE;V7BNUB z2QYP_Ban0ebb2ZDuf-8b5@{=K_pb7IBlRZifea|`Q}`Jvp3d!&`K7BC7CLGnQ@-xj z3z;mxu_WQLySW6%KrQMwjL0}jj z3K;?a9Z1D*$6XrJr;udlV`S#;T1>GF;sqik*6a&xSQjQjp@}DvMrt2UFTY_qef7cv zU^;Hkn5|YPH1Q>P1WlMcTuxuNu#nDBtK@v+;ABV;RTUiH)6Y$u?{l7-hzv3b+}PS8 zdQ2PJw(+>>Pz|~-MYb)svsOcIG-y5L!9+jlg7!ZUCD^H^wdnUHqGXp~9a*G~)cMp; zpdaI6%QV0vfkQIP?JL}>H>Gk}Y7(g6W1HZVoSR)Ox2uL&7&e*>l_W=47?@pNrN8!Y ze2h>NB-lcnU8S9M{0r-xXUl@kMM`^|tAKIB4_{H$m4!lWx(Nf~Af1sKV2_8_O zsH`amIy8j3wr-lm5)_$Bh;ib9E)ogl*tK5tLt_FHpotu)A}3Stj43O@qpO{cO7=HR z-mLS`)=k{)C%cA<>#7k+zNY^OTKX-DgN=hIM*~gouk5gnIjgK+ftt_7lCe7`CL{jy z6O)q@g*~(HAEF5J*}&vvAUo+_gF(=QvqCm2d~B39+mG|O<49~0<#(4_uRu5Ob$Y7G zSak_8R^xF#8a*&KC(O*4B#*!slP-z=3}1~2iKzp{MnTA&oF+V2+2(i#-F#)9GyRn% z*#s-eENNko4yKS}Wf^vbG`UE&hQu0aD`j4!?p6eYIkHH_d?JxgK1K8}JmZ-TdA(k& zGGo}|4W$_`&rD5`2i{bW^S}ev>kUma9-a|*u4nHOl^{0eVG3l|Bjxqr6yx(T-dT?) zB1E>ky`&d=W<5;AU0Wg*a$r2{xsz~sw}Nm-F-@i3CAE{mP60+BX8Z9%@9Ve@eYBoO zYI{^0G=TgjVbuZef(LHx(cB7vHhNe4Opwz~fSY$Unvgz+w<21zi0K%)tOL?8%& z>}Cc*aE3FSo*X#4lNOlS*&uG#5-aVjw6l4oR@@}{Buf~Dv!vDflnBdtC1=5sqt>!d zI)Tpjt%Iz);hp94|JLdAVgB#E>IRA+Ig;-r`#us~9nh$%uCDOn?+ttCb)r0ap4F1t z{<*pR+3ZP8b~znmd-u=jC+4S7JtOPOC%}UL?>ZB&C0HWS_-&WWp!=xI<6^rKi3B{2 zAeG{hvOA5A2;*m+l2qtzkESeKC zQ%a@#RlRtn*pP}SXr%mKIemJv_l>)s&_Qxr#|EnVImHo$T>qFT!zB8S6y|~4KuZ-n z-$Ir_$HwwtRl_2jFqc$@W`+}QWS@%eZafWT^d#9YhaMR&Ib_Er=J$vD7X7tR-*Egd z8@EJv>o67qzGUNS*!M`{)C6M>4uF(XmqghJ$x{m4r$RPjFFgtpkqWy34nRgyv8>cS z$v#PQXc+G1Ci|(pwO5Eg!FO1^@YLR$m!A8|o=-d!9gRc-!6+Mh>cY~^FMs8^hd%LV zfoNnj8s(A}lK6B%Teg&DAQd(>6FwW5nC(6j>FZc!vT_McI?a|H$_AXnr`|5JY+8B- zHs@$_*;Y<(Aj?xLldEKR+Ge*J-NwsEX(mmGQ80fJ$h8|{H^ArQ?bMvLV9%T1+!Op6xMY8r&Pxt_ z{__E88@p&&|Iut@o!zH|;lQu%&;=E)j zm?yhkV8dqThFeCFe6KQepb52Xdbx7~Cox#XsOX7M=-q# z(1?)Llq>pj=nLVIaCqd~l=>V0pj7PdVE(blz( zlUtVA@;JI#PG|`kmQ2HdS<>{;_oA9EFfb61gb|9KLnIji!W*~(cL5xS*e_&HXMuX3 z^)$@?cKW}aW~+D(r~R+OX;W52Z>*nYRoUGV{1;$tWztXnH{N%j zi(XGX?0e`T?kz@o1Y7=DKnW($$f(#fnbd%<8fK-mp=lMpuIs#S86?5&usofhnLr|+ zd+dt$F%537YZX?8uLRp%iJ|2U$OR>kTd^Xn8l^R?|6c3qz0zUo^#u=dxLHuE5f4k; z5W1%Db5u!rEJnL9>4J3+-E0_i?2+=z@`QGM?T3!!WE0wnG zDizqqyQ0kxc6EJy)6#TMlNi_FS~?l9#vu!v`s*L+zv1JR3Nw1&cFP;iS1LALMEBv- z+IPyb3Mo^pAAs6U_!V-4@LO@^vsYs!WYsmGf=y614_RoPAwSTr51>W)B_IrL^@sZU zLM#EN@M+71I7Ts-&3={jCrKDmEjC>~p)Pgq2TeMmU&s|_74k44y}}4s3ygz} z_`I|mc!dLC%eM?Iq~xeaJFTq%Tb3UOJ$OK0!eoqJDrmL@j){C$P=~y$})T;26iQh28gnQSSr0Wgtj|J&932v>DgBCO43$%EETVX@% zclut3uh$?e;^#T#@5XsEozA;;W;EcjVS&;sHEHMBRe|an+)lq?n$5}8$=7Y7zB~Df zkdx84ONHeSe#WHH)3*i3?@8P<9{egv7|e2JYGY&SqDHl;vj4{#H?t%sgeejf{lF7+ z9e-Gz_20a(G<{?3{>;=RQyJ_MLqi>iPceU z_%Yci7DI*sjUli|rLg}pNDK^vb!r-LGg`#I0oNgkXq%)}eksfOX9X5TC5aB>n5S!V zL2!oOAvYcvxF!t*pw3gnT!uyZD2;)>b5c$ywl53*HLn!=?m39=HOIiurYQK#>*c@)F3qdq@c1UQ{QUAeaJYWPt+MJ36}e z)?1%Y?nM6ePUSz0onhWHW4GS=_)GlCOOo66RwSRk4zfTZD;9a1{HW){vaL;S&bO@L z3x~g3w-iu^t6c8OHNFlQwISlePy%J;ts-fn(y$sGeTgl^W^To--&@m^C-%pNpBf$e z&yC-T&D`=5UhFummml9BOG!fAc^gEf_MR6#v?9?XT{BqtYCHZyiuJ3Q8V z=(!_D?ml|-Zl3;HI9#pOv^Vh!l>YpUH%em8a1<9UHuwybZY$wW$pbL4iniiR7mHv; za{BwxW&G|bp&%TCV*Q)*vwKs{iu#I`EB_g#Cgs-8Pbn31BYq}Le3#mm7n4x)P;JZV zH^q!>-s78O*A4j;RGWiUh}jKP!A)~n zStB{WX2kBiGj{Ncv4aO=cQ&qC7t0z^Uq$TFH+XsJ4ow|G;zdt8_K?hFi*U<08a=&}2JC?RnIh&s> zOj>#}D*&wmuGeB21vi!|x9kddne3LY$Ima#{%sU}Jtqo0XHS})8y|P~CA!Wp#iEIL z8ZJNo^|4v#ue+n@^_lkYdK4z^*0Mv1Xl&_xSEA4Te{Y?B@NYs~pX?q^5;Ylo{RveE z_F33)T`B@EN(432OGWInfRVJu)*Adou&i;Q^n)?5f@NzuL(B=UG|&Elq*Ju|O&78t zWMn_fUVfP!dc5&CQ`xJpvYU!Ukpcy84YHsjzfbZyQ9_E1VudcC+i16#3ANJJj1cf0 zp|Jl-V@=czaZ@4i=9u<{aTJDq)1Y#zlUC6bIY-GO;Gg(ObD5Q%b@eUwgfs4nh8&~K%`j(k^s6CCh1k6*r zicF{LmUQn=*q=20C5TPQVnWgicGu&N-&Vcxu`2wrKY1MXkKI_kt?{STs^k)o9)`#_ zo@5=^k>pL!DC*Z}0Oy#N`5YK1eP3 zA<8yrGN%MJ!lDgBRGQgd#;;zthMTM$&a_vJn?0DKlDM{g?Wk=O_D>Fp+9pd#W!Ehk zWa98eHWvz|EwdR0Y!?a4Q5gdZ9J}|p5(`m%0OAIBjn@Xx^xXXcZ^Cn!UFz(7wj0%V*nI)q=cXYX3P<2`WiGo77Gg5N&d z2|pWu>~9~Rib4Gu)cBf1BL50}0;$lfp$hX>fwfgrM*IOamC3v~WL4_W*Pp#6J^OLS zc-0!$X#c+E*Yi||Ju87{ne^-@8rOIg7^8jE`ciUn3UnvC4^avWJejF0@Q+SGBz0wP zWyKQxwFaSNZt|E2koI|-0UzLmOpXiZNkrZ57ytlN$pM!#IjFf9w(Tm{bBkKV#zrO* z9&zaDC|D%6&141U*J&DSl*HMItf}x@)I3(VM(5id7#UqR9wBTi3wX?{(Fz7 zI}}cgWG5ykvLlIbsN3Ti_w-HdeI91HlDE6tTgD_d8GmKrb~f*Jb@ccETg>h5?CSOP zbhz9Lj=eV|kaNB*k|Yq zAi{;Tq~Qtj=tik@1=AWGLaW{@WoVuoZ(;+b#Py4s368kM5@byl8?a+WQ3>}Ok?3eN zVt{wmU}iAP1s)3Owfn>Sdjmk){+xy??|7ze`rjeobrwjO@#V~B=h6?^0()-jsH|ZT7)(8pd=v|q~KVAJt2@lk9Whd z+g6KMD*<`h;3gagtbG}4Qq>uO{50120c@H{TV2z26Sf-c$h}v`14!4&C8kb(SKP0P z4oHzg?3E-b|AJ>ZDlLOY$2n{@Qu@&5v~bDrIA@*PN};T9EN;1N?qLR2lW1st4HNpS z^V(ZqY1VaCfqUpVc#}|K>3&M|%xiS9NT>W3{_yk-%>}q{IPj<&*B*ouYw7o88Ms%6 z)R5ROXs0#O@gH74yz^Y@Iu;H(#J0!8coZmWN|M z?BU5x-bSbvLv6l^4+SZ{@FJvS*Kg~~Oll@NW6egO-DROre0luoP80Xn04LxrkUty%>#fT{xg5~Nh;3a_CFU&9CM#^^iKs%+h^Dg6D* z+T8A`DsM+>bH8;B>xQ^(^e#l*rf@FXJyWwgAsjVK`&6_4>>f#7td4z=o(OhaiO4%% zgMUv?ZQmowJ3NmRu=)dDJwhM11^5&&aiCWVhviu&& zD?AC(^|n4NNpG5TxBisfPi3n{xmF)+n5~Hvh7R>XtceNPH)lxx_b(sYs@+;vi!i8- zyRF6Kw$`IoYxOgY=5meK)3mBtZ=3%%_{=9YyAY#xEZQwsgztq3kIw$(PeUW!t|cGg zyhW`M!|;3IX>xSjHfro~L#<6BlIBI>NvNvLxeA}WId<%a5O3UmB@ZASO6!p2=LyFK z9gM(h;wvi-Aa_S9fPdfg}7 zu3jdSAT!EqyNZ#<$Yf8lD!1&k<>iDgNJnaj=wClFi7e664|oCw(zFYc6T=^R_sGo4 zK>ivv18v`xx#20M&mOZe@~UJV4$eK)lYIveIw`aG9%|#zi8gn0H z731{y$R3xw@k;dZ8=w3jNIis=xQCEC_*#rL;`}QpI=CZFihJG^vV3W-=-^|ZbT+>A zwfo-F*?GCM+t>L>XXhJpaag9irUsFJ^<{h$_nz*IbXm<%2>qcYb7?>F^M0cg9^2>uqneP1J?jHRpdtc+Xq6>-T{P6tIPxN;G+;ZRilQtE> zYPLN{0MXq7gzkp+AYZ#T2Y9~I>bnP~FH@DJXLdE}hG7&X$nsgKe;m?94vnBdY2c9J_0e8S&8FE}VFHoPo41G8$ihHTbGQNc^ZigLfG3PXcW z?hjm`I;Z%K>6&3`8@d4mSjjX?xRE@Syr5{VAZmbU4jA2j_%~|kU8k%XWhNP5=TmNlx;x8es!h zk$0_9r~vd~E+OL!aFCLtDPf~L3Q0n{Eo{!Civ10Y(kTyIfhro9#|e3m=QNk7@jT{5 zz8Cf+J^kwHa(;Yi99Xg<=oYJSU5{6*c|KB#_DEq$3gysA>?O>stgcqBNiP8Ur%^5& zx`|ddZDTdM8Ba=-s&y+_VsZ>o%ZW%^^6eysnHjvzH_A^6h#XW)oSx?6D^AB13b_8#hKC#&S zN8KN%A^Z+Xe@d{hd0{M>yh9k}|4Fp8vF*=Dt{&xREJ@^9a&3)FJ{mx8lfU6rU1>R6 zDEeBcTn1gGxv8~bnk<*4e?4npyU!3_msF6GAXXRZkCVg8Cz!T!Vv|?Mt1IS8o}Xa) zzmGK{`i5`D(5Q>J8C3x;x5%~0>?6#vzf%{)URAI&2^pTP?&$1 zK}hpB_F!YCj=tv-#T;p&^3BqCaWOF<+H&L3v-~tNt)-c6KLe<}uQBtSlgS5_a9{68F#F@VkuGOnU(cN`Z(?{RAB+E&`H{XJufw71 z%+37$djlS)+&eV;*hI+VML8~WvTijEcyNPbE!;qECrL9uk#cx|`^)=KW6IP{PkvF=2|f1~Xo%v5skbc|=_bKP=HtfX{4}M{m-$6SR9dOtcme zNs#VbNKwW~RyT}k8bja0>`bP>R14P-CK}g5R02R9&O@%BgE|DIVNQ#Qg1`d21@feC zi2~om3el-R(nyYj6mU(jbFh*kEBJ!C|iHW+lTOO-|i- zLKo>v;*I`tVKBYin>rplHoRg<4%T7gcFg8FPyXiY8?;*ODoJN__#QqwzoTf~L0;?2 zlFnXk&hdnCt;%WG3Ksu^O~_U!ViS$8#3o{I)-+tLP4@6aY;rO-5jPE(xQx|RuFZLc z)mdJO+HZ6?oASVB`|_%}dED5GD9Ih^Ug|yu+lY9=@}L+>z@N2~+FKcGg)}`dV%W|b z(9Aq?Pno@9(-}6pWY(fH*egIGtg}$rC^Mupj4}}#qPAxk{q@saR?KUfK`E|>My$f0 zBm|m?W*CXs!HWygfeDA^Sll&~zIm5An0IN;gS#G~MdU5r^Ly2vXm456`6=2aXp zFQbI~#g{rdzKFx-)%f^${FPT`e$5uK>k0_#(JxzKP1~M+@=D+&A~8$oh7n>P8{55a zys?pAJ}|AEoY;MVY0kac_`c=*%yD;i`ncGN{ZgdK56*E{4ystQ)mBL7I-813$WAm4 zbn-wP@Um06^dJLcLOULZ;796~2DlA&R!(oNU;VwY2ghTqzpa*)_r~5h9y_tAszRO~ z^4_6gr53h%=(15V%I#0S0gTMr<{WK3P?aQ|I=o5iRWP(>v8=z`ExWH&N&xQoR2tvZ ze{B2>nzHEslwUrUW5Z*+C*sLWByngat|qcm(B3*KLi*5(MO)6#op9(-g+e0UpNV9; zW)5}7!^g$e;u>6wTHr5%S81EJW0gpTiW*(&>czUSp|(ec*gsgvbQ z{Owv(M_RS?ruOCp^1afYCtszvS+}^kfre|fsc(RzjJfUI1yb7k#cN_Q>{lUv2qT z7Uvc@AeABJUI_(MH4v&s&?o+)Sd38LE@`OU8+dE}gwI)O;XR@#lZ?Nsf_h+Y}&M6#%hz24-$~Q+;YeaXQt6nU4iux3AQ!P;FDG z6|7Ntecwtjb;YWe*xQ|?wMOz}8=rPq{n4A1S)Bk$9i8{Uk$m?D); zY76pWMO)K25&{|e5LaXX)1=cHYP&JA<<}-%O<59g;B%5h@TVs=rpV`#axFu!YFA(hZB}#i_bti zansT%JMGv^TTRl5Tr92;m={mL&KCW#$wz;2t z@lpoBUBE!FXhbq>1*qxuF6z}+=^e$Fp?;=mV z0^adO`tgraN@aWz$|%zJSt^5m`bA2GcrRY^j8b_awZ=D2;teO6qTPT8H#B1eJxBT@ zqW`mWvk7HjSus=BzeWdAw}sGBYocp&&WCdY8q8`-XbGDu{GYrIskml*w>P4cuG$hA zt~9IAfi7G$gt>|+P-=}%8Y5P7BvJkKOS~Oen3YX_Xrub@SYtjOTZx*ufKIxglK5G= zukm#@g#x2Lr!%dIYghZ3Go-dk2AJy|6XfFmE&lnNy^Wk#I+xzDCrG& z4xDvha>k&$!Y^_BrCPSdPO1%md+jyi@n5e%y*LnAt8QgN7htigR~s8xIRa&%L~;mq z42w^j-<)}>{dqBZVZE`T>x%HiqD;}&*dwk~bB=Gy7cuwdB*g_^w9(uz=Pi)X@;W)z zg#9FY^oKW}RJEd6SzkA|`HD`+gx@rqa*F>7_45%Ohk+xU`6TIg(7htHapnAZhQau1 z`_5ls|MheGR~r8hMgzTvJ?LH8FF6IfSXolJRqS>?VeHbY|Gq?BX$=#T=?#3T3})5_ zU16n2M&kMLb%`XelwZ@Qx;@Wg?HoxJA3-*#iV5Xg!*v#0>^q7BQ@6v>208)Z4e7%gc>XQy_u1hjqfKj7sY_Y4?E|mEi-|Vem3C}py?#osYZy0T2m2MENfn2r< zd7(KTOy%?Q=s>72srJURXWv*`JnOAM?<|=&e;^qAz|CgmOM&|j{?dUbBuQ>c%*C}l zEyTDI_9XWY*rZs2I9e1Fkr|f>ZN<1`9Rs0(dJeuZi}Xk4Cq~mYIQ;!V!*dC^rM-kt zzr`;sKs+j*wEI&270vR&3;RHFP1ydB?Zsws79!)j_Tl$TS5nzB$gkG()h#eDfg9+6~QmN~O@c;(2(^x?zPxWO@#tb+~v zi_O^e^z1vthp4qXg;loo10zWz%(vvF5P%*UZtQ>+t1T;&nmcdV-;#MMD;Fu!Tq!UB{dXWxE$_d0aeujZNKTN~ ztdfuqaXtldVn%b!^BA6dBWr0^1Q<5>tgd2&{hDo8h8i-lk40h36}DeP?2cbRt7)t% z*-dBd@xhmtT5;9e)8jSKEc{V=do!C)p6 z7#a*@fZWq<`GiZreng57sw=f&O=bm|Mf*y?ei$|E{RgNX+)JG)V*CZtz@Mcw%;O$Z zh$E!rUpa>D7Q`>fa$wq`mo#W5TM@neBQ*DIY*InmSeKMzg!>@NvZ`)}b3JT<5{JpGZY>dnRnuAB`v0GwW zZ1?lh>!kan2PMh2#ZYH44p@G!y`9|rdh`1%Y&kf#?b_{gx&1zC-;N#6hLNW34s~{R z-7B`e0T;Sp%R?HVTky&9@yV-P$GXmySy}z)W?UbPu$Z^&FYDy*dm{5VTtYt##aX zEA8+LB%&QctB89R<4-B11~v_BjaRtQC>;J6aV@tA_A$%MB=SfVkm<5bM6%XZm1onxL({d4 z5%P1hN|s(rj#3%rl>FY59j+iB3LT)PT7~AgVxKUWYX2)W{0mWb%iw8-Edep?_Bi@| z-GRQYJq#PA!}BRz~|9dEO zqWP9;!hrmQ@HSPt^*OtPG@#@P-2STg+f_Qc396=S`MqH4Aw+G{X>R;1O|-P?aL%Ti zGzz3`rBGb+^_!o5`sUr!GrM-pOtU)NJUDpQ!*>l1(h8)r%67l0U3mKG3&XJk=gu97 z(Qi6}5B<atzKg8^uxuwxYqs{LE+Ef#k`1z_0H=V^Z3W z=cIjW+WmwiiCk^T^v5-8spiqii~WMf^QFZvfdx?GKf{Pk%_V!I>|=0>7d_v~L{hUl zbY{sT^hY18AYm!S(S+v-t|Oa+i5WDA=srhUTd+a~m8Q&P4c~CxsNA@CQu*TVotiwD zc;H1B`?PD}UeCYB)BowfZ^F~^v#DpME6@0kUi-zsz`0S__Wop-0_Ue3&rG{*4Iq^t z6(xd!oVvw|%w|r%N!+h)W)HO_xrb7t3!|e870&rGP2>!J6TcZHzFT4yhs2RBNI$I* z50cL}HBNF~)DPKKb4dPIAjA-sbj1Ms4g-&#BK&ROHR`WokfB#~>rJAw0e_2C9^>Y( z$VbvH-AibI60@E(RM??#Gzy05V;SM6H&Mp2Vw>%DGll8@xtH5|=7 z`JrsWGs48ecVkt{tOj?bwY7+!w8J6t$OKjc{Sj)LKTK)VNaO$tM6#MyB7)^TM>j~} z8%S?~G>~l+1KC#aG*^xaA=3lTRIJkx9)FCZi_m3O#H+eaC-oxUQ{nI;9+841sfQ-z zwqlv7-$QM9lq4?|dv%)%)p_hAD);Ahs+PzJdHD<+$XU$Qw&sVr#`&w7!KBi@FNxe0 zGl{*b7FSP2?Q3DbB(%3pQ_QtE%Z$Kbiu(eeMaV6bj&KC9*VC#yLFswnxN_>DedFn# z{=WX6)0ZwWNgz}C=k;{u$L~Hmz7**03i^8b5qp!*kH1Z_3WZyE1ROtBkeS}{>4uKLkqP7Z)x zLJ)!w2e`V5Hq*MkiYK9PY`2oW(YG$ z6-riSZ?kDaJPWC6@OZW)!6Pqy(+a(GdKei=6 zuCA@s1&Kj>l+Jd1g!UY^7uSh6GksE+>{T|YP;vp>Vbv-O+6&~Hm?Da91=5T8|W8luUi&c#r0!fLc@RPl=aEgnhVmo{?>cGF&x@Tp*Lq;B`%+Va)i z+NU??_fPkn%pKgW1w@a5?^Vj)mWdE=ap$)|R{9(dWT#$ABmV_fXD^6x677G&=V)#( zVE8^w7#|KxbDvH+pMC7H#&0nbrABqIoc=$x-xgyfd!!JLal!)Ii0lG1miXL(irJ7^ zYf()bw65#ioSEzo1XV$U~orNx2I97R?WW%jf|KaaoV(c zRf799rDr*uxy+q=<_lz3ni^J8VDt^BNNld;l3jjv?^}QF=KgNk(K$FdIS@vR>gArU zfG4UR7)jg#*g1XO?#Rr@K-j8JmFm;qtdA^Ck5%2cTVAKBmujY2Q?6CNI>iT=hWZIV zQa4vm_D}`6UAh{wo}o&@&2_4(x2rR#^mI)Q^z`^G^}-MxLi z-923cBLh8d0A-hhsewq)-G}_wXQ3uHLroNl&IN^LGs9R2j6s#K-}8BS4oiojPo;C) zd8T){I^~eu>FNs0T}qelofr1|Wj4^$(>L1J(=)(ENBtg;%jNO-M|Umsy8Qj4yX1$L zB7@_L@jkc5eVUL)Q& zuHRi1T_@=45>><8_T><`0Mw~}fKaiak~_aAp`|G15=FD)K8N3>B3coeeB1JCRd9y5 z-Z=3H?IDxoeV25Aw@6lK6>DcV%=g+p&_Xn5U|jRjbDee~2!k*mJqfhU6#Zi4r_ZhZ|MDoKN#y7~6?L`yO-8^+!ihFJ)}$-lSS@uaI`f> zeLkhO)f^i>yLm*?Y$MdLL`JfPLFz$BHtZThi<`vWSH((J6`V>H@X|v=1H-Pea}%8# zBKmA=4P_u7E0q?p2Pb8wnVaItSJyUkseQB(=_Hl=p80WZ5mDcU6Ss7TKd}=NF4)AW zlD64TKn{`3^mp|Y*gZ0q*JqDh$6H{k>+pCgx7B07<|!Q#+3OGS2#vt60u#KY3xX)p zf{|P~v3v&;VfBke2G7j&<>mHHRxC=))-6*knm`g*>nzi24b5B`-b1m%&F~q?*|yeP zf2G-Bk*Qp-mv>0x(m4Aj`=({>5GD)1XK9jNL=;`zxNo*qG-Ay25VcC;ZNIEVu8L z7=Dqa%jL|(Qtp$~e~OgNTi~|bo9Mpx3HKr0I3xMl@3HR?rc9Ijmr?r#mJIViB2wod z-xla2FgP(rPt2jh6;C!pDl#6w76>^mRDNP2-5(n^j1I3OH8hlRcsmSZIOdQ&PNzq9 zw0%=0dD2ap!@iFG#bi3|l6yRWItEx{o*vniPA3=pnajzT)5W&?9^ZgCi+72(&lZva zdbz=t5u&{yhB5^kfxQg-4eeu-vB^)zCS&j90Z~kI2rd-0EL>uyVw!J*Q~1Pwi(Z9W zdn=sWWt#7YOW-VLNoxLx_!jc5WH~68U>yp{oSbv!Q|!Lku!0cVy<>+Pb>L+y2D|M> z4dsfpYf_EV@Lb#Bwm2sMF(=@0^m1e6KI}U81d%ZRD{b054p0&;aE(z-q0A_fj6$B#Vx-sNuA9((zaPAR2hyO#{JN9 zWUoP6Ub&9HJH1u%S!g;^67DI$ND#kID~7(sCtl<5H~d>ugRp1lq+s$}D?0r#L!8^q z7K)QjzMnQf-fr(8=wRCRp6kW07w)5w^x+3d9R46lXBX-C{aYi})7N2ErL#R@N=c5s z$m7$CsqiiI3ixB+V&B5(kkl(+6#SR*$DvSjq4{$Jb}AU_(~>jr4oz7 zFIZn=K8ki*C-iu!gw}pv(BoR^1SQmaY+1n;zXw4hK$~-i<1OTNwS<3~kcw*(0;`(z zVba#4Hqc`jXE7q%g=GQJ;ZpN)V zMp^Nkew2=@f@U*8$EY*YB#rl?W?Yr5bdpEkv;FlvZQ6w_d>695Q(I6&vd6|7vT=-U zbU=33jW^y9BSrpk($~l7c;to~Zu~_$zo+Q&-0JD*^xRYg@z`x1PZ2KM28YF)JOTK| z1HZrV2|;}yr{g$WP0{(>4!Mw1Q~bHWEsj zXG_EyiGB(s8$+oM&hLI!;L8J<_H7M;S}ue9v{O&$dg3*KVo#i4aQ!v744)P8S-(fR zQq;Qnpe+Zb5kiMW`&Npo0{av{Aw$(XsIGI?K81T`dqQqB-6BmqGQoRn>AXhnir~U{ z=`=Ixl#bz=z*TU1bAo0%EJ;?gxO0*VvWzxOB?#S|J z5{%`U0vPY+{80!)cJj05H0`F2bA_b~7nXM2Wbs9R2){%ron#wff+SU@Y*J0}TuNzX z`9?AxXE&c*0QrtW0Sc5VWzQ7S;0JfzB%jk(38K4XSjCa&smYErlW^f>3iEWFJEz`B zJMug=S&`onz#Fo4bSb@)nY8=A+CIVd77!=^_qG%Olf;M*uQf>k2~)`-S`BQq84&FR zHdzRW7z--RcC*mkQ^TYn0;_F5sf9p8MC6o0z3I1oK8I`NH&$E@`(W_K+b*0td-H{J ztlHD~jUGoT<>+C%X1tn0((THX)*!i?3P*$S9jt3hI`5-(=ER zW75daS6cex@*B<;{<@k-R5y8C{j1uz{ot*NWPzJRJ~#sF%`}%;=UVb-m4JFv7R@PJ z%hBw7);ijDJ<^p8UY&~aDzHz9e1A_q-_u_XbmtRFcK~?eW(B(dZNPFWSq6jZgsCM$ z269$`LI_eV@OklBM4Jlo|JjKS4=CK_$~IJQw}5!9c3{teleoYPZew%M_!a~hjzo;1 z%+OGVb6_iMgT2W8{I=SfLJ6t|E@bCLufD;Ln}dTUCd?4L`F`iZv11ot!+iVc4g8HA zRg{G|vRVPO#x!CHI&9VrG z?)jmifmnL-b&=>q2Fff#nV+-0;>gpNB*HS64yRBE4AK@)%Q7m@UXQs9zA2{0N2Wih zyZ!OO^LJnsuqt0rW0UC+Ui17)OpT?FzU~|quTxbHNbTB;9r!aHG#*nG56|Fzf01MyDfHckil>It+dL*O_N^n(J3Y%8eArEJ@ zohWf88wLi3yanay6LEiJm|MahlzaL<=It2lT6IP~-rdZ z7tnnEq^9-z8prSP=*C~okNA6?J#+bi4tJu@*MIa41B1K9-uTA6>U2Au4pfaeJkAbx zS7%qc*Om2k##B#-)6?N_db`z3k1IB$xSYGw*QBpujGvpOx3Dk6(=SN3OA^CJ1M%~= z4;Lb=OL(^S=aca+a_J?5o;d<8Mf;+rbrGS0KN4rm2~X-_9UWc$-X7TlPa0V8yGKKQ zcvRWlHyG^aj~eiOQX5cD098P$zf9>}-F|H{5>9kDGLcTFHtp}rXe_BZT}~%+Zh6q& zUVKt0!_(~>peGHwov}VG-48BVL2u{Tr0VVhomq=6aT9RE#N# z5=!w8odR+=krGe@%)w3IxF*_xlpXn<;Q6<+C!_PT3#Tt77JmauU5~}IL_BzYX>>R- zz58IksQk|G*wO`7YP>5tpLpoh?&-ywW5@p=T|XI%=MU_jj>EU-gYkrhS_%;hsaxu& zngP-ltwSIT$3%f7uK*@u)=r#$T#%Z;exGtUK6uIJd}|`M^g)N?eQ$O8E-l4Qz;fiG zaaZ^Bg$%ztwB+imh59@OEKf_pzQ#|pv$!a+M+6>#N7eF5al(t{N^q4UehXkDph5E| z>!@Hdi@IT;45CN}Ok=3&Hcf&sgVjTa{WVG2B$*SVWLuVkDr8IE+OUUXy6Chcpc{IT zjCblf9GIF0zRvYJ8cdsn|F6TY4jV&^O+;NXu7|p0V`wRPNQBLf;)2JjaGm1WpkSv~ zsugR+4cM1fiwd1!7G_)RJ8b;YEak~_ z1eGavB}?ziF2yo21&qfj)>UfA+%VR)-_FD`PY-2cU)A5~-)2zdb6@U{r={0b8dGTLF$wLNRaCPFNmRhOr1$iP5zy#*=XH zFcg*Fw~wuIb%g#HREaIa4RG|3D671oTiYB9n(CIop2DOKXm$At|vHhj~{14p?A>mkA2<%Ax z@U_kIR~a;6N%pfe62w`KFx8wm!q9>Ongk_bSqn>e6}s*r*w_I`9@n(D!R}qCMN@o?D zXAOkBkecvRZ{<-p^FwEx-q&H`h#0c?WfFfdGu%I< z4K_BG@Wu~q;5`JSVTA7+T+WXzHm>a+1@SJml+HE?X~<7f3PKHrLIr@EEVY*)hS}@P zHO1Fo9~~Tmta`DaCEciG4^cM&V<$oc{W&OSXmB(`6?r=?upE_t-Ndhrc7#*X;aK<- zvb7KFC}F;Td^{M0?ViQOXk>9QQr%YK%;Ys9Cmk~*_;@zCTi`K(I}Qe?m(cMI`@WCXz`7BXcG&&6}D*J3Z7 zjA4BOpZ|OSIB7axhnM%?l%9tl?on9KAF<@Ke@fUV96Q8Tm;i7uMX{MH8-7r3BIl%< zM;X-qeuK0MKTfHB;nNquRTR8H*SaC~g_r{Prvj(!tmlS@b9KPR!51A0VVViHWOfy+ zHWNs%WmE07NvqAWlg*<7YC2#+PF(#{D&_YnWn<&M4#@wSM7wcM_-dFbD_<2V^JTNz zszudQpzQRu2K!^O2OCBofdGnwSvFIkaNtdJKNUI*FoYiX(CQ3(I3kWO1Rv8h8{Zt2 z6(9r*(*WW?kw@7~I=zxk&oEe{C&r4!u?bC^9L?UE9c3nB{53XyC@6Q_#W88_>X3s! z#I326@o_~Tj7DKtxy3g|oc|c7ee71s;&GdfPQ~ykBza*2Wm(KD2hV0%V^b)Z^>KWWV%e)|zqpz-BAp;iA ztGQGv_o`LEzwxs)k%$S$k>br??Xck_wYF=96`M;4AeQY^4 z0a+ft$STpr&n|r?9*(n(#--?)vz6$Ri?LxSVE*F!l*!LdH#Xvdn8cdx6@(%F-?F1s#8ay>la;j^x=PoG zrV){_!yN0^FWSg8r(p`PfsLcjrp#0h10Nxm3C;xl0|v$`#y-YZ^Y1ig`310Qy%BQ# z7tQq<&ej%yxC?E2_+1wRdEn~6MkLVZ^(Jl}?8n^&ezvjl3QZvV^A&TA@C+18*UXRx z&_P3;ooP@|ZF3}2fW$4gBGd!tO=*hkGe{Il_+t4aD=JDzFQPxDUN_cCYX;MpROWER zA;nNa2FSHbEMyREN239bddOm-kW@p|Q?e*Yb0(c0YNjlErlav{#~bD{iM~F=WTx&I z=v(g_aG=Y26VOl)6Mr|Hbo)bz=T2WbeF;A71;Uj)lI-nG zh7z4FM1gg6CPH)`?{Fc8qN^kRmk*tK=+r4ltaa#ROPZB$SrN#DR;utCQS%D07K#;r z%oa2j*rTKvDVr>V^-HXiUpM&4z(p9R@!<)T={^ogwYu1=zCs9(FEScZfT_2FqyD2V zh~LsP5#stk{%&NBbzxg@vYeWv29pt=PKK~0#OR|vWU8rc;AWnU`jH^p)8TWT^o2hW zVD7(12E#pcgU$_^IR*%OQ0wk+yPprGoNnMjIy>_(HR|+@Fv>Z8<#n+Am{|m0lG3UG z91G|0*$`RX@7pTl=DPN##v&_C2wDrPr#0h1w9m~2Y$c8z#NpU-lvet~_H29TvGDAX zBJt|1O8{#t*z+~c-Hl&+JbZMPS}AV5DL?je{tzFR-~>w62q6P8qdDoYgnma%Y8O#%CAW=sm&4xP|^2rA(qjO2~nY``XzDjNT>e zF_lES7Sd}swT?l~G}#VmD!0pF5Bq#qd?UV^4_t;p@mMB;>#}bIuENEB0A%+`jwXsC zy#r>&Q7w=O7*?A_$d1cEL8MV+3eZ)hD!gBlna$OV-a)vnpDVJ;;{_&B4pSr?jH*sg z#Cqei16FvCnr6Zk)6`0Vg92{pAX=k?eX<(jQwE&nEc-9+on2wBcnL>uhe}V zsBUz1u*hxGQ=M)fo!776m!l)y9m0G~QA1iiK4amlW@c5VlS9lHL=+GI)eW^;jYjiJ zH0BM^3bNwA5zSziN!E%iF9ZFxWge;GpXdyrm&-soY=TvA2{Z)sU*a9$CAoxoyFfFG zZMR0=Z+r~vYgZ!~@ZBwDA`B$_HM;uA)m2! zi~}u;e7(x{#y=4Izz1Ug(dQ4xPfm8k!^USXhQn7_r*(b62**1nZ-|Hcq8GzQ!WHRX z8L!H=LgPA`v6cj(0A1VFqKWLuhEfau{7po!82Q&VK1)Yz*}%!hgpK0NT&6+z`TPsC z|5~w(^9^nrATt*2Ww<2ZU&edW1oOS{-+43t-8gVv=U!vYQ8T=KoS=5JSM$Q@3m={y z9-bb)#m0NZb)gypszOisVP9rIPBipd@~3leHBSdwKlyej}J!wmDaF7IRJ zo1B!E|JTI-VxwJ+U-3G|CdOG8J3t45S0&+%2{L9N`aE_pK43EDtr&c^zmug*y=i=0 zUOA{8T#@aAKPJCHj_`9%{DKagmZt`jR^S<4BpU~b1+eQg>BZjnzrUB&8&C8aMlbYZ z8-tvzxH$SwvfsiSA4cy*dD21D9T~Z-M*QISJp6vJ%7Tc^FzFUG#(k{7ktUt)oqI}$ zX<2dz$mRpBbs>XOWsd{0bmix+5*66-)cN?h-rMI1&SevOD%j)6% zXX8tPR)=cI5$NSqt}qWvj4U@r^)i3om-UtW2fW^lSN;Igxy5@ij81eP@XB!e2VUWt zogy>gP5qBPb}e`>-XOw1S({d@D~u%&}!(ccfV-*I}w zd?eB+M43qIpg?xVkk}IgMKBQ(n-r&e{(2-FrVsQqd$&F^Xp9VYcL2jRIAZV*oxxQ! zUPmg<|1Mf3-x7((Zj!oIW&JEvq_&4!-dm&8lN|2Z{mCfc^?UTyF4MTobPd$MBW}iVSjRbMr(iqn$xB?v90b!ixK~{QRmmIh-G! zBvZXup;20ch`GZvj#|wzGhBf`fg42|GxBc-J!sCJ{R`hSKUyv7Mg4b(-(1{@AvG)I z7ng}Ao%(JJDd~Y|J?i4t*nyxbTcnD|rd4Dd1>Dhb?zOS6cSrmm?Mo1ma%|2>#vxl~ z?t<$y1I2D6%I0Xc>#hFC+!)hzw;{ zVBXp@^T5*L;iNh+lGu|-45&$$KG`Tu>iSE+Sg&^y&G#HJbf5nK(k&lQlLOvF!aI;; zlYNIK8vlh2OdRU-SIRj7r(2Yl%a%-exYY0dsVu&$DS2?ji&Vp>(ti%r%RKUPzKG z(yAjk1uL)LMrFS|6mjsPhtG|M-ik=KV%^xPh?4Ac6pm4n^hbC{AjFNjXlZ~?J+!f zj4%UgtV~uQh#62>hvTxy1v>~At&nQE)JnxQCpYyft#NBE%B2pu7?Oi*V=Cn`yrcGd zSi!-vOu{-e{+YQRWmT+&_Lxv!7a`hZN%5)5Fby^>&&oI45VJp@q8j{+aD^FmwB6%` z{r8;Yrn<0fq4wvoYto~!&+y&%!@tLl=}TB^Hho3QEvr2GXw3ewM}?Ek@#q-+gh`lP zj1_4|cT^eF&AtPw4;6whtR`Z>5u~tnZAn4>}qWlkabyQ)mS%H zwJUI~1Q&PA2QVY3|5I)XrK|`))K-l(ZFN;+MQydQ4!K-~i*SXcv^M6ZfFTGhlN&aJ zVg}I0OdYZ*>pHC=z-Kevw&(5N0im6X3O-8dUs1|*NH%|Py{Exr79^%=-2;zN~OPpar=A<7wb>x~BaqRKgD~B_4D6i2DbdUGkx_IR7yN?{@ zmw|_v$}AiM+ZyQCABWuTB&h=R6zn6;0=|6eY=;hgno{;&+BJTQb`t&0fZx^l@6x27 zD)3<}9g5*yls-l2uTk1I-U9d=K$nz@)oT1v?J;54iSa)=sfXtfLl*Aeh~4mO`gb74 zA2VV%tY4Ghh;lVph3=(Dj3j2uLRW{7e&5l5?S@zl4w$rlLu_*m=xG5&q`<0T6_^X= zAuFchbJTA-$d@O@qdcPMs)KqvQs*%`g1aB32#j>M7;O-3qW*L9?musi64Gz}nT3R& zZI3#`DU~EqA}W|bz&Nu)%drB{Bo9;i`Mr(xy%YU2i9?B*{>EQ14Ov%12#|4p0z7n< zCno$eeSI_j#vd1p=s+mBn{<~0jss|AOZq%NOz<*NcYLw{rG5xw~GTRD?Yz6qchGMqBTv_Y6 zOml$fa)a!F0>bI|TMwxduP7(i2*c_SLA=uOQll(%k-jZ7ai@$5hSwK$lq9|c$!?#vZ zN=VnHFf(`NB4*`7z|$QU0m#) z>D)UxxwrG>Hr>M1tus>{F5gd$1}}{UAMf3>r+4NI-gw5AYHm=iQs1pc91M4-N`OKA z4h63O)l_b`HXN5Eh6)I74@!IadZjZX11c`<{L<-5%C;3?QY51Tz{Gg~`dHq+BCR^` z_rDwJaNYOsziy2_8j2|wv4}Dz@$tm=^{RIEhC;oat-jHTYU^v#4s|5#!Gkn9hR`lF z&2?wwLX-zLZ}c3p4G`xOX>Lu8^A!6hk0%d?hJ!=C$=6T%5@9$7cgXwMaO0m6=JJZE zRDOhCiuAa94)pdO=ymrF@Za41!m^owJFbXck5)7a%>H`qfHvCS&4|++t#m5*j(laX`$xy#}u9ZYT^_q%CD(@ti67e8`ZDY%1SR5v3^pU zyxNZ2*+YJj$cdAjNJXLmGqio96tvR9D8JEo?{ePSfxy=&mW+Fj%#OvQ$^0_Yn}={6 z>bFnMQk%?=EBJAMq# zOt^Zlr!yW7;SGnUwRmi34lc){0LC}l;~96le~e$@-#R>rUbjfAP)zVN$0jUbZLk8o zKFEM&DJVj-IvZMbcJ|mpW-2{h)av}eoSoe;&022u$l|R%HfnKRkQNDzIl%#gGv&&?GK36E}Sx)AL z@F@lNdFzDHNSVr@v8O zU$25g$hvNtqGbY~4`c!%D72}HfZa1&luPx{q3YpZ6h@nfzTHVEg*RY7#Ks{KypRhu z=Sf>!$`ebLt3p35TzAa@ccc4UrH0O)zJO7^;z_`X^mXVa1k{Olj!!8uW%6o=gUGT(adg zk_H|R>R3f99oXK=*331Ntu;1ksafX7Yp`9?bP!FLIf>SbGW$0BR4YHqE+iM+GCJ|3 zW#Gg^p`V@3h5WF6s+U!I?pR~fy^VjE_`-0E&ERF&?i>B#(c$40*XZjWKj1T($Wvu# z@qRu|pknPdMGZ}~C^FZt*ycnQdeC398kcRSL5Ihc!I%dj%!Sg3UC z@imvDUB?D|;l{&YKVXh8Y47tzJR_A%q-qXSy4>D-h~TK%R8+lL0=G=b+ht&dH2jkIRg%!kQv+O4D_xj zCND#a`2tMhc{V=Xs~SbCoZhC*<{zL9B2mODwGPl1AhMYUy%$WTSyff&S`OY{&VjEL z4m|AQlZi7wtft&UPBp+ny{YNB>7~$JS4Q`EVBKbdOKzpBPrAeb7IJG)YYv}yy9%hpLtpwVn=4-Qhnkq%DD$wD*CTaqeP zjW0hC$qWTppfBd%6;-VTy)-SN-9wmNRTw(^ly7Vnno@A(Mk9Kf9Il@q~LJn!Bq5Ofg=5o1A6=DT8!Sl7JKcr5|`8U9FunG~ozOljkX z&6i@am&_L_jQ!;oC8uSX^GOTWP(l|W8K`y@_u2Ubos^e;0^D=oGOkBXMvRR+S>O)+ z^sA>g_U_fk;Tl}J;|~4QsTS%G*URaft=F=!;X0zWA%$)DzW{VL11C(p{ZPeFIuHxF?)j zoa))-9h)#a8~>g41jGGZo&VsK1fMPiDTIIm;VWBu(JXHRCTDpAkWBJdvhKyP@qM5T z{nLlx;h7^c;Pv3stK%5HJv%xNPZ{?A^q=74H$E5{aKO`teLBqoMNTCUz1L5clRWqy zP6AEwXU;aP!XgQ)w?Oq_Wy7del_DXOcCTw|XjA2nTqzj_7*DafVd(n0VVEQV&1q;< z753A+&*I_hg>FaBzO{6Cb7h-GbzXC_mzenli}pdVu7F8!(HJY!L3QO9q2+#P6mkfYunQ zmr7)j!2ospJ{k<0ysSGY{yIqeWq$~qOtXFj<6)sM$q$@7`GEW-{mg?8UWEg;1{c26 zD0!dw^b?Xx_-2^ZNFn(119%$Ujrf^f)eNO&htz_)G|AX?m&rq$;%jb5N0JH~S z61*SWeJ;nJz$xNNlQpVUe@|;J$Z_%Re_kx@*;De;n69JeCb)O9FkV}{L^Hvy3!~ZH zS&q&52;l^fWf1z%W-T|CCiFys)%T}m-4iYq&BTkvy^F=;i?L%D?>)MgJ#c*SSZ?x; z5?n7GIXo9LP919H`8?E9vSg0gW%%WXVlNjTfjie?zf-d9LmiS7C46s*@o`U}xs(Y0 zC=?~AIVs=?5MGdE`4CkJFA!*h@UU-k(wFj0O!|hynMhf?AruP*0WfE+!xvCvAz1d8 z6m{7jkw-@4Fp6N3{xJRox3E76Yp7lcb>E4E<(=JlyQ2O|#NXAmZ(mmz@;N@yBV-G{ zLr&U7Qc&*MZTmbZBEmG^+RqWY%+KwVOH~dh&i{1luUc=E>NPS_UaJ#)5|hYYxk%UA zP8xM)N`h}{Cr6|uN{)=!=fLEL4wKNr^KEcItT=dJ!PMlRUpP=`)E6E@sx$pA9+AFp zM9t^NV~qCd$Zoi1e^5&)nGT6nEGcM8nj-BRm6Em!Zbd3bO$YCKHIk}s&NqCwlz%dq!#vtgQGM!mJ^*O~`)vTORcLSfpzTqs3N(d)imxqnQ> z4)0KG9g4kw$6}i}i?2ulk}i-vI`lEyWes|POfW$(Ty;Qb$W5TTVh;S?OOdLsDEjK` ziLPE`CwjY1%mV9AvL!oDne-`58Fyiu+&z>#D^A`xSr-ZbCz4Xd94i#Y%+R*QSf$jc z=3&yMWMRV2p|M74_w08oA7k9Gf^=x_cu zb2F!-RoXy*KieJtkGrC}qL;@Ki-Y!RLGkQ)ybx)GN-8K@A5kS*CCx$T`bWaWlJK0G z`$+7ZyYaQ7ZryzjXoCK4thPUHwv>w*_dPdz{yswz+7>a$Ml7^p86CCM>%6=C>f+++ z;=9}5Ae+i$j%PB9JG{u9<2@GSd?0Jbdz1@8yvM9c@gB>eQYlmhqp;ObiDOg1DXZ~) zqmI|g2ESvC?iTFVyE)<#*H@-OR7$9T)_ZD>%YQT5qPa=q`y3N4;6Iad&7(&*L%UV> zjmy9e!m_d6JTlr~-u~6+Vc9OPi8eb1R_#kIuQr=&$h4iST>Z*xMk5UB$?JxK9`+Ei zmOk{RAO9!e_|>B$kxWaz~#o;?~+}3eG1m;%te3^&Ji!z^d2DXx-??_GMj5H zEX_vk#B3CfTJaY`ZttSSqip5rYSyKL_=P0Z$Er{>D#x&gF4*n(s&R5(V{PAY%Jpp* zO3d{j8tg?j`ZYAX*S?X%Z@!T9sjBbKfLIAC734YWOO_*jDk4)-`P_ukE%W?nIf6^Cy@k4t?4;ss0P;q!XnHclB%8UBAHrCUf z9|VupxynswGW5V%Z*p>CI5;O-nA$yX%v!-S!!Y%S+E(p$qf%VOQ{g+qsqToddarV0 zO-f-U*R-I-PkhJF!@&dYkxoF_}3p50+Kim-gXOUb{7 z54(tu?b@OIs+JrZOPb%y6T@gEnrXtOnhJvT1W#qUvOV=AtMC_6>F-B`|k35`u-{~v&bien#-S=Fv zCHD0GNS2_Y0SnxobH`HHZ*Blb%7MBho3IS^(XsL5F#{+(6mP4M(6b&eZ2XII< zppEhg>97UxNl>BC5jpS{lMqTw+#I@819xE#_mcP%3R*8jWf$zj=l^OP^-%_yO@b6ta-oj#XuK<(;* zIZ*ZYc1OKF^$#tKF2TovEQeW&yn!)IHcggmg!jhGuX7_(qXDW@1_Ue7D15B7MMaYW zNDI43X_r)-77*QQuQbXGm^|pLl?@Pr8L)K08e6=w3P;kFE4J-H-SXB?x2%F>vW9Ad z_*HD*0d|b$qkLVlO{8!H)bN0t107uhi>VfzyFy^eZT2W}7_$~}GH+2RSu98xdnS{> zbFfBK;~()tc!3o~0oTEYiJ%n5<#wZ}kb%6LQIYI6{)v~S*o7M}u#Zv}AEwcC@8Q8r zdgv;ZcCTfxN7{m~unlXj-34{tgb|R>;cTep01}%J1VU{#!G(M)=J!WhkO4=6LH9`K zm1Q}77QqB+WuyLQp!+;L^;-y!LefJ!^GkPaG7QHjdAz~W<5Bt!^qnBnQd(6AeCeEHs zo=ZqVIU+`>KnHr-%0%l}88)WS1C0rVvI-RT3YKc{r`Qk*J_*Gopjap|WtGSgjgsW~ zN{}@kqFkIINo`7MX|;1>nIsf!*(g3S2(`ZhtM&ive$_k_>J^&f^>+JzbrrvQNob6>G~3@plJUC3 zMYMDTD9KsrWXmoF404mu2pLcx5D!ELAW>3)02>UydMd4SI{V+ z(j90XeYp;x;LCWt%u}DZ>Iqgu1>CM@m4k9EFeYiY60mh*Bp-?I9NjCYP?~48&5FGu zc^|B@@y0hHb!$K_-h47GY+s9V44u7WOrrVq$sH;p)`aAu z>6Y(uQx?5#4gQ{r)!=V!O9NC${qr@T?$Oq)y->kM(IfSc^dnC=_ur+_!Tz$`vHio= zzzL;nFlnc!+*)FR`q2FKOO!x_WbE*k5qQ7;UCX0+DrHm4*DtPKjlH)Jdv5#UD%IF~ z3bCCEY_pJK$a0d-ju_D_iMC`CZGr6^dtdaPBgJBVx%VO1;&j4p8Jj(Fk5MWb%lTOB z&~iQ*jayeFAy%|U3iFtsu)-F$foXHn3(iI;^zeH9LfOGe}Qu8)#-zh#6Mh z8eaz9kcFJmX>k!*%SaI-sZ_##Vi~H2!HUFnH1Bpvz1$Y75D~|qR_34#DKV!o-&u&Xa|KA}n~o$hbSoXb^(Gv;?wHu)Up%tt-(#Kh z4y0mJup~~!QUkqA;)(;U$E)ay+@lYrK-JMB!-=;CnjsaNbUG(vDV&WNy!URl!Twqb zS@u7kY}Nw?wHfqhpGTTWW`8L&?@Vv+mq*UT5`DqjjaxGp5;1>o*%grSa<4y@xRANk zxV6705j!&?M1rC|6+qy15}wHD+>usOK|AmY`1ZG1SSrGa(Xz-)So^$)r{dsP4atC< zWD;t%o@IRmFz5aw$suYj>``Q|@SNA&OSB~CGV8XkgVrW7`lMia*A@}j299O`HPc#~ z>R0HmjQxOSunis^4k9Ndo=+%=?^FMU=OYU>)Ar-a65oy~E8KNg%rxHvTkNinljEV~ z>?C6N5rQ*ePj2UD!EyRFWA&j&RNXW;WAklYX?wX{v>%!$Y1<_#;HT9vAz?Lerb6I* zfWN0vC88JM{U9xO`jeKCBl?z{2(5-*VG{8rtg7pZ(x@?s8b-8_c92y9MW4$ymmjrh z&P=4qBaawsYXIGBnKVO78kb)sH5)5Jwd}SPo=7HH)l_R`YmY&*)Ae`qkjVsT*jU4K zYReU75Pxv5ufqg`MM!*&DlrZB(FtAN+3R%Z(|>`x82PQ0*+0S^c+}0QT81~ONXd4@ z9*wb!@oUm!@tdD{Cicvq<9UpJdh@S68+*3R^C!+de*!Q~Z{vDHR2jaNtGcqu>n2o2 zKOa-y>~d2pmqm$1II!$! z7^brE|69-&;G50#DfjdRo~AuUHk&&06K6(g*uN6&?hbZ;{U^@+1S`_m-`|Z_NE*Yv zV5X?9wxrrtV{o$;jBZ2&+1;7U?%9KLdk^m#oSr;X z7@9dWF>z=nd(+aAV2NG z4<~eGesbEeGJ7zzIGvBj5AU6$VjtGW_e_Qo+F&R&s3k&^d&YGKyYbM>P~p(z^k8&p z>831JM*6<{57>BnASbou!z%Hs+XLsEffBon*=*-Od z_(XP>S9krp>~62_y=h@DUHj$N$L|}Wqv`a>f0$0spP&<|d(&*)$2nodogk}|IcY)K zBT057ezzU^!EJ}|m+>lGp`dRRvPb5j3FhXTVVDgaL+~>R7YT}_Lgz4?i%9V6CWX=E z?s!P4KwNydhe_)g*Pru0c&hVQ{!GHlJW_K$GO$EM|gNB86~;KLZo^l1b#@M@hrv^}PnyG>RV0>B1tbP>nh{9+c$; z!ENrfN(J~|eWOw_&3~z+*R@4wB8{}+-Z|Q(^!vsWfC5@1WT+x0i5!>D)0JPPE7v4C zVfq$%w!*am%z`J%aXd$ub>OgoJ^@YD-2Nb_B{dLvc1OZmIIJC{QdnPb5F)aspuvW_ zqtRqnGWvc^W2;n9o5U}=Rc`JUbRnA}Zuw$`g8kVfLU#&ZSQ@`NX&DBI27%o8^vG#V z{!kc6Vvb3P<-S{Xqu^#CHokZ10!VUY^djKpzXEtvR-3il}LJuYkc+HBB2vLvppP)G9@3Qrb06DqP#pZV~!H zO~b4<#18Nk)7+%#jltXDu9$@#$c&Bk^Ote{CymLl3hzd@5`IEQQY zTfOa=$8*d%wl}e_GwgKU?R3r#cAxFu)fwEINbC)Eo<8Pu9`jW3+GBYBd9Ixtj14N| zF9a7x&nn{zeBL@XKE6IW5?okY2#$3 z`FiZ@Cs%cwAVs}?I!gs7JTJyD#MbfnKRgRVj3=Cpz9Qc)$5#N=E z2jU0+M&r*e(@DB*+grb_93cq3(sT$iacypu_hqQW7?gRDDpFiuXOd7JR)fmqRe{kf zl-xxevxjmtE?Mht%Fa zi0l`N_ulgP?QnK~p${;&`}%tE##@+gJJ4N;@j5sp;-I&(NrX<$1T|`B^kt-3k@5A)o)vM5OhOq=2NVfC zBChs_k+o{97s&&M=_S)#=SAuDy3WneelR0b@EsH|>nLJhTBaFYR!A&a;A=0J7qU

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG literal 0 HcmV?d00001 diff --git a/Dashboard/MaterialIcons-Regular.woff2 b/Dashboard/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/Dashboard/app.css b/Dashboard/app.css new file mode 100644 index 0000000..c4d7179 --- /dev/null +++ b/Dashboard/app.css @@ -0,0 +1,1058 @@ + :root { + --mdui-primary: #2962ff; + --mdui-surface: #ffffff; + --mdui-background: #f5f5f5; + --mdui-text-primary: rgba(0, 0, 0, 0.87); + --mdui-text-secondary: rgba(0, 0, 0, 0.6); + --mdui-shape-corner: 20px; + } + /* 页面切换时模糊和透明度的效果 */ + .fade-blur-enter-active, .fade-blur-leave-active { + transition: opacity .5s ease, filter .5s ease, transform .5s ease; + } + + .fade-blur-enter, .fade-blur-leave-to { + position: absolute;/* 保持原来的宽度 */ + width: 100%; + opacity: 0; + filter: blur(100px); + transform: translateX(-100%); + } + + .fade-blur-enter-to, .fade-blur-leave { + opacity: 1; + filter: blur(0px); + } + + + + + + + + + + + +.ldo-enter-active, .ldo-leave-active { + transition: opacity .5s ease, filter .5s ease, transform .5s ease; + } + + .ldo-enter, .ldo-leave-to { + width: 100%; + opacity: 0; + filter: blur(100px); + } + + .ldo-enter-to, .ldo-leave { + opacity: 1; + filter: blur(0px); + } + + + + + + + + @keyframes min { + 0% { + transform: translateX(100%); + opacity: 0; + filter: blur(100px); + } + 100% { + transform: translateX(0%); + opacity: 1; + filter: blur(0px); + + + } + } + @keyframes gmin { + 0% { + transform: translateX(0%); + opacity: 1; + filter: blur(0px); + } + 100% { + transform: translateX(100%); + opacity: 0; + filter: blur(100px); + + + } + } + + .min { + animation: min 0.5s ease; + } + + + body { + margin: 0; + background: var(--mdui-background); + font-family: 'Segoe UI', system-ui; + color: var(--mdui-text-primary); + } + + .container { + padding: 16px; + max-width: 500px; + margin: 0 auto; + } + + .status-card { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 24px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + transition: transform 0.2s; + } + + .status-card:hover { + transform: translateY(-2px); + } + + .metric-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + } + + .metric-value { + font-size: 32px; + font-weight: 700; + color: var(--mdui-primary); + } + + .metric-label { + color: var(--mdui-text-secondary); + font-size: 14px; + } + + .quick-actions { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; + margin: 24px 0; + } + + .action-button { + background: var(--mdui-surface); + border: none; + border-radius: 16px; + padding: 16px; + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + cursor: pointer; + transition: all 0.2s; + } + + .action-button:hover { + background: #f0f4ff; + } + + .action-button svg { + width: 24px; + height: 24px; + fill: var(--mdui-primary); + } + + .chart-container { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin: 16px 0; + } + + .progress-bar { + height: 8px; + background: #eeeeee; + border-radius: 4px; + overflow: hidden; + margin: 12px 0; + } + + .progress-fill { + width: 65%; + height: 100%; + background: var(--mdui-primary); + border-radius: 4px; + transition: width 0.3s ease; + } + + .nav-bottom { + position: fixed; + bottom: 0; + width: 100%; + background: var(--mdui-surface); + display: flex; + justify-content: space-around; + padding: 12px 0; + box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.05); + } + + .nav-item { + display: flex; + flex-direction: column; + align-items: center; + color: var(--mdui-text-secondary); + padding: 8px; + border-radius: 12px; + transition: all 0.2s; + } + + .nav-item.active { + color: var(--mdui-primary); + background: #e8efff; + } + + .nav-item svg { + width: 20px; + height: 20px; + margin-bottom: 4px; + } + + .user-card { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + transition: transform 0.2s; + } + + .user-card:hover { + transform: translateY(-2px); + } + + .user-card-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; + } + + .user-card-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + background: #e8efff; + display: flex; + align-items: center; + justify-content: center; + } + + .user-card-avatar svg { + width: 24px; + height: 24px; + fill: var(--mdui-primary); + } + + .user-card-info { + flex: 1; + } + + .user-card-name { + font-size: 18px; + font-weight: 600; + margin-bottom: 4px; + } + + .user-card-role { + font-size: 14px; + color: var(--mdui-text-secondary); + } + + .user-card-stats { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; + } + + .user-card-stat { + text-align: center; + } + + .user-card-stat-value { + font-size: 18px; + font-weight: 600; + color: var(--mdui-primary); + } + + .user-card-stat-label { + font-size: 12px; + color: var(--mdui-text-secondary); + } + + .user-info-card { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + transition: transform 0.2s; + } + + .user-info-card:hover { + transform: translateY(-2px); + } + + .user-info-card-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; + } + + .user-info-card-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + background: #e8efff; + display: flex; + align-items: center; + justify-content: center; + } + + .user-info-card-avatar svg { + width: 24px; + height: 24px; + fill: var(--mdui-primary); + } + + .user-info-card-info { + flex: 1; + } + + .user-info-card-name { + font-size: 18px; + font-weight: 600; + margin-bottom: 4px; + } + + .user-info-card-role { + font-size: 14px; + color: var(--mdui-text-secondary); + } + + .user-info-card-details { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 12px; + } + + .user-info-card-detail { + display: flex; + align-items: center; + gap: 8px; + } + + .user-info-card-detail svg { + width: 18px; + height: 18px; + fill: var(--mdui-primary); + } + + .user-info-card-detail-label { + font-size: 14px; + color: var(--mdui-text-secondary); + } + + .user-info-card-detail-value { + font-size: 14px; + font-weight: 600; + } + + .table-container { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + } + + .table-container table { + width: 100%; + border-collapse: collapse; + } + + .table-container th, + .table-container td { + padding: 12px; + text-align: left; + border-bottom: 1px solid #eeeeee; + } + + .table-container th { + font-weight: 600; + color: var(--mdui-text-primary); + } + + .table-container td { + color: var(--mdui-text-secondary); + } + + .form-container { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + } + + .form-container label { + display: block; + font-size: 14px; + color: var(--mdui-text-secondary); + margin-bottom: 8px; + } + + .form-container input, + .form-container select, + .form-container textarea { + width: 80%; + padding: 12px; + border: 1px solid #eeeeee; + border-radius: 8px; + font-size: 14px; + color: var(--mdui-text-primary); + margin-bottom: 16px; + transition: border-color 0.2s; + } + + .form-container input:focus, + .form-container select:focus, + .form-container textarea:focus { + border-color: var(--mdui-primary); + outline: none; + } + + .form-container button { + background: var(--mdui-primary); + color: white; + border: none; + border-radius: 8px; + padding: 12px 24px; + font-size: 14px; + cursor: pointer; + transition: background 0.2s; + } + + .form-container button:hover { + background: #1e4dff; + } + + .alert { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + display: flex; + align-items: center; + gap: 12px; + } + + .alert svg { + width: 24px; + height: 24px; + fill: var(--mdui-primary); + } + + .alert-success { + background: #e8f5e9; + } + + .alert-success svg { + fill: #4caf50; + } + + .alert-warning { + background: #fff3e0; + } + + .alert-warning svg { + fill: #ff9800; + } + + .alert-error { + background: #ffebee; + } + + .alert-error svg { + fill: #f44336; + } + + .alert-info { + background: #e3f2fd; + } + + .alert-info svg { + fill: #2196f3; + } + + .modal { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + justify-content: center; + align-items: center; + } + + .modal-content { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 24px; + max-width: 400px; + width: 100%; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + } + + .modal-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 16px; + } + + .modal-title { + font-size: 18px; + font-weight: 600; + } + + .modal-close { + background: none; + border: none; + cursor: pointer; + padding: 8px; + } + + .modal-close svg { + width: 24px; + height: 24px; + fill: var(--mdui-text-secondary); + } + + .modal-body { + margin-bottom: 16px; + } + + .modal-footer { + display: flex; + justify-content: flex-end; + gap: 8px; + } + + .modal-footer button { + padding: 8px 16px; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background 0.2s; + } + + .modal-footer button.primary { + background: var(--mdui-primary); + color: white; + } + + .modal-footer button.primary:hover { + background: #1e4dff; + } + + .modal-footer button.secondary { + background: #eeeeee; + color: var(--mdui-text-primary); + } + + .modal-footer button.secondary:hover { + background: #dddddd; + } + + .pagination { + display: flex; + justify-content: center; + gap: 8px; + margin: 16px 0; + } + + .pagination button { + background: var(--mdui-surface); + border: none; + border-radius: 8px; + padding: 8px 12px; + cursor: pointer; + transition: background 0.2s; + } + + .pagination button.active { + background: var(--mdui-primary); + color: white; + } + + .pagination button:hover { + background: #f0f4ff; + } + + .tabs { + display: flex; + gap: 8px; + margin-bottom: 16px; + } + + .tabs button { + background: var(--mdui-surface); + border: none; + border-radius: 8px; + padding: 3px 16px; + cursor: pointer; + transition: background 0.2s; + } + + .tabs button.active { + background: var(--mdui-primary); + color: white; + } + + .tabs button:hover { + background: #f0f4ff; + } + + .dropdown { + position: relative; + display: inline-block; + } + + .dropdown-button { + background: var(--mdui-surface); + border: none; + border-radius: 8px; + padding: 8px 16px; + cursor: pointer; + transition: background 0.2s; + } + + .dropdown-button:hover { + background: #f0f4ff; + } + + .dropdown-content { + display: none; + position: absolute; + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + min-width: 160px; + z-index: 1; + } + + .dropdown-content a { + display: block; + padding: 8px 16px; + text-decoration: none; + color: var(--mdui-text-primary); + transition: background 0.2s; + } + + .dropdown-content a:hover { + background: #f0f4ff; + } + + .dropdown:hover .dropdown-content { + display: block; + } + + .timeline { + display: flex; + flex-direction: column; + gap: 16px; + } + + .timeline-item { + display: flex; + align-items: flex-start; + gap: 12px; + } + + .timeline-item-icon { + width: 24px; + height: 24px; + border-radius: 50%; + background: #e8efff; + display: flex; + align-items: center; + justify-content: center; + } + + .timeline-item-icon svg { + width: 16px; + height: 16px; + fill: var(--mdui-primary); + } + + .timeline-item-content { + flex: 1; + } + + .timeline-item-title { + font-size: 14px; + font-weight: 600; + margin-bottom: 4px; + } + + .timeline-item-description { + font-size: 12px; + color: var(--mdui-text-secondary); + } + + .timeline-item-time { + font-size: 12px; + color: var(--mdui-text-secondary); + } + + + + + + +.material-icons { + /* stylelint-disable-next-line */ + font-family: 'Material Icons'; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + -webkit-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; +} + +@font-face { + font-weight: 400; + font-family: 'Material Icons'; + font-style: normal; + src: local('Material Icons'), local('MaterialIcons-Regular'), url(./MaterialIcons-Regular.woff2) format('woff2'), url(./MaterialIcons-Regular.woff) format('woff'); +} + + + + + + + + + + + + + +:root { + --primary: #2962FF; + --surface: rgba(255,255,255,0.95); +} + +.card { + background: var(--surface); + backdrop-filter: blur(12px); + border-radius: 24px; + padding: 20px; + margin-bottom: 12px; + box-shadow: 0 8px 24px rgba(41, 98, 255, 0.1); + max-width: 360px; + transition: all 0.4s cubic-bezier(0.18, 0.89, 0.32, 1.28); + border: 1px solid rgba(41, 98, 255, 0.1); +} + +.card:hover { + transform: translateY(-8px) scale(1.02); + box-shadow: 0 16px 32px rgba(41, 98, 255, 0.15); +} + +.header { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 20px; +} + +.icon-wrapper { + width: 48px; + height: 48px; + background: rgba(41, 98, 255, 0.1); + border-radius: 12px; + display: grid; + place-items: center; + transition: transform 0.3s; +} + +.icon-wrapper:hover { + transform: rotate(15deg); +} + +.icon { + width: 24px; + height: 24px; + color: var(--primary); +} + +.title-group { + flex: 1; +} + +.title { + color: #0A1F44; + font-size: 1.4rem; + margin: 0; + font-weight: 700; +} + +.status { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 6px 12px; + background: rgba(41, 98, 255, 0.1); + border-radius: 8px; + color: var(--primary); + font-size: 0.9rem; +} + +.detail-grid { + display: grid; + gap: 12px; +} + +.detail-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 0; + border-bottom: 1px solid rgba(41, 98, 255, 0.05); +} + +.detail-item:last-child { + border: none; +} + +.label { + color: #5A6B87; + font-size: 0.9rem; +} + +.value { + color: #0A1F44; + font-weight: 500; + display: flex; + align-items: center; + gap: 8px; +} + + + + +/* From Uiverse.io by xopc333 */ +.button { + display: block; + position: relative; + width: 56px; + height: 56px; + margin: 0; + overflow: hidden; + outline: none; + background-color: transparent; + cursor: pointer; + border: 0; +} + +.button:before, +.button:after { + content: ""; + position: absolute; + border-radius: 50%; + inset: 7px; +} + +.button:before { + border: 4px solid #2962FF; + transition: opacity 0.4s cubic-bezier(0.77, 0, 0.175, 1) 80ms, + transform 0.5s cubic-bezier(0.455, 0.03, 0.515, 0.955) 80ms; +} + +.button:after { + border: 4px solid #5A6B87; + transform: scale(1.3); + transition: opacity 0.4s cubic-bezier(0.165, 0.84, 0.44, 1), + transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94); + opacity: 0; +} + +.button:hover:before, +.button:focus:before { + opacity: 0; + transform: scale(0.7); + transition: opacity 0.4s cubic-bezier(0.165, 0.84, 0.44, 1), + transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94); +} + +.button:hover:after, +.button:focus:after { + opacity: 1; + transform: scale(1); + transition: opacity 0.4s cubic-bezier(0.77, 0, 0.175, 1) 80ms, + transform 0.5s cubic-bezier(0.455, 0.03, 0.515, 0.955) 80ms; +} + +.button-box { + display: flex; + position: absolute; + top: 0; + left: 0; +} + +.button-elem { + display: block; + width: 20px; + height: 20px; + margin: 17px 18px 0 18px; + transform: rotate(180deg); + fill: #2962FF; +} + +.button:hover .button-box, +.button:focus .button-box { + transition: 0.4s; + transform: translateX(-56px); +} +a { + text-decoration: none; /* 移除下划线 */ + color: inherit; /* 颜色继承父元素 */ + cursor: pointer; /* 保留鼠标悬停时的指针样式(可选) */ +} + +/* 可选:移除其他状态的默认样式 */ +a:hover, +a:visited, +a:focus { + text-decoration: none; + color: inherit; +} + +/* From Uiverse.io by SchawnnahJ */ +.loader { + position: relative; + width: 2.5em; + height: 2.5em; + transform: rotate(165deg); +} + +.loader:before, .loader:after { + content: ""; + position: absolute; + top: 50%; + left: 50%; + display: block; + width: 0.5em; + height: 0.5em; + border-radius: 0.25em; + transform: translate(-50%, -50%); +} + +.loader:before { + animation: before8 2s infinite; +} + +.loader:after { + animation: after6 2s infinite; +} + +@keyframes before8 { + 0% { + width: 0.5em; + box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75); + } + + 35% { + width: 2.5em; + box-shadow: 0 -0.5em rgba(225, 20, 98, 0.75), 0 0.5em rgba(111, 202, 220, 0.75); + } + + 70% { + width: 0.5em; + box-shadow: -1em -0.5em rgba(225, 20, 98, 0.75), 1em 0.5em rgba(111, 202, 220, 0.75); + } + + 100% { + box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75); + } +} + +@keyframes after6 { + 0% { + height: 0.5em; + box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75); + } + + 35% { + height: 2.5em; + box-shadow: 0.5em 0 rgba(61, 184, 143, 0.75), -0.5em 0 rgba(233, 169, 32, 0.75); + } + + 70% { + height: 0.5em; + box-shadow: 0.5em -1em rgba(61, 184, 143, 0.75), -0.5em 1em rgba(233, 169, 32, 0.75); + } + + 100% { + box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75); + } +} + +.loader { + position: absolute; + top: calc(50% - 1.25em); + left: calc(50% - 1.25em); +} + +.md { + + content: ""; + position: absolute; + top: 50%; + left: 50%; + display: block; + width: 100%; + height: 100vh; + border-radius: 0.25em; + transform: translate(-50%, -50%); + z-index: 99999999; + background-color: rgba(200,200,255,0.2); + + animation: lmin 0.2s ease; + } + + + + @keyframes lmin { + 0% { + opacity: 0; + filter: blur(100px); + } + 100% { + opacity: 1; + filter: blur(0px); + + + } + } \ No newline at end of file diff --git a/Dashboard/app.css.bak b/Dashboard/app.css.bak new file mode 100644 index 0000000..cdd4ece --- /dev/null +++ b/Dashboard/app.css.bak @@ -0,0 +1,1058 @@ + :root { + --mdui-primary: #2962ff; + --mdui-surface: #ffffff; + --mdui-background: #f5f5f5; + --mdui-text-primary: rgba(0, 0, 0, 0.87); + --mdui-text-secondary: rgba(0, 0, 0, 0.6); + --mdui-shape-corner: 20px; + } + /* 页面切换时模糊和透明度的效果 */ + .fade-blur-enter-active, .fade-blur-leave-active { + transition: opacity .5s ease, filter .5s ease, transform .5s ease; + } + + .fade-blur-enter, .fade-blur-leave-to { + position: absolute;/* 保持原来的宽度 */ + width: 100%; + opacity: 0; + filter: blur(100px); + transform: translateX(-100%); + } + + .fade-blur-enter-to, .fade-blur-leave { + opacity: 1; + filter: blur(0px); + } + + + + + + + + + + + +.ldo-enter-active, .ldo-leave-active { + transition: opacity .5s ease, filter .5s ease, transform .5s ease; + } + + .ldo-enter, .ldo-leave-to { + width: 100%; + opacity: 0; + filter: blur(100px); + } + + .ldo-enter-to, .ldo-leave { + opacity: 1; + filter: blur(0px); + } + + + + + + + + @keyframes min { + 0% { + transform: translateX(100%); + opacity: 0; + filter: blur(100px); + } + 100% { + transform: translateX(0%); + opacity: 1; + filter: blur(0px); + + + } + } + @keyframes gmin { + 0% { + transform: translateX(0%); + opacity: 1; + filter: blur(0px); + } + 100% { + transform: translateX(100%); + opacity: 0; + filter: blur(100px); + + + } + } + + .min { + animation: min 0.5s ease; + } + + + body { + margin: 0; + background: var(--mdui-background); + font-family: 'Segoe UI', system-ui; + color: var(--mdui-text-primary); + } + + .container { + padding: 16px; + max-width: 500px; + margin: 0 auto; + } + + .status-card { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 24px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + transition: transform 0.2s; + } + + .status-card:hover { + transform: translateY(-2px); + } + + .metric-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + } + + .metric-value { + font-size: 32px; + font-weight: 700; + color: var(--mdui-primary); + } + + .metric-label { + color: var(--mdui-text-secondary); + font-size: 14px; + } + + .quick-actions { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; + margin: 24px 0; + } + + .action-button { + background: var(--mdui-surface); + border: none; + border-radius: 16px; + padding: 16px; + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + cursor: pointer; + transition: all 0.2s; + } + + .action-button:hover { + background: #f0f4ff; + } + + .action-button svg { + width: 24px; + height: 24px; + fill: var(--mdui-primary); + } + + .chart-container { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin: 16px 0; + } + + .progress-bar { + height: 8px; + background: #eeeeee; + border-radius: 4px; + overflow: hidden; + margin: 12px 0; + } + + .progress-fill { + width: 65%; + height: 100%; + background: var(--mdui-primary); + border-radius: 4px; + transition: width 0.3s ease; + } + + .nav-bottom { + position: fixed; + bottom: 0; + width: 100%; + background: var(--mdui-surface); + display: flex; + justify-content: space-around; + padding: 12px 0; + box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.05); + } + + .nav-item { + display: flex; + flex-direction: column; + align-items: center; + color: var(--mdui-text-secondary); + padding: 8px; + border-radius: 12px; + transition: all 0.2s; + } + + .nav-item.active { + color: var(--mdui-primary); + background: #e8efff; + } + + .nav-item svg { + width: 20px; + height: 20px; + margin-bottom: 4px; + } + + .user-card { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + transition: transform 0.2s; + } + + .user-card:hover { + transform: translateY(-2px); + } + + .user-card-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; + } + + .user-card-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + background: #e8efff; + display: flex; + align-items: center; + justify-content: center; + } + + .user-card-avatar svg { + width: 24px; + height: 24px; + fill: var(--mdui-primary); + } + + .user-card-info { + flex: 1; + } + + .user-card-name { + font-size: 18px; + font-weight: 600; + margin-bottom: 4px; + } + + .user-card-role { + font-size: 14px; + color: var(--mdui-text-secondary); + } + + .user-card-stats { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; + } + + .user-card-stat { + text-align: center; + } + + .user-card-stat-value { + font-size: 18px; + font-weight: 600; + color: var(--mdui-primary); + } + + .user-card-stat-label { + font-size: 12px; + color: var(--mdui-text-secondary); + } + + .user-info-card { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + transition: transform 0.2s; + } + + .user-info-card:hover { + transform: translateY(-2px); + } + + .user-info-card-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; + } + + .user-info-card-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + background: #e8efff; + display: flex; + align-items: center; + justify-content: center; + } + + .user-info-card-avatar svg { + width: 24px; + height: 24px; + fill: var(--mdui-primary); + } + + .user-info-card-info { + flex: 1; + } + + .user-info-card-name { + font-size: 18px; + font-weight: 600; + margin-bottom: 4px; + } + + .user-info-card-role { + font-size: 14px; + color: var(--mdui-text-secondary); + } + + .user-info-card-details { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 12px; + } + + .user-info-card-detail { + display: flex; + align-items: center; + gap: 8px; + } + + .user-info-card-detail svg { + width: 18px; + height: 18px; + fill: var(--mdui-primary); + } + + .user-info-card-detail-label { + font-size: 14px; + color: var(--mdui-text-secondary); + } + + .user-info-card-detail-value { + font-size: 14px; + font-weight: 600; + } + + .table-container { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + } + + .table-container table { + width: 100%; + border-collapse: collapse; + } + + .table-container th, + .table-container td { + padding: 12px; + text-align: left; + border-bottom: 1px solid #eeeeee; + } + + .table-container th { + font-weight: 600; + color: var(--mdui-text-primary); + } + + .table-container td { + color: var(--mdui-text-secondary); + } + + .form-container { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + } + + .form-container label { + display: block; + font-size: 14px; + color: var(--mdui-text-secondary); + margin-bottom: 8px; + } + + .form-container input, + .form-container select, + .form-container textarea { + width: 80%; + padding: 12px; + border: 1px solid #eeeeee; + border-radius: 8px; + font-size: 14px; + color: var(--mdui-text-primary); + margin-bottom: 16px; + transition: border-color 0.2s; + } + + .form-container input:focus, + .form-container select:focus, + .form-container textarea:focus { + border-color: var(--mdui-primary); + outline: none; + } + + .form-container button { + background: var(--mdui-primary); + color: white; + border: none; + border-radius: 8px; + padding: 12px 24px; + font-size: 14px; + cursor: pointer; + transition: background 0.2s; + } + + .form-container button:hover { + background: #1e4dff; + } + + .alert { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + display: flex; + align-items: center; + gap: 12px; + } + + .alert svg { + width: 24px; + height: 24px; + fill: var(--mdui-primary); + } + + .alert-success { + background: #e8f5e9; + } + + .alert-success svg { + fill: #4caf50; + } + + .alert-warning { + background: #fff3e0; + } + + .alert-warning svg { + fill: #ff9800; + } + + .alert-error { + background: #ffebee; + } + + .alert-error svg { + fill: #f44336; + } + + .alert-info { + background: #e3f2fd; + } + + .alert-info svg { + fill: #2196f3; + } + + .modal { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + justify-content: center; + align-items: center; + } + + .modal-content { + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + padding: 24px; + max-width: 400px; + width: 100%; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + } + + .modal-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 16px; + } + + .modal-title { + font-size: 18px; + font-weight: 600; + } + + .modal-close { + background: none; + border: none; + cursor: pointer; + padding: 8px; + } + + .modal-close svg { + width: 24px; + height: 24px; + fill: var(--mdui-text-secondary); + } + + .modal-body { + margin-bottom: 16px; + } + + .modal-footer { + display: flex; + justify-content: flex-end; + gap: 8px; + } + + .modal-footer button { + padding: 8px 16px; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background 0.2s; + } + + .modal-footer button.primary { + background: var(--mdui-primary); + color: white; + } + + .modal-footer button.primary:hover { + background: #1e4dff; + } + + .modal-footer button.secondary { + background: #eeeeee; + color: var(--mdui-text-primary); + } + + .modal-footer button.secondary:hover { + background: #dddddd; + } + + .pagination { + display: flex; + justify-content: center; + gap: 8px; + margin: 16px 0; + } + + .pagination button { + background: var(--mdui-surface); + border: none; + border-radius: 8px; + padding: 8px 12px; + cursor: pointer; + transition: background 0.2s; + } + + .pagination button.active { + background: var(--mdui-primary); + color: white; + } + + .pagination button:hover { + background: #f0f4ff; + } + + .tabs { + display: flex; + gap: 8px; + margin-bottom: 16px; + } + + .tabs button { + background: var(--mdui-surface); + border: none; + border-radius: 8px; + padding: 3px 16px; + cursor: pointer; + transition: background 0.2s; + } + + .tabs button.active { + background: var(--mdui-primary); + color: white; + } + + .tabs button:hover { + background: #f0f4ff; + } + + .dropdown { + position: relative; + display: inline-block; + } + + .dropdown-button { + background: var(--mdui-surface); + border: none; + border-radius: 8px; + padding: 8px 16px; + cursor: pointer; + transition: background 0.2s; + } + + .dropdown-button:hover { + background: #f0f4ff; + } + + .dropdown-content { + display: none; + position: absolute; + background: var(--mdui-surface); + border-radius: var(--mdui-shape-corner); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + min-width: 160px; + z-index: 1; + } + + .dropdown-content a { + display: block; + padding: 8px 16px; + text-decoration: none; + color: var(--mdui-text-primary); + transition: background 0.2s; + } + + .dropdown-content a:hover { + background: #f0f4ff; + } + + .dropdown:hover .dropdown-content { + display: block; + } + + .timeline { + display: flex; + flex-direction: column; + gap: 16px; + } + + .timeline-item { + display: flex; + align-items: flex-start; + gap: 12px; + } + + .timeline-item-icon { + width: 24px; + height: 24px; + border-radius: 50%; + background: #e8efff; + display: flex; + align-items: center; + justify-content: center; + } + + .timeline-item-icon svg { + width: 16px; + height: 16px; + fill: var(--mdui-primary); + } + + .timeline-item-content { + flex: 1; + } + + .timeline-item-title { + font-size: 14px; + font-weight: 600; + margin-bottom: 4px; + } + + .timeline-item-description { + font-size: 12px; + color: var(--mdui-text-secondary); + } + + .timeline-item-time { + font-size: 12px; + color: var(--mdui-text-secondary); + } + + + + + + +.material-icons { + /* stylelint-disable-next-line */ + font-family: 'Material Icons'; + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + /* Support for IE. */ + -webkit-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; +} + +@font-face { + font-weight: 400; + font-family: 'Material Icons'; + font-style: normal; + src: local('Material Icons'), local('MaterialIcons-Regular'), url(./MaterialIcons-Regular.woff2) format('woff2'), url(./MaterialIcons-Regular.woff) format('woff'); +} + + + + + + + + + + + + + +:root { + --primary: #2962FF; + --surface: rgba(255,255,255,0.95); +} + +.card { + background: var(--surface); + backdrop-filter: blur(12px); + border-radius: 24px; + padding: 20px; + margin-bottom: 12px; + box-shadow: 0 8px 24px rgba(41, 98, 255, 0.1); + max-width: 360px; + transition: all 0.4s cubic-bezier(0.18, 0.89, 0.32, 1.28); + border: 1px solid rgba(41, 98, 255, 0.1); +} + +.card:hover { + transform: translateY(-8px) scale(1.02); + box-shadow: 0 16px 32px rgba(41, 98, 255, 0.15); +} + +.header { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 20px; +} + +.icon-wrapper { + width: 48px; + height: 48px; + background: rgba(41, 98, 255, 0.1); + border-radius: 12px; + display: grid; + place-items: center; + transition: transform 0.3s; +} + +.icon-wrapper:hover { + transform: rotate(15deg); +} + +.icon { + width: 24px; + height: 24px; + color: var(--primary); +} + +.title-group { + flex: 1; +} + +.title { + color: #0A1F44; + font-size: 1.4rem; + margin: 0; + font-weight: 700; +} + +.status { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 6px 12px; + background: rgba(41, 98, 255, 0.1); + border-radius: 8px; + color: var(--primary); + font-size: 0.9rem; +} + +.detail-grid { + display: grid; + gap: 12px; +} + +.detail-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 0; + border-bottom: 1px solid rgba(41, 98, 255, 0.05); +} + +.detail-item:last-child { + border: none; +} + +.label { + color: #5A6B87; + font-size: 0.9rem; +} + +.value { + color: #0A1F44; + font-weight: 500; + display: flex; + align-items: center; + gap: 8px; +} + + + + +/* From Uiverse.io by xopc333 */ +.button { + display: block; + position: relative; + width: 56px; + height: 56px; + margin: 0; + overflow: hidden; + outline: none; + background-color: transparent; + cursor: pointer; + border: 0; +} + +.button:before, +.button:after { + content: ""; + position: absolute; + border-radius: 50%; + inset: 7px; +} + +.button:before { + border: 4px solid #2962FF; + transition: opacity 0.4s cubic-bezier(0.77, 0, 0.175, 1) 80ms, + transform 0.5s cubic-bezier(0.455, 0.03, 0.515, 0.955) 80ms; +} + +.button:after { + border: 4px solid #5A6B87; + transform: scale(1.3); + transition: opacity 0.4s cubic-bezier(0.165, 0.84, 0.44, 1), + transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94); + opacity: 0; +} + +.button:hover:before, +.button:focus:before { + opacity: 0; + transform: scale(0.7); + transition: opacity 0.4s cubic-bezier(0.165, 0.84, 0.44, 1), + transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94); +} + +.button:hover:after, +.button:focus:after { + opacity: 1; + transform: scale(1); + transition: opacity 0.4s cubic-bezier(0.77, 0, 0.175, 1) 80ms, + transform 0.5s cubic-bezier(0.455, 0.03, 0.515, 0.955) 80ms; +} + +.button-box { + display: flex; + position: absolute; + top: 0; + left: 0; +} + +.button-elem { + display: block; + width: 20px; + height: 20px; + margin: 17px 18px 0 18px; + transform: rotate(180deg); + fill: #2962FF; +} + +.button:hover .button-box, +.button:focus .button-box { + transition: 0.4s; + transform: translateX(-56px); +} +a { + text-decoration: none; /* 移除下划线 */ + color: inherit; /* 颜色继承父元素 */ + cursor: pointer; /* 保留鼠标悬停时的指针样式(可选) */ +} + +/* 可选:移除其他状态的默认样式 */ +a:hover, +a:visited, +a:focus { + text-decoration: none; + color: inherit; +} + +/* From Uiverse.io by SchawnnahJ */ +.loader { + position: relative; + width: 2.5em; + height: 2.5em; + transform: rotate(165deg); +} + +.loader:before, .loader:after { + content: ""; + position: absolute; + top: 50%; + left: 50%; + display: block; + width: 0.5em; + height: 0.5em; + border-radius: 0.25em; + transform: translate(-50%, -50%); +} + +.loader:before { + animation: before8 2s infinite; +} + +.loader:after { + animation: after6 2s infinite; +} + +@keyframes before8 { + 0% { + width: 0.5em; + box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75); + } + + 35% { + width: 2.5em; + box-shadow: 0 -0.5em rgba(225, 20, 98, 0.75), 0 0.5em rgba(111, 202, 220, 0.75); + } + + 70% { + width: 0.5em; + box-shadow: -1em -0.5em rgba(225, 20, 98, 0.75), 1em 0.5em rgba(111, 202, 220, 0.75); + } + + 100% { + box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75); + } +} + +@keyframes after6 { + 0% { + height: 0.5em; + box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75); + } + + 35% { + height: 2.5em; + box-shadow: 0.5em 0 rgba(61, 184, 143, 0.75), -0.5em 0 rgba(233, 169, 32, 0.75); + } + + 70% { + height: 0.5em; + box-shadow: 0.5em -1em rgba(61, 184, 143, 0.75), -0.5em 1em rgba(233, 169, 32, 0.75); + } + + 100% { + box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75); + } +} + +.loader { + position: absolute; + top: calc(50% - 1.25em); + left: calc(50% - 1.25em); +} + +.md { + + content: ""; + position: absolute; + top: 50%; + left: 50%; + display: block; + width: 100%; + height: 100vh; + border-radius: 0.25em; + transform: translate(-50%, -50%); + z-index: 99999999; + background-color: rgba(250,250,255,0.2); + + animation: lmin 0.2s ease; + } + + + + @keyframes lmin { + 0% { + opacity: 0; + filter: blur(100px); + } + 100% { + opacity: 1; + filter: blur(0px); + + + } + } \ No newline at end of file diff --git a/Dashboard/app.js b/Dashboard/app.js new file mode 100644 index 0000000..847d6af --- /dev/null +++ b/Dashboard/app.js @@ -0,0 +1,93 @@ +// app.js +const { createApp } = Vue; + +const { ElButton, ElMessage, ElInput, ElCard, ElRow, ElForm, ElFormItem, ElDivider, ElLoading } = ElementPlus; +const app = createApp({ + data() { + return { + userlogo: null, + UserInfo: null, + page: null, + purchases: null, + cart: null, + ld: true, + } + }, + async mounted() { + // 生命周期钩子 - 挂载后 + console.log('应用已挂载'); + this.getinfo(); + + }, + methods: { + go(link) { + + + Message.info('跳转中...'); + window.location.href = link; + }, + viewcart() { + this.ldo(); + axios.get('/Main/GetGoods/') + .then(response => { + this.ldx(); + this.cart = response.data; + this.cart_fid = Object.keys(this.cart)[0]; + }) + }, + ldo() { + this.ld = true; + }, + ldx() { + this.ld = false; + }, + getinfo() { + this.ldo(); + axios.get('/Main/GetInfo/') + .then(response => { + + this.ldx(); + Message.closeAll(); + if (response.data.code === 200) { + this.UserInfo = response.data.msg; + + this.page = "home"; + if (response.data.msg.qq != null) { + this.userlogo = "https://q1.qlogo.cn/g?b=qq&nk="+response.data.msg.qq+"&s=640"; + } + } else { + + Message.warning('请先登陆'); + // 1 秒后跳转到指定页面 + setTimeout(function() { + window.location.href = "/Main/Login"; + }, 2000); // 1000 毫秒 = 1 秒 + + } + }) + }, + getpurchases() { + + this.ldo(); + axios.get('/Main/GetProducts/') + + .then(response => { + + this.ldx(); + if (response.data.code === 200) { + this.purchases = response.data.msg; + } else { + + + Message.warning('获取业务失败'); + } + }) + + }, + + } +}); + +// 挂载到DOM元素 +app.use(ElementPlus); +app.mount('#app'); diff --git a/Dashboard/app.js.bak b/Dashboard/app.js.bak new file mode 100644 index 0000000..769607e --- /dev/null +++ b/Dashboard/app.js.bak @@ -0,0 +1,91 @@ +// app.js +const { createApp } = Vue; + +const { ElButton, ElMessage, ElInput, ElCard, ElRow, ElForm, ElFormItem, ElDivider, ElLoading } = ElementPlus; +const app = createApp({ + data() { + return { + userlogo: null, + UserInfo: null, + page: null, + purchases: null, + cart: null, + ld: true, + } + }, + async mounted() { + // 生命周期钩子 - 挂载后 + console.log('应用已挂载'); + this.getinfo(); + + }, + methods: { + go(link) { + + + Message.info('跳转中...'); + window.location.href = link; + }, + viewcart() { + axios.get('/Main/GetGoods/') + .then(response => { + this.cart = response.data; + this.cart_fid = Object.keys(this.cart)[0]; + }) + }, + ldo() { + this.ld = true; + }, + ldx() { + this.ld = false; + }, + getinfo() { + this.ldo(); + axios.get('/Main/GetInfo/') + .then(response => { + + this.ldx(); + Message.closeAll(); + if (response.data.code === 200) { + this.UserInfo = response.data.msg; + + this.page = "home"; + if (response.data.msg.qq != null) { + this.userlogo = "https://q1.qlogo.cn/g?b=qq&nk="+response.data.msg.qq+"&s=640"; + } + } else { + + Message.warning('请先登陆'); + // 1 秒后跳转到指定页面 + setTimeout(function() { + window.location.href = "/Main/Login"; + }, 2000); // 1000 毫秒 = 1 秒 + + } + }) + }, + getpurchases() { + + this.ldo(); + axios.get('/Main/GetProducts/') + + .then(response => { + + this.ldx(); + if (response.data.code === 200) { + this.purchases = response.data.msg; + } else { + + + Message.warning('获取业务失败'); + } + }) + + }, + + } +}); + +// 挂载到DOM元素 +app.use(ElementPlus); +app.mount('#app'); diff --git a/Dashboard/b.php b/Dashboard/b.php new file mode 100644 index 0000000..0d8f0de --- /dev/null +++ b/Dashboard/b.php @@ -0,0 +1,49 @@ +loadHTML($html); + + $results = []; + $blocks = $dom->getElementsByTagName('div')->item(0)->getElementsByTagName('div'); + + foreach ($blocks as $block) { + $title = $block->getElementsByTagName('h2')->item(0)->textContent; + $link = $block->getElementsByTagName('a')->item(0)->getAttribute('href'); + $description = $block->getElementsByTagName('p')->item(0)->textContent; + + $results[] = [ + 'title' => trim($title), + 'link' => trim($link), + 'description' => trim($description), + 'icon' => null // 网页版Bing不显示图标 + ]; + } + + return $results; +} + +$searchTerm = isset($_GET['p']) ? $_GET['p'] : 'Kentucky'; +$results = fetchBingResults($searchTerm); + +$response = [ + 'results' => $results, + 'total' => count($results), + 'max_page' => 1 +]; + +echo json_encode($response); +?> diff --git a/Dashboard/bing.html b/Dashboard/bing.html new file mode 100644 index 0000000..f7c9745 --- /dev/null +++ b/Dashboard/bing.html @@ -0,0 +1,49 @@ + + + + + + + FuxSo + + + +

+ +
+
+

Bing搜索

+ + + +
+
+
+
+ +
+
+

{{ m.title }}

+ + + + + 前往 + +
+
+
+
+ {{ m.description }} +
+
+
+ +
+ + + + + + + diff --git a/Dashboard/bing.html.bak b/Dashboard/bing.html.bak new file mode 100644 index 0000000..97641ba --- /dev/null +++ b/Dashboard/bing.html.bak @@ -0,0 +1,53 @@ + + + + + + + FuxSo + + + +
+ +
+
+

Bing搜索

+ + + +
+
+
+
+ +
+
+

{{ m.title }}

+ + + + + 前往 + +
+
+
+
+ {{ m.description }} +
+
+
+ +
+ + + + + + + + + diff --git a/Dashboard/bing.js b/Dashboard/bing.js new file mode 100644 index 0000000..f270047 --- /dev/null +++ b/Dashboard/bing.js @@ -0,0 +1,49 @@ +// app.js +const { createApp } = Vue; + +const app = createApp({ + data() { + return { + w: null, + p: null, + d: null, + s: true, + } + }, + async mounted() { + // 生命周期钩子 - 挂载后 + console.log('应用已挂载'); + + }, + methods: { + search() { + Message.info('正在请求...', { duration: 5000000000000000 }); + this.s = false; + + + + + + axios.get('https://zk.aoidc.top/api/api.php?q='+this.w) + .then(response => { + Message.closeAll(); + this.s = true; + if (response.data.results != null) { + this.d = response.data.results; + this.s = true; + Message.success('已载入~', { duration: 2000 }); + console.log(this.d); + + } else { + Message.warning('失败', { duration: 2000 }); + + + } + }) + + }, + } +}); + +// 挂载到DOM元素 +app.mount('#app'); diff --git a/Dashboard/bing.js.bak b/Dashboard/bing.js.bak new file mode 100644 index 0000000..11ce0c4 --- /dev/null +++ b/Dashboard/bing.js.bak @@ -0,0 +1,47 @@ +// app.js +const { createApp } = Vue; + +const app = createApp({ + data() { + return { + w: null, + p: null, + d: null, + s: true, + } + }, + async mounted() { + // 生命周期钩子 - 挂载后 + console.log('应用已挂载'); + + }, + methods: { + search() { + Message.info('正在请求...', { duration: 5000000000000000 }); + this.s = false; + + + + + + axios.get('https://zk.aoidc.top/api/api.php?q='+this.w) + .then(response => { + Message.closeAll(); + this.s = true; + if (response.data.results != null) { + this.d = response.data.results; + this.s = true; + Message.success('已载入~', { duration: 2000 }); + } else { + Message.warning('失败', { duration: 2000 }); + + + } + }) + + }, + } +}); + +// 挂载到DOM元素 +app.mount('#app'); diff --git a/Dashboard/index.html b/Dashboard/index.html new file mode 100644 index 0000000..f74e1fc --- /dev/null +++ b/Dashboard/index.html @@ -0,0 +1,267 @@ + + + + + + Fuxsto Host V5 - Dashboard + + + + + + + + + +
+ + + + + +
+
+
+ +
+ + + + + + + +
+ +
+
+
+ 头像 +
+ +
+
+ {{ UserInfo.username }} +
+
+ {{ UserInfo.id }} +
+
+
+ +
+
+
+ {{ UserInfo.balance }} +
+
+ 余额 +
+
+ +
+
+ {{ UserInfo.score }} +
+
+ 积分 +
+
+ +
+
+ {{ UserInfo.status }} +
+
+ 状态 +
+
+
+
+ +
+ + + + + +
+
+ + + +
+ + +
+
+
+ + + + + +
+
+
返回
+
Go to home
+
+
+ +
+ +
+ + + + + +
+ +
+
+
+
+ + + +
+ +
+

+ {{ m.name }} +

+
+ + + + {{ m.status }} +
+
+
+ +
+
+ 业务ID + + {{ m.purchase_id }} + +
+ +
+ 到期时间 + + + + + + {{ m.expiry_time }} + +
+
+
+
+
+ + + + + + + + +
+ + {{ cart }} +
+ + + + + + + +
+ + + + + + + + + + + diff --git a/Dashboard/index.html.bak b/Dashboard/index.html.bak new file mode 100644 index 0000000..78709f4 --- /dev/null +++ b/Dashboard/index.html.bak @@ -0,0 +1,267 @@ + + + + + + Fuxsto Host V5 - Dashboard + + + + + + + + + +
+ + + + + +
+
+
+ +
+ + + + + + + +
+ +
+
+
+ 头像 +
+ +
+
+ {{ UserInfo.username }} +
+
+ {{ UserInfo.id }} +
+
+
+ +
+
+
+ {{ UserInfo.balance }} +
+
+ 余额 +
+
+ +
+
+ {{ UserInfo.score }} +
+
+ 积分 +
+
+ +
+
+ {{ UserInfo.status }} +
+
+ 状态 +
+
+
+
+ +
+ + + + + +
+
+ + + +
+ + +
+
+
+ + + + + +
+
+
返回
+
Go to home
+
+
+ +
+ +
+ + + + + +
+ +
+
+
+
+ + + +
+ +
+

+ {{ m.name }} +

+
+ + + + {{ m.status }} +
+
+
+ +
+
+ 业务ID + + {{ m.purchase_id }} + +
+ +
+ 到期时间 + + + + + + {{ m.expiry_time }} + +
+
+
+
+
+ + + + + + + + +
+ + {{ cart }} +
+ + + + + + + +
+ + + + + + + + + + + diff --git a/Dashboard/msg.js b/Dashboard/msg.js new file mode 100644 index 0000000..0b8f983 --- /dev/null +++ b/Dashboard/msg.js @@ -0,0 +1,235 @@ +// 终极消息系统 (保留所有优秀特性) +(() => { + // 完美图标系统 + const icons = { + success: '', + error: '', + warning: '', + info: '' + }; + + // 专业配置系统 + const config = { + duration: 3000, + spacing: 10, + maxMessages: 10, + closable: false, + enterAnimation: 'msg-slideIn', + exitAnimation: 'msg-fadeOutUp' + }; + + // 完美样式系统 + const style = document.createElement('style'); + style.textContent = ` + @keyframes msg-slideIn { + 0% { opacity: 0; transform: translate(-50%, -20px); + filter: blur(5px); } + 100% { opacity: 1; transform: translate(-50%, 0); + filter: blur(0px); } + } + + @keyframes msg-fadeOutUp { + 0% { opacity: 1; transform: translate(-50%, 0); + filter: blur(0px); } + 100% { opacity: 0; transform: translate(-50%, -100px); + filter: blur(5px); } + } + + .msg { + position: fixed; + left: 50%; + transform: translateX(-50%); + min-width: 300px; + max-width: 90vw; + padding: 14px 20px; + border-radius: 15px; + background: #fff; + + display: flex; + align-items: center; + z-index: 9999; + opacity: 0; + transition: top 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); + font-family: system-ui, sans-serif; + } + + .msg-enter { + animation: ${config.enterAnimation} 0.5s forwards; + } + + .msg-exit { + animation: ${config.exitAnimation} 0.5s forwards; + } + + .msg-icon { + width: 24px; + height: 24px; + margin-right: 12px; + flex-shrink: 0; + animation: msg-content-in 0.4s ease-in-out 0.5s forwards; + } + + .msg-content { + flex: 1; + font-size: 14px; + line-height: 1.5; + padding-right: 8px; + transition: all 0.5s; + animation: msg-content-in 0.4s ease-in-out 0.55s forwards; + } + @keyframes msg-content-in { + 0% { opacity: 1; + filter: blur(0px); } + 50% { opacity: 1; + filter: blur(2px); } + } 100% { opacity: 1; + filter: blur(0px); } + } + + .msg-close { + cursor: pointer; + width: 24px; + height: 24px; + margin-left: 8px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 6px; + transition: all 0.5s; + color: rgba(0,0,0,0.5); + flex-shrink: 0; + animation: msg-content-in 0.4s ease-in-out 0.6s forwards; + } + + .msg-close:hover { + background: rgba(0,0,0,0.08); + color: rgba(0,0,0,0.8); + } + + /* 专业配色方案 */ + .msg-success { color: #10B981; box-shadow: 0px 0px 4px rgba(16, 185, 129, 0.2);} + .msg-error { color: #EF4444; box-shadow: 0px 0px 4px rgba(239, 68, 68, 0.2);} + .msg-warning { color: #F59E0B; box-shadow: 0px 0px 4px rgba(245, 158, 11, 0.2);} + .msg-info { color: #3B82F6; box-shadow: 0px 0px 4px rgba(59, 130, 246, 0.2);} + + `; + document.head.appendChild(style); + + // 终极消息管理器 + class MsgManager { + static instances = []; + + static add(msg) { + if (this.instances.length >= config.maxMessages) { + this.instances[0].close(); + } + this.instances.push(msg); + this.updateLayout(); + } + + static remove(msg) { + const index = this.instances.indexOf(msg); + if (index > -1) { + this.instances.splice(index, 1); + this.updateLayout(true); + } + } + + static updateLayout(animate = false) { + let top = 20; + this.instances.forEach(instance => { + instance.element.style.transition = animate ? 'top 0.5s cubic-bezier(0.34, 1.56, 0.64, 1)' : 'none'; + instance.element.style.top = `${top}px`; + top += instance.element.offsetHeight + config.spacing; + }); + } + } + + // 完美消息实例 + class Msg { + constructor(type, content, options) { + this.type = type; + this.content = content; + this.options = { ...config, ...options }; + this.element = this.createElement(); + this.setupEvents(); + this.show(); + } + + createElement() { + const el = document.createElement('div'); + el.className = `msg msg-${this.type}`; + + const closeBtn = this.options.closable + ? '
×
' + : ''; + + el.innerHTML = ` +
${icons[this.type]}
+
${this.content}
+ ${closeBtn} + `; + + return el; + } + + setupEvents() { + if (this.options.closable) { + this.element.querySelector('.msg-close').addEventListener('click', () => this.close()); + } + } + + show() { + document.body.appendChild(this.element); + requestAnimationFrame(() => { + this.element.classList.add('msg-enter'); + MsgManager.add(this); + }); + this.autoCloseTimer = setTimeout(() => this.close(), this.options.duration); + } + + close() { + clearTimeout(this.autoCloseTimer); + this.element.classList.remove('msg-enter'); + this.element.classList.add('msg-exit'); + + setTimeout(() => { + this.element.remove(); + MsgManager.remove(this); + }, 500); + } + } + + // 终极API暴露 + const Message = { + config(newConfig) { + Object.assign(config, newConfig); + }, + + success(content, options) { + return new Msg('success', content, options); + }, + + error(content, options) { + return new Msg('error', content, options); + }, + + warning(content, options) { + return new Msg('warning', content, options); + }, + + info(content, options) { + return new Msg('info', content, options); + }, + + closeAll() { + MsgManager.instances.slice().forEach(msg => msg.close()); + } + }; + + window.Message = Message; +})(); + +// 完美调用示例 +//Message.success(''); +//Message.error('验证失败', { closable: true, duration: 5000 }); diff --git a/Dashboard/msg.js.bak b/Dashboard/msg.js.bak new file mode 100644 index 0000000..7c0edcd --- /dev/null +++ b/Dashboard/msg.js.bak @@ -0,0 +1,235 @@ +// 终极消息系统 (保留所有优秀特性) +(() => { + // 完美图标系统 + const icons = { + success: '', + error: '', + warning: '', + info: '' + }; + + // 专业配置系统 + const config = { + duration: 3000, + spacing: 10, + maxMessages: 10, + closable: false, + enterAnimation: 'msg-slideIn', + exitAnimation: 'msg-fadeOutUp' + }; + + // 完美样式系统 + const style = document.createElement('style'); + style.textContent = ` + @keyframes msg-slideIn { + 0% { opacity: 0; transform: translate(-50%, -20px); + filter: blur(5px); } + 100% { opacity: 1; transform: translate(-50%, 0); + filter: blur(0px); } + } + + @keyframes msg-fadeOutUp { + 0% { opacity: 1; transform: translate(-50%, 0); + filter: blur(0px); } + 100% { opacity: 0; transform: translate(-50%, -100px); + filter: blur(5px); } + } + + .msg { + position: fixed; + left: 50%; + transform: translateX(-50%); + min-width: 300px; + max-width: 90vw; + padding: 14px 20px; + border-radius: 15px; + background: #fff; + + display: flex; + align-items: center; + z-index: 9999; + opacity: 0; + transition: top 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); + font-family: system-ui, sans-serif; + } + + .msg-enter { + animation: ${config.enterAnimation} 0.5s forwards; + } + + .msg-exit { + animation: ${config.exitAnimation} 0.5s forwards; + } + + .msg-icon { + width: 24px; + height: 24px; + margin-right: 12px; + flex-shrink: 0; + animation: msg-content-in 0.4s ease-in-out 0.5s forwards; + } + + .msg-content { + flex: 1; + font-size: 14px; + line-height: 1.5; + padding-right: 8px; + transition: all 0.5s; + animation: msg-content-in 0.4s ease-in-out 0.55s forwards; + } + @keyframes msg-content-in { + 0% { opacity: 1; + filter: blur(0px); } + 50% { opacity: 1; + filter: blur(2px); } + } 100% { opacity: 1; + filter: blur(0px); } + } + + .msg-close { + cursor: pointer; + width: 24px; + height: 24px; + margin-left: 8px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 6px; + transition: all 0.5s; + color: rgba(0,0,0,0.5); + flex-shrink: 0; + animation: msg-content-in 0.4s ease-in-out 0.6s forwards; + } + + .msg-close:hover { + background: rgba(0,0,0,0.08); + color: rgba(0,0,0,0.8); + } + + /* 专业配色方案 */ + .msg-success { color: #10B981; box-shadow: 0px 0px 4px rgba(16, 185, 129, 0.2);} + .msg-error { color: #EF4444; box-shadow: 0px 0px 4px rgba(239, 68, 68, 0.2);} + .msg-warning { color: #F59E0B; box-shadow: 0px 0px 4px rgba(245, 158, 11, 0.2);} + .msg-info { color: #3B82F6; box-shadow: 0px 0px 4px rgba(59, 130, 246, 0.2);} + + `; + document.head.appendChild(style); + + // 终极消息管理器 + class MsgManager { + static instances = []; + + static add(msg) { + if (this.instances.length >= config.maxMessages) { + this.instances[0].close(); + } + this.instances.push(msg); + this.updateLayout(); + } + + static remove(msg) { + const index = this.instances.indexOf(msg); + if (index > -1) { + this.instances.splice(index, 1); + this.updateLayout(true); + } + } + + static updateLayout(animate = false) { + let top = 20; + this.instances.forEach(instance => { + instance.element.style.transition = animate ? 'top 0.5s cubic-bezier(0.34, 1.56, 0.64, 1)' : 'none'; + instance.element.style.top = `${top}px`; + top += instance.element.offsetHeight + config.spacing; + }); + } + } + + // 完美消息实例 + class Msg { + constructor(type, content, options) { + this.type = type; + this.content = content; + this.options = { ...config, ...options }; + this.element = this.createElement(); + this.setupEvents(); + this.show(); + } + + createElement() { + const el = document.createElement('div'); + el.className = `msg msg-${this.type}`; + + const closeBtn = this.options.closable + ? '
×
' + : ''; + + el.innerHTML = ` +
${icons[this.type]}
+
${this.content}
+ ${closeBtn} + `; + + return el; + } + + setupEvents() { + if (this.options.closable) { + this.element.querySelector('.msg-close').addEventListener('click', () => this.close()); + } + } + + show() { + document.body.appendChild(this.element); + requestAnimationFrame(() => { + this.element.classList.add('msg-enter'); + MsgManager.add(this); + }); + this.autoCloseTimer = setTimeout(() => this.close(), this.options.duration); + } + + close() { + clearTimeout(this.autoCloseTimer); + this.element.classList.remove('msg-enter'); + this.element.classList.add('msg-exit'); + + setTimeout(() => { + this.element.remove(); + MsgManager.remove(this); + }, 500); + } + } + + // 终极API暴露 + const Message = { + config(newConfig) { + Object.assign(config, newConfig); + }, + + success(content, options) { + return new Msg('success', content, options); + }, + + error(content, options) { + return new Msg('error', content, options); + }, + + warning(content, options) { + return new Msg('warning', content, options); + }, + + info(content, options) { + return new Msg('info', content, options); + }, + + closeAll() { + MsgManager.instances.slice().forEach(msg => msg.close()); + } + }; + + window.Message = Message; +})(); + +// 完美调用示例 +Message.success('支付成功!'); +Message.error('验证失败', { closable: true, duration: 5000 }); diff --git a/Dashboard/t.html b/Dashboard/t.html new file mode 100644 index 0000000..5cc313d --- /dev/null +++ b/Dashboard/t.html @@ -0,0 +1,984 @@ + + + + + + 移动端仪表盘 + + + +
+ +
+
+
+
85%
+
本月完成进度
+
+ + + +
+
+
+
+
+ + +
+ + + +
+ + +
+

存储使用情况

+
+
+
+ 已用 15.2GB / 50GB +
+
+
+
+
+ + + +
+
+ + +
+
+
+ + + +
+
+
张三
+
管理员
+
+
+
+
+
12
+
项目
+
+
+
45
+
任务
+
+
+
98%
+
完成率
+
+
+
+ + + + + +
+

用户列表

+ + + + + + + + + + + + + + + + + + + + + + + + + +
姓名角色邮箱
张三管理员zhangsan@example.com
李四开发者lisi@example.com
王五设计师wangwu@example.com
+
+ + +
+

用户注册

+
+ + + + + + + + + + + + + +
+
+ + +
+ + + +
操作成功!
+
+ +
+ + + +
请注意,您的存储空间即将用完。
+
+ +
+ + + +
操作失败,请重试。
+
+ +
+ + + +
这是一个信息提示。
+
+ + + + + + + + +
+ + + +
+ + + + + +
+
+
+ + + +
+
+
事件1
+
这是事件1的描述。
+
2023-10-01
+
+
+
+
+ + + +
+
+
事件2
+
这是事件2的描述。
+
2023-10-02
+
+
+
+ + +
+

最近活动

+
+
+
+ + + +
+
+
新用户注册
+
2分钟前
+
+
+ +
+
+




















+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Dashboard/t.html.bak b/Dashboard/t.html.bak new file mode 100644 index 0000000..430c87a --- /dev/null +++ b/Dashboard/t.html.bak @@ -0,0 +1,983 @@ + + + + + + 移动端仪表盘 + + + +
+ +
+
+
+
85%
+
本月完成进度
+
+ + + +
+
+
+
+
+ + +
+ + + +
+ + +
+

存储使用情况

+
+
+
+ 已用 15.2GB / 50GB +
+
+
+
+
+ + + +
+
+ + +
+
+
+ + + +
+
+
张三
+
管理员
+
+
+
+
+
12
+
项目
+
+
+
45
+
任务
+
+
+
98%
+
完成率
+
+
+
+ + + + + +
+

用户列表

+ + + + + + + + + + + + + + + + + + + + + + + + + +
姓名角色邮箱
张三管理员zhangsan@example.com
李四开发者lisi@example.com
王五设计师wangwu@example.com
+
+ + +
+

用户注册

+
+ + + + + + + + + + + + + +
+
+ + +
+ + + +
操作成功!
+
+ +
+ + + +
请注意,您的存储空间即将用完。
+
+ +
+ + + +
操作失败,请重试。
+
+ +
+ + + +
这是一个信息提示。
+
+ + + + + + + + +
+ + + +
+ + + + + +
+
+
+ + + +
+
+
事件1
+
这是事件1的描述。
+
2023-10-01
+
+
+
+
+ + + +
+
+
事件2
+
这是事件2的描述。
+
2023-10-02
+
+
+
+ + +
+

最近活动

+
+
+
+ + + +
+
+
新用户注册
+
2分钟前
+
+
+ +
+
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Log/ExpiryReminder/.last_clean b/Log/ExpiryReminder/.last_clean new file mode 100644 index 0000000..e69de29 diff --git a/Log/ExpiryReminder/ExpiryReminder_2025-03-01.log b/Log/ExpiryReminder/ExpiryReminder_2025-03-01.log new file mode 100644 index 0000000..11eeecd --- /dev/null +++ b/Log/ExpiryReminder/ExpiryReminder_2025-03-01.log @@ -0,0 +1,3 @@ +[2025-03-01 15:17:22].341 <执行中> - >>>==================================>>> +[2025-03-01 15:17:22].341 <提示> - ExpiryReminder 任务开始 +[2025-03-01 15:17:22].341 <提示> - 查询中 diff --git a/Main/BuyGoods/generated_strings.txt b/Main/BuyGoods/generated_strings.txt new file mode 100644 index 0000000..95a7c7c --- /dev/null +++ b/Main/BuyGoods/generated_strings.txt @@ -0,0 +1,63 @@ +nl01tnkt4t +lh6sr7t9sd +55irq9mt51hht8r +l6jbl3awye +0f7wilpmqlwrwb7 +pfy5lwf18l +7tohfmfpf8k2x7m +mvirbu6hog +xm7x949ipbb0u4p +b10cxrewms +9x8w1pe9sssu17y +9ydyzcwap0 +5lrxiq10snw2e4s +4456d5a8vv +z07lurkukdxho1j +w7o2w6vsva +f5sqqb01x66jjhn +1kwqp1bty6 +sckk4u5e5iyu0cd +bmyvr14q3z +5mwf7jh2vwoezy1 +hy25pbtvia +h13qspl8nfu38r2 +i6b29cufv1 +k7brk5as0zgro0f +9mwvjh1t01 +sneg222cuhu06uh +y07mjuo1cf +oulpjda4h72bp9d +zvn19ce909 +8qugxyavcgoaxm9 +ojsrsgpy46 +3u8a2hivbyxj947 +gy3accf815 +dohwpxuxu36f445 +bm4h3na5xj +3jmwv9cv2o62j5h +8mvaysfctg +beqktcwt9g0n1bf +an3hydsfbb +cld06vc4ba2t9tr +nuy7sak0vp +c2wz01xoyw6xjpa +ac1ddtz5uz +s4ammf90ludjpxx +u3jocjlecs +mrm9h0qex58wnu4 +jlgne3buvp +1cp744jvbvhyw07 +3ywmpl50l2 +ou84orvyac2q5ih +fmccgczjr2 +c9qgnzhp367p7sk +845jp6o44u +ox9py3z8e41usol +gdfk38lg9q +c62dmgesi1ik6lo +x8jhc04f68 +6iys03f3o1zxtp0 +n1dmp5v1ou +2utduxhqu3m75tj +srtonx74oz +ajzrbq4mdw1tlsv diff --git a/Main/BuyGoods/index.php b/Main/BuyGoods/index.php new file mode 100644 index 0000000..3b7d5f7 --- /dev/null +++ b/Main/BuyGoods/index.php @@ -0,0 +1,98 @@ + &$category1Items) { + foreach ($category1Items as $category2 => &$category2Items) { + // 按照 sort_order 字段降序排序 + usort($category2Items, function ($a, $b) { + return $b['sort_order'] - $a['sort_order']; + }); + } +} + +// 转换为 JSON 格式输出 +echo 转JSON($categories); + + +?> \ No newline at end of file diff --git a/Main/GetGoods/index.php.bak b/Main/GetGoods/index.php.bak new file mode 100644 index 0000000..f0f1757 --- /dev/null +++ b/Main/GetGoods/index.php.bak @@ -0,0 +1,46 @@ + &$category1Items) { + foreach ($category1Items as $category2 => &$category2Items) { + // 按照 sort_order 字段降序排序 + usort($category2Items, function ($a, $b) { + return $b['sort_order'] - $a['sort_order']; + }); + } +} + +// 转换为 JSON 格式输出 +echo 转JSON($categories); + + +?> \ No newline at end of file diff --git a/Main/GetInfo/index.php b/Main/GetInfo/index.php new file mode 100644 index 0000000..0310e9e --- /dev/null +++ b/Main/GetInfo/index.php @@ -0,0 +1,5 @@ + diff --git a/Main/GetProducts/index.php.bak b/Main/GetProducts/index.php.bak new file mode 100644 index 0000000..80ae0b3 --- /dev/null +++ b/Main/GetProducts/index.php.bak @@ -0,0 +1,26 @@ + diff --git a/Main/Hv4.Function.php b/Main/Hv4.Function.php new file mode 100644 index 0000000..840c2bc --- /dev/null +++ b/Main/Hv4.Function.php @@ -0,0 +1,234 @@ +connect_error) { + return "连接失败: " . $conn->connect_error; + } + + // 执行 SQL 查询 + $result = $conn->query($sql); + + // 查询失败,返回错误信息 + if ($result === FALSE) { + $conn->close(); + return "查询失败: " . $conn->error; + } + + // 如果是 SELECT 查询,自动处理并返回结果 + if (stripos($sql, 'SELECT') === 0) { + // 创建一个数组存储所有的查询结果 + $data = []; + while ($row = $result->fetch_assoc()) { + $data[] = $row; // 将每一行的数据加入结果数组 + } + $conn->close(); + return $data; // 返回查询结果 + } + + // 对于非 SELECT 查询(INSERT, UPDATE, DELETE)直接返回 true + $conn->close(); + return true; +} + + + +// 生成随机字符串的函数 +function 生成随机字符串($长度, $字符集, $字符集长度) { + $随机字符串 = ''; + for ($i = 0; $i < $长度; $i++) { + $随机字符串 .= $字符集[rand(0, $字符集长度 - 1)]; + } + return $随机字符串; +} + +function 唯一随机字符串($长度) { + // 定义字符集 + $字符集 = 'abcdefghijklmnopqrstuvwxyz0123456789'; + $字符集长度 = strlen($字符集); + + // 文件路径,用来存储已生成的字符串 + $文件路径 = 'generated_strings.txt'; + + // 检查文件是否存在,如果不存在则创建 + if (!file_exists($文件路径)) { + file_put_contents($文件路径, ''); // 创建一个空文件 + } + + // 生成唯一字符串 + do { + $随机字符串 = 生成随机字符串($长度, $字符集, $字符集长度); + $已生成的字符串 = file($文件路径, FILE_IGNORE_NEW_LINES); + } while (in_array($随机字符串, $已生成的字符串)); + + // 将新生成的字符串保存到文件 + file_put_contents($文件路径, $随机字符串 . PHP_EOL, FILE_APPEND); + + return $随机字符串; +} + + + + + +function JSON解析($json) { + return @json_decode($json,true); +} + +function 转JSON($json) { + return @json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); +} + + + + +/** + * 生成高颜值不重复产品编号 + * 特点:排除易混淆字符、智能查重、自动保存记录、美观格式化 + */ +function 唯一字符串() { + // 配置参数(可自行调整) + $charSet = [ + 'letters' => 'ABCDEFGHJKLMNPQRSTUVWXYZ', // 24个大写字母(排除I/O) + 'digits' => '23456789', // 8个数字(排除0/1) + ]; + $pattern = 'AAA-111-AAA'; // 定义编号格式:3字母 + 3数字 + 3字母 + $storageFile = 'product_codes.txt'; // 存储文件 + + do { + // 根据格式生成各部分 + $codeParts = []; + foreach (explode('-', $pattern) as $segment) { + $type = preg_match('/^A+$/', $segment) ? 'letters' : 'digits'; + $codeParts[] = generateSegment($charSet[$type], strlen($segment)); + } + + // 组合完整编码(去掉分隔符后确保10位) + $fullCode = str_replace('-', '', implode('', $codeParts)); + + // 检查是否已存在(使用内存加速查询) + $existingCodes = file_exists($storageFile) + ? array_flip(file($storageFile, FILE_IGNORE_NEW_LINES)) + : []; + } while (isset($existingCodes[$fullCode])); + + // 保存新编码并返回格式化版本 + file_put_contents($storageFile, $fullCode.PHP_EOL, FILE_APPEND); + return implode('-', $codeParts); +} + +/** + * 生成指定长度的字符段 + */ +function generateSegment($characters, $length) { + $segment = ''; + $maxIndex = strlen($characters) - 1; + for ($i = 0; $i < $length; $i++) { + $segment .= $characters[random_int(0, $maxIndex)]; + } + return $segment; +} + +function 发送邮件接口($收件人, $主题, $内容, $接口地址 = 'https://hv3.fuxsto.cn/user/OpenEmailApi.php') +{ + // 参数有效性验证 + if (!filter_var($收件人, FILTER_VALIDATE_EMAIL)) { + return "收件人邮箱格式无效"; + } + + // 准备请求参数(自动编码处理) + $请求数据 = http_build_query([ + 'to' => $收件人, + 'subject' => $主题, + 'msg' => $内容 + ]); + + // 初始化cURL + $ch = curl_init(); + + // 配置cURL选项 + curl_setopt_array($ch, [ + CURLOPT_URL => $接口地址, + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_SSL_VERIFYPEER => true, // 验证SSL证书 + CURLOPT_TIMEOUT => 15, // 15秒超时 + CURLOPT_CONNECTTIMEOUT => 5, // 5秒连接超时 + CURLOPT_POSTFIELDS => $请求数据, + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' + ] + ]); + + // 执行请求 + $响应 = curl_exec($ch); + + // 错误处理 + if (curl_errno($ch)) { + $错误信息 = '网络请求失败: ' . curl_error($ch); + curl_close($ch); + return $错误信息; + } + + // 获取HTTP状态码 + $状态码 = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + // 处理响应 + if ($状态码 !== 200) { + return "接口响应异常 (HTTP {$状态码})"; + } + + // 验证响应内容 + return ($响应 === '200') ? 200 : trim($响应); +} + diff --git a/Main/Hv4.Function.php.bak b/Main/Hv4.Function.php.bak new file mode 100644 index 0000000..9e0f359 --- /dev/null +++ b/Main/Hv4.Function.php.bak @@ -0,0 +1,179 @@ +connect_error) { + return "连接失败: " . $conn->connect_error; + } + + // 执行 SQL 查询 + $result = $conn->query($sql); + + // 查询失败,返回错误信息 + if ($result === FALSE) { + $conn->close(); + return "查询失败: " . $conn->error; + } + + // 如果是 SELECT 查询,自动处理并返回结果 + if (stripos($sql, 'SELECT') === 0) { + // 创建一个数组存储所有的查询结果 + $data = []; + while ($row = $result->fetch_assoc()) { + $data[] = $row; // 将每一行的数据加入结果数组 + } + $conn->close(); + return $data; // 返回查询结果 + } + + // 对于非 SELECT 查询(INSERT, UPDATE, DELETE)直接返回 true + $conn->close(); + return true; +} + + + +// 生成随机字符串的函数 +function 生成随机字符串($长度, $字符集, $字符集长度) { + $随机字符串 = ''; + for ($i = 0; $i < $长度; $i++) { + $随机字符串 .= $字符集[rand(0, $字符集长度 - 1)]; + } + return $随机字符串; +} + +function 唯一随机字符串($长度) { + // 定义字符集 + $字符集 = 'abcdefghijklmnopqrstuvwxyz0123456789'; + $字符集长度 = strlen($字符集); + + // 文件路径,用来存储已生成的字符串 + $文件路径 = 'generated_strings.txt'; + + // 检查文件是否存在,如果不存在则创建 + if (!file_exists($文件路径)) { + file_put_contents($文件路径, ''); // 创建一个空文件 + } + + // 生成唯一字符串 + do { + $随机字符串 = 生成随机字符串($长度, $字符集, $字符集长度); + $已生成的字符串 = file($文件路径, FILE_IGNORE_NEW_LINES); + } while (in_array($随机字符串, $已生成的字符串)); + + // 将新生成的字符串保存到文件 + file_put_contents($文件路径, $随机字符串 . PHP_EOL, FILE_APPEND); + + return $随机字符串; +} + + + + + +function JSON解析($json) { + return @json_decode($json,true); +} + +function 转JSON($json) { + return @json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); +} + + + + +/** + * 生成高颜值不重复产品编号 + * 特点:排除易混淆字符、智能查重、自动保存记录、美观格式化 + */ +function 唯一字符串() { + // 配置参数(可自行调整) + $charSet = [ + 'letters' => 'ABCDEFGHJKLMNPQRSTUVWXYZ', // 24个大写字母(排除I/O) + 'digits' => '23456789', // 8个数字(排除0/1) + ]; + $pattern = 'AAA-111-AAA'; // 定义编号格式:3字母 + 3数字 + 3字母 + $storageFile = 'product_codes.txt'; // 存储文件 + + do { + // 根据格式生成各部分 + $codeParts = []; + foreach (explode('-', $pattern) as $segment) { + $type = preg_match('/^A+$/', $segment) ? 'letters' : 'digits'; + $codeParts[] = generateSegment($charSet[$type], strlen($segment)); + } + + // 组合完整编码(去掉分隔符后确保10位) + $fullCode = str_replace('-', '', implode('', $codeParts)); + + // 检查是否已存在(使用内存加速查询) + $existingCodes = file_exists($storageFile) + ? array_flip(file($storageFile, FILE_IGNORE_NEW_LINES)) + : []; + } while (isset($existingCodes[$fullCode])); + + // 保存新编码并返回格式化版本 + file_put_contents($storageFile, $fullCode.PHP_EOL, FILE_APPEND); + return implode('-', $codeParts); +} + +/** + * 生成指定长度的字符段 + */ +function generateSegment($characters, $length) { + $segment = ''; + $maxIndex = strlen($characters) - 1; + for ($i = 0; $i < $length; $i++) { + $segment .= $characters[random_int(0, $maxIndex)]; + } + return $segment; +} diff --git a/Main/Hv4.Logged.php b/Main/Hv4.Logged.php new file mode 100644 index 0000000..f5d1954 --- /dev/null +++ b/Main/Hv4.Logged.php @@ -0,0 +1,64 @@ +window.location.href = '/';"); +} else { +$_SESSION["username"] = $用户名; +die(""); +} +} else { +$_SESSION["username"] = $用户名; +die(""); +} +} else { +die(""); +} diff --git a/Main/Login/CallBack.php.bak b/Main/Login/CallBack.php.bak new file mode 100644 index 0000000..d0aaec2 --- /dev/null +++ b/Main/Login/CallBack.php.bak @@ -0,0 +1,31 @@ +window.location.href = '/';"); +} else { +$_SESSION["username"] = $用户名; +die(""); +} +} else { +$_SESSION["username"] = $用户名; +die(""); +} +} else { +die(""); +} diff --git a/Main/Login/index.php b/Main/Login/index.php new file mode 100644 index 0000000..5156a45 --- /dev/null +++ b/Main/Login/index.php @@ -0,0 +1,53 @@ + [ + 'method' => 'POST', // 使用 POST 请求 + 'header' => implode("\r\n", $headers), // 设置请求头 + 'ignore_errors' => true, // 即使请求失败,也返回响应内容 + ], + 'ssl' => [ + 'verify_peer' => false, // 禁用 SSL 验证 (如果目标地址使用自签名证书,可以考虑启用) + 'verify_peer_name' => false, + ], +]; + +// 创建上下文 +$context = stream_context_create($options); + +// 发起请求并获取响应 +$response = file_get_contents($url, false, $context); + +$Task = json_decode($response,true)["msg"]; + + + + +?> + diff --git a/Main/Login/index.php.bak b/Main/Login/index.php.bak new file mode 100644 index 0000000..07c44b3 --- /dev/null +++ b/Main/Login/index.php.bak @@ -0,0 +1,53 @@ + [ + 'method' => 'POST', // 使用 POST 请求 + 'header' => implode("\r\n", $headers), // 设置请求头 + 'ignore_errors' => true, // 即使请求失败,也返回响应内容 + ], + 'ssl' => [ + 'verify_peer' => false, // 禁用 SSL 验证 (如果目标地址使用自签名证书,可以考虑启用) + 'verify_peer_name' => false, + ], +]; + +// 创建上下文 +$context = stream_context_create($options); + +// 发起请求并获取响应 +$response = file_get_contents($url, false, $context); + +$Task = json_decode($response,true)["msg"]; + + + + +?> + diff --git a/Main/Login/product_codes.txt b/Main/Login/product_codes.txt new file mode 100644 index 0000000..7402d15 --- /dev/null +++ b/Main/Login/product_codes.txt @@ -0,0 +1,30 @@ +GZZ242HHB +RHW483HGU +GUF299UVB +HSS245YXC +AUQ924HZF +RSN975RCB +XMS622TNH +PAQ832MFQ +VNY422EDJ +ZSY355CBW +TQL298LRK +LLL653JNQ +UHL926WAR +LTR252ECM +LMP863RDB +JTZ287MGC +YNC968LSP +AWL859EJQ +XZJ755RAJ +YKD357UAN +DFB956HBN +UGZ298BEN +EFV762GLD +NVE522XGG +SCU359CGD +FEE855MLH +ZVY632QKL +UQS923YDT +KYZ269EFJ +DJP294LAN diff --git a/Main/ProductsModule/HK-FREE-EP/Main.php b/Main/ProductsModule/HK-FREE-EP/Main.php new file mode 100644 index 0000000..09fa282 --- /dev/null +++ b/Main/ProductsModule/HK-FREE-EP/Main.php @@ -0,0 +1,120 @@ + $v) { + $url .= $k . "=" . $v . "&"; + } + return "http://38.55.233.203:3312/api/index.php?" . $url . "r=" . $r . "&s=" . $skey . "&json=1"; +} + + +function 展示产品($业务元数据,$产品元数据) { + $Page = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/Main/ProductsModule/HK-FREE-EP/s.html'); + $Page = @str_replace("<业务元数据>", 转JSON($业务元数据), $Page); + $Page = @str_replace("<产品元数据>", 转JSON($产品元数据), $Page); + $Page = @str_replace("<登录元数据>", 转JSON($业务元数据["extra_data"]), $Page); + return $Page; +} + +function 开通产品($产品元数据,$产品唯一标识符) { + $a = "add_vh"; + $r = rand(100000, 999999); + + $user = 唯一随机字符串(10); // 随机生成用户名 + $pass = 唯一随机字符串(15); // 随机生成密码 + + $currentDate = date('Y-m-d'); // 获取当前日期 + $futureDate = date('Y-m-d', strtotime($currentDate . ' +30 days')); // 计算30天后的日期 + + $info = [ + "c" => "whm", + "a" => $a, + "init" => 1, + "name" => $user, + "passwd" => $pass, + "product_id" => $产品元数据["extra_info"] + ]; + + $skey = kanglehost_CreateSign($a, $r); // 修正函数名称大小写 + $url = kanglehost_GetUrl($info, $skey, $r); // 修正函数名称大小写 + $re = @file_get_contents($url); + $re = json_decode($re, true); + + if (!isset($re['result'])) { + $code = 100; // 错误处理:如果result不存在,设为100 + } else { + $code = $re['result']; + } + + $储存数据 = []; + $储存数据["username"] = $user; + $储存数据["password"] = $pass; + $data["data"] = $储存数据; + if ($code == 200) { + $data['msg'] = $re; + $data['code'] = 200; + } else { + $data['msg'] = $re; + $data['code'] = 100; + } + + return $data; +} + +function show_product($data) { + $templatePath = './mods/us_m/index.html'; // 模板路径 + $variables = $data; + + return h_t($templatePath, $variables); +} + +function long_product($data) { + $date = new DateTime($data['dqtime']); + $date->modify('+' . $data['Today'] . ' days'); // 假设'Today'是$data数组中的一个键 + + $data['dqtime'] = $date->format('Y-m-d'); + + + return $data; +} + + + + +function 删除业务($业务元数据,$产品元数据) { + + + $username = @JSON解析($业务元数据["extra_data"])["username"]; + + $a = "del_vh"; + $r = rand(100000, 999999); + $info = ["c" => "whm", "a" => $a, "name" => $username]; + + + $skey = kanglehost_CreateSign($a, $r); // 修正函数名称大小写 + $url = kanglehost_GetUrl($info, $skey, $r); // 修正函数名称大小写 + $re = @file_get_contents($url); + $data['msg'] = $re; + $re = json_decode($re, true); + + $data['code'] = $re["result"]; + + + return $data; +} + + + +function ready_products($data) { +$templatePath = './mods/us_m/ready.html'; // 模板路径 + $variables = $data; + $variables["id"] = $_GET["id"]; + return h_t($templatePath, $variables); +} \ No newline at end of file diff --git a/Main/ProductsModule/HK-FREE-EP/Main.php.bak b/Main/ProductsModule/HK-FREE-EP/Main.php.bak new file mode 100644 index 0000000..166e926 --- /dev/null +++ b/Main/ProductsModule/HK-FREE-EP/Main.php.bak @@ -0,0 +1,120 @@ + $v) { + $url .= $k . "=" . $v . "&"; + } + return "http://38.55.233.203:3312/api/index.php?" . $url . "r=" . $r . "&s=" . $skey . "&json=1"; +} + + +function 展示产品($业务元数据,$产品元数据) { + $Page = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/Main/ProductsModule/HK-FREE-EP/s.html'); + $Page = @str_replace("<业务元数据>", 转JSON($业务元数据), $Page); + $Page = @str_replace("<产品元数据>", 转JSON($产品元数据), $Page); + $Page = @str_replace("<登录元数据>", 转JSON($业务元数据["extra_data"]), $Page); + return $Page; +} + +function 开通产品($产品元数据,$产品唯一标识符) { + $a = "add_vh"; + $r = rand(100000, 999999); + + $user = 唯一随机字符串(10); // 随机生成用户名 + $pass = 唯一随机字符串(15); // 随机生成密码 + + $currentDate = date('Y-m-d'); // 获取当前日期 + $futureDate = date('Y-m-d', strtotime($currentDate . ' +30 days')); // 计算30天后的日期 + + $info = [ + "c" => "whm", + "a" => $a, + "init" => 1, + "name" => $user, + "passwd" => $pass, + "product_id" => $产品元数据["extra_info"] + ]; + + $skey = kanglehost_CreateSign($a, $r); // 修正函数名称大小写 + $url = kanglehost_GetUrl($info, $skey, $r); // 修正函数名称大小写 + $re = @file_get_contents($url); + $re = json_decode($re, true); + + if (!isset($re['result'])) { + $code = 100; // 错误处理:如果result不存在,设为100 + } else { + $code = $re['result']; + } + + $储存数据 = []; + $储存数据["username"] = $user; + $储存数据["password"] = $pass; + $data["data"] = $储存数据; + if ($code == 200) { + $data['msg'] = $re; + $data['code'] = 200; + } else { + $data['msg'] = $re; + $data['code'] = 100; + } + + return $data; +} + +function show_product($data) { + $templatePath = './mods/us_m/index.html'; // 模板路径 + $variables = $data; + + return h_t($templatePath, $variables); +} + +function long_product($data) { + $date = new DateTime($data['dqtime']); + $date->modify('+' . $data['Today'] . ' days'); // 假设'Today'是$data数组中的一个键 + + $data['dqtime'] = $date->format('Y-m-d'); + + + return $data; +} + + + + +function 删除业务($业务元数据,$产品元数据) { + + + $data['status'] = '已到期'; + + $a = "del_vh"; + $r = rand(100000, 999999); + $info = ["c" => "whm", "a" => $a, "name" => $data['username']]; + + + $skey = kanglehost_CreateSign($a, $r); // 修正函数名称大小写 + $url = kanglehost_GetUrl($info, $skey, $r); // 修正函数名称大小写 + $re = @file_get_contents($url); + $data['msg'] = $re; + $re = json_decode($re, true); + + $data['code'] = $re["result"]; + + + return $data; +} + + + +function ready_products($data) { +$templatePath = './mods/us_m/ready.html'; // 模板路径 + $variables = $data; + $variables["id"] = $_GET["id"]; + return h_t($templatePath, $variables); +} \ No newline at end of file diff --git a/Main/ProductsModule/HK-FREE-EP/s.html b/Main/ProductsModule/HK-FREE-EP/s.html new file mode 100644 index 0000000..b22d7c9 --- /dev/null +++ b/Main/ProductsModule/HK-FREE-EP/s.html @@ -0,0 +1,374 @@ + + + + + + 虚拟主机详情 - Fuxsto Host V4 + + + + + +
+
+

{{a.name}}

+

{{a.status}}

+
+
+ +
+
+
+ + + +
4 vCPU
+
计算核心
+
+ +
+ + + +
4 GB
+
内存容量
+
+ +
+ + + +
7 M
+
带宽
+
+
+ +
+

主机详情

+
+
+
+ 主机区域 + 香港🇭🇰 +
+
+ 业务ID + {{a.purchase_id}} +
+
+ 控制面板 + Kangle EasyPanel +
+
+
+
+ 创建时间 + {{a.purchase_time}} +
+
+ 到期时间 + {{a.expiry_time}} +
+
+ 网络类型 + CN2 Max +
+
+
+
+ +
+

账号配置

+
+ 登陆地址 + 38.55.233.203:3312 +
+
+ 登陆账号 + {{ username }} +
+
+ 登陆密码 + {{ password }} +
+
+ 一键登陆 +
+ + + +
+
+
+
+ + + \ No newline at end of file diff --git a/Main/ProductsModule/HK-FREE-EP/s.html.bak b/Main/ProductsModule/HK-FREE-EP/s.html.bak new file mode 100644 index 0000000..50b1d13 --- /dev/null +++ b/Main/ProductsModule/HK-FREE-EP/s.html.bak @@ -0,0 +1,375 @@ + + + + + + 虚拟主机详情 - Fuxsto Host V4 + + + + + +
+
+

{{a.name}}

+

{{a.status}}

+
+
+ +
+
+
+ + + +
4 vCPU
+
计算核心
+
+ +
+ + + +
4 GB
+
内存容量
+
+ +
+ + + +
7 M
+
带宽
+
+
+ +
+

主机详情

+
+
+
+ 主机区域 + 香港🇭🇰 +
+
+ 业务ID + {{a.purchase_id}} +
+
+ 控制面板 + Kangle EasyPanel +
+
+
+
+ 创建时间 + {{a.purchase_time}} +
+
+ 到期时间 + {{a.expiry_time}} +
+
+ 网络类型 + CN2 Max +
+
+
+
+ +
+

账号配置

+
+ 登陆地址 + 38.55.233.203:3312 +
+
+ 登陆账号 + {{ username }} +
+
+ 登陆密码 + {{ password }} +
+
+ 一键登陆 +
+ + + +
+
+
+
+ + + \ No newline at end of file diff --git a/Main/System/ExpiredProductsCleaner.php b/Main/System/ExpiredProductsCleaner.php new file mode 100644 index 0000000..d19974a --- /dev/null +++ b/Main/System/ExpiredProductsCleaner.php @@ -0,0 +1,211 @@ + './Log/ExpiredProductsCleaner', // 日志目录 + 'retain_days' => 60, // 日志保留天数(改为60天清理) + 'file_prefix' => 'ExpiredProductsCleaner' // 日志文件前缀 + ]; + + // 生成时间相关变量 + $now = new DateTime(); + $currentDate = $now->format('Y-m-d'); + $logFile = sprintf("%s/%s_%s.log", $config['log_dir'], $config['file_prefix'], $currentDate); + + // 自动创建日志目录 + if (!is_dir($config['log_dir']) && !mkdir($config['log_dir'], 0777, true)) { + error_log("无法创建日志目录: {$config['log_dir']}"); + return; + } + + // 构建日志内容(含毫秒时间戳) + $timestamp = $now->format('[Y-m-d H:i:s]') . sprintf('.%03d', (float)$now->format('u')/1000); + $logLine = sprintf("%s <%s> - %s\n", $timestamp, strtoupper($type), $content); + + // 高性能写入(使用资源句柄+flock避免并发冲突) + try { + $handle = fopen($logFile, 'a'); // 追加模式打开 + if (flock($handle, LOCK_EX)) { // 获取独占锁 + fwrite($handle, $logLine); + flock($handle, LOCK_UN); // 释放锁 + } + fclose($handle); + } catch (Exception $e) { + error_log("日志写入失败: " . $e->getMessage()); + } + + // 控制台输出(可选调试) + echo $logLine; + + // 智能清理(每天只执行一次清理检查) + $cleanFlagFile = $config['log_dir'] . '/.last_clean'; + if (!file_exists($cleanFlagFile) || (time() - filemtime($cleanFlagFile)) > 86400) { + $expireDate = $now->modify("-{$config['retain_days']} days")->getTimestamp(); + foreach (glob($config['log_dir'] . "/{$config['file_prefix']}_*.log") as $file) { + if (filemtime($file) < $expireDate) { + @unlink($file); + } + } + touch($cleanFlagFile); // 更新清理标记时间 + } +} + + + +$语句 = "SELECT * +FROM purchases +WHERE + expiry_time < NOW() -- 过期时间早于当前时间 + AND status = 'expiring' +ORDER BY expiry_time; +"; + +日志写入(">>>==================================>>>","执行中"); + +日志写入("ExpiryReminder 任务开始","提示"); + +日志写入("查询中","提示"); + +$结果 = @数据库运行($语句); + +if (!$结果) { +日志写入("无结果","提示"); +die(); +} + +日志写入("查询结果","提示"); + +日志写入(">>>==================================>>>","结果"); + +日志写入(@转JSON($结果),"数据"); + +日志写入(">>>==================================>>>","结果"); + +日志写入("开始循环","提示"); + +foreach ($结果 as $业务元数据) { + +日志写入(">>>==================================>>>","任务"); +$用户ID = $业务元数据["user_id"]; +$业务ID = $业务元数据["purchase_id"]; +$业务状态 = $业务元数据["status"]; +$业务名称 = $业务元数据["name"]; +$到期时间 = $业务元数据["expiry_time"]; +$产品标识 = $业务元数据["product_id"]; +日志写入("提取业务ID ".$业务ID,"提示"); +日志写入("提取用户ID ".$用户ID,"提示"); +日志写入("提取业务状态 ".$业务状态,"提示"); + + + + + +$dateString = $到期时间; + +// 创建目标日期对象并设置时间为0点 +$targetDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString); +$targetDate->setTime(0, 0, 0); + +// 创建当前日期对象并设置时间为0点 +$today = new DateTime(); +$today->setTime(0, 0, 0); + +// 计算日期差异 +$interval = $today->diff($targetDate); + +// 获取天数差 +$剩余天数 = $interval->days; + +// 处理过去或未来的情况 +if ($interval->invert) { + $剩余天数 = -$剩余天数; +} + + + +$语句 = "SELECT * FROM users WHERE id = $用户ID;"; + +$用户数据 = @数据库运行($语句); + +$用户数据 = @reset($用户数据); + +$QQ = $用户数据["qq"]; + +日志写入("获取邮件模板","提示"); + +$邮件模板 = @file_get_contents("./Res/ExpiredProductsCleaner.html"); + + +$search = ["[到期时间]", "[业务名称]", "[业务ID]"]; +$replace = [$到期时间, $业务名称, $业务ID]; + +$邮件模板 = str_replace($search, $replace, $邮件模板); + +日志写入("正在发送邮件","提示"); +$结果 = 发送邮件接口( + $QQ.'@qq.com', + '关于业务的重要通知', + $邮件模板 +); + + +if ($结果 === 200) { + +日志写入("已发送","成功"); +} else { + +日志写入("发送失败 " . $结果,"错误"); +} + +$语句 = "SELECT * FROM products WHERE product_id = '$产品标识';"; + +日志写入("获取产品元数据中","提示"); + +$产品元数据 = @reset(@数据库运行($语句)); + + +日志写入("获取结果","提示"); + +日志写入(">>>==================================>>>","结果"); + +日志写入(@转JSON($产品元数据),"数据"); + +日志写入(">>>==================================>>>","结果"); + +$产品模块 = $产品元数据["module"]; +$产品周期 = $产品元数据["subscription_period"]; +$模块路径 = "../ProductsModule/".$产品模块."/Main.php"; + +日志写入("载入模块 ".$产品模块,"提示"); +require_once $模块路径; + + +日志写入("删除业务中","提示"); +$结果 = @转JSON(@删除业务($业务元数据,$产品元数据)); + +日志写入("结果 ".$结果,"结果"); + +$语句 = "UPDATE purchases +SET status = 'expired' +WHERE purchase_id = '$业务ID'; +"; +@数据库运行($语句); + +日志写入("已更新业务状态","提示"); + + +} + + +日志写入("任务结束","提示"); +日志写入(">>>==================================>>>","结束"); + +?> \ No newline at end of file diff --git a/Main/System/ExpiredProductsCleaner.php.bak b/Main/System/ExpiredProductsCleaner.php.bak new file mode 100644 index 0000000..81b7e16 --- /dev/null +++ b/Main/System/ExpiredProductsCleaner.php.bak @@ -0,0 +1,211 @@ + './Log/ExpiredProductsCleaner', // 日志目录 + 'retain_days' => 60, // 日志保留天数(改为60天清理) + 'file_prefix' => 'ExpiredProductsCleaner' // 日志文件前缀 + ]; + + // 生成时间相关变量 + $now = new DateTime(); + $currentDate = $now->format('Y-m-d'); + $logFile = sprintf("%s/%s_%s.log", $config['log_dir'], $config['file_prefix'], $currentDate); + + // 自动创建日志目录 + if (!is_dir($config['log_dir']) && !mkdir($config['log_dir'], 0777, true)) { + error_log("无法创建日志目录: {$config['log_dir']}"); + return; + } + + // 构建日志内容(含毫秒时间戳) + $timestamp = $now->format('[Y-m-d H:i:s]') . sprintf('.%03d', (float)$now->format('u')/1000); + $logLine = sprintf("%s <%s> - %s\n", $timestamp, strtoupper($type), $content); + + // 高性能写入(使用资源句柄+flock避免并发冲突) + try { + $handle = fopen($logFile, 'a'); // 追加模式打开 + if (flock($handle, LOCK_EX)) { // 获取独占锁 + fwrite($handle, $logLine); + flock($handle, LOCK_UN); // 释放锁 + } + fclose($handle); + } catch (Exception $e) { + error_log("日志写入失败: " . $e->getMessage()); + } + + // 控制台输出(可选调试) + echo $logLine; + + // 智能清理(每天只执行一次清理检查) + $cleanFlagFile = $config['log_dir'] . '/.last_clean'; + if (!file_exists($cleanFlagFile) || (time() - filemtime($cleanFlagFile)) > 86400) { + $expireDate = $now->modify("-{$config['retain_days']} days")->getTimestamp(); + foreach (glob($config['log_dir'] . "/{$config['file_prefix']}_*.log") as $file) { + if (filemtime($file) < $expireDate) { + @unlink($file); + } + } + touch($cleanFlagFile); // 更新清理标记时间 + } +} + + + +$语句 = "SELECT * +FROM purchases +WHERE + expiry_time < NOW() -- 过期时间早于当前时间 + AND status = 'expiring' +ORDER BY expiry_time; +"; + +日志写入(">>>==================================>>>","执行中"); + +日志写入("ExpiryReminder 任务开始","提示"); + +日志写入("查询中","提示"); + +$结果 = @数据库运行($语句); + +if (!$结果) { +日志写入("无结果","提示"); +die(); +} + +日志写入("查询结果","提示"); + +日志写入(">>>==================================>>>","结果"); + +日志写入(@转JSON($结果),"数据"); + +日志写入(">>>==================================>>>","结果"); + +日志写入("开始循环","提示"); + +foreach ($结果 as $业务元数据) { + +日志写入(">>>==================================>>>","任务"); +$用户ID = $业务元数据["user_id"]; +$业务ID = $业务元数据["purchase_id"]; +$业务状态 = $业务元数据["status"]; +$业务名称 = $业务元数据["name"]; +$到期时间 = $业务元数据["expiry_time"]; +$产品标识 = $业务元数据["product_id"]; +日志写入("提取业务ID ".$业务ID,"提示"); +日志写入("提取用户ID ".$用户ID,"提示"); +日志写入("提取业务状态 ".$业务状态,"提示"); + + + + + +$dateString = $到期时间; + +// 创建目标日期对象并设置时间为0点 +$targetDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString); +$targetDate->setTime(0, 0, 0); + +// 创建当前日期对象并设置时间为0点 +$today = new DateTime(); +$today->setTime(0, 0, 0); + +// 计算日期差异 +$interval = $today->diff($targetDate); + +// 获取天数差 +$剩余天数 = $interval->days; + +// 处理过去或未来的情况 +if ($interval->invert) { + $剩余天数 = -$剩余天数; +} + + + +$语句 = "SELECT * FROM users WHERE id = $用户ID;"; + +$用户数据 = @数据库运行($语句); + +$用户数据 = @reset($用户数据); + +$QQ = $用户数据["qq"]; + +日志写入("获取邮件模板","提示"); + +$邮件模板 = @file_get_contents("./Res/ExpiredProductsCleaner.html"); + + +$search = ["[到期时间]", "[业务名称]", "[业务ID]"]; +$replace = [$到期时间, $业务名称, $业务ID]; + +$邮件模板 = str_replace($search, $replace, $邮件模板); + +$结果 = 发送邮件接口( + $QQ.'@qq.com', + '关于业务的重要通知', + $邮件模板 +); + +日志写入("正在发送邮件","提示"); + +if ($结果 === 200) { + +日志写入("已发送","成功"); +} else { + +日志写入("发送失败 " . $结果,"错误"); +} + +$语句 = "SELECT * FROM products WHERE product_id = '$产品标识';"; + +日志写入("获取产品元数据中","提示"); + +$产品元数据 = @reset(@数据库运行($语句)); + + +日志写入("获取结果","提示"); + +日志写入(">>>==================================>>>","结果"); + +日志写入(@转JSON($产品元数据),"数据"); + +日志写入(">>>==================================>>>","结果"); + +$产品模块 = $产品元数据["module"]; +$产品周期 = $产品元数据["subscription_period"]; +$模块路径 = "../ProductsModule/".$产品模块."/Main.php"; + +日志写入("载入模块 ".$产品模块,"提示"); +require_once $模块路径; + + +日志写入("删除业务中","提示"); +$结果 = @转JSON(@删除业务($业务元数据,$产品元数据)); + +日志写入("结果 ".$结果,"结果"); + +$语句 = "UPDATE purchases +SET status = 'expired' +WHERE purchase_id = '$业务ID'; +"; +@数据库运行($语句); + +日志写入("已更新业务状态","提示"); + + +} + + +日志写入("任务结束","提示"); +日志写入(">>>==================================>>>","结束"); + +?> \ No newline at end of file diff --git a/Main/System/ExpiryReminder.php b/Main/System/ExpiryReminder.php new file mode 100644 index 0000000..9618bc2 --- /dev/null +++ b/Main/System/ExpiryReminder.php @@ -0,0 +1,212 @@ + './Log/ExpiryReminder', // 日志目录 + 'retain_days' => 60, // 日志保留天数(改为60天清理) + 'file_prefix' => 'ExpiryReminder' // 日志文件前缀 + ]; + + // 生成时间相关变量 + $now = new DateTime(); + $currentDate = $now->format('Y-m-d'); + $logFile = sprintf("%s/%s_%s.log", $config['log_dir'], $config['file_prefix'], $currentDate); + + // 自动创建日志目录 + if (!is_dir($config['log_dir']) && !mkdir($config['log_dir'], 0777, true)) { + error_log("无法创建日志目录: {$config['log_dir']}"); + return; + } + + // 构建日志内容(含毫秒时间戳) + $timestamp = $now->format('[Y-m-d H:i:s]') . sprintf('.%03d', (float)$now->format('u')/1000); + $logLine = sprintf("%s <%s> - %s\n", $timestamp, strtoupper($type), $content); + + // 高性能写入(使用资源句柄+flock避免并发冲突) + try { + $handle = fopen($logFile, 'a'); // 追加模式打开 + if (flock($handle, LOCK_EX)) { // 获取独占锁 + fwrite($handle, $logLine); + flock($handle, LOCK_UN); // 释放锁 + } + fclose($handle); + } catch (Exception $e) { + error_log("日志写入失败: " . $e->getMessage()); + } + + // 控制台输出(可选调试) + echo $logLine; + + // 智能清理(每天只执行一次清理检查) + $cleanFlagFile = $config['log_dir'] . '/.last_clean'; + if (!file_exists($cleanFlagFile) || (time() - filemtime($cleanFlagFile)) > 86400) { + $expireDate = $now->modify("-{$config['retain_days']} days")->getTimestamp(); + foreach (glob($config['log_dir'] . "/{$config['file_prefix']}_*.log") as $file) { + if (filemtime($file) < $expireDate) { + @unlink($file); + } + } + touch($cleanFlagFile); // 更新清理标记时间 + } +} + +日志写入(">>>==================================>>>","提示"); +日志写入("预修复数据中","提示"); +$语句 = "UPDATE purchases +SET status = 'activated' +WHERE + status = 'expiring' + AND expiry_time > CURDATE() + INTERVAL 7 DAY +"; + +$Q = @数据库运行($语句); +日志写入("CODE ".$Q,"提示"); + +日志写入(">>>==================================>>>","提示"); +日志写入("删除过时数据中","提示"); +$语句 = "DELETE FROM purchases +WHERE + status = 'expired' + AND expiry_time < NOW() - INTERVAL 2 DAY;"; + +$Q = @数据库运行($语句); +日志写入("CODE ".$Q,"提示"); + +日志写入(">>>==================================>>>","提示"); + + +$语句 = "SELECT * +FROM purchases +WHERE + ( + (expiry_time >= CURDATE() + AND expiry_time < CURDATE() + INTERVAL 8 DAY) + OR + expiry_time < NOW() + ) + AND status != 'expired' -- 现在这个条件会全局生效 +ORDER BY expiry_time +"; + +日志写入(">>>==================================>>>","执行中"); + +日志写入("ExpiryReminder 任务开始","提示"); + +日志写入("查询中","提示"); + +$结果 = @数据库运行($语句); + +if (!$结果) { +日志写入("无结果","提示"); +die(); +} + +日志写入("查询结果","提示"); + +日志写入(">>>==================================>>>","结果"); + +日志写入(@转JSON($结果),"数据"); + +日志写入(">>>==================================>>>","结果"); + +日志写入("开始循环","提示"); + +foreach ($结果 as $数据) { + +日志写入(">>>==================================>>>","任务"); +$用户ID = $数据["user_id"]; +$业务ID = $数据["purchase_id"]; +$业务状态 = $数据["status"]; +$业务名称 = $数据["name"]; +$到期时间 = $数据["expiry_time"]; +日志写入("提取业务ID ".$业务ID,"提示"); +日志写入("提取用户ID ".$用户ID,"提示"); +日志写入("提取业务状态 ".$业务状态,"提示"); + + + + + +$dateString = $到期时间; + +// 创建目标日期对象并设置时间为0点 +$targetDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString); +$targetDate->setTime(0, 0, 0); + +// 创建当前日期对象并设置时间为0点 +$today = new DateTime(); +$today->setTime(0, 0, 0); + +// 计算日期差异 +$interval = $today->diff($targetDate); + +// 获取天数差 +$剩余天数 = $interval->days; + +// 处理过去或未来的情况 +if ($interval->invert) { + $剩余天数 = -$剩余天数; +} + + + +$语句 = "SELECT * FROM users WHERE id = $用户ID;"; + +$用户数据 = @数据库运行($语句); + +$用户数据 = @reset($用户数据); + +$QQ = $用户数据["qq"]; + +if ($业务状态 != "expiring") { +$语句 = "UPDATE purchases +SET status = 'expiring' +WHERE purchase_id = '$业务ID'; +"; +@数据库运行($语句); +日志写入("业务状态已更新","成功"); +} else { +日志写入("业务状态无需更新","成功"); +} + +日志写入("获取邮件模板","提示"); + +$邮件模板 = @file_get_contents("./Res/ExpiryReminder.html"); + + +$search = ["[到期时间]", "[业务名称]", "[剩余天数]", "[业务ID]"]; +$replace = [$到期时间, $业务名称, $剩余天数, $业务ID]; + +$邮件模板 = str_replace($search, $replace, $邮件模板); + +日志写入("正在发送邮件","提示"); +$结果 = 发送邮件接口( + $QQ.'@qq.com', + '关于业务的重要通知', + $邮件模板 +); + + +if ($结果 === 200) { + +日志写入("已发送","成功"); +} else { + +日志写入("发送失败 " . $结果,"错误"); +} + +} + + +日志写入("任务结束","提示"); +日志写入(">>>==================================>>>","结束"); + +?> \ No newline at end of file diff --git a/Main/System/ExpiryReminder.php.bak b/Main/System/ExpiryReminder.php.bak new file mode 100644 index 0000000..9e0fd5d --- /dev/null +++ b/Main/System/ExpiryReminder.php.bak @@ -0,0 +1,202 @@ + './Log/ExpiryReminder', // 日志目录 + 'retain_days' => 60, // 日志保留天数(改为60天清理) + 'file_prefix' => 'ExpiryReminder' // 日志文件前缀 + ]; + + // 生成时间相关变量 + $now = new DateTime(); + $currentDate = $now->format('Y-m-d'); + $logFile = sprintf("%s/%s_%s.log", $config['log_dir'], $config['file_prefix'], $currentDate); + + // 自动创建日志目录 + if (!is_dir($config['log_dir']) && !mkdir($config['log_dir'], 0777, true)) { + error_log("无法创建日志目录: {$config['log_dir']}"); + return; + } + + // 构建日志内容(含毫秒时间戳) + $timestamp = $now->format('[Y-m-d H:i:s]') . sprintf('.%03d', (float)$now->format('u')/1000); + $logLine = sprintf("%s <%s> - %s\n", $timestamp, strtoupper($type), $content); + + // 高性能写入(使用资源句柄+flock避免并发冲突) + try { + $handle = fopen($logFile, 'a'); // 追加模式打开 + if (flock($handle, LOCK_EX)) { // 获取独占锁 + fwrite($handle, $logLine); + flock($handle, LOCK_UN); // 释放锁 + } + fclose($handle); + } catch (Exception $e) { + error_log("日志写入失败: " . $e->getMessage()); + } + + // 控制台输出(可选调试) + echo $logLine; + + // 智能清理(每天只执行一次清理检查) + $cleanFlagFile = $config['log_dir'] . '/.last_clean'; + if (!file_exists($cleanFlagFile) || (time() - filemtime($cleanFlagFile)) > 86400) { + $expireDate = $now->modify("-{$config['retain_days']} days")->getTimestamp(); + foreach (glob($config['log_dir'] . "/{$config['file_prefix']}_*.log") as $file) { + if (filemtime($file) < $expireDate) { + @unlink($file); + } + } + touch($cleanFlagFile); // 更新清理标记时间 + } +} + +日志写入(">>>==================================>>>","提示"); +日志写入("预修复数据中","提示"); +$语句 = "UPDATE purchases +SET status = 'activated' +WHERE + status = 'expiring' + AND expiry_time > CURDATE() + INTERVAL 7 DAY +"; + +$Q = @数据库运行($语句); +日志写入("CODE ".$Q,"提示"); + +日志写入(">>>==================================>>>","提示"); + + +$语句 = "SELECT * +FROM purchases +WHERE + ( + (expiry_time >= CURDATE() + AND expiry_time < CURDATE() + INTERVAL 8 DAY) + OR + expiry_time < NOW() + ) + AND status != 'expired' -- 现在这个条件会全局生效 +ORDER BY expiry_time +"; + +日志写入(">>>==================================>>>","执行中"); + +日志写入("ExpiryReminder 任务开始","提示"); + +日志写入("查询中","提示"); + +$结果 = @数据库运行($语句); + +if (!$结果) { +日志写入("无结果","提示"); +die(); +} + +日志写入("查询结果","提示"); + +日志写入(">>>==================================>>>","结果"); + +日志写入(@转JSON($结果),"数据"); + +日志写入(">>>==================================>>>","结果"); + +日志写入("开始循环","提示"); + +foreach ($结果 as $数据) { + +日志写入(">>>==================================>>>","任务"); +$用户ID = $数据["user_id"]; +$业务ID = $数据["purchase_id"]; +$业务状态 = $数据["status"]; +$业务名称 = $数据["name"]; +$到期时间 = $数据["expiry_time"]; +日志写入("提取业务ID ".$业务ID,"提示"); +日志写入("提取用户ID ".$用户ID,"提示"); +日志写入("提取业务状态 ".$业务状态,"提示"); + + + + + +$dateString = $到期时间; + +// 创建目标日期对象并设置时间为0点 +$targetDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString); +$targetDate->setTime(0, 0, 0); + +// 创建当前日期对象并设置时间为0点 +$today = new DateTime(); +$today->setTime(0, 0, 0); + +// 计算日期差异 +$interval = $today->diff($targetDate); + +// 获取天数差 +$剩余天数 = $interval->days; + +// 处理过去或未来的情况 +if ($interval->invert) { + $剩余天数 = -$剩余天数; +} + + + +$语句 = "SELECT * FROM users WHERE id = $用户ID;"; + +$用户数据 = @数据库运行($语句); + +$用户数据 = @reset($用户数据); + +$QQ = $用户数据["qq"]; + +if ($业务状态 != "expiring") { +$语句 = "UPDATE purchases +SET status = 'expiring' +WHERE purchase_id = '$业务ID'; +"; +@数据库运行($语句); +日志写入("业务状态已更新","成功"); +} else { +日志写入("业务状态无需更新","成功"); +} + +日志写入("获取邮件模板","提示"); + +$邮件模板 = @file_get_contents("./Res/ExpiryReminder.html"); + + +$search = ["[到期时间]", "[业务名称]", "[剩余天数]", "[业务ID]"]; +$replace = [$到期时间, $业务名称, $剩余天数, $业务ID]; + +$邮件模板 = str_replace($search, $replace, $邮件模板); + +日志写入("正在发送邮件","提示"); +$结果 = 发送邮件接口( + $QQ.'@qq.com', + '关于业务的重要通知', + $邮件模板 +); + + +if ($结果 === 200) { + +日志写入("已发送","成功"); +} else { + +日志写入("发送失败 " . $结果,"错误"); +} + +} + + +日志写入("任务结束","提示"); +日志写入(">>>==================================>>>","结束"); + +?> \ No newline at end of file diff --git a/Main/System/Log/.last_clean b/Main/System/Log/.last_clean new file mode 100644 index 0000000..e69de29 diff --git a/Main/System/Log/ExpiredProductsCleaner/.last_clean b/Main/System/Log/ExpiredProductsCleaner/.last_clean new file mode 100644 index 0000000..e69de29 diff --git a/Main/System/Log/ExpiredProductsCleaner/ExpiredProductsCleaner_2025-03-01.log b/Main/System/Log/ExpiredProductsCleaner/ExpiredProductsCleaner_2025-03-01.log new file mode 100644 index 0000000..f1f3248 --- /dev/null +++ b/Main/System/Log/ExpiredProductsCleaner/ExpiredProductsCleaner_2025-03-01.log @@ -0,0 +1,1083 @@ +[2025-03-01 15:14:47].382 <执行中> - >>>==================================>>> +[2025-03-01 15:14:47].383 <提示> - ExpiryReminder 任务开始 +[2025-03-01 15:14:47].383 <提示> - 查询中 +[2025-03-01 15:14:47].517 <提示> - 查询结果 +[2025-03-01 15:14:47].518 <结果> - >>>==================================>>> +[2025-03-01 15:14:47].518 <数据> - [ + { + "id": "18", + "user_id": "3", + "product_id": "hk-free-a", + "purchase_id": "FVE-563-ASY", + "purchase_time": "2025-02-23 03:55:37", + "expiry_time": "2025-02-25 03:55:37", + "quantity": "1", + "status": "expiring", + "subscription_period": "30", + "extra_data": "{\n \"username\": \"bm4h3na5xj\",\n \"password\": \"3jmwv9cv2o62j5h\"\n}", + "name": "香港🇭🇰公益虚拟主机-A" + } +] +[2025-03-01 15:14:47].518 <结果> - >>>==================================>>> +[2025-03-01 15:14:47].518 <提示> - 开始循环 +[2025-03-01 15:14:47].519 <任务> - >>>==================================>>> +[2025-03-01 15:14:47].519 <提示> - 提取业务ID FVE-563-ASY +[2025-03-01 15:14:47].519 <提示> - 提取用户ID 3 +[2025-03-01 15:14:47].519 <提示> - 提取业务状态 expiring +[2025-03-01 15:14:47].655 <提示> - 获取邮件模板 +[2025-03-01 15:14:50].045 <提示> - 正在发送邮件 +[2025-03-01 15:14:50].046 <成功> - 已发送 +[2025-03-01 15:14:50].046 <提示> - 获取产品元数据中 +[2025-03-01 15:14:50].190 <提示> - 获取结果 +[2025-03-01 15:14:50].190 <结果> - >>>==================================>>> +[2025-03-01 15:14:50].190 <数据> - { + "id": "2", + "name": "香港🇭🇰公益虚拟主机-A", + "description": "