From dd05dc9b74aeaac701ab094866d588092c565b3b Mon Sep 17 00:00:00 2001
From: gfdgd_xi <3025613752@qq.com>
Date: Sat, 13 Aug 2022 17:50:21 +0800
Subject: [PATCH] =?UTF-8?q?1.9.0=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Icon/BadStar.svg | 81 +
Icon/Star.svg | 76 +
Icon/UnStar.svg | 76 +
Makefile | 26 +-
clean-unuse-program.py | 29 +-
deb/DEBIAN/control | 1 +
deb/DEBIAN/postrm | 7 +-
.../apps/deepin-wine-runner/Icon/BadStar.svg | 81 +
deb/opt/apps/deepin-wine-runner/Icon/Star.svg | 76 +
.../apps/deepin-wine-runner/Icon/UnStar.svg | 76 +
deb/opt/apps/deepin-wine-runner/StartVM.sh | 22 +
.../deepin-wine-runner/clean-unuse-program.py | 29 +-
.../apps/deepin-wine-runner/cleanbottle.sh | 393 +
.../deepin-wine-packager.py | 77 +-
.../deepin-wine-runner/deepin-wine-runner | 207 +-
deb/opt/apps/deepin-wine-runner/dlls.7z | Bin 2901126 -> 0 bytes
.../apps/deepin-wine-runner/information.json | 5 +
.../deepin-wine-runner/package-script.zip | Bin 300045 -> 300045 bytes
deepin-wine-packager.py | 77 +-
dlls.7z | Bin 2901126 -> 0 bytes
information.json | 3 +
mainwindow.py | 187 +-
package-script.zip | Bin 300045 -> 300045 bytes
system.reg | 38800 ----------------
user.reg | 871 -
userdef.reg | 64 -
26 files changed, 1417 insertions(+), 39847 deletions(-)
create mode 100644 Icon/BadStar.svg
create mode 100644 Icon/Star.svg
create mode 100644 Icon/UnStar.svg
create mode 100644 deb/opt/apps/deepin-wine-runner/Icon/BadStar.svg
create mode 100644 deb/opt/apps/deepin-wine-runner/Icon/Star.svg
create mode 100644 deb/opt/apps/deepin-wine-runner/Icon/UnStar.svg
create mode 100755 deb/opt/apps/deepin-wine-runner/StartVM.sh
create mode 100755 deb/opt/apps/deepin-wine-runner/cleanbottle.sh
delete mode 100644 deb/opt/apps/deepin-wine-runner/dlls.7z
delete mode 100644 dlls.7z
delete mode 100644 system.reg
delete mode 100644 user.reg
delete mode 100644 userdef.reg
diff --git a/Icon/BadStar.svg b/Icon/BadStar.svg
new file mode 100644
index 0000000..7b6cfe4
--- /dev/null
+++ b/Icon/BadStar.svg
@@ -0,0 +1,81 @@
+
+
+
+
diff --git a/Icon/Star.svg b/Icon/Star.svg
new file mode 100644
index 0000000..03c1185
--- /dev/null
+++ b/Icon/Star.svg
@@ -0,0 +1,76 @@
+
+
+
+
diff --git a/Icon/UnStar.svg b/Icon/UnStar.svg
new file mode 100644
index 0000000..dc4c6fd
--- /dev/null
+++ b/Icon/UnStar.svg
@@ -0,0 +1,76 @@
+
+
+
+
diff --git a/Makefile b/Makefile
index a5355eb..8fef46f 100755
--- a/Makefile
+++ b/Makefile
@@ -8,16 +8,6 @@ build:
cp -rv VM-source/Windows7X86Auto.iso VM
cp -rv VM-source/run.py VM
zip -v -q -r package-script.zip package-script
- #rm -rfv dlls.7z
- #rm -rfv dlls-arm.7z
- #rm -rfv dxvk.7z
- #rm -rfv exagear.7z
- #rm -rfv wined3d.dll.so.7z
- #7z a dlls.7z dlls
- #7z a dlls-arm.7z dlls-arm
- #7z a dxvk.7z dxvk
- #7z a exagear.7z exagear
- #7z a wined3d.dll.so.7z wined3d.dll.so
cp -rv VM deb/opt/apps/deepin-wine-runner
cp -rv AllInstall.py deb/opt/apps/deepin-wine-runner
cp -rv BeCyIconGrabber.exe deb/opt/apps/deepin-wine-runner
@@ -43,18 +33,20 @@ build:
cp -rv RunVM.sh deb/opt/apps/deepin-wine-runner
cp -rv "wine install" deb/opt/apps/deepin-wine-runner
cp -rv 窗体透明度设置工具.exe deb/opt/apps/deepin-wine-runner
- cp -rv dlls.7z deb/opt/apps/deepin-wine-runner
- cp -rv UpdateGeek.sh deb/opt/apps/deepin-wine-runner
- cp -rv AppStore.py deb/opt/apps/deepin-wine-runner
- cp -rv InstallWineOnDeepin23.py deb/opt/apps/deepin-wine-runner
+ cp -rv UpdateGeek.sh deb/opt/apps/deepin-wine-runner
+ cp -rv AppStore.py deb/opt/apps/deepin-wine-runner
+ cp -rv InstallWineOnDeepin23.py deb/opt/apps/deepin-wine-runner
cp -rv dxvk.7z deb/opt/apps/deepin-wine-runner
- cp -rv InstallFont.py deb/opt/apps/deepin-wine-runner
+ cp -rv InstallFont.py deb/opt/apps/deepin-wine-runner
cp -rv dlls-arm.7z deb/opt/apps/deepin-wine-runner
- cp -rv deepin.list deb/opt/apps/deepin-wine-runner
- cp -rv sparkstore.list deb/opt/apps/deepin-wine-runner
+ cp -rv deepin.list deb/opt/apps/deepin-wine-runner
+ cp -rv sparkstore.list deb/opt/apps/deepin-wine-runner
cp -rv wined3d.dll.so.7z deb/opt/apps/deepin-wine-runner
cp -rv clean-unuse-program.py deb/opt/apps/deepin-wine-runner
cp -rv InstallNewWineHQ.sh deb/opt/apps/deepin-wine-runner
+ cp -rv cleanbottle.sh deb/opt/apps/deepin-wine-runner
+ cp -rv StartVM.sh deb/opt/apps/deepin-wine-runner
+ cp -rv Icon deb/opt/apps/deepin-wine-runner
dpkg -b deb spark-deepin-wine-runner.deb
diff --git a/clean-unuse-program.py b/clean-unuse-program.py
index f819fb7..89e8e15 100755
--- a/clean-unuse-program.py
+++ b/clean-unuse-program.py
@@ -4,21 +4,40 @@ import os
if __name__ == "__main__":
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
print("此程序可以帮助您删除程序无需的组件以节约空间")
+ print("如果全部删除,将只会有核心功能")
print("如果删除后想要恢复这样组件需要重新安装该软件包")
delProgramList = []
delProramCommand = "#!/bin/bash\n"
for i in [
+ [
+ "含有商业软件的内容",
+ [
+ f"{programPath}/StartVM.sh",
+ f"{programPath}/RunVM.sh",
+ f"{programPath}/VM",
+ "/usr/share/applications/spark-deepin-wine-runner-control-vm.desktop",
+ "/usr/share/applications/spark-deepin-wine-runner-start-vm.desktop",
+ f"{programPath}/BeCyIconGrabber.exe",
+ f"{programPath}/geek.exe",
+ f"{programPath}/窗体透明度设置工具.exe",
+ f"{programPath}/UpdateGeek.sh",
+ f"{programPath}/AppStore.py",
+ f"{programPath}/InstallFont.py",
+ f"{programPath}/InstallMsxml.py",
+ f"{programPath}/InstallNetFramework.py",
+ f"{programPath}/InstallOther.py",
+ f"{programPath}/InstallVisualCPlusPlus.py"
+ ]
+ ],
[
"Wine 打包器(不基于生态打包脚本)",
[
- f"{programPath}/dlls.7z",
- f"{programPath}/dlls",
+ f"{programPath}/deepin-wine-packager.py",
f"{programPath}/exagear",
f"{programPath}/exagear.7z",
f"{programPath}/exagear",
f"{programPath}/wined3d.dll.so.7z",
f"{programPath}/wined3d.dll.so",
- f"{programPath}/deepin-wine-packager.py",
"/usr/bin/deepin-wine-package-builder",
"/usr/share/applications/spark-deepin-wine-package-builder.desktop"
]
@@ -37,7 +56,9 @@ if __name__ == "__main__":
"Arm 64 box86 wine 运行 DLL",
[
f"{programPath}/dlls-arm.7z",
- f"{programPath}/dlls-arm"
+ f"{programPath}/dlls-arm",
+ f"{programPath}/wined3d.dll.so.7z",
+ f"{programPath}/wined3d.dll.so"
]
],
[
diff --git a/deb/DEBIAN/control b/deb/DEBIAN/control
index 751ea32..ac270fd 100755
--- a/deb/DEBIAN/control
+++ b/deb/DEBIAN/control
@@ -7,6 +7,7 @@ Priority: optional
Depends: python3, python3-pil, python3-pil.imagetk, python3-pyquery, deepin-terminal, aria2, curl, unrar, unzip, python3-requests, fakeroot, bash, python3-pyqt5, toilet
Conflicts: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer
Replaces: spark.deepin-venturi-setter, spark-deepin-wine5-application-packer
+Installed-Size: 23500
Description: gfdgd xi、为什么您不喜欢熊出没和阿布呢 制作的 wine 运行器
更新内容:
※1、界面大改造,从使用 Tkinter 改为 Qt,参考了 @134******28 和 @sgb76 提供的设计方案和代码
diff --git a/deb/DEBIAN/postrm b/deb/DEBIAN/postrm
index f959110..643f829 100755
--- a/deb/DEBIAN/postrm
+++ b/deb/DEBIAN/postrm
@@ -1,3 +1,6 @@
#!/bin/sh
-# 删除软件残留
-rm -rfv /opt/apps/spark-deepin-wine-runner/*
\ No newline at end of file
+# 删除软件残留,简单粗暴一点直接全部删掉,防止出现警告
+# 加判断是为了怕 reinstall 后程序就再也打不开了(除非卸载后重新安装)
+if [ "$1" = "remove" ] || [ "$1" = "purge" ];then
+ rm -rf /opt/apps/deepin-wine-runner/
+fi
diff --git a/deb/opt/apps/deepin-wine-runner/Icon/BadStar.svg b/deb/opt/apps/deepin-wine-runner/Icon/BadStar.svg
new file mode 100644
index 0000000..7b6cfe4
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/Icon/BadStar.svg
@@ -0,0 +1,81 @@
+
+
+
+
diff --git a/deb/opt/apps/deepin-wine-runner/Icon/Star.svg b/deb/opt/apps/deepin-wine-runner/Icon/Star.svg
new file mode 100644
index 0000000..03c1185
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/Icon/Star.svg
@@ -0,0 +1,76 @@
+
+
+
+
diff --git a/deb/opt/apps/deepin-wine-runner/Icon/UnStar.svg b/deb/opt/apps/deepin-wine-runner/Icon/UnStar.svg
new file mode 100644
index 0000000..dc4c6fd
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/Icon/UnStar.svg
@@ -0,0 +1,76 @@
+
+
+
+
diff --git a/deb/opt/apps/deepin-wine-runner/StartVM.sh b/deb/opt/apps/deepin-wine-runner/StartVM.sh
new file mode 100755
index 0000000..d1a7c77
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/StartVM.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# 使用系统默认的 bash 运行
+###########################################################################################
+# 作者:gfdgd xi、为什么您不喜欢熊出没和阿布呢
+# 版本:1.7.0
+# 更新时间:2022年07月15日
+# 感谢:感谢 wine 以及 deepin-wine 团队,提供了 wine 和 deepin-wine 给大家使用,让我能做这个程序
+# 基于 Python3 的 tkinter 构建
+###########################################################################################
+VBoxManage showvminfo Windows
+if test 0 == $?; then
+ # 检测到虚拟机存在,启动虚拟机
+ VBoxManage startvm Windows
+ exit
+fi
+zenity --question --no-wrap --text="检查到您未创建所指定的虚拟机,是否创建虚拟机并继续?\n如果不创建将无法使用"
+if test 1 == $?; then
+ # 用户不想创建虚拟机,结束
+ exit
+fi
+cd `dirname $0`
+./VM/VirtualMachine
\ No newline at end of file
diff --git a/deb/opt/apps/deepin-wine-runner/clean-unuse-program.py b/deb/opt/apps/deepin-wine-runner/clean-unuse-program.py
index f819fb7..89e8e15 100755
--- a/deb/opt/apps/deepin-wine-runner/clean-unuse-program.py
+++ b/deb/opt/apps/deepin-wine-runner/clean-unuse-program.py
@@ -4,21 +4,40 @@ import os
if __name__ == "__main__":
programPath = os.path.split(os.path.realpath(__file__))[0] # 返回 string
print("此程序可以帮助您删除程序无需的组件以节约空间")
+ print("如果全部删除,将只会有核心功能")
print("如果删除后想要恢复这样组件需要重新安装该软件包")
delProgramList = []
delProramCommand = "#!/bin/bash\n"
for i in [
+ [
+ "含有商业软件的内容",
+ [
+ f"{programPath}/StartVM.sh",
+ f"{programPath}/RunVM.sh",
+ f"{programPath}/VM",
+ "/usr/share/applications/spark-deepin-wine-runner-control-vm.desktop",
+ "/usr/share/applications/spark-deepin-wine-runner-start-vm.desktop",
+ f"{programPath}/BeCyIconGrabber.exe",
+ f"{programPath}/geek.exe",
+ f"{programPath}/窗体透明度设置工具.exe",
+ f"{programPath}/UpdateGeek.sh",
+ f"{programPath}/AppStore.py",
+ f"{programPath}/InstallFont.py",
+ f"{programPath}/InstallMsxml.py",
+ f"{programPath}/InstallNetFramework.py",
+ f"{programPath}/InstallOther.py",
+ f"{programPath}/InstallVisualCPlusPlus.py"
+ ]
+ ],
[
"Wine 打包器(不基于生态打包脚本)",
[
- f"{programPath}/dlls.7z",
- f"{programPath}/dlls",
+ f"{programPath}/deepin-wine-packager.py",
f"{programPath}/exagear",
f"{programPath}/exagear.7z",
f"{programPath}/exagear",
f"{programPath}/wined3d.dll.so.7z",
f"{programPath}/wined3d.dll.so",
- f"{programPath}/deepin-wine-packager.py",
"/usr/bin/deepin-wine-package-builder",
"/usr/share/applications/spark-deepin-wine-package-builder.desktop"
]
@@ -37,7 +56,9 @@ if __name__ == "__main__":
"Arm 64 box86 wine 运行 DLL",
[
f"{programPath}/dlls-arm.7z",
- f"{programPath}/dlls-arm"
+ f"{programPath}/dlls-arm",
+ f"{programPath}/wined3d.dll.so.7z",
+ f"{programPath}/wined3d.dll.so"
]
],
[
diff --git a/deb/opt/apps/deepin-wine-runner/cleanbottle.sh b/deb/opt/apps/deepin-wine-runner/cleanbottle.sh
new file mode 100755
index 0000000..8b60131
--- /dev/null
+++ b/deb/opt/apps/deepin-wine-runner/cleanbottle.sh
@@ -0,0 +1,393 @@
+#!/bin/sh
+if [ $WINE = "" ]; then
+ WINE_CMD="deepin-wine5"
+else
+ WINE_CMD=$WINE
+fi
+userdir=$USER
+
+remove_file()
+{
+ echo "============remove [$1]"
+ rm -rfv "$1"
+}
+
+purge_dir()
+{
+ echo "=============clean [$1]"
+ if [ -e "$1" ]; then
+ find "$1" -mindepth 1 -ignore_readdir_race -exec rm -rfv {} \;
+ else
+ mkdir -p "$1"
+ fi
+}
+
+clean_gecko()
+{
+ geckoid=$($WINE_CMD $BottleBase/windows/system32/uninstaller.exe --list | grep Gecko | cut -d"|" -f1)
+ echo " gecko GUID: ${geckoid}"
+ if [ -n "${geckoid}" ]; then
+ echo "uninstall gecko..."
+ $WINE_CMD $BottleBase/windows/system32/uninstaller.exe --remove ${geckoid}
+ fi
+ if [ -e "$BottleBase/windows/system32/gecko" ]; then
+ for i in $(ls "$BottleBase/windows/system32/gecko/" | grep -v plugin); do
+ echo "=============remove gecko dir [$i]"
+ rm -rfv "$BottleBase/windows/system32/gecko/$i"
+ done
+ fi
+}
+
+clean_common_temp()
+{
+ remove_file "$BottleBase/../winetricks.log"
+ purge_dir "$BottleBase/windows/ControlPanelDB"
+ remove_file "$BottleBase/windows/control-panel.db"
+ purge_dir "$BottleBase/windows/temp"
+ purge_dir "$BottleBase/windows/Installer"
+ purge_dir "$BottleBase/users/$userdir/Temp"
+ purge_dir "$BottleBase/users/$userdir/Cookies"
+ purge_dir "$BottleBase/users/$userdir/Recent"
+ remove_file "$BottleBase/users/$userdir/Application Data/pcmaster"
+ purge_dir "$BottleBase/users/$userdir/Application Data/wine_gecko"
+ purge_dir "$BottleBase/users/$userdir/Local Settings/History"
+ purge_dir "$BottleBase/users/$userdir/Local Settings/Temporary Internet Files"
+ #remove_file "$BottleBase/users/${USER}"
+ purge_dir "$BottleBase/users/Public/Temp"
+ remove_file "$BottleBase/../PACKAGE_VERSION"
+ remove_file "$BottleBase/../update.policy"
+ purge_dir "$BottleBase/deepin"
+}
+
+cleanup_aliwangwang()
+{
+ if [ ! -e "$BottleBase/Program Files/AliWangWang/AliIM.exe" ]; then return; fi
+
+ echo "++++AliWangWang detected. cleaning..."
+ purge_dir "$BottleBase/Program Files/AliWangWang/profiles"
+ purge_dir "$BottleBase/Program Files/AliWangWang/new"
+ purge_dir "$BottleBase/users/$userdir/Local Settings/Application Data/aef"
+ purge_dir "$BottleBase/users/$userdir/Application Data/AliWangWang"
+ purge_dir "$BottleBase/users/$userdir/Application Data/TaobaoProtect"
+ purge_dir "$BottleBase/users/$userdir/Application Data/wwbizsrv"
+}
+
+cleanup_aliworkbench()
+{
+ if [ ! -e "$BottleBase/Program Files/AliWorkbench/AliWorkbench.exe" ]; then return; fi
+
+ echo "++++AliWorkbench detected. cleaning..."
+ purge_dir "$BottleBase/users/Public/Documents/AliWorkbench"
+ purge_dir "$BottleBase/users/$userdir/Local Settings/Application Data/aef/"
+ purge_dir "$BottleBase/users/$userdir/Local Settings/Application Data/AliWorkbench/"
+ purge_dir "$BottleBase/users/$userdir/Application Data/AliWorkbench/"
+}
+
+cleanup_flash()
+{
+ if [ ! -e "$BottleBase/windows/system32/Macromed/Flash/" ]; then return; fi
+
+ echo "++++flash detected. cleaning..."
+ remove_file "$BottleBase/users/$userdir/Application Data/Adobe"
+ remove_file "$BottleBase/users/$userdir/Application Data/Macromedia"
+ remove_file "$BottleBase/windows/system32/FlashPlayerApp.exe"
+ remove_file "$BottleBase/windows/ControlPanelDB/FlashPlayerCPLApp.ico"
+ remove_file "$BottleBase/windows/system32/FlashPlayerCPLApp.cpl"
+ remove_file "$BottleBase/windows/system32/Macromed/Flash/FlashInstall.log"
+ #remove_file "$BottleBase/windows/system32/Macromed/Flash/Flash*.dll"
+ #remove_file "$BottleBase/windows/system32/Macromed/Flash/Flash*.exe"
+}
+
+cleanup_foobar2000()
+{
+ if [ ! -e "$BottleBase/Program Files/foobar2000/foobar2000.exe" ]; then return; fi
+
+ echo "++++foobar2000 detected. cleaning..."
+ purge_dir "$BottleBase/Program Files/foobar2000/configuration"
+ purge_dir "$BottleBase/Program Files/foobar2000/library"
+ purge_dir "$BottleBase/Program Files/foobar2000/playlists-v1.3"
+ remove_file "$BottleBase/Program Files/foobar2000/theme.fth"
+}
+
+cleanup_mailmaster()
+{
+ if [ ! -e "$BottleBase/Program Files/Netease/MailMaster/MailMaster.exe" ]; then return; fi
+
+ echo "++++MailMaster detected. cleaning..."
+ remove_file "$BottleBase/Program Files/Netease/MailMaster/account"
+ remove_file "$BottleBase/Program Files/Netease/MailMaster/address"
+ remove_file "$BottleBase/Program Files/Netease/MailMaster/tmp"
+ remove_file "$BottleBase/Program Files/Netease/MailMaster/UpdateTemp"
+ remove_file "$BottleBase/Program Files/Netease/MailMaster/applog.txt"
+ remove_file "$BottleBase/Program Files/Netease/MailMaster/netlog.txt"
+ remove_file "$BottleBase/Program Files/Netease/MailMaster/global.cfg"
+ remove_file "$BottleBase/Program Files/Netease/MailMaster/schd.sdb"
+}
+
+cleanup_nativeie()
+{
+ if [ ! -e "$BottleBase/Program Files/Internet Explorer/iexplore.exe.mui" ]; then return; fi
+
+ echo "++++native IE detected. cleaning..."
+ purge_dir "$BottleBase/users/$userdir/Local Settings/Application Data/Microsoft/"
+
+ remove_file "$BottleBase/windows/ie8"
+ remove_file "$BottleBase/windows/%DownloadedProgramFiles%"
+
+ #remove all useless gecko files
+ remove_file "$BottleBase/windows/system32/gecko"
+}
+
+cleanup_qq_before()
+{
+ if [ ! -e "$BottleBase/Program Files/Tencent/QQ/Bin/QQ.exe" ]; then return; fi
+
+ echo "++++QQ detected. cleaning..."
+ if [ -f "$BottleBase/Program Files/Tencent/Qzone/QQPhotoDrawUpdateSvr.exe" ]; then
+ remove_file "$BottleBase/Program Files/Tencent/Qzone"
+ fi
+ if [ -f "$BottleBase/Program Files/Tencent/QQGameMicro/QQGameMicro.exe" ]; then
+ remove_file "$BottleBase/Program Files/Tencent/QQGameMicro"
+ fi
+}
+
+cleanup_qq()
+{
+ if [ ! -e "$BottleBase/Program Files/Tencent/QQ/Bin/QQ.exe" ]; then return; fi
+
+ echo "++++cleaning QQ remains..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent"
+ purge_dir "$BottleBase/users/$userdir/Local Settings/Application Data/Tencent"
+ purge_dir "$BottleBase/users/Public/Application Data/Tencent/QQPCMgr"
+ purge_dir "$BottleBase/users/Public/Application Data/Tencent/QQProtect"
+ purge_dir "$BottleBase/users/Public/Application Data/Tencent/QQDownload"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/Npchrome"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/QQDownload"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/QQMiniDL"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/TXFTN"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/TXPTOP"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/TXSSO"
+ purge_dir "$BottleBase/Program Files/Tencent/QQGameMicro"
+ purge_dir "$BottleBase/Program Files/Tencent/QQMusic"
+ remove_file "$BottleBase/Program Files/Tencent/QQ/Plugin/Com.Tencent.QQPet/bin/QQPet"
+ remove_file "$BottleBase/Program Files/Tencent/QQ/Users"
+}
+
+cleanup_tim()
+{
+ if [ ! -e "$BottleBase/Program Files/Tencent/TIM/Bin/TIM.exe" ]; then return; fi
+
+ echo "++++cleaning TIM remains..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent"
+ purge_dir "$BottleBase/users/$userdir/Local Settings/Application Data/Tencent"
+ purge_dir "$BottleBase/users/Public/Application Data/Tencent/QQPCMgr"
+ purge_dir "$BottleBase/users/Public/Application Data/Tencent/QQProtect"
+ purge_dir "$BottleBase/users/Public/Application Data/Tencent/QQDownload"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/Npchrome"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/QQDownload"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/QQMiniDL"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/TXFTN"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/TXPTOP"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/TXSSO"
+ purge_dir "$BottleBase/Program Files/Tencent/QQGameMicro"
+ purge_dir "$BottleBase/Program Files/Tencent/QQMusic"
+ purge_dir "$BottleBase/Program Files/Tencent/SSPlus"
+ remove_file "$BottleBase/Program Files/Tencent/TIM/Users"
+}
+
+cleanup_wxwork()
+{
+ if [ ! -e "$BottleBase/Program Files/WXWork/WXWork.exe" ]; then return; fi
+
+ echo "++++cleaning WXWork remains..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent"
+}
+
+cleanup_wechat()
+{
+ if [ ! -e "$BottleBase/Program Files/Tencent/WeChat/WeChat.exe" ]; then return; fi
+
+ echo "++++cleaning WeChat remains..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent"
+}
+
+cleanup_baidupan()
+{
+ if [ ! -e "$BottleBase/Program Files/baidu/BaiduNetdisk/baidunetdisk.exe" ]; then return; fi
+
+ echo "++++cleaning baidu net disk remains..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/BaiduYunGuanjia"
+ purge_dir "$BottleBase/users/$userdir/Application Data/BaiduYunKernel"
+ purge_dir "$BottleBase/BaiduNetdiskDownload"
+ purge_dir "$BottleBase/Program Files/baidu/Download"
+ remove_file "$BottleBase/Program Files/baidu/BaiduNetdisk/users"
+}
+
+cleanup_foxmail()
+{
+ if [ ! -e "$BottleBase/Program Files/Foxmail 7.2/Foxmail.exe" ]; then return; fi
+
+ echo "++++cleaning Foxmail remains..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/HBuilder"
+ remove_file "$BottleBase/Program Files/Foxmail 7.2/Storage"
+ remove_file "$BottleBase/Program Files/Foxmail 7.2/FMStorage.list"
+}
+
+cleanup_hbuilder()
+{
+ if [ ! -e "$BottleBase/Program Files/HBuilder/HBuilder.exe" ]; then return; fi
+
+ echo "++++cleaning HBuilder remains..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/HBuilder"
+ purge_dir "$BottleBase/users/$userdir/HBuilder"
+ purge_dir "$BottleBase/users/$userdir/HBuilder settings"
+ $WINE_CMD reg DELETE "HKCU\\Software\\HBuilder" /f
+}
+
+cleanup_thunderspeed()
+{
+ if [ ! -e "$BottleBase/Program Files/Thunder Network/Thunder/Program/Thunder.exe" ]; then return; fi
+
+ echo "++++cleaning ThunderSpeed remains..."
+ purge_dir "$BottleBase/users/$userdir/AppData/LocalLow/Thunder Network"
+ purge_dir "$BottleBase/users/Public/Application Data/Thunder Network"
+ purge_dir "$BottleBase/users/Public/Thunder Network"
+ purge_dir "$BottleBase/Program Files/Thunder Network/Thunder/Data/ThunderPush"
+ purge_dir "$BottleBase/Program Files/Thunder Network/Thunder/Data/SmallHornCtrlCenter"
+ purge_dir "$BottleBase/Program Files/Thunder Network/Thunder/XLApp"
+}
+
+cleanup_qqdownload()
+{
+ if [ ! -e "$BottleBase/Program Files/Tencent/QQDownload/QQDownload.exe" ]; then return; fi
+
+ echo "++++QQDownload detected. cleaning..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent/TXSSO/SetupLogs"
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent/Logs"
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent/QQDownload"
+ #mkdir -p "$BottleBase/users/$userdir/Application Data/Tencent/QQDownload/115248456/Setting"
+}
+
+cleanup_qqcrm()
+{
+ if [ ! -e "$BottleBase/Program Files/Tencent/BizQQ/Bin/QQCRM.exe" ]; then return; fi
+
+ echo "++++QQCRM detected. cleaning..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent/Logs"
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent/QQCRM/STemp"
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent/TXSSO"
+}
+
+cleanup_qqeim()
+{
+ if [ ! -e "$BottleBase/Program Files/Tencent/QQEIM/Bin/QQEIM.exe" ]; then return; fi
+
+ echo "++++QQEIM detected. cleaning..."
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent/Logs"
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent/QQEIM/STemp"
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent/TXSSO"
+}
+
+cleanup_richez()
+{
+ if [ ! -e "$BottleBase/GTJA/RichEZ/TdxW.exe" ]; then return; fi
+
+ echo "++++Richez detected. cleaning..."
+ remove_file "$BottleBase/GTJA/RichEZ/JBPlugins/pyerr"
+ remove_file "$BottleBase/GTJA/RichEZ/RichET/bin/flyingfish.log"
+ purge_dir "$BottleBase/GTJA/RichEZ/RichET/fflog"
+ purge_dir "$BottleBase/GTJA/RichEZ/RichET/tmp"
+ remove_file "$BottleBase/GTJA/RichEZ/T0002/customcfg_gtjazd.zip"
+ remove_file "$BottleBase/GTJA/RichEZ/T0002/hq_cache"
+ purge_dir "$BottleBase/GTJA/RichEZ/T0002/tmp"
+ remove_file "$BottleBase/GTJA/RichEZ/T0002/xml_cache"
+ remove_file "$BottleBase/GTJA/RichEZ/webs/web_cache"
+}
+
+software_cleaner_before()
+{
+ cleanup_qq_before
+}
+
+cleanup_qqlite()
+{
+ if [ ! -e "$BottleBase/Program Files/Tencent/QQLite/Bin/QQ.exe" ]; then return; fi
+
+ echo "++++cleaning QQ Lite remains..."
+
+ purge_dir "$BottleBase/users/$userdir/Application Data/Tencent"
+ purge_dir "$BottleBase/users/$userdir/Local Settings/Application Data/Tencent"
+ purge_dir "$BottleBase/users/Public/Application Data/Tencent"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/Npchrome"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/QQDownload"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/QQMiniDL"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/TXFTN"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/TXPTOP"
+ remove_file "$BottleBase/Program Files/Common Files/Tencent/TXSSO"
+ remove_file "$BottleBase/Program Files/Tencent/QQLite/Users"
+}
+
+cleanup_youku()
+{
+ if [ ! -e "$BottleBase/Program Files/YouKu/YoukuClient/YoukuDesktop.exe" ]; then return; fi
+
+ echo "++++cleaning YouKu remains..."
+ purge_dir "$BottleBase/Program Files/YouKu/YoukuClient/repaire"
+ purge_dir "$BottleBase/users/$userdir/Application Data/youku"
+ purge_dir "$BottleBase/users/$userdir/Application Data/ytmediacenter"
+}
+
+software_cleaner()
+{
+ cleanup_aliwangwang
+ cleanup_aliworkbench
+ #cleanup_flash
+ cleanup_foobar2000
+ cleanup_mailmaster
+ cleanup_nativeie
+ cleanup_qq
+ cleanup_tim
+ cleanup_qqdownload
+ cleanup_qqeim
+ cleanup_qqcrm
+ cleanup_richez
+ cleanup_qqlite
+ cleanup_youku
+ cleanup_foxmail
+ cleanup_thunderspeed
+ cleanup_wechat
+ cleanup_wxwork
+ cleanup_baidupan
+ cleanup_hbuilder
+}
+
+#=============================================
+
+if [ -z "$1" ]; then
+ echo "prefix should be given"
+ exit 1
+fi
+WINEPREFIX=$1
+BottlePath=$1
+BottleBase=${BottlePath}/drive_c
+
+if [ ! -d "${BottlePath}" ]; then
+ echo "prefix do not exists"
+ exit 2
+fi
+
+#if [ ! -e "${BottlePath}/.update-timestamp" ]; then
+# echo "invalid prefix"
+# exit 3
+#fi
+
+echo "clean $BottlePath"
+export WINEPREFIX=${BottlePath}
+/usr/lib/i386-linux-gnu/deepin-wine5/wineserver -k
+
+software_cleaner_before
+clean_gecko
+software_cleaner
+clean_common_temp
+
+exit 0
diff --git a/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py b/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py
index 83b03c8..6c22e04 100755
--- a/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py
+++ b/deb/opt/apps/deepin-wine-runner/deepin-wine-packager.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
#########################################################################
# 作者:gfdgd xi、为什么您不喜欢熊出没和阿布
-# 版本:1.8.0
+# 版本:1.9.0
# 感谢:感谢 deepin-wine 团队,提供了 deepin-wine 给大家使用,让我能做这个程序
# 基于 Python3 的 PyQt5 构建
#########################################################################
@@ -62,6 +62,9 @@ def disabled_or_NORMAL_all(choose):
chooseWineHelperValue.setDisabled(choose)
wineVersion.setDisabled(choose)
debArch.setDisabled(choose)
+ rmBash.setDisabled(choose)
+ cleanBottonByUOS.setDisabled(choose)
+ installDeb.setDisabled(choose)
if not choose:
ChangeArchCombobox()
@@ -174,18 +177,18 @@ class make_deb_threading(QtCore.QThread):
if [ "$1" = "remove" ] || [ "$1" = "purge" ];then
-echo"清理卸载残留"
-for username in ls /home
-do
-echo /home/$username
-if [ -d "/home/$username/.deepinwine/{e5_text.text()}" ]
-then
-rm -rf "/home/$username/.deepinwine/{e5_text.text()}"
-fi
-done
+echo "清理卸载残留"
+for username in `ls /home`
+ do
+ echo /home/$username
+ if [ -d "/home/$username/.deepinwine/{e5_text.text()}" ]
+ then
+ rm -rf "/home/$username/.deepinwine/{e5_text.text()}"
+ fi
+ done
else
-echo"非卸载,跳过清理"
-fi"""][int()],
+ echo "非卸载,跳过清理"
+fi"""][int(rmBash.isChecked())],
"run.sh": [
f"""#!/bin/sh
@@ -541,7 +544,7 @@ reconstruct_bottle_symlink() {{
}}
extract_image() {{
-
+[doge]
progpid=$(ps -ef | grep "zenity --progress --title=${{BOTTLE}}" | grep -v grep)
if [ -n "$progpid" ];then
echo "one $BOTTLE app is extracting runtime images too."
@@ -670,29 +673,40 @@ WINEPREFIX=$BOTTLE $EMU $EMU_ARGS $WINE "$EXE" --disable-gpu &""",
# 设置容器
###############
self.label.emit("正在设置 wine 容器")
- os.chdir(b)
- self.run_command("sed -i \"s#$USER#@current_user@#\" ./*.reg")
- os.chdir(f"{b}/drive_c/users")
- self.run_command(f"mv -v '{os.getlogin()}' @current_user@")
os.chdir(programPath)
if cleanBottonByUOS.isChecked():
self.run_command(f"WINE='{debInformation[debArch.currentIndex()]['Wine']}' '{programPath}/cleanbottle.sh' '{b}'")
+ os.chdir(b)
+ # 对用户目录进行处理
+ self.run_command("sed -i \"s#$USER#@current_user@#\" ./*.reg")
+ os.chdir(f"{b}/drive_c/users")
+ if os.path.exists(f"{b}/drive_c/users/@current_user@"):
+ self.run_command(f"rm -rfv '{b}/drive_c/users/@current_user@'")
+ self.run_command(f"mv -fv '{os.getlogin()}' @current_user@")
+ # 如果缩放文件 scale.txt 存在,需要移除以便用户自行调节缩放设置
+ if os.path.exists(f"{b}/scale.txt"):
+ os.remove(f"{b}/scale.txt")
+ # 删除因为脚本失误导致用户目录嵌套(如果存在)
+ if os.path.exists(f"{b}{b}/drive_c/users/@current_user@/@current_user@"):
+ shutil.rmtree(f"{b}{b}/drive_c/users/@current_user@/@current_user@")
+ # 删除无用的软链
+ self.run_command(f"rm -fv '{b}/drive_c/users/@current_user@/我的'*")
+ self.run_command(f"rm -fv '{b}/drive_c/users/@current_user@/My '*")
+ self.run_command(f"rm -fv '{b}/drive_c/users/@current_user@/Desktop'")
+ self.run_command(f"rm -fv '{b}/drive_c/users/@current_user@/Downloads'")
+ self.run_command(f"rm -fv '{b}/drive_c/users/@current_user@/Templates'")
+ os.chdir(programPath)
###############
# 压缩容器
###############
self.label.emit("正在打包 wine 容器")
self.run_command("7z a {}/opt/apps/{}/files/files.7z {}/*".format(debPackagePath, e1_text.text(), b))
###############
- # 复制图片
+ # 复制文件
###############
self.label.emit("正在复制文件……")
# arm64 box86 需要复制 dlls-arm 目录
- if debArch.currentIndex() == 0:
- if not os.path.exists(f"{programPath}/dlls"):
- self.run_command(f"7z x \"{programPath}/dlls.7z\" -o\"{programPath}\"")
- os.remove(f"{programPath}/dlls.7z")
- self.run_command(f"cp -rv '{programPath}/dlls' {debPackagePath}/opt/apps/{e1_text.text()}/files/")
- elif debArch.currentIndex() == 1:
+ if debArch.currentIndex() == 1:
if not os.path.exists(f"{programPath}/dlls-arm"):
self.run_command(f"7z x \"{programPath}/dlls-arm.7z\" -o\"{programPath}\"")
os.remove(f"{programPath}/dlls-arm.7z")
@@ -718,7 +732,6 @@ WINEPREFIX=$BOTTLE $EMU $EMU_ARGS $WINE "$EXE" --disable-gpu &""",
# 写入文本文档
################
self.label.emit("正在写入文件……")
-
write_txt(f"{debPackagePath}/DEBIAN/control", f'''Package: {e1_text.text()}
Version: {e2_text.text()}
Architecture: {debInformation[debArch.currentIndex()]["Architecture"]}
@@ -727,6 +740,7 @@ Depends: {debInformation[debArch.currentIndex()]["Depends"]}
Section: non-free/otherosfs
Priority: optional
Multi-Arch: foreign
+Installed-Size: {size}
Description: {e3_text.text()}
''')
if debInformation[debArch.currentIndex()]["postinst"] != "":
@@ -772,7 +786,7 @@ def write_txt(path, things):
def chang_textbox1_things(things):
if things.replace("\n", "").replace(" ", "") == "":
return
- textbox1.append(things)
+ textbox1.append(things.replace("\n", ""))
def clean_textbox1_things():
textbox1.setText("")
@@ -824,6 +838,8 @@ def ChangeArchCombobox():
#chooseWineHelperValue.setEnabled(option)
rmBash.setEnabled(option)
+def InstallDeb():
+ os.system(f"xdg-open '{e12_text.text()}'")
###############
# 程序信息
@@ -872,7 +888,11 @@ option1_text = QtWidgets.QComboBox()
button1 = QtWidgets.QPushButton("浏览……")
button2 = QtWidgets.QPushButton("浏览……")
button4 = QtWidgets.QPushButton("浏览……")
+debControlFrame = QtWidgets.QHBoxLayout()
button5 = QtWidgets.QPushButton("打包……")
+installDeb = QtWidgets.QPushButton("安装打包完成的 deb……")
+debControlFrame.addWidget(button5)
+debControlFrame.addWidget(installDeb)
debOption = QtWidgets.QHBoxLayout()
rmBash = QtWidgets.QCheckBox("设置卸载该 deb 后自动删除该容器")
cleanBottonByUOS = QtWidgets.QCheckBox("使用统信 Wine 生态适配活动容器清理脚本")
@@ -889,6 +909,7 @@ button1.clicked.connect(button1_cl)
button2.clicked.connect(button2_cl)
button4.clicked.connect(button4_cl)
button5.clicked.connect(make_deb)
+installDeb.clicked.connect(InstallDeb)
wineFrame.addWidget(wineVersion)
debArch.currentIndexChanged.connect(ChangeArchCombobox)
wineFrame.addWidget(chooseWineHelperValue)
@@ -928,7 +949,7 @@ widgetLayout.addWidget(e12_text, 13, 1, 1, 1)
widgetLayout.addWidget(button4, 13, 2, 1, 1)
widgetLayout.addLayout(debOption, 14, 1, 1, 1)
widgetLayout.addWidget(debArch, 15, 1, 1, 1)
-widgetLayout.addWidget(button5, 16, 1, 1, 1)
+widgetLayout.addLayout(debControlFrame, 16, 1, 1, 1)
widgetLayout.addWidget(label13_text, 17, 0, 1, 3)
widgetLayout.addWidget(textbox1, 18, 0, 1, 3)
menu = window.menuBar()
@@ -942,7 +963,7 @@ programmenu.addAction(exit)
help.addAction(tip)
# 控件配置
try:
- e6_text.setText(sys.argv[1])
+ e6_text.setText(sys.argv[1].replace("~", get_home()))
e5_text.setText(pathlib.PurePath(sys.argv[1]).name)
wineVersion.setCurrentText(sys.argv[2])
except:
diff --git a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner
index 819198c..3d36ef9 100755
--- a/deb/opt/apps/deepin-wine-runner/deepin-wine-runner
+++ b/deb/opt/apps/deepin-wine-runner/deepin-wine-runner
@@ -2,14 +2,16 @@
# 使用系统默认的 python3 运行
###########################################################################################
# 作者:gfdgd xi、为什么您不喜欢熊出没和阿布呢
-# 版本:1.8.0
-# 更新时间:2022年08月01日
+# 版本:1.9.0
+# 更新时间:2022年08月12日
# 感谢:感谢 wine、deepin-wine 以及星火团队,提供了 wine、deepin-wine、spark-wine-devel 给大家使用,让我能做这个程序
# 基于 Python3 的 PyQt5 构建
###########################################################################################
#################
# 引入所需的库
#################
+from fileinput import close
+import hashlib
import os
import sys
import time
@@ -616,6 +618,16 @@ def SetDeepinFileDialogDefult():
def SetDeepinFileDialogRecovery():
threading.Thread(target=os.system, args=[f"'{programPath}/launch.sh' deepin-terminal -C 'pkexec \"{programPath}/deepin-wine-venturi-setter.py\" recovery' --keep-open"]).start()
+def DeleteDesktopIcon():
+ if os.path.exists(f"{get_home()}/.local/share/applications/wine"):
+ try:
+ shutil.rmtree(f"{get_home()}/.local/share/applications/wine")
+ except:
+ traceback.print_exc()
+ QtWidgets.QMessageBox.critical(widget, "错误", traceback.format_exc())
+ return
+ QtWidgets.QMessageBox.information(widget, "提示", "删除完成")
+
def DeleteWineBotton():
if QtWidgets.QMessageBox.question(widget, "提示", "你确定要删除容器吗?删除后将无法恢复!\n如果没有选择 wine 容器,将会自动删除默认的容器!") == QtWidgets.QMessageBox.No:
return
@@ -924,7 +936,149 @@ class GetDllFromWindowsISO:
except:
traceback.print_exc()
QtWidgets.QMessageBox.critical(GetDllFromWindowsISO.message, "错误", traceback.format_exc())
-
+
+class ProgramRunStatusShow():
+ msgWindow = None
+ def ShowWindow():
+ if not os.path.exists(e2.currentText()):
+ QtWidgets.QMessageBox.information(widget, "提示", "您输入的 exe 不存在")
+ return
+ try:
+ sha = ProgramRunStatusUpload.GetSHA1(e2.currentText())
+ lists = json.loads(requests.get(f"http://120.25.153.144/spark-deepin-wine-runner/app/{sha}/all.json").text)
+ r = requests.get(f"http://120.25.153.144/spark-deepin-wine-runner/app/{sha}/title.txt")
+ r.encoding = "utf-8"
+ title = r.text
+ except:
+ if QtWidgets.QMessageBox.question(widget, "提示", "暂时还没有该软件的运行情况信息\n是否自己上传该软件的运行情况?") == QtWidgets.QMessageBox.Yes:
+ ProgramRunStatusUpload.ShowWindow(sha)
+ return
+ informationList = ["0分:无法运行并且也没有报错,自己无法解决",
+ "1分:无法运行但有报错,自己无法解决",
+ "2分:可以运行但是效果很差,几乎无法使用",
+ "3分:可以运行且勉强可以使用",
+ "4分:可以运行,体验大差不差,还是有点小问题",
+ "5分:可以运行且完全没有bug和问题,和在 Windows 上一样",
+ "含有不良内容,不宜安装",
+ "含有病毒、木马等对计算机有害的软件"
+ ]
+ if title.lower() == "null":
+ title = "未知应用"
+ maxHead = lists.index(max(lists))
+ ProgramRunStatusShow.msgWindow = QtWidgets.QMainWindow()
+ msgWidget = QtWidgets.QWidget()
+ msgWidgetLayout = QtWidgets.QGridLayout()
+ starLayout = QtWidgets.QHBoxLayout()
+ uploadButton = QtWidgets.QPushButton("点此上传运行情况")
+ uploadButton.clicked.connect(lambda: ProgramRunStatusUpload.ShowWindow(sha, title))
+ msgWidgetLayout.addWidget(QtWidgets.QLabel("综合评价:"), 0, 0)
+ msgWidgetLayout.addLayout(starLayout, 0, 1)
+ msgWidgetLayout.addWidget(QtWidgets.QLabel(informationList[maxHead]), 1, 0, 1, 2)
+ msgWidgetLayout.addWidget(uploadButton, 2, 0, 1, 2)
+ end = 5
+ if maxHead > 5:
+ for i in range(end):
+ starLayout.addWidget(QtWidgets.QLabel(f""))
+ else:
+ for i in range(maxHead):
+ starLayout.addWidget(QtWidgets.QLabel(f"
"))
+ head = maxHead
+ for i in range(head, end):
+ starLayout.addWidget(QtWidgets.QLabel(f"
"))
+ msgWidget.setLayout(msgWidgetLayout)
+ ProgramRunStatusShow.msgWindow.setCentralWidget(msgWidget)
+ ProgramRunStatusShow.msgWindow.setWindowIcon(QtGui.QIcon(iconPath))
+ ProgramRunStatusShow.msgWindow.setWindowTitle(f"应用“{title}”的运行情况")
+ ProgramRunStatusShow.msgWindow.show()
+
+class ProgramRunStatusUpload():
+ msgWindow = None
+ starLayout = None
+ fen = None
+ starList = []
+ sha1Value = ""
+ programName = None
+ def ChangeStar():
+ if ProgramRunStatusUpload.fen.currentIndex() > 5:
+ for i in ProgramRunStatusUpload.starList:
+ i.setText(f"
")
+ return
+ for i in range(ProgramRunStatusUpload.fen.currentIndex()):
+ ProgramRunStatusUpload.starList[i].setText(f"
")
+ head = ProgramRunStatusUpload.fen.currentIndex()
+ end = len(ProgramRunStatusUpload.starList)
+ for i in range(head, end):
+ ProgramRunStatusUpload.starList[i].setText(f"
")
+
+ def ShowWindow(sha="", title=""):
+ ProgramRunStatusUpload.starList = []
+ ProgramRunStatusUpload.sha1Value = sha
+ ProgramRunStatusUpload.msgWindow = QtWidgets.QMainWindow()
+ msgWidget = QtWidgets.QWidget()
+ msgWidgetLayout = QtWidgets.QGridLayout()
+ ProgramRunStatusUpload.programName = QtWidgets.QLineEdit()
+ ProgramRunStatusUpload.fen = QtWidgets.QComboBox()
+ ProgramRunStatusUpload.starLayout = QtWidgets.QHBoxLayout()
+ upload = QtWidgets.QPushButton("上传")
+ upload.clicked.connect(ProgramRunStatusUpload.Upload)
+ if title != "":
+ ProgramRunStatusUpload.programName.setText(title)
+ ProgramRunStatusUpload.programName.setDisabled(True)
+ # 生成星星列表
+ for i in [1, 1, 1, 1, 0]:
+ ProgramRunStatusUpload.starList.append(QtWidgets.QLabel(f"
"))
+ ProgramRunStatusUpload.starLayout.addWidget(ProgramRunStatusUpload.starList[-1])
+ ProgramRunStatusUpload.starLayout.addItem(QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum))
+ ProgramRunStatusUpload.programName.setPlaceholderText("如果这个程序和程序名确实是合法还是检测到敏感词,改为“NULL”即可")
+ ProgramRunStatusUpload.fen.addItems(["0分:无法运行并且也没有报错,自己无法解决",
+ "1分:无法运行但有报错,自己无法解决",
+ "2分:可以运行但是效果很差,几乎无法使用",
+ "3分:可以运行且勉强可以使用",
+ "4分:可以运行,体验大差不差,还是有点小问题",
+ "5分:可以运行且完全没有bug和问题,和在 Windows 上一样",
+ "含有不良内容,不宜安装",
+ "含有病毒、木马等对计算机有害的软件"])
+ ProgramRunStatusUpload.fen.setCurrentIndex(4)
+ ProgramRunStatusUpload.fen.currentIndexChanged.connect(ProgramRunStatusUpload.ChangeStar)
+ msgWidgetLayout.addWidget(QtWidgets.QLabel("程序名:"), 0, 0)
+ msgWidgetLayout.addWidget(QtWidgets.QLabel("评分:"), 1, 0)
+ msgWidgetLayout.addWidget(ProgramRunStatusUpload.programName, 0, 1)
+ msgWidgetLayout.addWidget(ProgramRunStatusUpload.fen, 1, 1)
+ msgWidgetLayout.addLayout(ProgramRunStatusUpload.starLayout, 2, 1)
+ msgWidgetLayout.addWidget(upload, 3, 1)
+ msgWidget.setLayout(msgWidgetLayout)
+ ProgramRunStatusUpload.msgWindow.setCentralWidget(msgWidget)
+ ProgramRunStatusUpload.msgWindow.setWindowTitle("上传程序运行情况")
+ ProgramRunStatusUpload.msgWindow.setWindowIcon(QtGui.QIcon(iconPath))
+ ProgramRunStatusUpload.msgWindow.show()
+
+ def Upload():
+ if not os.path.exists(e2.currentText()):
+ QtWidgets.QMessageBox.critical(None, "错误", "exe 文件不存在!")
+ return
+ try:
+ if ProgramRunStatusUpload.sha1Value == "":
+ ProgramRunStatusUpload.sha1Value = ProgramRunStatusUpload.GetSHA1(e2.currentText())
+ QtWidgets.QMessageBox.information(None, "提示", json.loads(requests.post("http://120.25.153.144:30250", {
+ "SHA1": ProgramRunStatusUpload.sha1Value,
+ "Name": ProgramRunStatusUpload.programName.text(),
+ "Fen": ProgramRunStatusUpload.fen.currentIndex(),
+ "Wine": o1.currentText()
+ }).text)["Error"])
+ except:
+ QtWidgets.QMessageBox.critical(None, "错误", "数据上传失败!")
+
+ def GetSHA1(filePath):
+ sha1 = hashlib.sha1()
+ file = open(filePath, "rb")
+ while True:
+ readByte = file.read(1024 * 1024)
+ sha1.update(readByte)
+ if not readByte:
+ break
+ file.close()
+ return sha1.hexdigest()
+
class ProgramSetting():
wineBottonA = None
wineDebug = None
@@ -997,6 +1151,7 @@ class ProgramSetting():
widgetLayout.addWidget(save, 10, 2, 1, 1)
widget.setLayout(widgetLayout)
ProgramSetting.message.setCentralWidget(widget)
+ ProgramSetting.message.setWindowIcon(QtGui.QIcon(iconPath))
ProgramSetting.message.setWindowTitle(f"设置 wine 运行器 {version}")
ProgramSetting.message.show()
@@ -1044,7 +1199,8 @@ defultProgramList = {
"Theme": "",
"MonoGeckoInstaller": True,
"AutoWine": True,
- "RuntimeCache": True
+ "RuntimeCache": True,
+ "MustRead": False
}
if not os.path.exists(get_home() + "/.config/deepin-wine-runner"): # 如果没有配置文件夹
os.mkdir(get_home() + "/.config/deepin-wine-runner") # 创建配置文件夹
@@ -1142,11 +1298,13 @@ tips = '''
N: 鉴于仓库 'https://community-packages.deepin.com/beige beige InRelease' 不支持 'i386' 体系结构,跳过配置文件 'main/binary-i386/Packages' 的获取。'''
@@ -1154,14 +1312,22 @@ updateThingsString = '''※1、修复了重复路径一直自动重复增加
※2、修复了两个打包器打包错误的问题(非基于生态活动脚本的为 wine 导入错误,基于生态活动脚本的为架构有误导致打包出的 deb 无法打包)
※3、适配了部分非 i386、amd64 架构计算机的 UOS 系统使用的 wine 并支持打包非 i386、amd64 架构计算机的 UOS 系统使用的 wine 程序 deb 包
※4、支持安装 dxvk(遵守 Zlib 开源协议)
-※5、运行器、打包器(包括非基于生态适配活动脚本制作的)支持使用 Wine 生态适配活动的容器清理脚本
-6、支持不显示没有安装的 Wine,方便用户识别
-7、增加字体商店
-8、修改了 Wine 的顺序使其更加合理
+※5、运行器、打包器(包括非基于生态适配活动脚本制作的)支持使用 Wine 生态适配活动的容器清理脚本
+※6、支持更加简易的安装最新版的 WineHQ
+※7、增加字体商店
+※8、新增查看可执行文件运行情况的功能
+9、支持不显示没有安装的 Wine,方便用户识别
+10、修改了 Wine 的顺序使其更加合理
+11、支持删除安装 exe 后在启动器的快捷方式
+12、优化了 Wine 打包器(非基于生态活动脚本)对容器的处理
+13、修复了 Wine 打包器(非基于生态活动脚本)打包出的 deb 安装时显示为解压缩后会消耗 0 B 的额外空间以及 postrm 的一些问题
+14、支持删除无需使用的程序组件
+15、支持组件/运行库下载后缓存方便下次使用(可以清理)
+16、点击获取图标按钮后会自动读取 exe 框的程序图标(不支持相对路径和包内路径,只支持绝对路径)
'''
for i in information["Thank"]:
thankText += f"{i}\n"
-updateTime = "2022年08月11日"
+updateTime = "2022年08月12日"
about = f'''一个能让Linux用户更加方便运行Windows应用的程序,内置了对wine图形话的支持和各种Wine工具和自制Wine程序打包器、运行库安装工具等等
同时也内置了基于VirtualBox制作的小白Windows虚拟机安装工具,可以做到只需要用户下载系统镜像并点击安装即可,无需顾及虚拟机安装、创建、虚拟机的分区等等
@@ -1270,7 +1436,7 @@ programManager = QtWidgets.QGridLayout() leftDownLayout.addLayout(programManager) programManager.addWidget(QtWidgets.QLabel("程序管理:"), 0, 0, 1, 1) getProgramIcon = QtWidgets.QPushButton("提取图标") -getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe")) +getProgramIcon.clicked.connect(lambda: RunWineProgram(f"{programPath}/BeCyIconGrabber.exe' 'z:/{e2.currentText()}")) programManager.addWidget(getProgramIcon, 1, 0, 1, 1) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 1, 1, 1) trasButton = QtWidgets.QPushButton("窗口透明工具") @@ -1284,7 +1450,11 @@ miniAppStore = QtWidgets.QPushButton("微型应用商店") miniAppStore.clicked.connect(lambda: threading.Thread(target=MiniAppStore).start()) programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 5, 1, 1) programManager.addWidget(miniAppStore, 1, 6, 1, 1) -programManager.addItem(QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum), 1, 7, 1, 1) +programManager.addWidget(QtWidgets.QLabel(" "*5), 1, 7, 1, 1) +getProgramStatus = QtWidgets.QPushButton("获取该程序运行情况") +getProgramStatus.clicked.connect(ProgramRunStatusShow.ShowWindow) +programManager.addWidget(getProgramStatus, 1, 8, 1, 1) +programManager.addItem(QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum), 1, 9, 1, 1) programManager.addWidget(QtWidgets.QLabel("WINE配置:"), 2, 0, 1, 1) wineConfig = QtWidgets.QPushButton("配置容器") wineConfig.clicked.connect(lambda: RunWineProgram("winecfg")) @@ -1378,6 +1548,7 @@ w5 = QtWidgets.QAction("打包 wine 应用") w6 = QtWidgets.QAction("使用官方 Wine 适配活动的脚本进行打包") w7 = QtWidgets.QAction("从镜像获取DLL(只支持Windows XP、Windows Server 2003官方安装镜像)") updateGeek = QtWidgets.QAction("从 Geek Uninstaller 官网升级程序") +deleteDesktopIcon = QtWidgets.QAction("删除所有 Wine 程序在启动器的快捷方式") wineOption.addAction(w1) wineOption.addAction(w2) wineOption.addAction(w3) @@ -1443,6 +1614,8 @@ installDxvk = QtWidgets.QAction("安装 DXVK") uninstallDxvk = QtWidgets.QAction("卸载 DXVK") dxvkMenu.addAction(installDxvk) dxvkMenu.addAction(uninstallDxvk) +wineOption.addSeparator() +wineOption.addAction(deleteDesktopIcon) w1.triggered.connect(OpenWineBotton) w2.triggered.connect(InstallWineFont) w3.triggered.connect(OpenWineFontPath) @@ -1474,6 +1647,7 @@ wm4_1.triggered.connect(lambda: os.system(f"'{programPath}/launch.sh' deepin-ter wm4_2.triggered.connect(lambda: os.system(f"'{programPath}/launch.sh' deepin-terminal -C 'pkexec apt purge winbind -y' --keep-open")) installDxvk.triggered.connect(InstallDXVK) uninstallDxvk.triggered.connect(UninstallDXVK) +deleteDesktopIcon.triggered.connect(DeleteDesktopIcon) virtualMachine = menu.addMenu("虚拟机(&V)") v1 = QtWidgets.QAction("使用 Virtualbox 虚拟机运行 Windows 应用") @@ -1546,7 +1720,8 @@ for i in [ [[p1, installWineOnDeepin23, installWineHQ], f"{programPath}/InstallWineOnDeepin23.py"], [[w5], f"{programPath}/deepin-wine-packager.py"], [[w6], f"{programPath}/deepin-wine-packager-with-script.py"], - [[p1, v1], f"{programPath}/RunVM.sh"] + [[p1, v1], f"{programPath}/RunVM.sh"], + [[getProgramIcon, uninstallProgram, updateGeek, trasButton, miniAppStore, fontAppStore, wm1_1, wm1_2, wm1_3, wm1_6, w7, w2], f"{programPath}/geek.exe"], ]: if not os.path.exists(i[1]): for x in i[0]: @@ -1567,4 +1742,6 @@ if len(sys.argv) > 1 and sys.argv[1]: e2.setEditText(sys.argv[1]) if not os.path.exists("/opt/durapps/spark-dwine-helper/spark-dwine-helper-settings/settings.sh"): sparkWineSetting.setEnabled(False) +#ProgramRunStatusShow.ShowWindow() +#ProgramRunStatusUpload.ShowWindow() sys.exit(app.exec_()) diff --git a/deb/opt/apps/deepin-wine-runner/dlls.7z b/deb/opt/apps/deepin-wine-runner/dlls.7z deleted file mode 100644 index b6975e1b589471c95cce3a3aa9b52eb3c11ab15b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2901126 zcmV(sK<&Rbdc3bE8~_C5by5RCL@WRR0000b0000000007KhJyQIgsE6T>w9kMTBTO z-rlAY95HpVM5`pG{0hqhRLrzN8iVlLRbf0E=KfI?TQ-u#rq zV>-(&WpQ}ufz_6s$=YLDL~W3ZSFr#!ScfaJ2mkrHl1*G!LjtR8>65#*a|zp{v6=Z7 z0Cx=om^en%U~;N>0XTm{J~JsPQfP57Vz`4Z!3xLweEZx_M?8)TsG}d3*aPV{ztecD z8vqjRJw(p*S$Rpi!yw0a8^?Ee0N|xZ5 aSWxo;7a#ryo0R9m2r#8<}aeU2vV>NQ_-QJ-c{G0yRlSG6D_xhCvlb|i+o<^cR zmloYi*<-4(zeQ=(+1_Iob9#x;C7`>w14Vo12QRhY0tr$dun+~TkIFuViH_z?-svC9 zF@WQ1K^Jf@I-kyYHtlre#D4|#Olza~2p_>)!y>w-N)JGP5B2T}KIT{{T_Po~OTP#Z zw3NXWZPK3m6S`khWgBgiykJH}B_1(WarZ7%E vqzR^{?#VfxoILcUl@} z7a6sN$rOG}6l?2gdo=|BX G!*1{*Pbxh4+nCO6)dPMW94A3YC0sPOi|y$K0nefMYGUn!!IkH1Y!GT)yq$o zUeK>@kN=%A%rmhz!qkR7faLHWH<}}jhWqkK=%T#>ErTGMzgx|97RFo?IwJ$9j4cc1 zXFuxjw d4WJUi@bBT-(ru7GX=l1LAmoQY4xitB;m zfy&LDEK%zGkbK<2VQz%8FX TS1fO6+h}@+^5gai6#Wxk`!-y z^}_G *>-F9S`(@`mD;K3lzFZe1(I$H%!^ zo@a7}Nf7m#6r=ZzUiIU7XJt6a;nI#$ ?Sw@CwJg zbvEb|4tn2j;2|i`S-9ux3dL~{wViT_eB>s4t~KjpTAP~K21mOBU9hWbCv8*B|8Jj$ z 0WQ9gG*CK#sf7G0n6MqxS??u#kUd6H&Zwv;x6OUkSx;J^2^#uS?Ku` zN(C*Pe?Qj6XIhEq1=6mr8?=`22aL}xKCSz2f})9TGzulT_lC #PM> z=EM^0k+M@BMkZA`BrGksz|yvU_uPuXR1ePly~X=>PqoKaT{qZxFyttaE7_YClq2qu z2~~XDnHME=&yRx~@}1$v)dV#zF+TM_D2$+beo!k7l;hS!2sl};Cz!tC}&8 z 7BVrYK zR#lcAe1G)V%E|q;5IEY?CfLVd=uQ#Vv1?n;FUl_P!_);CtwK=zZJP&XCrb-==EaxU z;mDbpBDOPu4HQO77OCzv-`ctGe``k>=XtjUG^HLKRNJv=s+PEUGGBmatU{6$vX!z7 z*8I9{h=0e6=audrl#N4*xr1*2_oL5^^rTybrh57+-7?CDenZ`qrajo%Pa&{|Te#V* z=p#vVu}8j=XAL?;26`7;)TR%loAoC3)tbH*1c>@ea?zbYKrcCvkQ8s6IIZ6Bwn!yT z63Ear0L>P|u}|L)md`$cpzL52ZPm!hE;w`L67BT!FSTT$=bl>Q@`Vv#isOW)&_YL; zn`t>1Gy?DAYWbd_(KMyn( x zfrg{>Ej4ZJ?m%4&G{`Ff#2i&abJBnupxawqT7jh2YJFBrpfgNpYiB{jlGytHm=b1F z3_ZHWJE4+wucwEN-^>9VJsAsTbE3Z+aeVi{@{;WShix-miCftd;&e3w#jn|pLn;mx zNIt$92-ylW0tX!u>+Z)(xBYR|u=H80CN}=Q|0&5&)tmojhikghAMqI;<+*rJhq7}g zrE_*^Z);vieFqxV{P1|8imdxmxm*zU`nl-r uUwa~clY zPY!H RAt|H>C4t^XoC#EZ09W4X_!j6mDzbdYtSNWZOC99Zo$Av#O1mocu`fUbA($|riv zke5tp7OF2&I(w yZ@YL`=Ey5oeC3!49{Og25MIL>;NR@lVZq@O z?@66@)by2%&p8qUiAvtgBYxe*^1~QO8MamJiEWV`RrC s2<#ExM+lzXyXv4MCkVI1y27;F7I^nD=z^hc_yPMbU(8f4BH=8i9tvZ7z zO!0j#CU$~h`t6VN5+%RhYPpE800=5u&6QZ}{k;7JW0d&xjI$^k2YM-8Pc?h{9NS0k z9Qg(IxKP?{dQ}TBlmvl|H@bEzKw_Qg#;nXn8Qpq=73jGp62klAwvr0K_wOPB$j+;Z zO}$t)^y64*Qd;6O8&V7~m%?Dcqygz6VJNJwnLE^%t}w9qc{T1~{Dux2BEP8atc>J) z6Ltag)2t5l)UsJxyw}tsLrw8E5p@{ zg`}PWNVYCHK2{xCbQvhMQgH?$nkJoR!B%N8yLeNWYdkPIuC#iW7n?~xx&TF;JnduL z!M~8TKD#E7J+MHW?XCC=VSJii=8!^M@>3F>-fkt59eJI)=X|RN8pJb9juBN}nES;Y zpmGc6Dx52P1(u=X+VXH?nuC~L+-y}~{ey2@2A5Ak|3xAz+EJ>z`f@Z+r4FjHLlHmW z)L^ksLubnx=t>_Us#LVpu2Z`#dXoe+^}-R)kCF2Z)<|rXydc1SFpT3Y>S_+snT7{? zV 9Zgd3ZIhbP1v(B3=kELCVP^VoWaVDxk|ETBo*8Nz%r~P`;HR z(=O7ae9|21Nr3Hr0=HoocKlJ^XX=pOyRj^e)=;5U{v-UEH_NKo>5l`@jE<#L(%YL@ zE>)`s Xv; zUsYrsXul6OgI;fU8Ev0 tAtuSMdv`eKZ?0@Y zO(kYsoB7rbf_De~Ks=a}c>o||ZC5uD^QJqti|eugr0YvT`a1Es<`2c4wBB$Si1#)@ z6-p=@4<0@g&_dsA*iAiSGhUer &h9Z}ZxSilrRSrpa6}QJpm?lAx)W&xeH493 zZ7)JTH)xA#a(gyqDC9Z{3;SrGG?S1!`Ialfb^OxFF$v{q^#P?$3^Bw9H^sTRVc;eq z1sh&}#>VMqp>9azojM#oR@gNuhjcv}AW{2X_P3w9P-Z*ByAkWwvXQh-#M&C>OrPZ% z5GWjmhzmP+@6eS4?b{YJ0ey5iB*3Tx<>9y^{Li!xKf+O#u(^{)hq%gnWJ5y-yCZ`J zpj+AHQj)mSTS&wLEH@Buy9{M{b1sX=`x)Z|Tmf!f0i4qg416SR-eN;Ml%%LC#JGlc z$p(b)s+ySy>R+U+ouR^Pp#LgWL^=Df{T#{BPPklDw4@f|(OQbxxc}HUcI7tm3Qd=$ zN6Q0NtGmrBy#y8OM1BXdD}Y=vS%Mlo*R9@}kC#IR5}KC~o$AKbjWAwsW3?y9rAiVc z1P_XAuucbMvyTP&4pqB`cnXAN xkmH3b(KZ2Zlub|2r;a^`62Q*5$7OC=tix95MGRhh!MjbAtJxUT=FD z$RctbNyAQ4j_A} JoAKq+C&4axtTI$VW2Cr8EZ@BlVI$-k>aB7-tK{=Aei*4K7~0RIX= z+$BLUO!ennv875&`LO!o7-1R-?77<;pRhoX43j+;Onki~M80l$ECc Zxt79PYKY%ziA urRe<(Yy@hZ3sp)ry`?Hzt%-*>K*!G32LF; zT7{)j-(%3^FM!rz)(=F(7PXyVRyYTL<%~!91pe_F@QP{Mqa5Lk){~8GD}3H++)(GK zt9bv;t}!-Q_;aegBPKAV_HIf~;T8#0l>OQ79XPbE#RSWJZP*#+uimSR;`j@+gmVtv zYuUM599Ob1riNP}OCZ5Fa=kPMErIPCznR0@mDtopo#lbEIx13|bA@QYydm=QQYX+^ zON7&^OQ0a0Rc#5$Q18Y?jd6(r_vllUiGKSpf1f16of7_h0A5?H
SOZSW-RF`OJ7rP4gkPucQcsK}`ICID*v3ns(|Ong_z5IqD_0$f<9{sG$l0uTCz z8og)K{GNJr!ZQQyu_6I&?1|bqiuF=0mUg}U#gB{LkUqL2h {5k0N92^!skt?d%e2~4QX+jQ&%P%v1&Os4iL6B#qF zk}5Ly0ld8a7Nwu}PA0h{Fy$q3iQC1X66aD8MN&}5T-D;MqoZVdS4Qa8AdWAAv?v>q zull5%IQ0KkJrpRpo8v^cFZMr)%TQZ@8pQ`5$(f1o@`{13y6^6@3%AB?|E=w@iY^<@ z=~-&bFaZL&9pV6wVwh$;i55bNHYWA9y@0f~#jK?17STeRD&Eb}XD^7ACmZ({Ip@Y? zpjyPiOdzRDJ%T3;mkXtOgc SA&&wF@#MWSY2>^NPouM88T#xZD5XW`?>_#2-WA z&(*FM{)(B0*J*uf@m#=nw4~sdIKXNfBB5@1C-(ZHorE 4;$fVA7$Vn{<_6&EQY0H_7S z8tRZ)yQ}3MOQeuZpnj(pi)CC(TJNBQ166%YUQ9{Md!@ehRgbt>x4jpMY_)Lg?$@s{ zelO*aT&BX?Y10!PnCD!S_-j6k<`l09SaK|b#_rwzMQOfPBwTCi*|2sk;ev9<_xk;9 zHb@SnNeCh{F&hjGg8)`E(xZu~vh_;hZHJ4%#yrci8?g?)k_s}_(O%}_{L9FSBKw6x zV<3~Itglh9@`~p~!!XV(J(e?>d@Nj+{xhP!Yyf{4YX~DAlo1We5G&RIy&qYKM|(l0Zj4d1Ow4 z2f!?+SqwU7YtTelZmrz%F~a56-8~jWRMF=vxj2;gyKt&{#YWND6=p#2iz}ixh-E@P zeriY^XpvAyh3WTFy`uFi2sTfc{n){b=b!-CdW0Q*UCm_)X8X<|tRah+XK T~BDOg`KlwEQC{KQ;MM|QeGMUv8yKSJO9sFJ~wY{%`cRYhQv z>g2Co5pupwfy*oUz*TV&{(%9Q1T-S{g~` K_P16X$>+WcRFNK9`djwi#-Wm;%Zda4y1qWhG{9b7eq$R(G zI+I$_!dwz&Y6989yi1*z+IuxzA)^@qApg?gDX4y0nXmpM2R4O19ti4F%d zWQlzt)HdF@1l9+^Q>BG2Jzpa9D4(-i*KWp_fb=crul$@F3KMKSNHN1ct_CxYPF+X+ zG}AAey?Z{BT#%?Q5{w{jMUqgbAAy^oC)Kj=d$ghLTkGHEcJ&5nMD*?|Qn7e-p0}6* z-519qpZw={k~%G}56e%=S|fp`g7UA XZ^jCb?4gPZ{yzNmN6)aluQ%8OEt z^0E#qL-OXBo3WV*BPZY97l6UX9AHfRIR%%$AUf*S|IN#A3Bv?X@T&0w#kKSO38TL% z0;tRaA2@q(7RWJ?Y7Hb-5O=YKw~-m}!7Ii@&JeRC2sz^~F66cOHUNAvQK1iP$c2kb zIz0({tpL3Su@`LenYVp&rW1rYC-Gj}-Q-O3CC&Uu4AG_T7v?rtT8FN_{e-oH3Y{0^ zp4F>NuUm%Yte|)RK^`}kQ<6IVD+3#0A1#?87jxHD4UkEC+cy*=DY9O7 %Ys~Ap}T6B3U|n~5&XsBJYE)1BeNgt{66DUs-_61G~v!k#!v%- zB2suoy#+oTIkep_Znu<6)w0S?`;?7(e0vVNG#cQ}V-$-mAvIQ*9i~hIqI-o(E(HSG z1~T?i W%wgPl<03rrZjE7xFGW1Z?8m(o*K;9(s<;)MRLEr%zmEpu7}2K=ZSCae9J zn!g`3475($>8UwX5VN9*RE*XKa3l3txOubl|Nfk#wLmPLWOLX2P)mhCnMD72E(P&_ zBd|Mcc8K2fjqN)I95Ay*c|~6PFGvOCG~5JW=m7gapds6I7;I)d{+y#(qjmgI4ef*O zv}(0@cOP7VB%l3kVn=#Zu`)7XdGogIE!6(SFIWR9Cp_wMzK;;NRf9u)9WodaA+bmj z0CMt!im<|BW dqEef#>_XMN<`mZ=@?D>3nEo4W+_7*wW17&3St zw_}C@AcNly^g7(LYV# a3Xp;gMB0A_!Pk(qAo B7PAxa}%Ysm5uFsB>sH=xFi(mIULyGT@Y^o8=`Z8}%Ji^yw-JUo!+ zC)(8(hN)|2>6V!>h9JT@JR6s9dC%ozM UFX1aMP7?jkp2^Z(NA3|6WEfj3kAn8Bt!r{d3OfLeVmTC>e=tr@ob z)k>tSK^G_`h$*L`MIZek`mxgTnV$Y43PVMl- cME18= zsaVN43conz5a%d`u5o8v$_RFI$hTSsDX*CF&C8fH?IDZf;pz#EmJ=Mj9##aGkQ{0> zi>8@GU>12u;!X-mg#r%?%5-YMH4dC2XTuQdz5I#0QHLa?7o%Trs`oME8B)G?NL8G2 zAd^DM4NEBKah)xQY;v9OReXzKbjfLnMGXvgIABd`2WuUpDBoW02dCL!`(0e1dV!~0Xz^TL(C$Eot_V&aw z75Wf)I2Wmvm8f-Veh^0_(!eCrbGaCjK1((Nb^;0gXWH+@-tz~iph~}4UnidBv5^!T zO&YEn6q76 2xf<{b4OL&zThvic+IrN<0QksL$tkFKdz_c$x<~EKRd0I!^ionKHt% z=@Zi-hnU)xuyd|OUE56a`N#NJtKUtVf|1D@$s+`l*sDPb1U zUN$}(#T?B_P|1%(nOL#5$v3IbbSF0yb2@pmhv;^(pwjz)6?=4I|5d@Hikye*4STY} z^)|K|_ P shw8u zacdM<7nYo@HX=r8 mZ^vjXIoNSQ;gRzmt;FZj`;+&s%ln7$`7A#ao^ zNo8>-V?;5pv*&iD9rT{wwp8rxe}I6S1OYo+d##@|*@e$On(dIixFxrbUqfP MHQ7!=+^ayZX-dlAW6_0 zbR)JV(~ FJ4c10jn%eADxsIU{!;+4=mny z>eI^LvNqn92iP4w8XVM#)O#i@xNo#+Xpjc)s3PQkO;PM71h%eS->bl5R=o-r Udo7eZH{vk-FFHju&Z+fqDF(vhGx`9BsA+|xMxEUJJXw>S13Yt8XyOS0 ze#LaZb7DN}8G~L#?l}a8L59ZH$Bl|M(k|HUS2_WN#8&CMZm)XoyCl2@gZ|0;c1YI9 z;J2#J7aRj}S8_vFM&v1Fe0u$2t?sbSL=+k$d^Q%9O*K=Gc4#%>K@)=Kt+^-{TMy+1 zT+U_X)-I~Q=K;3xI<0~woH(}q;E=g0qG#}q7gyfX{a1{V3FhUuH`@`>FMmI*fFTz{ z1MaUcUVb)@f?n#Ij#UwEfNIaE(S%XhPN71@)4gFjfR+{B9b5*Co{l$+VM4muQ0xV~ z`U#&K>Y`e3rxk#@ti0G0X_DGW^>zN4|EJhie-)vo`KAapC7|)H?n52fY_Xwfk#C7- zQ@{BVut3G%=P?*$J{?yrLad5if`7BVN3^Co*L1`uHXWgYKfeNk$W!rbboD$zjkG6o z!)dx*B}kEZujOt0MTQwP*OUM?L?`CQh{JHpJX_I{cq?|DRxCQtsu44z5&;OOz87TE zr`_*>g4Wy#5M88kD;T{Ps+|0hMmuLGK&EmwAx&ppr1xaNx`?G*RiLxwV~?i+C|O06 zoaqGTVs!c^E=5 XD=p7WH7FU&=&%BceBBw$>hbrfgkIxeKiP-5bJz)b zzdG&mzDfJ(&|U-a= axNz`YVr1UjtOh(24#zLgJ)O%LrR z!rok20KRRR>Y#5Z1^bO(RM$(2?Sfuya7y&&?{;Gtb<;^yqvhm_x!D#0Cz1b?KE*E9 zaYRJ?N;f40;pcMP=W}>sJIFJ~ZNn!Ko7B_p>qC=^CEH(BfFc>xXKCghrq3_lMlQ^H zHcS9rt1jDfH1pB`x334rQLZ_K2SRPToz)`$$ S zw@RS8sva^&vFRG@ Achcki5aX%v*8<=z;CGv>XS?>g9Ez-~@<%{*&2Ph6 zL8NVxLEvgvgAs7=p!x*1`CZxZ@<8CQ&ajC7wR-$YXV&`+uV3MbpC$XLr(o8-O4tlO zaQ{btjC&g^G>_6VhZEt}i5DtYzI6zl=7`X2DDRNRwl1Qx<5eGGOg`osdbIg%E=n|Z zd^4w|$2*W}AXEs3AQzdgQwX}Icf5>4yLUgfitv g+ z%tV0BPed$uITqlTIUEU~oT^@e`xic2`|~}34lZ?fhpZ`2MAtPoZl{yq$$nRTcZdHf zvXdn@9O0VQomz{?h%aicffB=I1%9`zX7=>PIxt=W- 2y}D;oE2?X1i+6j={+D`+OPr9GxEQ5z%aj$2dsNZoqT; zQbmQ05weLa_t7*!liOBX`MPxEbt!_ZoE%ZA7G!`E>|DcRRoADO@*#u&@PbQXaY>zd z(;v5*bw~e#I3BvD3iqVY(CY9yt31qq$4cfrxK~|$LVEa(EYzF!<)skyqT07`GEc{< z_p^%U!-j0Mw8^pe&YCad_TMxFKN|qo&tsf2zIe7iB%xYz{w2W_zqif3Q}f z`w0X7yG{TYf#MVJH$Jf4G{HCRG~K#Lp45PKGpTfeZyJeU>{6QQSM9Ia;Wa}}E<#86 z-x*T%al)C$Pm**_$3VsaLqBI>aXo5L6h8kZsdTaAnq%q-3JfvK43*{i$Gm&CBOqNL ze!GuF!I5q~B=K3lAUmw=!%-dS;tX#5Cb*A;$f_HYD3`^jqrz!lOT_{jNHe`U $s7acZCQ}~Dbs`P9acI_&ch~A7%e!HM6jTTJSb A_%TC05Rkb^kUHG0&g^VQu83g8aTCLis@z?C@pSSN z#%4Ko SXXxZqu&|&Ac)dQN%NzT!_ zd_-bD^| 83B zXR2Wj^>%buBZBo5V^M`HM!*-}uGUHWw*7Kzv9f2Wdt%@xHepFk%Rr(n!g%`0+RkxA zua;{{GD-E7U<|5}5#>Vss_3#WDR)|jyBek91u$zTu4$WAYcU9f$v~DZmJ?xtpqoLD za42~f>W_}<;b|g6qoLEe__ui%v?j)bhOofJe-y@8rMiQ&0>;dPdU3Gia!vGgMq;2k z_*~_%zgQ@@TX>l0`u;v5U<)bs)ZIThdeSyxSVa6hY(*2ujnG<>p!46^AC*mXQIsWy zU>Gy|clla21*s}2mv5Le%^U%VNaWh(-hVoq`Lt}rW*)jI5NPW%sEEpt)ol5Ah(9dO zG#`o@5 %ml}#E7oVfXPK-d z*qFeBEuA00< >ub W`8b1{EYE{N)#5OV=VQX5=Kt>nY#Uk7T*ikg*u zZ4TS)z9OL9oedTA;pv8E6Y{QBV4tC6n@ygG-^whEpKH~{!poI fCupY>SYYYIUq{KL%!7jw#btmz=WRZ#&SG? zaC{K}*+R9m{K88Vls-eu?s1JE0jjC=Wj8YqS6rVSYyReb6;bxU)X)C2TPULPd_ix+ z*b_iqAHO<=xIH6vAl?YSg5ptyJ<^7g;@7=US-X+UoZ7=~H;?v)A6d<56E`47-sDPG zG=y?Ua&%eRb@JDzq%fBHe5YFvCzs=_%PzwjDRkLb<)8?=k7DB#W`FU)Nyo-Prvvj| z^91tkK<&qZ*$^ypxO9E?|FXHJ9rtri#BR_*V4g!|OAkjwP $W~VRdxWJ< 7&Vcx^SlbbDN)JH_|lS}Xxcx{9vc zsSJDYkCc%eXy*zU=YpZaQ#@{nYtE D`2q_QON$K zUZQGL7<8}M4h@yLL@=L4ZP6 hFeaG=p)dNW)qLf9o12`oCZ zJ4)g>Wydp(3~n*oR0ukZYgXkSLy5ckV^`?!UGdUTrsfmZA5?#+JSI1I5n`#Nvl2n= zOCwCR9j1U?Bpv~3aEok$OmwHzJ^(Q0;% msW4a7aj+vfg6d25Vx=Vwz)!Xs*1FcE~iWqI36 zrEjJj)eyaR*+Bh`uZ{I6tc|}%iIIH~-d_#7o mV9+&QYdN64HQI~Qgh8to8y28?yt~Q8$Ph~a+%82*x z2LSWbePYcyiLR(b1{0dl@(3NbUKjK6>=&&oTvNCsu-<>~qg&5m@fl{yH2j*$Q2YMu zps=e}xC8>4{TPoLaatNn9hQ){@6sfV*#!Rv)b^3BJu4+r!i#i|6z~sCB8DO|nNN-4 zZ{&_h%LNK!w <#(zZkIp0?2I=lUkCgWfx z82t5)_|6_(P>py-e8(!PVl(}Ub}5Nl2TAF^gOS4o=GLBjGp6|L6>JHtXPjW^0JJIS zf!5PxSr%#TKtODYKIF_gc<}^OZnb)vgqnh_=X4Ui$x9ExK{k)D>Noqki3u0TqW|D9 zR{&OS;PSRG83%>ND}%41Rr#om2Jz{aWqMW=Qfz%HwDTtyu`)Idd$-YNL!RV7!Jk56 zQOT&1w3bPwRmtx#JfVAXEOe!hS7B&@E?X1=zKaMWe=~7A?p=03Tx`R1M+XfWKw(Fz zY|nOP&$!RbSx8!j0o~xHabmSJp0O;Al#JN!EfGlMJfZlHsS}b1y9dfFvQ#?_rY_h` zCOH*A;$P>_AhXhmK&4du9XTDbh9Ea*`<;$-0md_j5g12W^dG8(W;Z1=bpM*P3hvMG z!aipvdnfC32vl(HQdegkq67*o&1pFnTko%Dpq)ox56VEy2H4u&*yuCunoL0{C H3jo*}r?4CwZ{Y5W80`K%Ww3jTR&!|#<6rcE4N%ni@nYnv7mmCn%i z 6br2? zQ9a>Dt3%`L`@mxA>Bf=OPJRFyRT(<2piy0qA@$Xx8tJ;SPjUpp-B}qjP(E?wausy+ z8AiI^wApKqRM6bw1xkeE!zT6Y7+pbT`v66$NdrkKkP77h(uy2auS(cZyRM$Sk~i-G zax$CE!THRsV<%zR1iJy*E9BF>Q(*zLJsQq@;uV3Vo8xKP-|AMI;W9%+-$J!{9>c@} z@7Zcqj-Tv%2$)ypR$s+^wYCu$k9UZ 7p(T`FgW#Q8HE}6ak*9+h;i|U8kkk{s)(jGSMDY#1{wZrFF=E}_H*268Tlcn zn^Ou}XX8y|7vEJ&Vi;)C*L1NWeFt!6hnWRmZPld^2x}#mxZK3IuJU$H2A9Bk(%(kk zT|G8RF#{9?Ig{Q>mRAFQ{1Jt*Vh#8#M4mh@XSKm4m$-pur6ZV6A}$jTsf2&GB(f7p z5Zoj}R7u|Swzf7tt1^LM!t2H466FNq!g@W+B(|aTQo~IZ6}%J!J|lm7Z?ohuNFd(C zFF5yOzY-7Y2RKH_&AXDiW(=y=g*!OF+iP#S+H0#3W`UTESl2;rADik_YJm~yZO4G_ zFuv|$ut-_md7u3;2f-BgM-Av&|I*QEu3s*CS>BLHzvCkfl|gVv ?zGk;dUB92>HWrV`J`d0n|Dr0ykY(Q#AeCdLwqeH{zYYY;e-Em?d$>xN2Ls zoJ4hH2XW@Fd@&)Bm)P2#4g@Uwu{}Chne7XNP8O0;%gFi~fKk^4L}vGp14Bg8fZbCv zeJV_Emi@t vB8Q9Y zx~7l3=Fl$J?rOW ILqNNd#SSLXn|G`1LP^`s>~We*w!#ZpKFK` zLf}>`@Gj(Ik5<1o0@Pu~2;C3*nNdS#k=?xsDt)UDRW_0)I9Ir4kAewcd#G+CrEr4P zE04#a2OK$U9$=mMU&{LP%I8p!i(#|#oKAv8{##YEjMAOM5{AOG(}}ZZnp=|U zS)}o|rNLoC&sbBhVcYG`;MKXV2M%suXskO^*>KnXlC-c8 zKI0~3oEG>9ln!E>`4VNRu+1YO&%{D#0%xXEmb-7}b@n;=O=FiFZDqHkbyCLvnidrD zWZ-U~Qn#5ezDtgQ3SDh&b@l=dd^MOp%erz}bJ>%c{ (;?tSPgr6%FN8@F7+j4j4J-C>spTpg@ypVaB)*8=@seL&&8 zAT@>_?hpOUaKfvLx>#9me|@wmn7|&DP5Y@qazRVD!+2i%xgLtc7bqNURl|8KALn9M zTMN;#S-)VuWzLY}Y@hzkDcYc^|5hYbJ#erT#^V1mMO4vJRE
z> zFE#mV2{5a}%kL6@>|Ss(r)Rzr{*DA?3Crw!#g+JDeE9MoqrH-yZGR&eQ@tuq-8u#( zjw~*cx%b!H1$Zkx |J5d-WT$~sH=^iKwYbl}X|aTz3PcowRm*9Eaw$B3Bv`RMJg zvvvlr;}GNUPNW*FQlQZ2ij>_pk1)@izz{Be;8C9={dQ&Xb~_gd>f)xY$x1Z#=E*E+ z`jfZSBZ_`m(P+d$<+XWZ(~^%Q9JAPk)ttS#MhoZ@U3*CR>`|Z(#DN9!NChr5-Lloi z!LKLSOIPd(l}ekEzH|#Miz2Vf2(gJ&8RWh}TjIF ZIJ})=fR##BYd*K!$axi z*aAGgoGHH?<7^rnQF6rsguu>egS@}%MI*Z11TVT S09;|b~ zDJjRv`}>k}uRgVtGHC}jTVC$ANn@%AkOraY1629yR4Gs$LHq-#=O7x$?_pT1JWe>M znFAn~0Fn|SgITC)6&HE-yY3kp2TN}UDOTnmp10Ri_=Iz5xi~hyB kGux3o3r9W}s zy;GRRGA$7HLGm>%tvmnUU_~*j^A2b;=OpueM6f>_C*xN{msZVUI%rUkg`~}EMA>tZ zb0=N#<7h1n7UPupGPIfi$fYm*M?tz4ke(qAOMuk`-YZ;-z~AWe%`Q2N)%`N=H?549 zh`W4{-Dn_YPz}TKKPblErffEzSi8KsaUISSVNFTSJbd;oCBNwKhOoV9>C3)e+JD&{ z0gmBV0u%bO!VLSxx%Nahf^P%v_BJ=}%OS-yYNdHpg|ZVpWqmebqPxMVRN1&mMrgmg zy^Kuf8bj+|(dBKXsw_1(YD^e>xni4B=J8|V#?L$HXKcj*BsQCC@XOyBFvxiOx8(pT z)P$6Vr$hi&qy3W9;h@QHmRC6oFO}Q{zPXpmJj3I*zuYRLF bK2nta|?LeeTOOELV2Lu;Y_{odQqpkdRcN85XNw7zuBB(Sw zfKN>ra`bbZ7jH)i_|#qRgzabUP*$W#s;7mHX4#FEVA@)R Rf=w}xlIPhy&K$>f*(aix(keAAxT&(5tAJM84| zbOmV^M>75#L_O9G+=TsuwvtU(NdiP}ioP_HL+T6PSV1^=$gXj0=XYDu0WT1H*Ej%I zBA)#s9nVV%){kn#L5_o<452W34;=m24nupr&Cj9k@F~7USj6$PhSU(3a<8)TD6vg$ zb*oEhXJXO-Y^JJQ#KzCJ#Ff8V_hy~QO4$v8k3wC3b{!6HP&*#3xWt3}9}Vkt!%`B9 zLJUk(FLIrV=@e<@yu8yTyKApfu|MG1|76N%PVg(h8pGG`zzHYBakS_lj$wkpIB-)3 zgpCQ1c;MI5oleNAiyGF?Z#^uw`l=>T0Hz_(Z_#o`Fv9W4pn94%w7E)|a0X3&-BH?~ z^d&w7PPgYvjs0iXXjc {4_dDgoP+WFy8* zTp9XOcgP~l--6_FjLVN8!@RK0q+dqvBX@;I{wa}|19EEy+94yc-Y?vVN^mk54vs&< zewDt%eTqo_(|ekleZAl@oc4#GcMMGdo{3hlU!`0TkQfHeT%ztTtR=W(F@+`W45O*; zjQ%7$@+z&^Gv%_9lwj+QPb{rpf~M0~Vgsn$bF#5Vx0axp!hMmJX4HqUL+etS-+}HR zB|ysM>9@(e4X@~ wJAF@OO&B*qzZ;29B-H1R;dVZgO2WkS zXnJgOD#&oSF+e$aD!9{*;Z^_(6a$Jd!3)rDpBTGx!t1=h7WW%wse8@nEbo3u?h2~i zRH}Oqq6%=El|!BNzw_5guy2pCKwjROZ2nkP*$X1PAaOt(3tPo@z-m-k+}O%7$vNAh zMAH{V!zPq7hNOtMr7MipL598Pc2~{+VNq{#2UR90j1vWhl=;#^na<=!z3kD!8;;lv zWpK_wZdnqK!Lgs~&9yvjia=Q6?Kt^@n+Pd@L5O=8 RHA^D{ne zfa!luME+2oLYh8NDyq6wLJpxKUN=rbij^U;3-nAizYz>yT`7R&hQOZ0MK=z NR-w5<_|Hp>>0dDSxsZ9RMyC`Z z9XRmsRt3?k_<4N)sOQ560RSgz=|G}TQ)@#XNgq+gbdjo7I>@U!puXYz@W;YtGp8A%~CwG!qE#*L!8 dc_8^EavwBqU~YxmDNO;Edi4DcFWCs*@KBFI>UuuCPchWCbqY4F`#5CX?$ z4?o5bbc{qILs+hajoXgK2`eJBqLb)k8oNGua`v~bct}N}kWdDc$40Un_*jjg+KNQ` zw$*YXwJ#SYzL1NhD(~MUUuJenbDgV;&>Yxi0Ell+oP*30);=@ZU6 w%7I_|& })O*Vqp{rDQteqkR9JyNX(Ikn8(aZZr zcTx;NnBo?$zko#GxF!M*;gM!ZtjTjvMkiJLbt1dW+@eEHcHwu+b++V;r(SGQ-2n0R zNuY^F3&NM+KQ|?R4zfZHQ&1(36HNkYo}L%9W>8T+b8*@wd4Hg%ZWv0tk;d$}81yPC z=UwwLeB&po87*dP^5BoyaOKGa5x72C-0- lf8^D}feADmZ5P z;aPn~dCNb#Azr*7->vOMa!mmE$Q^f8>6QU*j7JrDrP5Wx0wNl192ytTC!o!D ?Gha8j+w%jx_E}wh#=K0 z*%GH (xW1X+t6 zREInb8HI=wZq?)=zfDfXS^#=7)DbzY*jH`>f =AGC(%HEjmpLk{D39Z%XiDL5r0SpE-kvTY) zBKuyd*~n89#UIRxjOyB8Bz?lDqjCl}k}Y&Xh3#7U5DNepi@NCjEc+zl%X0R(N&@5} zfh!b1{+whA)d4q4EFtdAK$98>(j2l%l4+BD_YOSxas8k3LqpC*?5FlDY=$Fd;|#)k zV$Aql-Mrg;*E`ql-uxJe*(AWS1{Gslhm(f4!-_+gKhZw}72;7pYNPNEody1J&^I%` z@y*^Jca|-#!_VG*4aex59URL1J4 xr}5AJR>xU|V1E4+;8WiNdr!6R8!EC{4oba+57>aQKdxVZ6KXpB~+IGUFB zb_Sf~Ia!BuQQ*Pz`$dOLdJ!W*(4+m+vOs+LEYm@q>)jbmTnxZu8|;NnrbXy9Q%0>3nR!}-pcMJYR2BsX)u4CE@?+suqFm^XZoQ*x zmHA9pXpm-`1Oa^@mgVqu_il_ov5m |emlrQptwadh!jMNUf(=F zm iF_6JXI5KoTdVSMC@nqu@LJ?N% zM`gF*i$Pb>T09^LZAy$a)pMDNcNw*krVhgU3!b?-*<>Ts-jFr)siH T u)|guN5I zlYHDChicfF3L$rCH3l|Winm2Or<7JT6Thj#L4qcLjBw(lw+QI99|PITKAlMD0huRy zq{81BsnR%cGerazCzO+Kd7>F}?~zQ#;T@}0KB{ztN{Iwa^SoSUBdW5JC^8;|8f_#B zl-W5;mF2Wtp}H}tE>3K?*sE_K!vM)&vlngy#&e+vBbXuEF8 EtDmWqGUXyOz^bM(qE+T-ROsvJNSed>RJ zLWDNOn3$tQ*C|~(kx4cZ%niwiliY|VJR>jV50=%FJ>r)C@UH2~#TFj4GqhX~wzItr zHydO*_|QB^oyR2Z4#rk20V;HbXS1#>pM=bec+{C;GdPFt(qlDGw#&!@!LU7%Ce|3n z&AXd#rruR?;ihk?aUbTmO!#3ZEUg=QczAIGF{>k)V#|8GfkfWC!7o9_LFP|;tqxd1 zjwCI{4_a+oNS|O5_G=nt9M=`jvTZ_?S(i1F0zA?oDzyHo6=mJ-Dr|J~aoF?xJ9WC< zvWTj(P~wu;pBVE-%qt)BcEdt+eLVu&4oYbw5h$cDZ Ap&M2Km3(`go&pDqC;Ec#-#Z(GIs74tI&r>G!+Non5%Wm|5QRc zA5En~-8$ele&6$|zo)jrY^g3;U5LZXnuUwxU(JU7f%eJ8iew6==YonPB#V6?NquOz z_|yk55|YR+65*M4P@3S_ClU^F)$kr0Z1ymFKl%O&*(t?*vdG7%bXQ0S>kh)BwmlI^ zm38yC*~W0J7`$BII~zz9GF^n*xG_O4*M7jp%{A5;(^FCza`FBvhJ4P3mb^RPj;7QY z;aM6ov-G5DkV=50f3C*mj1x_w@;I3I1E5Gv)eam8xGhGUPNPL&_=(A~2PrRD{S?=k z=XHJwhs#}HsB}Li8M^^yLz+=SjlfTj{fTE_6CmWCr5~Hgb=!o&=~ZbdiWv_aeqsR0 zQ$=pY$R=#>($}Hnj|&a2BJS&1MUvgQQTp&O2ju#wi24Vvq)m=@VV0 Rf+V9 z%+2R5tx5#}pHqG^PiVxuSr|<8hPTzvkR}`KTHX(@bOe>aU4 NiT#Y9d&T| zZD_sr5er+Kf4U7N>PUyRb&9sNki&MSOF>uPM}{_3PbORRvN{D_*OUMkUQ^964{X`{ zo=Q-coV;w}lhk|T`_@Cis_9A45Z1`&;B@f7-2f80slYipL%X5g5_9{tF888;)|%X8 zcx%Uk8&JXm#z}ta!qL^XzdOeRGN?#c)7dP`kryD1j%aGm=H050#@f?wUlS>6=9{T| zrY>*b0-3Ik7FKK@cM)XJO_~$!y$|%YwmYc0d_UQp;~)I9#7DmloKh#qOEbYEGsc2p zM*v4=dOW=lLJE%I^YnFC9bw$p NWPebRLi#---P@sIy?`TuxbcN2 ^Qd?1 z*w!K}sCxD3CC3ir2IwGh!9VJFRSpBZu{%b;TbOx@WCS!EF*PUcbnhk^Z4vevNQYOT zwP&>2ZNrG;F-iDuzY+;gQeYX?)X~?pk-Kgr5MTSU3PJwMubQ4oSd|v#d9<&&79usG zwYM)UMWfN&%c*$ul#;Jb)H<+`(@1cic9${j${7qMeCwIcN)J=-y<{w|RmAcyc}L6` zR{C3@HvybAY&9Rw<&&gWJUVOt{tq&S{s2b+J(d58BMJO!Aa?*V;x{zW>6t=KR@lQH z0~ Z=}L|Ed}$#RU32D!9&yKir5Z+AosAG zoKmm;?(;ldX~7jancK`aUqqtw@LD38lzCUQ9A4g_fYYq2h2nUqmAOM;&1aMX@f8+O z&uK&%39w_rp2(3_xJIrV*UV0XibT3Qf3JXdC*|8Y6lt}R?2GGW04+e$zX2zwCxfqB z?V*+z(be*SthgXEFwv>iN2u1onB eh}&{H-hM*ilZ@$=i&! zVt(Y;Y$LwGzglj9hxT&p%^8U`V7aaxW5`HE-|ywAoVaNU7;pNGguLy{V($2$y2hS_ zFf-V@C_oSaH?#l^ZFvDsUG-Ae-rT$Qqk9BGLJ2_Zi>;f%plPa@N8K`gYsyE(9}hMU zX%SVc9I9Hh5Rml23rug9ahZBpjNSxw7x^ wH1!xxqer}dk z>>ltv3;#&Z1 qn z&>lbjF Xr zoRL+DN*jTPVm-p)C*|dB;08GkYwlYH$LiA5Ps|%IFOT#1lf>D#tHs@cKq%JCO{l z6Y@|^3)H@1GKKyGu{Q FUWf4TBEX1pZHOK>LgK*Te8H!>!YlEX^8*y~ !m@U5-klECSP%_%l)=xdgerkN-ejqNj z-4u*%TTiQ!E8TK4B}^(X1H=+tjqjO4Y N(ACmc#1_S 0uHSxWBy5fW;r?*fXpL? z70Mmem;CSsCZ})a!411w$a@2lp$0Ek)Ho8x%S9t&1Q;WDJ}ZW!6k&7kPci*Lo0*c6 z A%5g%4AQM7u)zq}4{(E2%J(o_6P+s0uuAkoheP3Xl|1+lUzoe#W2Y)2#D; zncKrW%=*r5`LIAlc4F`Tv0P1g{i}B#U>++#Q_%qMg}%;w(NP1qV+|`w(@m*2c0_JG zQSckCE%jE15A*G6e{sERA$7{@8dAD$(a8v(hLP@;*}Yy-8|nIddhV{)XC;gefJ&-{ z>ROyOQ^QoOKM2*y#2??fF@OG7l!|b$%7Og9>(Nz75{E<9IAma_TrbGd##N-?b6E1- za0LVCO`;E?$rge$6K^j{8$9$>=&EjUsyJ&$cTdX)2X%uSAw)TFqBAcr1OUO?E?d)h ztMW7=?WDr?EbI q29{a+ z)!>Qe^VDvv_Y5pX=bTMrdYcjIjw=vp3ZrScyv@A4 QP6XL+0HqAgqB*<73k4 O9;#GvUBe==vRS$j;*kNldRBhh_&KGJmB@Vj|R zY-tp>t(#2BTM5SM9jw;l(;PKPvql1*IPo6Yvh%Tqa4IT-!g_aNuWFdH_MZ_B3B(^l zSl+C_y}^fEdIsY~^#?z$C17=pX&hpzPG=v?T`1@)@S1e^$Yb@< %$glFkmygVwdxV8%2zvzd;$p0Pl&U&HP z@sJ`uMBwdPN?g_cvN8NBoVr}4!7B?vEWBd9b59RkbRMe6eQh8yH)Q1|k`UIXiiGDE z>X?;R UJ!Wq=E(srqiM$&Q$uo0-Nhqrv*MYt8A0 zv3l3l$r3Wf8s1Xi^gdbQJJ@62-$%3wFi1)Q5tzu(R|wohdd>GRIMV18mR;f>`vx;{ zXH@#UWH@y_83lkat?FfL9>F|xQEGP*J4e_+hJ0+1gJAcQ?S8SEjJEa*bQCgOEJJl1 z2S^W1vYoX3!Z}SE_Y49p%T>Je${OOOPm%2*y}X$+U>$8Py4b@j2k=H9KX7E8)dq+- zuT`i=n(G4;%M#Ua)cK7}uB}!8`Tn^P-1;e#|4dM0n+U>E;C)LNe%>DUKQ)=pD8uI!8wux6B86YM=AqRx4^)TVZ5cpkc?d2Lgp09RGTFKJ z0+>ruhA7LQR}ibRl{+0Eyc`csy85E=-y6lf%EQ47C0X-|0p*lBTLh6%GxpcN(-duD z=mN@iD`#^Vl8cjuS%!MU*_i!{_6Vi4&VBXXiQ=)F D&(Rs}3Ks)1lmk*n*6^M9U9$69N&c4^2(WjBZ?TwQG+%v{UC z#=?R5xS|i;prt~)FESNpvt6Sx@2y-e9f^fhaNy_~b2Jpkm9-!#)SqBP^5%-KClx_d zC0@sjF$6J{g1OI`5wGwjR7w5-Kdf#70CT)sj(U;LKJrjlk&BLmCcBq1ZiXdhJYPn_ zo=n2Ug;GkSC#?R2p6+6Yscez{3wn|ysxnRXxw5r0SjcDAMJks74#-=z@$}6g=;o}m zDW?<_1JAzMcZIkQ0@;+CM90+^|Fr}85UKtjTu766=O|LcORr)?(L=W_|DOU1hAI5O z$iyC7(#AKMn{1dZiUZJR{ca=aJ(&+-t*^Te`gB)=PH=&8tR#PL3B*KG0O$5awk(ok z{x;OtZUmJhPUnuptLn!Tyi~glr!!uO^Jo?F8|`eX56OJZ>*WXZFs;e-u6<#~8$)N^ z{|G9wDd{4SA$!1u{2t++KfzJV`x~?m5*aqf*-XnL002e1A20wz_T|e}7g9ac-IJCt zr`c;R0>b03t2V`&4A{_Xrv9*NoQjZv5DR^fx^Ikj>Akb84T)_7b<2E`erhscEW8!r z8c=7arjg+%ile=PYx*O7ems%Q4Y%@$@r1ur5X4F946X<6^t;izB;O;H0Q#3fQ zuKt?u6|0J~W7gvMP5>UvrA@my`lPOYs~raj=VGT?Np}Y7;TG5PMI8jLF&6b%HROpb z*+a?FZ{F~QS2dT1llPrg!gx=B31_|zFJDfIGv5*zJ7T^zYWk$5vaQcksZl$@Kb2Uu zWt4RkfUhu&E-Cl;v^7p=pvm_D?FbDa8Zsc^v@ pBAzzF)L z6GnE!sItudBP@s(p;|tRAgKGwsueIz0HRy;j=r#(1QF0dx;dG`cu?HR@aN7A6(Pm0 zVmbbR@2ac5jU1AsNi)wfUTlRrLc(^b8Z2VPfPPQn0Lx+~s=>I0cy%%wXR3>KU$}}5 zQP}-joEJN#(>)A1q-D&i={N(3kb~s?MvLSzH0KniX7qip{Go%sVP+cPi9}I_zGjU| zSLZD>DPdIGfr;(#ZaTEhtV9?Izp>byXS!C)n`~vz)(Z^@?)2T05Ha>?zS@Dk<>FSJ-0; QEnTFg%>}(j5+i8$Qq%Q)1YS%RFXVMtBFy)@#MS*7SJPM(L z3n_JNW0pF~I}$Z0kSQMa>c*FAFh+sQwstTUVKidOBf$)D`QIm3{#}d&v*?CzVDqjX zPR0;UYDh``?4=R@Gc(j|_LXz$8$GC-6CM%7QVItc)EMq0@CXqd=$Pr8dgdi8(U}p8 zCo2dskO1gBH0buc+J0ov^(I^$GG@D$>hAF=d`|aRfcWFIFFG7yaFT0U7HpW+u_KrT z+bZ&Xr!2wavX$P3YVTXQlVX1i--^Y32w25Usz7M0lYgi`hOv+4tG0;n {2p2TV%TLjx#)vB`SQ*u3&vd)>EXJ)WLTq y_n|j^-eBU;ENT ze7xw+48;8#% 1^Na4{<0vN4I%W#s|KOe8(Jc((_7ay$rY{}Fi9asY|y5Xm(@?8{62?b ziW_Rk?ee;Z!?5&cwBz|N5Ov202EU;uX77JBAtns*mNw8tlAb_PbLe{ptRySE|LphE z`Uu;rxbVi$X 7sNEfSO8H3g6-$8 ziuJw6uPCnKrR_-HlMI?W-~RfwG8P8KdV92+1Y-z`=Vgx7;mkieNf6UHbXKm!?-<=D z%cL`;Vaz_`l(8a%=gw@(G){32MQYs}Wq2E^59jXoX`yDI`c^+i<{%z1+f>PD20K-> zzc&fm 5$yo!p5zH;MVvfZ|p`j)WwtYFK(n|v3=#z zK|8ddR9$Y(Pp@C1VA_pN${L0&1AZ{LP^-JLp^5nk$}E7*>(CX`A}vwEDCvM8gaGbh z9=p`9tI (*osT?W z!iJ=^VU^Lh`eTpw)t)?o7qB+-ny5hiC=`?0%2y#D5*8*mqu~cD$xa@1ykaD EBF(UOMQc(D>s>m)O_{SG}ui w8t>*cQ_xvob}yXfm=1dOOv_5qb}{M zQLE*}?Wg!0Twnrv(+cQUiV1!5+s@2ynsHLf6Ym`Rbpc*i0l0@0ZOb8$(7#Hth-Q8H z`5f#FRisoS*Yy5*Gq}pBw~_^XIb&Hrp0QtO+zr2sTR;%y Kl7Iz?QTYQ% fSUej +NfqacdA{bQ85N%F)07TB zh64JWqsMJ*_NYbPb6Y0y)$_~PDDRk_3muCaDZEh)xy&Hdmq6Rj-LRB+7!LY1MxfVN z&WA1c6L`6mLT{kk;V`s9?SfXptzYVTzRp}N+7Sf0FR&L2(T#SKQ^Uun_8PrdlM5A| zmXwpIctoE&jbPJH`+01|A({*oK`BCXOQ8)VzhRswQ=E%Tl|S+#+8A7KM$F89+u+*f zrrzAuxHjtU )ob{s`OCmZ?nfh@^e&@nz&xAe6dC~0luo6Q zmA*OlRHS<(055w$e58ouWs4nhqkV9~;}w6{`kq6Sam9Ei=1doZa#wKJ+Nw%4dyQi0K1mh6?NyN7E2Vo*H~OHHYyi3;tiq zMZa*ZM=yE1wE(DsbEuR#tL`dCM0;m|VRr2!0(whq &UF1vzV2=d_p@Nn<5QTCqXy zTZ?A!#&wOQ&h59H-@?X9O7SMA8k!J8mVURbXP62%Xx06 D21oF+D{X^D9*hRk2gimo%PXD zysxkNX5@x@GHHVrDpHk0#A%A_Ydz@@_N8+BTB>C(Y9URQ?r`3JxOCNMg~xvQ4cS{m zVtD-r_%Hej=l2=^)Zwh%oiCZ#s1yE9If$=$BIZ>mz&d07bZtXOA{(YFg~hMhW-d0{ zb(|c7T6_Y%j}XGsrF~;FQB&oJLYcM2IuL%iHeIjn?)s_8ze-jmslql+TB=>{?uip4 zVBAzYxQ+tI2x8qxTYLs^Qhwh=WkGcqyE>K&Xy);8usseCgPd-0o*8T4x9Uw0ajyEH zR0+wPy?9l;N0&M3*5=>(5~ufmMsK!|ve?amXNbxJhP!~7RqR@kjwfZ4GWYB;Guo~> z4C8Xq#75Cw%`h*x(Lpa#w`XdBOFV@oM0O{2*OtMxf=#7=D4Ke#5*uuuI=($GD~1+v zC(Vg6vx`c2sl0ps7p*!UiCRWCY#-@?>j$b(d|qYFr}2GL)Go{7#o!ao-Z yTtp=p{KN0atDwgp#yoW70MIWaWH+wI9nSzcoJ! zfC46XfE|NI$osORzOC{mshAY&1$g)Jsf$;b^%1W5q7D$Nw0v%#E;8w1;3(}?-QR*o zCCKdQeLEl9ek=0G7WYc6(4VDQip7Wnc( SB3xRj%v4`j9O^8t3vxG)(Cc#HBo+){qhSa3`w}llYHE%I=OZF1X z@$`?3KiR&}rO@G#>Y5Gky2g&a004sc$VUFBE-!J3kU~>%S?6n@IE)93Jlr2RIc%pP z!Vxpte|dd0+$+p$#124UV;Y-!O=SuPf2b{JlhS-z;YGBGW+M8|Hp$f92`5^Zi^CN! z{zNW#0m7omX_eQDJ}mTOUKs{YI?p`Z&f==t xtZ2bBaTK+vuOc-{?L;(=;I5JSfOWrFls21MO4sJoO3;bNOFc6Ef|`< z*0Q$*ax`k;T_{BD`MPubaw#fL-*BM^cAzUmS&2H^Zuze_5|;Mbr`72zb>TsAl{;Jl zcDm-n?QPm)QXSBr&AiZS(?k!{z$XN)RF2VoKBs0J7odQW=?`~|><++fVV)k0GkYJu z5{Myvju;cYyS`R<)=k*h)o7{#KHZ`pXwah&V$T=l*g|zTu5AE6_mXWie5o`9RgGBc zDjdefws&%sG<#-bdC`bqbrVk)cD^tBC|NU3*X49pn|WnmLV`2S(a-~{1N_ztQk*5( za0oy>d!zw7bbLB-PIwxDD%NXijuI;xJ Ae97-IN(_%hwj8?E4GODvZ7C8GaYqw<|?^uXQZt2Lj5Nq`leNw??3> z7o(Cw*+c&v9&|%nqaoPfU)Z-9NpZ0#Zu%{iALHCx&q;#6y5~f>avETwUT=0c(|w_l zc={0@7kmHd?Rfk2zzNW#g1Ou-vqKNi2+IBSsCuz6hi)9dNf?goQsq|tgx&G6AQr#|V!Dzsmok5n#jdT&%`W8ERj_CIW{0nZWxo!wx3t)Tg25!4 z00-vfeQDYvGjy>53{&_i6n{u=@to5+q%IBE{(e=;jsBcP_UhHAm(ScJrMwOaWpNU| zaIEgbABus5xHjzNJY`rC9*dFJP>QBnNSCZ|9oLE>B#1Fc^xqa(?pl>aM~-e&7c4MY z?ELUiOdC@XYB*cuf$Spw@fTh~TEa$~7U5Y`f^JVom43bZq&ud^9=f|1g1%?3oW8k% zc}UExdIPnI^Bh+MEQ@M3&P-gJ{A515XlDKjD9&2$Y}nqb5y-kGnsE%uOl_uzMBkQ& z;tL2Ksee>@7CME`hjh*h-FQ41=Ia~c32dgT75uW;j-}Usu4e&0Niu8fxw&<^Ie&$J z1o&~uN2G)A3f=Twjw%gT?F7duDkR_?ZZam5YT7&V3Igpsu+4U=(lCM-gK>*yy(+bF z#&H#Z2J5!DK?L~(w+b{JdLME;#Z%FO0T!(i&&z!)qoxN^TjJ=%B7P7;%s?@mq-Y&= zNKD{LZBvjS-0-@^lEs%g-!@$6ud|ujl}J0l@yDXq+Zpg$pMUc2d83vw=kLMoSMq3X zEPy^_?oz| vP|z-f+7CQ_WDi`22~F`nvJvBj}ED_4%X6^X1FX@ z;fF=euUw9D{;oXE+T{FKydR+aGDGM%d8oc1pG^qW%q$eMP~`IFB#zrzwB{z}4b=OA z=Jk8tj>$~@n+`ya!hU&8z;Ss-ML1UVz?D%#4HrbQ5*i|~R;!(GJ2&eByEEH^6_T#8 zF|773Xu!eeZ3aT_9eQ@fMVJ>Rso*nRW#F1d=TprvCGbPz0I_AO29H}sd24L9dG#|l zh_0v#2ZevN5!rTgd6rxZxOJ(yj4JKZbSCy&D_;@26)MCwU!IZ&*^PTeZwVJHjouGA zT(L2~)8?nbRL2RCsF2!ucxNoZA;uc_vJtQzZZDGV 7aW5E>|=<*gFT>0P>V%&8X7aM~_pu!F8?< z0aoz%-?f)v3q3Ub?^K)Wn1ua$OGOxAs7WHoTmd{18A^m*n#W{%sB_w|d($G_0Zg5= zd016q6<4u(u{38Wnl3Dw%?T3Ekq0MoR~T^b%uD@2<$@A%G~&;-SVSi;jm1pYjx(m# z(a4Fg`WSzJInqSNn4gvsADuf4DiFLP^87NMkd6|=EP`fJJRsLg{A<9_c9#9jB*9nD zUblvNq;O76XN2E6ilx{8l52eht34hs4m+%dSABd--S%HFNY|2y78GFzAp@%t9X@KA zhEV1`4lKHh&fM*T8~d*zlf;v(rR$0bJ$N~%!!O6I_gv^0f?_wZqGW6U3!v?7 )#Tg6;1e(r#>Sj=`vPv&{2e9ME(%edCkdK{=i3caNmE~qG z5~~So&La5HXNmKQz9xj+#g!A>8`Zgw5}Lhk2ATvPZvXn&F;w!wQ0bRM8qE=T%))u> zs*7&H)htmMkwL@>Fd>h1tFYy5!axEO2gs#WO6xf2pUF`Ap_kHLF|ZaiUG6l@ijJSg zmN3&JxV1`wIBzjs>HPMS1ZKv6R{e}Xg-3rF9BHMBVQu8~y~`oE3iaLTy9BZ($BKjU zgM(GTw)Az~Paav6Z`ui5l0#GUN7XOk7i)QN%!K|+9*`YB1>D1!6rSsT+;szykyg|G zT4sz3Lp#D)nsO92mxl!%xr7H4T1m%Mxs)n9<|{y6g_Pr*Bma |8EtcpfzhILj)}v*FlNO__9#Rm`({6xfuj! z((ScnCTx~d4zrb;r%m3fz&cy*BHULC?Zt3pUL76dOOp4=v%#r~xE=^7UN4Ya=Yxip z-X>eHZ}Ov#I}Iu)af5$vBrRo`3$DFf0){B7O|Ge{;c=6GvF--IqKYH+>#BzOzScwFY|Pix0FSUd zp*R`8=wlZ9C@Kdi-;nS`K4f44Lg~Wy5zGSZO7ezWq%v&e-dw_PoT!JD#X453n YkZeYzR(wmQiJR;-n9ZSge&prIE^A6uvkSlryzaXCd(>I~b7KDqF7<4bSO-kR>0G@)(Oud9%^CG$ zJs6bqNtB16y_Y5D-sbTP1vn1%6z4O{{7#0gP_|)CUs5yZJ6#4g^Or^i6GzN`13N_U z43j&EBTi)YEs+)|3Vn(F-}is*(b{p``8Lyhh&aqbAsYk|-uWunRH)eB+}K-0EnFGo zm*ivH=I&5|{#=~zyJkGJCpwgT)eJk|qm?V6;zv8|^q9lV1Go`!$)@$)f_$d0mAkO* zz71${ms<%SG)Wr90w3F4TJCA%Zl9NSYpfN<**e-xZwIOPuSRN?Cg1^~k_F~iXS^b2 zO|1|=m&04>$=Ip{qt^JzWsR7~m!7=G|NU+FoqvUcVvIGb0+&m*-(GI|H`E4~6<-V5 zNJy*1*8FqJxxzO6r~5srY4BZudkqyj3mpb0S4S%_78R;E>sxR&vMrip6g?+}hf!7# z6asn-xj&TW4$oW|=eIT`>c>o*`7U&j92tZhhbR_}7J(kheppPOpn}~37kEvBRzLef*9M*wN2n`bBtn{la3)i}z z4nfmni3gdA P~}(ow^_5tAH$Z?}F}caWOJ*aiS~8u>AJadxD;; z1oQdyl;_f;)0^!mlF`%HXB}9eB*_f+HF)brhz^!fKK$_2@!@8!>;&!m-vRzl{6!q) zbF2`=P87)r2i3NbMM !hiF~o@+#Dww6?uYp@*bC 0*F0< z^=;F2vH(cdi5#hO=gnmVX3qF-Yop49g4ny=LSjDjms}`7me|L%<^8*eb;8x(r}70G z{p&et&P{`2hPXlLuDXXTo-|R3cWA>k6=C!oeUm+fF~+Gkps9Ke^8I}FNO{$KgOu;} zSKrX`;v}v725yX;4$W+Ee$tRVEzl%ns++HBkB*puG0jPUHV`iFQPvEK&a|<*)H4E^ zB+BeE@3A$k`L!MQs^4SQGc;-YH^E&7Tz8MjB#d^p{=xcEAIY7FI-gkLT#r9KcdIRK zO6q{$5P}t-wYEV3l#}Hsu{0z`1C0 XR?Fu#%C 6GcU$=E{w>&v!V{;e;W z(MyC(D}k*G96(vTHb&p2f+o6e&=aI~Tl<`eFQh)3?zwRS*YH^z)uWrTg| C=ba@6EgM>jmx|nb88)jvO`%4d;>P2SJrxnLLlh*mMkvR912Y zd`Xc ZUm9aEnKG>HX~)snyiI$Y!$&Fzegq<`vX6nSps#U_?S3tg0fHI+ zF|rY5%RW{FSZH-{TgbD&UNl3I8tgZ29>ydpM4M^z paL9VWg$cS%*iU6RPS9`Ums_^|#7YNmXCZku^`OXZ% zMZ^8jDPls{fY&tkD$nvOm-YRJ>}ydfpb4z{`G}q2f>Z^o`2JgFp4-tu$WvnRt$Abm zb$!`B>XO+mDV2%jmJ*zMQvgU>Z|=~6PWMoT9mk&J jnQgO96p zY8}u4&$IdcG>`17^dbC&1}OIbFYakX?`3iw#--Yw2I*M7zt}h%qUH34??C+cZqUGS zgOFCStpRPb$yg`8q`Zgg$gPQYrN-IWNa7pT*#(f7)1oI3fjWHVD8E4u=xA4xw1N_h zbn3>7JI++(27U(H7F3A;hpWkwjv9jL+A*5`UyYH>%S~(H6x>)rv2=6Pg`3AF*z5Xj zP(kUt$w*}ZYajoKJP-LTjjCa&zFiFn#AjPCNA^+0eRpn?v-xyt$85%`;=89OM-WCG zCGfS3HQj$Z)hD2(srB)t10Gz2&c=M}AblXdRZ5%!J|lKNUc$7(9RD-e)iY z;z+ABMzJW^yWRu_vqWH)7zeboA#$3#h#%aRB^~g2yPM0-5UL8C?6l(bp;3;vg&{c7 zZ}lV~Rdj+QACNE}LV}q{u(uf1*O!wUy-+S1zYgm-8EFOEo*z)sgMr*GZ$QF^r;J3I zYsZi$`BE+h9}3$Db?!Y#ECS2ts7_T&v8l~#DMXknIKfe3DO7_7fLE?#vbHp?M|C-3|EEtX~H9lXxbWD 2kZyiuYMJZhtwLzJ#>-L)I*O!&HeWc5u~>N3OppV{nsbCtX|R| zT7Ii9%o~i%TcS$SS54E^(o=LoT!WH)L-L?C&3q%=U_wBQPfj$T_0AzF$RRuSF($zx zxziL>An(rSVxFS_P3$q?-w4@ w)M3M z9B$3zV9{MRG2g1h@|#zoAFdSMa@SSsZF6KzvU!9^+U6PdfR~uG`iOYGCxoO{lP}X6 zx7~yr&V>^r2xM7 zbFY)U+N`Unv6j#jo_f!!CH{w%HKQQ*L0wt&h5sV GDW~5h-MVJ%5gmwv6u6h zI{F;<2OFMQw*(=K=0MsNW+V$%0|T~`0FkjS1JtZ0efLZ7ENHZ7sH;K1m|4^7aik8u z?QOP}ax7>Jm5J+L2ncZ~?b%131AgsU^oFNtQ+Mb%1HH!bh-yCZ$KzO+(Ag~U!ZCtO z$&P9h!Zq-qw7d?|%A#6*_U&{S%R9+IG&2Du1RdIz+Lls-xhfaZ^wP#zu(3`_FPosR z@Uq;O&UG-QeE38D03kuCIa0*k@?KopS&sk{A}!CnAdOri8}dzgCFmAz^RnY0_5{m6 zrBeED;ZlgR72u5UW9$}0ECttBE{~O9&GDX(+rZHfsS>1>P$E`%w%(}~