From 5ea4cea03f7c9c25f0bcd0d9f78421aae63206c3 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Sun, 1 Sep 2024 16:16:33 +0200 Subject: [PATCH 01/20] feat: Severely unfinished Lune port --- .vscode/settings.json | 6 + Makefile | 63 - README.md | 184 --- general/fs_utils.luau | 105 ++ general/init.luau | 5 + .../logSystem.lua => general/log_system.luau | 56 +- install/archlinux/PKGBUILD | 48 - main.lua | 131 -- main.luau | 38 + metadata/init.luau | 20 + modules/config/configManager.lua | 125 -- modules/config/defaultConfigTemplate.lua | 90 -- modules/extra/programMetadata.lua | 17 - modules/gameLauncher.lua | 103 -- modules/general/fsUtils.lua | 188 --- modules/general/systemUtils.lua | 72 - modules/objects/steamGameObject.lua | 62 - modules/objects/toolObject.lua | 24 - modules/steam/protonDBManager.lua | 41 - modules/steam/steamConfigProvider.lua | 144 -- modules/steam/steamUtils.lua | 44 - modules/tools/gamemode.lua | 10 - modules/tools/gamescope.lua | 59 - modules/tools/mangohud.lua | 10 - modules/tools/obs-gamecapture.lua | 17 - modules/tools/switcherooctl.lua | 15 - modules/tools/zink.lua | 15 - modules/ui/UItoSettingsList.lua | 52 - modules/ui/aboutWindow.lua | 73 - modules/ui/gameSettingsOverview.lua | 167 --- modules/ui/lgiHelper.lua | 77 -- modules/ui/mainWindow.lua | 236 ---- modules/utilitiesList.lua | 15 - sst | 27 - steam/init.luau | 4 + steam/steam_config_provider.luau | 167 +++ steam/steam_utils.luau | 39 + .../vdfParser.lua => steam/vdf_parser.luau | 100 +- ui/definitions/cleanerPage.blp | 10 - ui/definitions/commandPage.blp | 10 - ui/definitions/gamescopePage.blp | 215 --- ui/definitions/mainWindow.blp | 147 -- ui/definitions/overviewPage.blp | 279 ---- ui/definitions/protonPage.blp | 225 ---- ui/definitions/settingsPage.blp | 59 - ui/definitions/utilitiesPage.blp | 93 -- ui/main.ui | 1190 ----------------- ui/update-ui.lua | 81 -- 48 files changed, 462 insertions(+), 4496 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 Makefile delete mode 100644 README.md create mode 100644 general/fs_utils.luau create mode 100644 general/init.luau rename modules/general/logSystem.lua => general/log_system.luau (54%) delete mode 100644 install/archlinux/PKGBUILD delete mode 100644 main.lua create mode 100644 main.luau create mode 100644 metadata/init.luau delete mode 100644 modules/config/configManager.lua delete mode 100644 modules/config/defaultConfigTemplate.lua delete mode 100644 modules/extra/programMetadata.lua delete mode 100644 modules/gameLauncher.lua delete mode 100644 modules/general/fsUtils.lua delete mode 100644 modules/general/systemUtils.lua delete mode 100644 modules/objects/steamGameObject.lua delete mode 100644 modules/objects/toolObject.lua delete mode 100644 modules/steam/protonDBManager.lua delete mode 100644 modules/steam/steamConfigProvider.lua delete mode 100644 modules/steam/steamUtils.lua delete mode 100644 modules/tools/gamemode.lua delete mode 100644 modules/tools/gamescope.lua delete mode 100644 modules/tools/mangohud.lua delete mode 100644 modules/tools/obs-gamecapture.lua delete mode 100644 modules/tools/switcherooctl.lua delete mode 100644 modules/tools/zink.lua delete mode 100644 modules/ui/UItoSettingsList.lua delete mode 100644 modules/ui/aboutWindow.lua delete mode 100644 modules/ui/gameSettingsOverview.lua delete mode 100644 modules/ui/lgiHelper.lua delete mode 100644 modules/ui/mainWindow.lua delete mode 100644 modules/utilitiesList.lua delete mode 100755 sst create mode 100644 steam/init.luau create mode 100644 steam/steam_config_provider.luau create mode 100644 steam/steam_utils.luau rename modules/steam/vdfParser.lua => steam/vdf_parser.luau (64%) delete mode 100644 ui/definitions/cleanerPage.blp delete mode 100644 ui/definitions/commandPage.blp delete mode 100644 ui/definitions/gamescopePage.blp delete mode 100644 ui/definitions/mainWindow.blp delete mode 100644 ui/definitions/overviewPage.blp delete mode 100644 ui/definitions/protonPage.blp delete mode 100644 ui/definitions/settingsPage.blp delete mode 100644 ui/definitions/utilitiesPage.blp delete mode 100644 ui/main.ui delete mode 100644 ui/update-ui.lua diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..351a6a5 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "luau-lsp.require.mode": "relativeToFile", + "luau-lsp.require.directoryAliases": { + "@lune/": "~/.lune/.typedefs/0.8.8/" + } +} \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index 970abf2..0000000 --- a/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -# Metadata -PROJECT_NAME=simplesteamtinker -INSTALL_FOLDER_NAME=SimpleSteamTinker -VERSION=indev - -ifeq ($(PREFIX),) - PREFIX := /usr -endif -BUILD_FOLDER := dist/ - -.PHONY: system install uninstall clean local - -# -------------- System installation -------------- -# This will create a folder structure in dist that is compatible with most package managers. -system: - @echo "Packaging project for system installation..." -# Executable - mkdir -p $(BUILD_FOLDER)$(PREFIX)/bin - install -Dm755 sst $(BUILD_FOLDER)$(PREFIX)/bin -# Modules - mkdir -p $(BUILD_FOLDER)$(PREFIX)/share/$(INSTALL_FOLDER_NAME) - install -Dm644 main.lua $(BUILD_FOLDER)$(PREFIX)/share/$(INSTALL_FOLDER_NAME)/main.lua - cp -r modules $(BUILD_FOLDER)$(PREFIX)/share/$(INSTALL_FOLDER_NAME) -# UI - mkdir -p $(BUILD_FOLDER)$(PREFIX)/share/$(INSTALL_FOLDER_NAME)/ui - install -Dm644 ui/main.ui $(BUILD_FOLDER)$(PREFIX)/share/$(INSTALL_FOLDER_NAME)/ui/main.ui -# Desktop file - mkdir -p $(BUILD_FOLDER)$(PREFIX)/share/applications - install -Dm644 assets/desktop/system.desktop $(BUILD_FOLDER)$(PREFIX)/share/applications/$(PROJECT_NAME).desktop -# Icons - mkdir -p $(BUILD_FOLDER)$(PREFIX)/share/icons/hicolor/256x256/apps - mkdir -p $(BUILD_FOLDER)$(PREFIX)/share/icons/hicolor/scalable/apps - install -Dm644 assets/icons/256x256.png $(BUILD_FOLDER)$(PREFIX)/share/icons/hicolor/256x256/apps/$(PROJECT_NAME).png - install -Dm644 assets/icons/scalable.svg $(BUILD_FOLDER)$(PREFIX)/share/icons/hicolor/scalable/apps/$(PROJECT_NAME).svg - -# Should only be used as last resort, the end user should use a compatible package manager if possible instead. -# This is only here for testing purposes, and also as a general "manual" on how to install the project for package maintainers. -install: system - @echo "Installing project to system..." - cp -r $(BUILD_FOLDER)$(PREFIX)/bin/* $(PREFIX)/bin - cp -r $(BUILD_FOLDER)$(PREFIX)/share/$(INSTALL_FOLDER_NAME) $(PREFIX)/share - cp -r $(BUILD_FOLDER)$(PREFIX)/share/applications/* $(PREFIX)/share/applications - cp -r $(BUILD_FOLDER)$(PREFIX)/share/icons/hicolor/256x256/apps/* $(PREFIX)/share/icons/hicolor/256x256/apps - cp -r $(BUILD_FOLDER)$(PREFIX)/share/icons/hicolor/scalable/apps/* $(PREFIX)/share/icons/hicolor/scalable/apps -# Update icon cache - @echo "Updating icon cache..." - gtk-update-icon-cache $(PREFIX)/share/icons/hicolor -uninstall: - @echo "Uninstalling project from system..." - rm -ri $(PREFIX)/bin/sst - rm -rI $(PREFIX)/share/$(INSTALL_FOLDER_NAME) - rm -ri $(PREFIX)/share/applications/$(PROJECT_NAME).desktop - rm -ri $(PREFIX)/share/icons/hicolor/256x256/apps/$(PROJECT_NAME).png - rm -ri $(PREFIX)/share/icons/hicolor/scalable/apps/$(PROJECT_NAME).svg -# Update icon cache - @ echo "Updating icon cache..." - gtk-update-icon-cache $(PREFIX)/share/icons/hicolor - -# -------------- Cleaning -------------- - -clean: - @echo "Cleaning up..." - rm -rf $(BUILD_FOLDER) diff --git a/README.md b/README.md deleted file mode 100644 index c0c140e..0000000 --- a/README.md +++ /dev/null @@ -1,184 +0,0 @@ -> [!WARNING] -> This project may be deprecated in the future, as I have been recently working on a **massive** rewrite, avoiding LGI and focusing more on portability and stability this time around. -___ - -> [!IMPORTANT] -> SimpleSteamTinker is still in ***HEAVY*** development and very unfinished. -> Expect an incomplete interface and lots of missing/unstable features. -> -> If SteamTinkerLaunch is fast enough for you and fits your needs, you should not use this tool right now. -> -> With that being said, I'd still very much appreciate people testing SimpleSteamTinker and reporting [issues](https://github.com/JordanViknar/SimpleSteamTinker/issues) or contributing. - -
- -

SimpleSteamTinker

-

A work-in-progress simple, fast, and modern Adwaita alternative to SteamTinkerLaunch.

- - -
- - - -
- - -
- -## Description - -### Situation - -I like [SteamTinkerLaunch](https://github.com/sonic2kk/steamtinkerlaunch). It is for me one of the biggest tools to have ever been created for Linux gaming. - -However, it presents many flaws in my eyes : it is slow, impractical to use, and not user-friendly. - -I want Linux Gaming to be available to everyone, including any non-technical users. In my opinion, SteamTinkerLaunch's interface is not friendly to newcomers. - -Finally, my curiosity once led me to look inside its source code, only to be met with a single, extremely long (26k+ lines) Bash script. At that point, I decided there should be an alternative to it. - -*And thus came SimpleSteamTinker...* - -### Goal - -*TL;DR : Simple, Fast, Modern & Friendly* - -SimpleSteamTinker aims to be only an alternative solution to SteamTinkerLaunch, not to replace it : the more complex features it provides that aren't used by the average user won't be implemented. - -Using Lua, a fast and simple language, and Adwaita, a modern user-friendly interface system, the goal of this project is to have a clean and easy but *powerful* way of launching Steam games with custom options and tools. - -It takes inspiration from [Bottles](https://github.com/bottlesdevs/Bottles) and Adwaita applications in general. - -Additionally, it is considered SimpleSteamTinker should work *with* Steam rather than hack/replace its features. Anything that can be easily done through Steam will not be reimplemented (Proton version management for example. If you want to use GE-Proton, [ProtonPlus](https://github.com/Vysp3r/ProtonPlus) and [ProtonUp-Qt](https://github.com/DavidoTek/ProtonUp-Qt) are recommended). - -And finally, as a side goal : prove that Lua can *also* be used for developing modern applications, just like for example Python (which I often see in Adwaita apps). - -## Installation - -### Arch Linux-based distributions - -SimpleSteamTinker can be installed from Arch Linux, Manjaro, and variants through the provided [PKGBUILD](./install/archlinux/PKGBUILD). - -**Always** download the latest version of the PKGBUILD, then use **makepkg** in its directory. - -It will eventually be made available on the AUR once the program is complete enough. - -To enable a game in SimpleSteamTinker with this installation method, use this text as launch options in Steam : -```bash -sst %command% -``` - -### Packaging for other distributions - -Here are informations which might be useful to you : - -SimpleSteamTinker is meant to be installed in `/usr/share/SimpleSteamTinker` (except `sst` which goes into `/usr/bin`). -The system desktop file goes in `/usr/share/applications` and the icons go in `/usr/share/icons` like many applications. - -Most of the file structure installation steps can be achieved with the Makefile. -It is recommended to use it if possible in your packaging system. - -It depends on : -- Lua 5.4 -- [LGI](https://github.com/lgi-devs/lgi) (development version **specifically**) + [GTK4](https://www.gtk.org/) + [libadwaita](https://gnome.pages.gitlab.gnome.org/libadwaita/) -- Steam installation, with a user configured and games installed. -- [LuaFileSystem](https://github.com/lunarmodules/luafilesystem) -- [LuaSocket](https://github.com/lunarmodules/luasocket) + [LuaSec](https://github.com/lunarmodules/luasec) -- [dkjson](https://dkolf.de/src/dkjson-lua.fsl/home) -- [xclip](https://github.com/astrand/xclip) *(Might be replaced/made optional in the future.)* -- [libnotify](https://gitlab.gnome.org/GNOME/libnotify) - -And optionally (if they're missing, their related features will simply be disabled) : - -[GameMode](https://github.com/FeralInteractive/gamemode), [MangoHud](https://github.com/flightlessmango/MangoHud), [Mesa](https://www.mesa3d.org/) *(for Zink support)*, [switcheroo-control](https://gitlab.freedesktop.org/hadess/switcheroo-control) and [Gamescope](https://github.com/ValveSoftware/gamescope). - -## Development - -Simply install the project's dependencies described earlier and clone it. - -To test the launch of Steam games, insert in their launch options : -```bash -/PATH/TO/CLONED/REPO/sst %command% -``` -For example, in my case `/PATH/TO/CLONED/REPO/sst` is `/home/jordan/Programmation/SimpleSteamTinker/sst`. - -Additionally, if you want to perform UI-related changes, you'll need [Blueprint](https://gitlab.gnome.org/jwestman/blueprint-compiler). -If, in the future, LGI becomes stable enough with GTK4 to use it directly to generate the UI, Blueprint might be dropped. - -*Note : A desktop file won't be provided with this method, and icons won't be installed.* - -## Comparison - -### Development - -| Development | SteamTinkerLaunch | SimpleSteamTinker | -| --- | --- | --- | -| Language | Bash | Lua | -| Code | A single file with 26k lines | Organised in modules and commented | -| UI | Directly generated by the code | (Mostly) done in separate GTK Blueprint files | -| Interface system | yad + GTK3 | LGI + GTK4 + libadwaita | -| License | GPL-3.0 | MPL-2.0 | - -### Interface - -| Features (interface) | SteamTinkerLaunch | SimpleSteamTinker | -| --- | --- | --- | -| Launch speed (on primary laptop) | ❌ (25 seconds) | ✅ (1 second) | -| Game list | ❌ | ✅ | -| Game status | ❌ | ✅ | -| ProtonDB integration | ✅ | ✅ | -| Launch Button | ✅ | ✅ | -| Steam AppID | ✅ | ✅ | -| Notifications | ✅ | ✅ | -| Pre-game launch window | ✅ | ❌ *(Not implemented to speed up game startup and not get in the user's way. Might change in the future.)* | -| Categories | ✅ | ❌ | -| Custom default game config | ✅ | ❌ | -| Game location | ~ *(impractical)* | ✅ | -| Compatdata location | ❌ | ✅ | -| Help pages *(ProtonDB, PCGamingWiki, etc.)* | ~ *(impractical)* | ✅ | - -### Tools, settings, etc. - -*(Note : Native Linux features/tools/settings are prioritized over alternatives designed for Windows.)* - -| Features (tools, settings, etc.) | SteamTinkerLaunch | SimpleSteamTinker | -| --- | --- | --- | -| Non-Steam game support | ✅ | ❌ *([Bottles](https://github.com/bottlesdevs/Bottles) recommended)* | -| ~~Proton version management~~ | ✅ | ❌ *([ProtonPlus](https://github.com/Vysp3r/ProtonPlus) recommended)* | -| dGPU management | ✅ | ✅ | -| GameMode | ✅ | ✅ | -| Custom launch system | ✅ | 🚧 *(Planned)* | -| Winetricks | ✅ | ❌ *(Planned ?)* | -| Protontricks | ❌ | ❌ *(Planned ?)* | -| Proton settings | ✅ | ✅ | -| DXVK settings | ✅ | 🚧 *(Planned)* | -| VKD3D settings | ✅ | 🚧 *(Planned)* | -| MangoHud | ✅ | ✅ | -| Gamescope | ✅ | ✅ | -| Shader support (ReShade/vkBasalt) | ✅ | 🚧 *(Planned)* | -| SDL Wayland video driver | ✅ | ✅ | -| Zink | ✅ | ✅ | -| PulseAudio latency | ✅ | 🚧 *(Planned)* | -| Vortex | ✅ | ❌ | -| Mod Organizer 2 | ✅ | ❌ | -| HedgeModManager | ✅ | ❌ | -| geo-11 3D Driver | ✅ | ❌ | -| SpecialK | ✅ | ❌ | -| FlawlessWidescreen | ✅ | ❌ | -| Stereo3D | ✅ | ❌ | -| RADV Perftest Options | ✅ | ❌ *(Cannot test properly due to lack of an AMD GPU)* | -| Steam Linux Runtime toggle | ✅ | ❌ | -| steamwebhelper toggle | ✅ | ❌ | -| obs-gamecapture | ✅ | ✅ | -| ~~Nyrna~~ | ✅ | ❌ *(Waiting for Wayland support...)* | -| ~~ReplaySorcery~~ | ✅ | ❌ *(Unmaintaned)* | -| ~~Boxtron~~ | ✅ | ❌ *([ProtonPlus](https://github.com/Vysp3r/ProtonPlus) recommended)* | -| ~~Roberta~~ | ✅ | ❌ *([ProtonPlus](https://github.com/Vysp3r/ProtonPlus) recommended)* | -| ~~Luxtorpeda~~ | ✅ | ❌ *([ProtonPlus](https://github.com/Vysp3r/ProtonPlus) recommended)* | -| Network monitoring and control | ✅ | 🚧 *(Planned)* | -| Discord Rich Presence | ✅ | 🚧 *(Planned)* | - -## Bug Reports / Contributions / Suggestions -You can report bugs or suggest features by making an issue, or you can contribute to this program directly by forking it and then sending a pull request. - -Any help will be very much appreciated. Thank you. diff --git a/general/fs_utils.luau b/general/fs_utils.luau new file mode 100644 index 0000000..3a341b6 --- /dev/null +++ b/general/fs_utils.luau @@ -0,0 +1,105 @@ +--!strict +local fsUtils = {} + +-- Lune Modules +local fs = require("@lune/fs") + +-- Internal Modules +local logSystem = require("log_system") + +--[[ + Name : function fsUtils.exists(path) + Description : Checks if a file or directory exists. + Arg 1 : path (string) : The path to check. + Return : true if the file or directory exists, false otherwise. +]] +function fsUtils.exists(path: string): boolean + return fs.metadata(path).exists +end + +--[[ + Name : function fsUtils.isDirectory(path) + Description : Checks if a path is a directory. + Arg 1 : path (string) : The path to check. + Return : true if the path is a directory, false otherwise. +]] +function fsUtils.isDirectory(path: string): boolean + return fs.isDir(path) +end + +--[[ + Name : function fsUtils.createOrUseDirectory(path) + Description : Creates a directory if it doesn't exist, or uses it if it does. + Arg 1 : path (string) : The path to create or use. + Return : true if the directory was created or used, false otherwise. +]] +function fsUtils.createOrUseDirectory(path: string): string + if not fs.isDir(path) then + logSystem.log("debug", "Directory "..path.." not found. Creating it...") + fs.writeDir(path) + end + return path +end + +--[[ + Name : function fsUtils.getSize(path) + Description : Gets the size of a file or directory. + Arg 1 : path (string) : The path to get the size of. + Return : The size of the file or directory. +]] +function fsUtils.getSize(path: string): () + -- Can't be implemented for now. +end + +--[[ + Name : function fsUtils.sizeToUnit(size) + Description : Converts a size in bytes to a human-readable size. + Arg 1 : size (number) : The size to convert. + Return : The human-readable size. +]] +type SizeUnit = "B" | "KB" | "MB" | "GB" | "TB" +function fsUtils.sizeToUnit(size: number): string + local unit: SizeUnit = "B" + if size > 1024 then + size = size / 1024 + unit = "KB" + end + if size > 1024 then + size = size / 1024 + unit = "MB" + end + if size > 1024 then + size = size / 1024 + unit = "GB" + end + if size > 1024 then + size = size / 1024 + unit = "TB" + end + return string.format("%.2f", size).." "..unit +end + +-- Missing stuff here + +--[[ + Name : function fsUtils.getFilenamePatternInDirectory(directory, pattern) + Description : Returns a table containing every filename matching a pattern in a directory. + Arg 1 : directory (string) : The directory to search in. + Arg 2 : pattern (string) : The pattern to search for. + Return : A table containing every filename matching the pattern. + + Note : Used to for game detection to work around Steam not updating the libraryfolders.vdf file immediately. +]] +function fsUtils.getFilenamePatternInDirectory(directory: string, pattern: string): {string} + local result = {} + + for _, file in fs.readDir(directory) do + if file:match(pattern) then + table.insert(result, file) + end + end + + return result +end + +return fsUtils \ No newline at end of file diff --git a/general/init.luau b/general/init.luau new file mode 100644 index 0000000..d649aa4 --- /dev/null +++ b/general/init.luau @@ -0,0 +1,5 @@ +--!strict +return { + logSystem = require("log_system"), + fsUtils = require("fs_utils"), +} \ No newline at end of file diff --git a/modules/general/logSystem.lua b/general/log_system.luau similarity index 54% rename from modules/general/logSystem.lua rename to general/log_system.luau index 409a586..eec4731 100644 --- a/modules/general/logSystem.lua +++ b/general/log_system.luau @@ -1,3 +1,4 @@ +--!strict local logSystem = {} --[[ @@ -7,20 +8,20 @@ local logSystem = {} Arg 2 : message (string) : The message to color. Return : The colored message. ]] -local function color(colorId, message) +type LogColor = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "grey" | "orange" | "reset" +local function color(colorId: LogColor, message: string): string local colorList = { - ["red"] = "\27[31m", - ["green"] = "\27[32m", - ["yellow"] = "\27[33m", - ["blue"] = "\27[34m", - ["magenta"] = "\27[35m", - ["cyan"] = "\27[36m", - ["white"] = "\27[37m", - ["grey"] = "\27[90m", - ["orange"] = "\27[91m", - ["reset"] = "\27[0m" + red = "\27[31m", + green = "\27[32m", + yellow = "\27[33m", + blue = "\27[34m", + magenta = "\27[35m", + cyan = "\27[36m", + white = "\27[37m", + grey = "\27[90m", + orange = "\27[91m", + reset = "\27[0m" } - return colorList[colorId]..message..colorList["reset"] end @@ -31,43 +32,32 @@ end Arg 2 : message (string) : The message to log. Return : nil ]] -function logSystem.log(type, message) +type LogType = "info" | "warning" | "error" | "debug" | "download" | "data" | "speed" +function logSystem.log(type: LogType, message: string | number) local logReactions = { - ["info"] = function(text) + info = function(text) print("["..color("blue","Info").."] "..text) end, - ["warning"] = function(text) + warning = function(text) print("["..color("yellow","Warning").."] "..color("yellow",text)) end, - ["error"] = function(text) + error = function(text) print(color("red","[Error]").." "..color("red",text)) end, - ["debug"] = function(text) + debug = function(text) print("["..color("grey","Debug").."] "..color("grey",text)) end, - ["switch"] = function (text) - print(color("green","[Output Switch] "..text)) - print("--------------------------") - end, - ["switchEnd"] = function (text) - print("--------------------------") - end, - ["download"] = function (text) + download = function (text) print("["..color("green","Download").."] "..text) end, - ["fileRead"] = function (text) + data = function (text) print("["..color("magenta","Data").."] "..text) end, - ["speed"] = function (startTime) + speed = function (startTime) print("["..color("grey","Speed").."] ".."Done in "..os.clock()-startTime.." seconds.") end } - - if (logReactions[type]) then - logReactions[type](message) - else - error("Unknown log type : "..type) - end + logReactions[type](message) end return logSystem diff --git a/install/archlinux/PKGBUILD b/install/archlinux/PKGBUILD deleted file mode 100644 index 658d7fb..0000000 --- a/install/archlinux/PKGBUILD +++ /dev/null @@ -1,48 +0,0 @@ -# Maintainer: JordanViknar - -pkgname=simplesteamtinker-git -pkgver=r44.84be422 -pkgrel=1 -pkgdesc="A work-in-progress simple, fast and modern Adwaita alternative to SteamTinkerLaunch." -arch=('x86_64' 'i686' 'armv7h' 'aarch64') -url=https://github.com/JordanViknar/SimpleSteamTinker -license=('MPL2') -makedepends=( - 'git' - 'make' -) -depends=( - 'lua' - 'lua-lgi-git' # Used for GTK (git version because latest release neither supports Libadwaita nor GTK4 and is pretty old) - 'libadwaita' - 'gtk4' - 'lua-filesystem' # Used for some filesystem operations - 'lua-socket' # Used for network operations - 'lua-sec' # Used for secure https interactions - 'lua-dkjson' # Used for json parsing - 'xclip' # Used for copying to clipboard - 'libnotify' # Used for notifications -) -optdepends=( - 'gamemode: Enable GameMode support' - 'mangohud: Enable MangoHud support' - 'mesa: Enable Zink support' - 'switcheroo-control: Launch games with your dedicated GPU' - 'gamescope: Enable GameScope support' - 'protonplus: Recommended to install with SimpleSteamTinker' -) -provides=("${pkgname%-git}") -conflicts=("${pkgname%-git}") -source=('git+https://github.com/JordanViknar/SimpleSteamTinker') -sha256sums=('SKIP') - -pkgver() { - cd SimpleSteamTinker - printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" -} - -package() { - cd SimpleSteamTinker - make system - cp -r dist/* "${pkgdir}/" -} diff --git a/main.lua b/main.lua deleted file mode 100644 index b9fe82f..0000000 --- a/main.lua +++ /dev/null @@ -1,131 +0,0 @@ --- Startup time -local totalStartupTimeVar = os.clock() - --- Internal Modules -local logSystem = require("modules.general.logSystem") -local fsUtils = require("modules.general.fsUtils") -local systemUtils = require("modules.general.systemUtils") -local steamUtils = require("modules.steam.steamUtils") -local programMetadata = require("modules.extra.programMetadata") -local gameLauncher = require("modules.gameLauncher") - -if programMetadata.version:find("dev") then - logSystem.log("warning", "DEVELOPMENT VERSION") -end - ---[[ - Chapter 0 : Preparing the environment - We need to create the config folder if it doesn't exist. -]] --- Create the config folder if it doesn't exist -fsUtils.createOrUseDirectory(programMetadata.folders.config) --- And the games folder inside of it -fsUtils.createOrUseDirectory(programMetadata.folders.gamesConfig) - --- Create the cache folder if it doesn't exist -fsUtils.createOrUseDirectory(programMetadata.folders.cache) - --- Put the arguments inside the cache folder for testing purposes -local cacheFile = io.open(programMetadata.folders.cache.."/lastArguments.txt", "w") -if not cacheFile then - logSystem.log("error", "Unable to open cache file.") -else - cacheFile:write(table.concat(arg, "\n")) - cacheFile:close() -end - ---[[ - Chapter 1 : Game management - What's the Steam config ? Is this being started through Steam or alone ? What to do ?! -]] - --- We retrieve games registered in Steam. -local steamGames = require("modules.steam.steamConfigProvider") -collectgarbage("collect") - --- We check if we're starting a Steam game or not through the arguments. -local gameStartStatus = steamUtils.isSteamArgs(arg) - -if gameStartStatus == "steamGame" then - local game = steamGames[arg[3]:gsub("AppId=", "")] - - -- We notify the user that SimpleSteamTinker is running. - logSystem.log("info", "Starting "..game.name.."...") - systemUtils.sendNotification(programMetadata.name.." is starting...", "Detected "..game.name, "information") - - -- For every argument that is a path, we put \ next to the spaces - for i, v in ipairs(arg) do - if fsUtils.exists(v) then - arg[i] = v:gsub(" ", "\\ ") - end - end - - -- We prepare the command - local command = table.concat(arg, " ") - - logSystem.log("info", "Applying settings for "..game.name.."...") - command = gameLauncher.prepareGameLaunch(game, command) - - if os.execute(command) then - os.exit(0) - else - systemUtils.sendNotification(programMetadata.name.." crashed !", "Something bad happened while running "..game.name..".", "error") - os.exit(1) - end -elseif gameStartStatus == "SteamTinkerLaunch" or (arg[3] and steamGames[arg[3]:gsub("AppId=", "")].status == "SteamTinkerLaunch") then - -- We notify the user that SteamTinkerLaunch is running. - logSystem.log("error", "Can't use "..programMetadata.name.." ! SteamTinkerLaunch detected.") - systemUtils.sendNotification("Can't use "..programMetadata.name.." !", "SteamTinkerLaunch detected.", "warning") - - -- For every argument that is a path, we put \ next to the spaces - for i, v in ipairs(arg) do - if fsUtils.exists(v) then - arg[i] = v:gsub(" ", "\\ ") - end - end - - -- We prepare the command - local command = table.concat(arg, " ") - - os.execute(command) - os.exit(0) -end -logSystem.log("info", "No game to be launched detected. Launching interface...") - - - ---[[ - Chapter 2 : The main window - No games started. Time to cook some Libadwaita goodness then. -]] - --- External Modules -local lgi = require("lgi") -local Adw = lgi.Adw - --- Application -local app = Adw.Application({ - application_id = programMetadata.developer.."."..programMetadata.name, -}) - --- Sort Steam games alphabetically -local newSteamGamesTable = {} -for _, v in pairs(steamGames) do - table.insert(newSteamGamesTable, v) -end -table.sort(newSteamGamesTable, function(a, b) return a.name < b.name end) -steamGames = newSteamGamesTable - --- Time to start the application -local timeStart = os.clock() -function app:on_startup() - require("modules.ui.mainWindow")(app, steamGames) -end - -function app:on_activate() - logSystem.log("speed", timeStart) - logSystem.log("info", "Startup time : "..os.clock()-totalStartupTimeVar.." seconds.") - self.active_window:present() -end - -return app:run(arg) diff --git a/main.luau b/main.luau new file mode 100644 index 0000000..cd423bb --- /dev/null +++ b/main.luau @@ -0,0 +1,38 @@ +--!strict +-- Startup time +local totalStartupTimeVar = os.clock() + +-- Lune Modules +local process = require("@lune/process") +local fs = require("@lune/fs") + +-- Internal Modules +local metadata = require("metadata") +local logSystem = require("general").logSystem +local fsUtils = require("general").fsUtils + +--[[ + Chapter 0 : Preparing the environment + We need to create the config folder if it doesn't exist. +]] +-- Create folders +fsUtils.createOrUseDirectory(metadata.folders.config) +fsUtils.createOrUseDirectory(metadata.folders.gamesConfig) +fsUtils.createOrUseDirectory(metadata.folders.cache) + +-- Grab arguments +local arguments = process.args + +-- Development version +if metadata.version:find("dev") then + logSystem.log("warning", "DEVELOPMENT VERSION") + -- Put the arguments inside the cache folder for testing purposes + fs.writeFile(metadata.folders.cache.."/arguments.txt", table.concat(arguments, "\n")) +end + +--[[ + Chapter 1 : Game management + What's the Steam config ? Is this being started through Steam or alone ? What to do ?! +]] + +local steamConfig = require("steam").steamConfig diff --git a/metadata/init.luau b/metadata/init.luau new file mode 100644 index 0000000..1843401 --- /dev/null +++ b/metadata/init.luau @@ -0,0 +1,20 @@ +--!strict +local process = require("@lune/process") + +local metadata = { + name ="SimpleSteamTinker", + description = "A work-in-progress fast, simple and modern Libadwaita alternative to SteamTinkerLaunch.", + executable="sst", + icon_name = "simplesteamtinker", + version="indev", + developer="JordanViknar", + url = "https://github.com/JordanViknar/SimpleSteamTinker", + folders = { + config = process.env.HOME.."/.config/SimpleSteamTinker", + gamesConfig = process.env.HOME.."/.config/SimpleSteamTinker/games", + storage = process.env.HOME.."/.local/share/SimpleSteamTinker", + cache = process.env.HOME.."/.cache/SimpleSteamTinker" + } +} + +return metadata diff --git a/modules/config/configManager.lua b/modules/config/configManager.lua deleted file mode 100644 index 31e02da..0000000 --- a/modules/config/configManager.lua +++ /dev/null @@ -1,125 +0,0 @@ --- Internal Modules -local gameConfigFolder = require("modules.extra.programMetadata").folders.gamesConfig -local fsUtils = require("modules.general.fsUtils") -local logSystem = require("modules.general.logSystem") - --- External Modules -local json = require("dkjson") - -local configManager = {} - ---[[ - Name : function configManager.createGameConfig(gameId) - Description : Creates a config file for a game. - Arg 1 : gameId (string) : The game's Steam ID. - Return : The game's config. -]] -function configManager.createGameConfig(gameId) - -- Grab the default template - local gameConfig = require("modules.config.defaultConfigTemplate") - gameConfig.steamGameId = gameId - - -- Write the new table to the file - local path = string.format("%s/%s.json", gameConfigFolder, gameId) - local file = assert(io.open(path, "w"), "Couldn't open " .. path .. " !") - file:write(json.encode(gameConfig, { indent = false })) - file:close() - - return gameConfig -end - ---[[ - Name : configManager.getGameConfig(gameId) - Description : Retrieves a game's config. - Arg 1 : gameId (string) : The game's Steam ID. -]] -function configManager.getGameConfig(gameId) - -- Check if the config exists - local path = string.format("%s/%s.json", gameConfigFolder, gameId) - if not fsUtils.exists(path) then - local warningMsg = "Config for game " .. gameId .. " at " .. path .. " doesn't exist. Creating it..." - logSystem.log("warning", warningMsg) - return configManager.createGameConfig(gameId) - end - - -- Read the file - local file = assert(io.open(path, "r"), "Couldn't open " .. path .. " !") - local fileContent = file:read("*a") - file:close() - - -- Parse the JSON - local parsed = json.decode(fileContent) - - -- Update the config to be based on defaultConfigTemplate recursively - local defaultConfig = require("modules.config.defaultConfigTemplate") - local function updateConfig(config, template) - for key, value in pairs(template) do - if config[key] == nil then - config[key] = value - elseif type(value) == "table" then - updateConfig(config[key], value) - end - end - end - updateConfig(parsed, defaultConfig) - - return parsed -end - ---[[ - Name : function configManager.modifyGameConfig(gameId, dataToChange) - Description : Modifies a game's config. - Arg 1 : gameId (string) : The game's Steam ID. - Arg 2 : dataToChange (string) : The data to change. Example : "steamGameId" - Arg 3 : value (any) : The value to set. - Return : The game's config. -]] -function configManager.modifyGameConfig(gameId, dataToChange, value) - -- Grab the original config data - local gameConfig = configManager.getGameConfig(gameId) - - -- Parse dataToChange - local keys = {} - for substring in dataToChange:gmatch("[^.]+") do - keys[#keys + 1] = substring - end - - -- Modify the table - local pointer = gameConfig - for i = 1, #keys - 1 do - pointer = pointer[keys[i]] or {} - end - pointer[keys[#keys]] = value - - -- Write the new table - local path = string.format("%s/%s.json", gameConfigFolder, gameId) - local file = assert(io.open(path, "w"), "Couldn't open " .. path .. " !") - - file:write(json.encode(gameConfig)) - file:close() - - return gameConfig -end - ---[[ - Name : function configManager.grabInTableFromString(table, string) - Description : Grabs a value in a table from a string. - Arg 1 : table (table) : The table to grab the value from. - Arg 2 : string (string) : The string to parse. Example : "gamescope.general.resolution.internal.width" - Return : The value. -]] -function configManager.grabInTableFromString(table, string) - local keys = {} - for substring in string:gmatch("[^.]+") do - keys[#keys + 1] = substring - end - - local pointer = table - for i = 1, #keys do - pointer = pointer[keys[i]] or {} - end - - return pointer -end - -return configManager diff --git a/modules/config/defaultConfigTemplate.lua b/modules/config/defaultConfigTemplate.lua deleted file mode 100644 index b605f27..0000000 --- a/modules/config/defaultConfigTemplate.lua +++ /dev/null @@ -1,90 +0,0 @@ -return - -{ - config_version = 1; - steamGameId = nil; - - dgpu = { - enabled = true; - }; - - -- Miscellaneous - misc = { - sdl_wayland = true; - }; - - -- Utilities - utilities = { - gamemode = { - enabled = true; - }, - mangohud = { - enabled = false; - }, - zink = { - enabled = false; - }, - obs_gamecapture = { - enabled = false; - }, - }, - - -- GameScope - gamescope = { - enabled = false; - general = { - resolution = { - enabled = false; - internal = { - width = 1280; - height = 720; - }; - external = { - width = 1920; - height = 1080; - }; - }; - frame_limit = { - enabled = false; - normal = 60; - unfocused = 5; - }; - fullscreen = false; - borderless = false; - }; - filtering = { - enabled = false; - filter = "FSR"; -- "Linear", "Nearest", "FSR", "NIS", "Pixel" - sharpness = 10; -- Ranges from 0 to 20 - } - }, - - -- Settings exclusive to Windows games - proton = { - direct3d = { - enable_direct3d9 = true; -- Exclusive to Proton GE - enable_direct3d10 = true; - enable_direct3d11 = true; - enable_direct3d12 = true; -- Exclusive to Proton GE - use_wined3d = false; - }; - sync = { - enable_esync = true; - enable_fsync = true; - }; - nvidia = { - enable_nvapi = false; - hide_nvidia_gpu = false; - }; - fsr = { -- Exclusive to Proton GE - enabled = false; - sharpness = 2; -- Between 0 and 5, 0 = maximum, 5 = minimum - upscaling_mode = "none"; -- Can be "none", "performance", "balanced", "quality" or "ultra" - resolution = { - enabled = false; - width = 1920; - height = 1080; - }; - }; - }; -} diff --git a/modules/extra/programMetadata.lua b/modules/extra/programMetadata.lua deleted file mode 100644 index 4df3476..0000000 --- a/modules/extra/programMetadata.lua +++ /dev/null @@ -1,17 +0,0 @@ -return { - name="SimpleSteamTinker", - description = "A work-in-progress fast, simple and modern Libadwaita alternative to SteamTinkerLaunch.", - executable="sst", - icon_name = "simplesteamtinker", - version="indev", - developer="JordanViknar", - url = "https://github.com/JordanViknar/SimpleSteamTinker", - installdir = os.getenv("SST_SCRIPT_PATH"), - folders = { - config = os.getenv("HOME").."/.config/SimpleSteamTinker", - gamesConfig = os.getenv("HOME").."/.config/SimpleSteamTinker/games", - - storage = os.getenv("HOME").."/.local/share/SimpleSteamTinker", - cache = os.getenv("HOME").."/.cache/SimpleSteamTinker" - } -} diff --git a/modules/gameLauncher.lua b/modules/gameLauncher.lua deleted file mode 100644 index 83f9fab..0000000 --- a/modules/gameLauncher.lua +++ /dev/null @@ -1,103 +0,0 @@ --- Internal Modules -local logSystem = require("modules.general.logSystem") -local systemUtils = require("modules.general.systemUtils") -local configManager = require("modules.config.configManager") -local programMetadata = require("modules.extra.programMetadata") - -local gameLauncher = {} - -function gameLauncher.prepareGameLaunch(game, command) - -- First we retrive the configuration - local gameConfig - local status, result = pcall(function(value) - gameConfig = configManager.getGameConfig(value) - end, game.id) - - if not status then - logSystem.log("error", "Couldn't retrieve configuration for "..game.name..". Error : "..result) - systemUtils.sendNotification("Couldn't retrieve configuration for "..game.name.." !", result, "error") - return command - end - - -- We get the list of utilities - local utilities = require("modules.utilitiesList")(gameConfig) - - -- Environment variables : Part 1 - local environmentVars = {} - - -- We iterate through the utilities and enable them if they are installed - for _, utility in pairs(utilities) do - if utility[2] --[[= Utility is enabled]] and utility[1].isInstalled then - if utility[1].toolType == "executable" then - command = utility[1].usage(command, gameConfig) - elseif utility[1].toolType == "environmentVariable" then - table.insert(environmentVars, utility[1].usage(command, gameConfig)) - end - end - end - - -- Special case for switcherooctl, some Steam launch desktop files force the dGPU on games even when disabled. - if gameConfig.dgpu.enabled == false and utilities[3][1].isInstalled then -- Should use names instead of indexes later - -- We add the environment variables to forcefully disable the dGPU - table.insert(environmentVars, "DRI_PRIME=0 __NV_PRIME_RENDER_OFFLOAD=0 __VK_LAYER_NV_optimus=none __GLX_VENDOR_LIBRARY_NAME=none") - end - - -- Environment variables not linked to a particular utility - if game.os_platform == "Linux" then - if gameConfig.misc.sdl_wayland == true then - table.insert(environmentVars, "SDL_VIDEODRIVER=\"wayland,x11\"") - else -- We force X11 to be used, just in case. - table.insert(environmentVars, "SDL_VIDEODRIVER=\"x11\"") - end - elseif game.os_platform == "Windows" then - -- Direct3D - if gameConfig.proton.direct3d.enable_direct3d9 == false then table.insert(environmentVars, "PROTON_NO_D3D9=1") end - if gameConfig.proton.direct3d.enable_direct3d10 == false then table.insert(environmentVars, "PROTON_NO_D3D10=1") end - if gameConfig.proton.direct3d.enable_direct3d11 == false then table.insert(environmentVars, "PROTON_NO_D3D11=1") end - if gameConfig.proton.direct3d.enable_direct3d12 == false then table.insert(environmentVars, "PROTON_NO_D3D12=1") end - if gameConfig.proton.direct3d.use_wined3d == true then table.insert(environmentVars, "PROTON_USE_WINED3D=1") end - -- Sync - if gameConfig.proton.sync.enable_esync == false then table.insert(environmentVars, "PROTON_NO_ESYNC=1") end - if gameConfig.proton.sync.enable_fsync == false then table.insert(environmentVars, "PROTON_NO_FSYNC=1") end - -- NVIDIA - if gameConfig.proton.nvidia.enable_nvapi == true then table.insert(environmentVars, "PROTON_ENABLE_NVAPI=1") end - if gameConfig.proton.nvidia.hide_nvidia_gpu == true then table.insert(environmentVars, "PROTON_HIDE_NVIDIA_GPU=1") end - -- FSR - if gameConfig.proton.fsr.enabled == true then - table.insert(environmentVars, string.format( - "WINE_FULLSCREEN_FSR=1 WINE_FULLSCREEN_FSR_STRENGTH=%s WINE_FULLSCREEN_FSR_MODE=%s", - gameConfig.proton.fsr.sharpness, - string.lower(gameConfig.proton.fsr.upscaling_mode) - )) - if gameConfig.proton.fsr.resolution.enabled == true then - table.insert(environmentVars, string.format( - "WINE_FULLSCREEN_FSR_CUSTOM_MODE=%sx%s", - gameConfig.proton.fsr.resolution.width, - gameConfig.proton.fsr.resolution.height - )) - end - else - -- Explictly disable FSR if it's not enabled, recent Proton GE versions enable it by default. - table.insert(environmentVars, "WINE_FULLSCREEN_FSR=0") - end - end - - -- We convert the environment variables table to a string - if environmentVars ~= {} then - local envVarString = table.concat(environmentVars, " ") - command = "env "..envVarString.." "..command - end - - -- Print the final command in cache for debugging purposes - local cacheFile = io.open(programMetadata.folders.cache.."/lastCommand.txt", "w") - if not cacheFile then - logSystem.log("error", "Unable to open cache file.") - else - cacheFile:write(command) - cacheFile:close() - end - - return command -end - -return gameLauncher diff --git a/modules/general/fsUtils.lua b/modules/general/fsUtils.lua deleted file mode 100644 index bbff7f5..0000000 --- a/modules/general/fsUtils.lua +++ /dev/null @@ -1,188 +0,0 @@ --- External Modules -local lfs = require("lfs") - --- Internal Modules -local logSystem = require("modules.general.logSystem") - --- Module -local fsUtils = {} - ---[[ - Name : function fsUtils.exists(path) - Description : Checks if a file or directory exists. - Arg 1 : path (string) : The path to check. - Return : true if the file or directory exists, false otherwise. -]] -function fsUtils.exists(path) - local attributes, err = lfs.attributes(path) - if attributes then - return true - else - return false, err - end -end - ---[[ - Name : function fsUtils.isDirectory(path) - Description : Checks if a path is a directory. - Arg 1 : path (string) : The path to check. - Return : true if the path is a directory, false otherwise. -]] -function fsUtils.isDirectory(path) - local attributes, err = lfs.attributes(path) - if attributes then - if attributes.mode == "directory" then - return true - else - return false - end - else - return false, err - end -end - ---[[ - Name : function fsUtils.createDirectory(path) - Description : Creates a directory. - Arg 1 : path (string) : The path to create. - Return : true if the directory was created, false otherwise. -]] -function fsUtils.createDirectory(path) - local success, err = lfs.mkdir(path) - if success then - return true - else - return false, err - end -end - ---[[ - Name : function fsUtils.createOrUseDirectory(path) - Description : Creates a directory if it doesn't exist, or uses it if it does. - Arg 1 : path (string) : The path to create or use. - Return : true if the directory was created or used, false otherwise. -]] -function fsUtils.createOrUseDirectory(path) - if not fsUtils.exists(path) then - logSystem.log("debug", "Directory "..path.." not found. Creating it...") - return fsUtils.createDirectory(path) - else - return true - end -end - ---[[ - Name : function fsUtils.getSize(path) - Description : Gets the size of a file or directory. - Arg 1 : path (string) : The path to get the size of. - Return : The size of the file or directory. -]] -local function trim(s) - return s:match'^()%s*$' and '' or s:match'^%s*(.*%S)' -end -function fsUtils.getSize(path) - local handle = io.popen("du -sb '"..path:gsub("'", "'\\''").."' | cut -f1") - if not handle then - return 0 - end - - local result = handle:read("*a") - handle:close() - - return tonumber(trim(result)) -end - ---[[ - Name : function fsUtils.sizeToUnit(size) - Description : Converts a size in bytes to a human-readable size. - Arg 1 : size (number) : The size to convert. - Return : The human-readable size. -]] -function fsUtils.sizeToUnit(size) - local unit = "B" - if size > 1024 then - size = size / 1024 - unit = "KB" - end - if size > 1024 then - size = size / 1024 - unit = "MB" - end - if size > 1024 then - size = size / 1024 - unit = "GB" - end - if size > 1024 then - size = size / 1024 - unit = "TB" - end - return string.format("%.2f", size).." "..unit -end - ---[[ - Name : function fsUtils.directoryContainsLinuxData(location) - Description : Checks if a directory contains Linux data. - Arg 1 : location (string) : The directory to check. - Return : true if the directory contains Linux data, false otherwise. - - Note : Used to for game platform detection to work around Steam not cleaning up the compat.vdf file when going back from the Windows version of a game to the Linux version. - Note 2 : The reason we don't use os.execute("file ...") is because Steam can get stuck while starting a game for whatever reason. -]] --- Alternative to using file command -local function checkFileForKeywords(location, file) - local filepath = location .. "/" .. file - - local fileHandle = io.open(filepath, "r") - if not fileHandle then - return false - end - - local foundKeywords = false - - for line in fileHandle:lines() do - if line:find("Linux") or line:find("shell") then - foundKeywords = true - break - end - end - - fileHandle:close() - - return foundKeywords -end - -function fsUtils.directoryContainsLinuxData(location) - for file in lfs.dir(location) do - if (string.find(file,".sh") or not string.find(file,".")) and not fsUtils.isDirectory(location.."/"..file) then - local containsKeywords = checkFileForKeywords(location, file) - if containsKeywords then - return true - end - end - end - - return false -end - ---[[ - Name : function fsUtils.getFilenamePatternInDirectory(directory, pattern) - Description : Returns a table containing every filename matching a pattern in a directory. - Arg 1 : directory (string) : The directory to search in. - Arg 2 : pattern (string) : The pattern to search for. - Return : A table containing every filename matching the pattern. - - Note : Used to for game detection to work around Steam not updating the libraryfolders.vdf file immediately. -]] -function fsUtils.getFilenamePatternInDirectory(directory, pattern) - local result = {} - - for file in lfs.dir(directory) do - if file:match(pattern) then - table.insert(result, file) - end - end - - return result -end - -return fsUtils diff --git a/modules/general/systemUtils.lua b/modules/general/systemUtils.lua deleted file mode 100644 index c75b843..0000000 --- a/modules/general/systemUtils.lua +++ /dev/null @@ -1,72 +0,0 @@ --- Custom modules -local logSystem = require("modules.general.logSystem") -local fsUtils = require("modules.general.fsUtils") -local programMetadata = require("modules.extra.programMetadata") - --- External modules -local lgi = require("lgi") -local Notify = lgi.Notify -Notify.init(programMetadata.name) - --- Module -local systemUtils = {} - ---[[ - Name : function systemUtils.sendNotification(title, message, urgency, transient, time) - Description : Sends a notification using notify-send. - Arg 1 : title (string) : The notification's title. - Arg 2 : message (string) : The notification's message. - Arg 3 : type (string) : The notification's type. Used only for icons right now. Can be "warning", "error" or "information". - Return : nil -]] -function systemUtils.sendNotification(title, message, type) - -- Set icons - local icon - if type == "warning" then - icon = "dialog-warning-symbolic" - elseif type == "error" then - icon = "dialog-error-symbolic" - else - icon = "dialog-information" - end - - local notification = Notify.Notification.new(title, message, icon) - notification:show() -end - ---[[ - Name : function systemUtils.copyToClipboard(text) - Description : Copies a text to the clipboard using xclip. - Arg 1 : text (string) : The text to copy. - Return : true if successful, false otherwise. -]] -function systemUtils.copyToClipboard(text) - local command = string.format("echo -n %q | xclip -selection clipboard", text) - - if not os.execute(command) then - logSystem.log("error", "Unable to copy to clipboard using command : "..command) - return false - else - return true - end -end - ---[[ - Name : function systemUtils.isInstalled(command) - Description : Checks if an command is installed. - Arg 1 : command (string) : The command to check. - Return : true if installed, false otherwise. -]] -function systemUtils.isInstalled(command) - if command:sub(1, 1) == "/" then - return fsUtils.exists(command) - else - if os.execute("which "..command.." &> /dev/null") then - return true - else - return false - end - end -end - -return systemUtils diff --git a/modules/objects/steamGameObject.lua b/modules/objects/steamGameObject.lua deleted file mode 100644 index 77e2b07..0000000 --- a/modules/objects/steamGameObject.lua +++ /dev/null @@ -1,62 +0,0 @@ --- Internal Modules -local fsUtils = require("modules.general.fsUtils") - --- Constants -local steamImagesLocation = os.getenv("HOME").."/.local/share/Steam/appcache/librarycache/" - --- Extra function -local function ifExists(path) - if fsUtils.exists(path) then - return path - else - return nil - end -end - --- Object -SteamGame = { - metatable = { - __index = SteamGame - } -} -function SteamGame:new (id, name, library, location) - -- Current way of detecting if an app is a game or a tool... not the greatest. - local type = "game" - local libraryIconPath = steamImagesLocation..id.."_library_600x900.jpg" - if not fsUtils.exists(libraryIconPath) then - libraryIconPath = nil - type = "software" - end - if name:find("Proton") then - type = "proton" - end - - -- The actual OS detection is in steamConfigProvider.lua instead. This is here because Linux games can have compatdata left over from previously using Proton. - local protonConfig = {} - if fsUtils.exists(library.."/steamapps/compatdata/"..id) then - protonConfig.compatdata = library.."/steamapps/compatdata/"..id - end - - return setmetatable({ - id = id, - name = name, - library = library, - location = location, - size = nil, -- Slow, done in UI - protondb_data = nil, -- VERY slow, done in UI - type = type, - os_platform = "Linux", -- Assume Linux first, normally gets reconfigured as Windows later - proton_config = protonConfig, - tool_status = false, -- Assume the game is not setup to use the tool, normally gets reconfigured true later - images = { - header = ifExists(steamImagesLocation..id.."_header.jpg"), - icon = ifExists(steamImagesLocation..id.."_icon.jpg"), - logo = ifExists(steamImagesLocation..id.."_logo.png"), - library = libraryIconPath, - library_hero = ifExists(steamImagesLocation..id.."_library_hero.jpg"), - library_hero_blur = ifExists(steamImagesLocation..id.."_library_hero_blur.jpg"), - } - }, SteamGame.metatable) -end - -return SteamGame diff --git a/modules/objects/toolObject.lua b/modules/objects/toolObject.lua deleted file mode 100644 index 0f81668..0000000 --- a/modules/objects/toolObject.lua +++ /dev/null @@ -1,24 +0,0 @@ --- Internal Modules -local systemUtils = require("modules.general.systemUtils") -local logSystem = require("modules.general.logSystem") - -Tool = { - metatable = { - __index = Tool - } -} - -function Tool:new (toolName, toolType, modification) - assert(toolName) - assert(toolType == "executable" or toolType == "environmentVariable", "Invalid tool type for tool "..toolName..".") - assert(type(modification) == "function", "Invalid modification for tool "..toolName..".") - - return setmetatable({ - toolName = toolName, - toolType = toolType, -- "executable" or "environmentVariable" - isInstalled = systemUtils.isInstalled(toolName), - usage = modification - }, Tool.metatable) -end - -return Tool diff --git a/modules/steam/protonDBManager.lua b/modules/steam/protonDBManager.lua deleted file mode 100644 index 1a5c448..0000000 --- a/modules/steam/protonDBManager.lua +++ /dev/null @@ -1,41 +0,0 @@ --- External Modules -local http = require("socket.http") -local ltn12 = require("ltn12") -local json = require("dkjson") - --- Internal Modules -local logSystem = require("modules.general.logSystem") - -local protonDBManager = {} - ---[[ - Name : protonDBManager.getAppInfo(appId) - Description : Retrieves the ProtonDB data for a given app ID. - Arg 1 : appId (string) : The app ID to retrieve the data for. - Return : The ProtonDB data for the given app ID. -]] -function protonDBManager.getAppInfo(appId) - local url = "https://www.protondb.com/api/v1/reports/summaries/"..appId..".json" - local response = {} - - local success, status, headers = http.request { - url = url, - method = "GET", - sink = ltn12.sink.table(response) - } - - if success then - local data = json.decode(table.concat(response)) -- Parse the JSON response - if data then - return data - else - logSystem.log("error", "Failed to parse JSON response from ProtonDB for app "..appId..".") - return "Not found" - end - else - logSystem.log("error", "Failed to retrieve ProtonDB data for app "..appId..", with error : "..status..".") - return "Unavailable" - end -end - -return protonDBManager diff --git a/modules/steam/steamConfigProvider.lua b/modules/steam/steamConfigProvider.lua deleted file mode 100644 index a922b79..0000000 --- a/modules/steam/steamConfigProvider.lua +++ /dev/null @@ -1,144 +0,0 @@ --- Internal Modules -local logSystem = require("modules.general.logSystem") -local vdfParser = require("modules.steam.vdfParser") -local steamUtils = require("modules.steam.steamUtils") -local programMetadata = require("modules.extra.programMetadata") -local fsUtils = require("modules.general.fsUtils") - --- Timer -local timeStart - ---[[ - Chapter 1 : We recover the Steam user config so we can get the last active user. - And also the SteamID3 to access their settings folder. -]] -logSystem.log("fileRead", "Detecting user config...") -timeStart = os.clock() -local userData = vdfParser.parseFile(os.getenv("HOME").."/.local/share/Steam/config/loginusers.vdf") - --- We add the SteamID3 to the user datas, and also grab the most recent user's ID while we're at it. -local activeUserID -for id,data in pairs(userData["users"]) do - -- SteamID3 - data["steamID3"] = steamUtils.convertToSteamID3(id) - - -- Most recent - if data["MostRecent"] == "1" then - activeUserID = id - end -end -logSystem.log("speed", timeStart) -logSystem.log("info", "Active user : "..userData["users"][activeUserID]["AccountName"]) - ---[[ - Chapter 2 : We recover the user config to get which games have the tool enabled. - This section would normally have quite an impact on performance. - Thanks to some optimizations, however, the time is cut from 0.5 seconds to 0.04 seconds on my computer. -]] -logSystem.log("fileRead", "Detecting active user game configs...") -timeStart = os.clock() - -local userAppSettings = vdfParser.parseFile( - os.getenv("HOME").."/.local/share/Steam/userdata/"..userData["users"][activeUserID]["steamID3"].."/config/localconfig.vdf", - {"UserLocalConfigStore","Software","Valve","Steam","apps"}, - {"CachedCommunityPreferences", - "UIStoreLocalState", - "CachedStorePreferences", - "CachedNotificationPreferences", - "SteamVoiceSettings_", - "UIStoreLocalSteamUIState", - "UIStoreLocalGamepadState", - "GetEquippedProfileItemsForUser", - "CTextFilterStore_strBannedPattern", - "CTextFilterStore_strCleanPattern", - "trendingstore_storage", - "playnextstore_storage", - "GetEquippedProfileItemsForUser"} -- Optimization : we remove big lines that we don't need. -)["UserLocalConfigStore"]["Software"]["Valve"]["Steam"]["apps"] -logSystem.log("speed", timeStart) - ---[[ - Chapter 3 : We recover the Steam library config to get the list of games. - We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. -]] -logSystem.log("fileRead", "Detecting games...") -timeStart = os.clock() - -local libraryFolders = vdfParser.parseFile(os.getenv("HOME").."/.local/share/Steam/config/libraryfolders.vdf") - --- Steam Game Object -local SteamGame = require("modules.objects.steamGameObject") --- And list -local steamGames = {} - --- For each library -for _,folderData in pairs(libraryFolders["libraryfolders"]) do - -- We check if the folder exists - if not fsUtils.exists(folderData["path"].."/steamapps") then - logSystem.log("warning", "Steam library "..folderData["path"].." doesn't exist. Skipping...") - goto continue - end - - -- We get the list of every appmanifest_*.acf file in the folder - local appManifestsFileNames = fsUtils.getFilenamePatternInDirectory(folderData["path"].."/steamapps", "appmanifest_") - for _,appId in pairs(appManifestsFileNames) do - -- We convert the filename to the app ID - appId = appId:gsub("appmanifest_", ""):gsub(".acf", "") - - local appManifest = vdfParser.parseFile(folderData.path.."/steamapps/appmanifest_"..appId..".acf") - -- We create a SteamGame object - local steamGame = SteamGame:new( - appId, - appManifest["AppState"]["name"], - folderData["path"], - folderData.path.."/steamapps/common/"..appManifest["AppState"]["installdir"] - ) - -- We add it to the list - steamGames[appId] = steamGame - end - - ::continue:: -end - --- And now we merge user game data and game data -for gameID, data in pairs(userAppSettings) do - -- We check if the game is actually installed before attempting a merge. - if steamGames[gameID] ~= nil then - -- Tool status - if data["LaunchOptions"] and string.find(data["LaunchOptions"],programMetadata.executable) then - steamGames[gameID].status = true - end - if data["LaunchOptions"] and string.find(data["LaunchOptions"],"steamtinkerlaunch") then - steamGames[gameID].status = "SteamTinkerLaunch" - end - end -end -logSystem.log("speed", timeStart) - ---[[ - Chapter 4 : We check if the game is in the compat list -]] -logSystem.log("fileRead","Detecting games' platforms...") -timeStart = os.clock() - -local compatList = vdfParser.parseFile( - os.getenv("HOME").."/.local/share/Steam/userdata/"..userData["users"][activeUserID]["steamID3"].."/config/compat.vdf" -)["platform_overrides"] - -for gameID,_ in pairs(compatList) do - -- Proton Status - --[[ - WARNING : METHOD WRONGLY SETS WINDOWS STATUS FOR LINUX GAMES THAT WERE PREVIOUSLY USING PROTON - Workaround : Check if Windows version contains Linux executable or shell script. - ]] - if steamGames[gameID] and steamGames.type ~= "proton" then - if not fsUtils.directoryContainsLinuxData(steamGames[gameID].location) then - steamGames[gameID].os_platform = "Windows" - else - logSystem.log("warning", "Game "..steamGames[gameID].name.." was listed as Windows game, but contains Linux data. Assuming it runs with Linux...") - end - end -end -logSystem.log("speed", timeStart) - -return steamGames diff --git a/modules/steam/steamUtils.lua b/modules/steam/steamUtils.lua deleted file mode 100644 index ed19bbb..0000000 --- a/modules/steam/steamUtils.lua +++ /dev/null @@ -1,44 +0,0 @@ -local steamUtils = {} - ---[[ - This function checks if the arguments are from Steam or not. - I suppose this is where non-Steam game support will be added later. -]] -function steamUtils.isSteamArgs(arguments) - if arguments[7] ~= nil and arguments[7]:find("steamtinkerlaunch") then - return "steamtinkerlaunch" - elseif ( - --arguments[1] == os.getenv("HOME").."/.local/share/Steam/ubuntu12_32/reaper" and - arguments[2] == "SteamLaunch" and - arguments[3]:match("AppId=%d+") and - arguments[4] == "--" and - --arguments[5] == os.getenv("HOME").."/.local/share/Steam/ubuntu12_32/steam-launch-wrapper" and - arguments[6] == "--" - ) then - return "steamGame" - else - return false - end -end - ---[[ - Name : function steamUtils.convertToSteamID3(steamID) - Description : Converts a SteamID64 to a SteamID3 - Arg 1 : string steamID - Return : string steamID3 -]] -function steamUtils.convertToSteamID3(steamID) - local id_str = tostring(steamID) - - if tonumber(id_str) then - local offset_id = tonumber(id_str) - 76561197960265728 - local account_type = offset_id % 2 - local account_id = math.floor((offset_id - account_type) / 2) + account_type - - return (account_id * 2) - account_type - else - error("Unable to decode SteamID : "..id_str) - end -end - -return steamUtils diff --git a/modules/tools/gamemode.lua b/modules/tools/gamemode.lua deleted file mode 100644 index de54ee9..0000000 --- a/modules/tools/gamemode.lua +++ /dev/null @@ -1,10 +0,0 @@ --- Internal Modules -local toolObject = require("modules.objects.toolObject") - -local name = "gamemoderun" -local type = "executable" -local usage = function(command) - return "gamemoderun "..command -end - -return toolObject:new(name, type, usage) diff --git a/modules/tools/gamescope.lua b/modules/tools/gamescope.lua deleted file mode 100644 index bc34396..0000000 --- a/modules/tools/gamescope.lua +++ /dev/null @@ -1,59 +0,0 @@ --- Internal Modules -local toolObject = require("modules.objects.toolObject") - -local name = "gamescope" -local type = "executable" -local usage = function(command, config) - local options = "" - - -- Nested resolution - if - config.gamescope.general.resolution.enabled == true - then - options = string.format( - "%s --nested-width %s --nested-height %s --output-width %s --output-height %s", - options, - config.gamescope.general.resolution.internal.width, - config.gamescope.general.resolution.internal.height, - config.gamescope.general.resolution.external.width, - config.gamescope.general.resolution.external.height - ) - end - - -- Frame limit - if config.gamescope.general.frame_limit.enabled == true then - options = string.format( - "%s -r %s -o %s", - options, - config.gamescope.general.frame_limit.normal, - config.gamescope.general.frame_limit.unfocused - ) - end - - -- Fullscreen - if config.gamescope.general.fullscreen == true then - options = options.." -f" - end - if config.gamescope.general.borderless == true then - options = options.." -b" - end - - -- Filtering - if config.gamescope.filtering.enabled == true then - options = string.format( - "%s --filter %s --sharpness %s", - options, - string.lower(config.gamescope.filtering.filter), - config.gamescope.filtering.sharpness -- gamescope's sharpness is inverted - ) - end - - -- The command - return string.format( - "gamescope %s %s", - options, - command - ) -end - -return toolObject:new(name, type, usage) diff --git a/modules/tools/mangohud.lua b/modules/tools/mangohud.lua deleted file mode 100644 index 59bb082..0000000 --- a/modules/tools/mangohud.lua +++ /dev/null @@ -1,10 +0,0 @@ --- Internal Modules -local toolObject = require("modules.objects.toolObject") - -local name = "mangohud" -local type = "executable" -local usage = function(command) - return "mangohud "..command -end - -return toolObject:new(name, type, usage) diff --git a/modules/tools/obs-gamecapture.lua b/modules/tools/obs-gamecapture.lua deleted file mode 100644 index b127f52..0000000 --- a/modules/tools/obs-gamecapture.lua +++ /dev/null @@ -1,17 +0,0 @@ --- Internal Modules -local toolObject = require("modules.objects.toolObject") - ---[[ - I was tempted to separate this tool in 2 options : one for the utility (supports Vulkan & OpenGL), - and another for the environment variable which can be used with Vulkan games. - However, I chose to stay simple and use what works for all : the utility. - This is seemingly also the approach SteamTinkerLaunch goes with, judging from its wiki. -]] - -local name = "obs-gamecapture" -local type = "executable" -local usage = function(command) - return "obs-gamecapture "..command -end - -return toolObject:new(name, type, usage) diff --git a/modules/tools/switcherooctl.lua b/modules/tools/switcherooctl.lua deleted file mode 100644 index 2aa25df..0000000 --- a/modules/tools/switcherooctl.lua +++ /dev/null @@ -1,15 +0,0 @@ --- Internal Modules -local toolObject = require("modules.objects.toolObject") - -local name = "switcherooctl" -local type = "executable" -local usage = function(command, config) - if config.utilities.zink.enabled == true then - -- We let Zink handle the dGPU - return command - else - return "switcherooctl launch "..command - end -end - -return toolObject:new(name, type, usage) diff --git a/modules/tools/zink.lua b/modules/tools/zink.lua deleted file mode 100644 index 3058c2a..0000000 --- a/modules/tools/zink.lua +++ /dev/null @@ -1,15 +0,0 @@ --- Internal Modules -local toolObject = require("modules.objects.toolObject") - -local name = "/usr/lib/dri/zink_dri.so" -local toolType = "environmentVariable" -local usage = function(command, config) - if config.dgpu.enabled and require("modules.tools.switcherooctl").isInstalled then - -- We override switcherooctl (in its function) and let Zink handle the dGPU - return "DRI_PRIME=1 __GLX_VENDOR_LIBRARY_NAME=mesa MESA_LOADER_DRIVER_OVERRIDE=zink GALLIUM_DRIVER=zink" - else - return "MESA_LOADER_DRIVER_OVERRIDE=zink" - end -end - -return toolObject:new(name, toolType, usage) diff --git a/modules/ui/UItoSettingsList.lua b/modules/ui/UItoSettingsList.lua deleted file mode 100644 index 29a6f8d..0000000 --- a/modules/ui/UItoSettingsList.lua +++ /dev/null @@ -1,52 +0,0 @@ -return { - -- Settings - ["dGPU_Switch"] = {type= "Switch", tool = "switcherooctl", setting = "dgpu.enabled"}, - ["SDL_Wayland_Switch"] = {type= "Switch", setting = "misc.sdl_wayland", os_platform = "Linux"}, - - -- Utilities - ["gamemode_Switch"] = {type= "Switch", tool = "gamemoderun", setting = "utilities.gamemode.enabled"}, - ["mangohud_Switch"] = {type= "Switch", tool = "mangohud", setting = "utilities.mangohud.enabled"}, - ["zink_Switch"] = {type= "Switch", tool = "/usr/lib/dri/zink_dri.so", setting = "utilities.zink.enabled"}, - ["obs_gamecapture_Switch"] = {type= "Switch", tool = "obs-gamecapture", setting = "utilities.obs_gamecapture.enabled"}, - - -- Gamescope - ["gamescope_Switch"] = {type= "Switch", tool = "gamescope", setting = "gamescope.enabled"}, - -- Resolution - ["gamescope_Resolution_Switch"] = {type= "Switch", tool = "gamescope", setting = "gamescope.general.resolution.enabled"}, - ["gamescope_Resolution_Internal_Width_SpinRow"] = {type= "SpinRow", tool = "gamescope", setting = "gamescope.general.resolution.internal.width"}, - ["gamescope_Resolution_Internal_Height_SpinRow"] = {type= "SpinRow", tool = "gamescope", setting = "gamescope.general.resolution.internal.height"}, - ["gamescope_Resolution_External_Width_SpinRow"] = {type= "SpinRow", tool = "gamescope", setting = "gamescope.general.resolution.external.width"}, - ["gamescope_Resolution_External_Height_SpinRow"] = {type= "SpinRow", tool = "gamescope", setting = "gamescope.general.resolution.external.height"}, - -- Framerate - ["gamescope_Framerate_Switch"] = {type= "Switch", tool = "gamescope", setting = "gamescope.general.frame_limit.enabled"}, - ["gamescope_Framerate_Normal_SpinRow"] = {type= "SpinRow", tool = "gamescope", setting = "gamescope.general.frame_limit.normal"}, - ["gamescope_Framerate_Unfocused_SpinRow"] = {type= "SpinRow", tool = "gamescope", setting = "gamescope.general.frame_limit.unfocused"}, - -- Filtering - ["gamescope_Filtering_Switch"] = {type= "Switch", tool = "gamescope", setting = "gamescope.filtering.enabled"}, - ["gamescope_Filtering_Sharpness_SpinRow"] = {type= "SpinRow", tool = "gamescope", setting = "gamescope.filtering.sharpness"}, - ["gamescope_Filtering_Filter_ComboRow"] = {type= "ComboRow", tool = "gamescope", setting = "gamescope.filtering.filter", items = {"Linear","Nearest","FSR","NIS","Pixel"}}, - -- Extras - ["gamescope_Borderless_Toggle"] = {type= "Toggle", tool = "gamescope", setting = "gamescope.general.borderless"}, - ["gamescope_Fullscreen_Toggle"] = {type= "Toggle", tool = "gamescope", setting = "gamescope.general.fullscreen"}, - - -- Proton - -- Direct3D - ["Direct3D9_Switch"] = {type= "Switch", setting = "proton.direct3d.enable_direct3d9", os_platform = "Windows"}, - ["Direct3D10_Switch"] = {type= "Switch", setting = "proton.direct3d.enable_direct3d10", os_platform = "Windows"}, - ["Direct3D11_Switch"] = {type= "Switch", setting = "proton.direct3d.enable_direct3d11", os_platform = "Windows"}, - ["Direct3D12_Switch"] = {type= "Switch", setting = "proton.direct3d.enable_direct3d12", os_platform = "Windows"}, - ["WineD3D_Switch"] = {type= "Switch", setting = "proton.direct3d.use_wined3d", os_platform = "Windows"}, - -- Sync - ["ESync_Toggle"] = {type= "Toggle", setting = "proton.sync.enable_esync", os_platform = "Windows"}, - ["FSync_Toggle"] = {type= "Toggle", setting = "proton.sync.enable_fsync", os_platform = "Windows"}, - -- NVIDIA - ["Hide_NVIDIA_GPU_Switch"] = {type= "Switch", setting = "proton.nvidia.hide_nvidia_gpu", os_platform = "Windows"}, - ["Enable_NVAPI_Switch"] = {type= "Switch", setting = "proton.nvidia.enable_nvapi", os_platform = "Windows"}, - -- FSR - ["Wine_FSR_Switch"] = {type= "Switch", setting = "proton.fsr.enabled", os_platform = "Windows"}, - ["Wine_FSR_Sharpness_SpinRow"] = {type= "SpinRow", setting = "proton.fsr.sharpness", os_platform = "Windows"}, - ["Wine_FSR_Upscaling_Resolution_Mode_ComboRow"] = {type = "ComboRow", setting = "proton.fsr.upscaling_mode", os_platform = "Windows", items = {"None", "Performance", "Balanced", "Quality", "Ultra"}}, - ["Wine_FSR_Resolution_Switch"] = {type = "Switch", setting = "proton.fsr.resolution.enabled", os_platform = "Windows"}, - ["Wine_FSR_Resolution_External_Width_SpinRow"] = {type= "SpinRow", setting = "proton.fsr.resolution.width", os_platform = "Windows"}, - ["Wine_FSR_Resolution_External_Height_SpinRow"] = {type= "SpinRow", setting = "proton.fsr.resolution.height", os_platform = "Windows"} -} diff --git a/modules/ui/aboutWindow.lua b/modules/ui/aboutWindow.lua deleted file mode 100644 index 8529e8b..0000000 --- a/modules/ui/aboutWindow.lua +++ /dev/null @@ -1,73 +0,0 @@ --- External Modules -local lgi = require("lgi") -local Adw = lgi.Adw -local Gtk = lgi.Gtk - --- Internal Modules -local programMetadata = require("modules.extra.programMetadata") - --- Translation fake function -local function _(text) return text end - -return function(application, interface, win) - local creditLauncher = interface:get_object("aboutLauncher") - creditLauncher.on_clicked = function() - -- Create window with main metadata already set - local creditWindow = Adw.AboutWindow{ - application = application, - modal = true, - - application_icon = programMetadata.icon_name, - application_name = programMetadata.name, - version = programMetadata.version, - - title = _("About ")..programMetadata.name, - developer_name = programMetadata.developer, - website = programMetadata.url, - issue_url = programMetadata.url.."/issues", - license_type = Gtk.License.MPL_2_0, - - developers = { - "JordanViknar https://github.com/JordanViknar", - }, - artists = { - "JordanViknar https://github.com/JordanViknar" - }, - documenters = { - "JordanViknar https://github.com/JordanViknar" - } - } - - -- Credits - creditWindow:add_acknowledgement_section(_("Inspired by"),{ - "SteamTinkerLaunch https://github.com/sonic2kk/steamtinkerlaunch", - "Bottles https://github.com/bottlesdevs/Bottles" - }) - creditWindow:add_acknowledgement_section(_("Powered by"),{ - "Lua https://www.lua.org/", - "LGI https://github.com/lgi-devs/lgi", - "GTK https://www.gtk.org/", - "libadwaita https://gnome.pages.gitlab.gnome.org/libadwaita/", - "LuaFileSystem https://github.com/lunarmodules/luafilesystem", - "LuaSocket https://github.com/lunarmodules/luasocket", - "dkjson http://dkolf.de/src/dkjson-lua.fsl/home" - }) - creditWindow:add_acknowledgement_section(_("Third-Party Tools and Special Thanks"),{ - "Steam https://store.steampowered.com/", - "Proton https://github.com/ValveSoftware/proton", - "GameMode https://github.com/FeralInteractive/gamemode", - "MangoHud https://github.com/flightlessmango/MangoHud", - "Zink https://docs.mesa3d.org/drivers/zink.html", - "ProtonDB https://www.protondb.com/", - "PCGamingWiki https://www.pcgamingwiki.com/", - "SteamDB https://steamdb.info/", - "switcheroo-control https://gitlab.freedesktop.org/hadess/switcheroo-control", - "Gamescope https://github.com/ValveSoftware/gamescope" - }) - - creditWindow:set_comments(_("A work-in-progress fast, simple and modern Libadwaita alternative to SteamTinkerLaunch.")) - - creditWindow:set_transient_for(win) - creditWindow:present() - end -end diff --git a/modules/ui/gameSettingsOverview.lua b/modules/ui/gameSettingsOverview.lua deleted file mode 100644 index 82064dd..0000000 --- a/modules/ui/gameSettingsOverview.lua +++ /dev/null @@ -1,167 +0,0 @@ --- Internal Modules -local lgiHelper = require("modules.ui.lgiHelper") -local protonDBManager = require("modules.steam.protonDBManager") -local fsUtils = require("modules.general.fsUtils") -local logSystem = require("modules.general.logSystem") -local systemUtils = require("modules.general.systemUtils") - --- External Modules -local lgi = require("lgi") -local Adw = lgi.Adw -local Gio = lgi.Gio - -return function(application, interface, steamGameData) - --[[ - SIDEBAR - ]] - -- Set the game banner in the sidebar - interface:get_object("Sidebar_Banner"):set_filename(steamGameData.images.header) - - --[[ - OVERVIEW - ]] - -- Sets the game image in the overview area - interface:get_object("Overview_Picture"):set_filename(steamGameData.images.library) - -- Sets the game title in the overview area - interface:get_object("gameTitle").label = steamGameData.name - - -- ProtonDB rating - local protonRating_Label = interface:get_object("protonDBRating_Label") - protonRating_Label.label = "Loading..." - protonRating_Label.css_classes = {"dim-label"} - if steamGameData.os_platform == "Windows" then - - local function loadProtonDBrating() - -- If the game's rating hasn't been retrieved yet, we retrieve it. - -- The reason why this is done HERE is because it would slow down startup otherwise. - if steamGameData.protondb_data == nil then - logSystem.log("download", "Loading ProtonDB rating for "..steamGameData.name.."...") - steamGameData.protondb_data = protonDBManager.getAppInfo(steamGameData.id) - end - - -- We set the rating label - if steamGameData.protondb_data == "Not found" then - protonRating_Label.css_classes = {"error"} - elseif steamGameData.protondb_data == "Unavailable" then - protonRating_Label.css_classes = {"warning"} - elseif steamGameData.protondb_data["tier"] == "platinum" then - protonRating_Label.css_classes = {"success"} - elseif steamGameData.protondb_data["tier"] == "silver" or "gold" then - protonRating_Label.css_classes = {"warning"} - else - protonRating_Label.css_classes = {"error"} - end - local rating = steamGameData.protondb_data["tier"] or steamGameData.protondb_data - -- Set label and capitalize the first letter - protonRating_Label.label = rating:sub(1, 1):upper()..rating:sub(2) - end - Gio.Async.start(loadProtonDBrating)() - - else - protonRating_Label.label = "Native" - protonRating_Label.css_classes = {"success"} - end - - -- Sets up the game start button - local gameLaunchButton = interface:get_object("gameLaunchButton") - lgiHelper.replaceSignal(gameLaunchButton, "on_clicked", function() - os.execute("xdg-open steam://rungameid/"..steamGameData.id.." &> /dev/null") - end) - - -- Sets up the game's SimpleSteamTinker status - local gameStatus, gameColor - if steamGameData.status == true then - gameStatus = "Enabled" - gameColor = "success" - elseif steamGameData.status == "SteamTinkerLaunch" then - gameStatus = "SteamTinkerLaunch" - gameColor = "warning" - else - gameStatus = "Disabled" - gameColor = "error" - end - local gameStatus_Label = interface:get_object("gameStatus_Label") - gameStatus_Label.label = gameStatus - gameStatus_Label.css_classes = {gameColor} - - -- Sets the game ID in the overview area - interface:get_object("gameID_Label").label = steamGameData.id - -- Sets up the game ID copy button in the overview area - local toastSystem = interface:get_object("toastSystem") - local gameIDCopyButton = interface:get_object("gameID_copyButton") - lgiHelper.replaceSignal(gameIDCopyButton, "on_clicked", function() - if systemUtils.copyToClipboard(steamGameData.id) then - toastSystem:add_toast( - Adw.Toast.new("Game ID copied to clipboard !") - ) - end - end) - -- Sets the game platform in the overview area - interface:get_object("gamePlatform_Label").label = steamGameData.os_platform - - -- Sets the game size in the overview area - local gameSize_Label = interface:get_object("gameSize_Label") - gameSize_Label.label = "Loading..." - if not steamGameData.size then - logSystem.log("fileRead", "Detecting size for "..steamGameData.name.."...") - - local function insertGameSize() - steamGameData.size = fsUtils.sizeToUnit(fsUtils.getSize(steamGameData.location)) - gameSize_Label.label = steamGameData.size - end - Gio.Async.start(insertGameSize)() - - else - gameSize_Label.label = steamGameData.size - end - - -- Sets the game folder in the overview area - interface:get_object("gameLocation_ActionRow").subtitle = steamGameData.location - -- Modifies the button to get to the game's folder - local gameFolderButton = interface:get_object("gameLocationButton") - lgiHelper.replaceSignal(gameFolderButton, "on_clicked", function() - os.execute("xdg-open '"..steamGameData.location:gsub("'", "'\\''").."' &> /dev/null") - end) - - -- Sets the compatdata folder in the overview area - local gameCompatdata_ActionRow = interface:get_object("gameCompatdata_ActionRow") - if steamGameData.os_platform == "Windows" then - gameCompatdata_ActionRow.visible = true - if steamGameData.proton_config.compatdata then - gameCompatdata_ActionRow:set_sensitive(true) - gameCompatdata_ActionRow.subtitle = steamGameData.proton_config.compatdata - -- Modifies the button to get to the game's compatdata folder - lgiHelper.replaceSignal(interface:get_object("gameCompatdataButton"), "on_clicked", function() - os.execute("xdg-open '"..steamGameData.proton_config.compatdata:gsub("'", "'\\''").."' &> /dev/null") - end) - else - gameCompatdata_ActionRow:set_sensitive(false) - gameCompatdata_ActionRow.subtitle = "Not found. Try launching the game at least once ?" - end - else - gameCompatdata_ActionRow.visible = false - end - - --[[ - LINKS - ]] - local protonDBPage_Button = interface:get_object("protonDBPage_Button") - lgiHelper.replaceSignal(protonDBPage_Button, "on_clicked", function() - os.execute("xdg-open 'https://www.protondb.com/app/"..steamGameData.id.."' &> /dev/null") - end) - - local steamDBPage_Button = interface:get_object("steamDBPage_Button") - lgiHelper.replaceSignal(steamDBPage_Button, "on_clicked", function() - os.execute("xdg-open 'https://steamdb.info/app/"..steamGameData.id.."' &> /dev/null") - end) - - local PCGamingWikiPage_Button = interface:get_object("PCGamingWikiPage_Button") - lgiHelper.replaceSignal(PCGamingWikiPage_Button, "on_clicked", function() - os.execute("xdg-open 'https://www.pcgamingwiki.com/wiki/"..steamGameData.name:gsub(" ", "_").."' &> /dev/null") - end) - - local SteambasePage_Button = interface:get_object("SteambasePage_Button") - lgiHelper.replaceSignal(SteambasePage_Button, "on_clicked", function() - os.execute("xdg-open 'https://steambase.io/apps/"..steamGameData.id.."' &> /dev/null") - end) -end diff --git a/modules/ui/lgiHelper.lua b/modules/ui/lgiHelper.lua deleted file mode 100644 index 75b1830..0000000 --- a/modules/ui/lgiHelper.lua +++ /dev/null @@ -1,77 +0,0 @@ --- External Modules -local lgi = require("lgi") -local GObject = lgi.GObject - --- Internal Modules -local systemUtils = require("modules.general.systemUtils") -local configManager = require("modules.config.configManager") - -local lgiHelper = {} - ---[[ - Name : function lgiHelper.replaceSignal(object, signal, action) - Description : This function helps replacing signals on widgets. - For example, if you want to replace the "on_clicked" signal of a button. - - It avoids bugs like opening a game's directory also opening the previous ones. - Arg 1 : The object to modify. - Arg 2 : The signal to replace. - Arg 3 : The function to run (when clicking for example). -]] -local signalList = {} -function lgiHelper.replaceSignal(object, signal, action) - lgiHelper.removeSignal(object, signal) - - if signalList[object] == nil then signalList[object] = {} end - signalList[object][signal] = object[signal]:connect(action) -end - ---[[ - Name : function lgiHelper.removeSignal(object, signal) - Description : Simply deactivate the function of a button. - Arg 1 : The object to modify. - Arg 2 : The signal to remove. -]] -function lgiHelper.removeSignal(object, signal) - -- We create a table for the object if it doesn't exist. - if signalList[object] == nil then signalList[object] = {} end - -- If the object already has an event connected to the same signal, we disconnect it. - if signalList[object][signal] then - GObject.signal_handler_disconnect(object, signalList[object][signal]) - signalList[object][signal] = nil - end -end - ---[[ - Name : function lgiHelper.connectUtilityToButton(id, button, utility, property, setting) - Description : Connects a utility to a button. - Arg 1 : string id : The game's ID. - Arg 2 : The button to connect. - Arg 3 : string utility : The utility's name. - Arg 4 : string property : The property to connect. - Arg 5 : string setting : The setting to modify. -]] -function lgiHelper.connectUtilityToButton(id, button, utility, property, setting) - local signal = "on_state_set" - lgiHelper.removeSignal(button, signal) - - -- If utility begins with /, then it's a file path. - local isPresent = systemUtils.isInstalled(utility) - - if isPresent then - button:set_sensitive(true) - button:set_active(property) - - if signalList[button] == nil then signalList[button] = {} end - signalList[button][signal] = button[signal]:connect(function() - configManager.modifyGameConfig(id, setting, button:get_active()) - end) - else - button:set_sensitive(false) - button:set_active(false) - button.has_tooltip = true - button.tooltip_text = "'"..utility.."' is not present on your system." - end -end - -return lgiHelper diff --git a/modules/ui/mainWindow.lua b/modules/ui/mainWindow.lua deleted file mode 100644 index da8014a..0000000 --- a/modules/ui/mainWindow.lua +++ /dev/null @@ -1,236 +0,0 @@ --- Internal Modules -local programMetadata = require("modules.extra.programMetadata") -local configManager = require("modules.config.configManager") -local systemUtils = require("modules.general.systemUtils") -local lgiHelper = require("modules.ui.lgiHelper") - --- External Modules -local lgi = require("lgi") -local Gtk = lgi.require("Gtk") -local Adw = lgi.Adw - --- Install checks -local installedList = {} - -return function(app, steamGames) - -- We create the window - local builder = Gtk.Builder.new_from_file(programMetadata.installdir.."ui/main.ui") - local win = builder:get_object("mainWindow") - win.application = app - win.title = programMetadata.name - win.startup_id = programMetadata.name - - -- Check for dev version and add relevant theme - if programMetadata.version:find("dev") or programMetadata.version:find("a") or programMetadata.version:find("b") then - win:add_css_class("devel") - end - - --[[ - UI ELEMENTS - ]] - -- Page management - local mainView = builder:get_object("mainView") - local gameList = builder:get_object("gameList") - - local gameSettingsInterface = builder:get_object("gameSettings") - - -- Stack test - local stack = builder:get_object("gameSettingsStack") - - -- For every game that has SimpleSteamMod enabled, we add a button in this list - for _, game in pairs(steamGames) do - if game.type == "game" then - local statusIcon, statusLabel, statusColor - -- Status label and icon - if game.status == true then - statusIcon = "emblem-default-symbolic" - statusLabel = programMetadata.name.." is enabled for this game." - statusColor = "success" - elseif game.status == "SteamTinkerLaunch" then - statusIcon = "emblem-important-symbolic" - statusLabel = "SteamTinkerLaunch is enabled for this game instead of "..programMetadata.name.."." - statusColor = "warning" - else - statusIcon = "dialog-error-symbolic" - statusLabel = programMetadata.name.." is disabled for this game." - statusColor = "" - end - - -- OS Label - local osLabel, osColor, osTooltip - if game.os_platform == "Linux" then - osLabel = "Native" - osColor = "success" - osTooltip = "This is a native Linux game." - elseif game.os_platform == "Windows" then - osLabel = "Proton" - osColor = "accent" - osTooltip = "This is a Windows game running through Proton." - end - - -- The row - local row = Adw.ActionRow { - title = game.name, - use_markup = false, -- Used to escape the ampersand - activatable = true, - subtitle_lines = 1 - } - - -- The game's image - local image = Gtk.Image { - file = game.images.icon, - icon_size = Gtk.IconSize.LARGE - } - row:add_prefix(image) - - local box = Gtk.Box { - orientation = Gtk.Orientation.HORIZONTAL, - spacing = 12, - Gtk.Label { - label = osLabel, - css_classes = { osColor, "dim-label" }, - has_tooltip = true, - tooltip_text = osTooltip - }, - Gtk.Image { - icon_name = statusIcon, - valign = Gtk.Align.CENTER, - halign = Gtk.Align.CENTER, - has_tooltip = true, - tooltip_text = statusLabel, - css_classes = { statusColor } - } - } - local button = Gtk.Button { - id = "button", - icon_name = "go-next-symbolic", - has_frame = false, - valign = Gtk.Align.CENTER, - halign = Gtk.Align.CENTER, - css_classes = { "circular", "flat", "image-button" }, - on_clicked = function() - -- We setup the gameSettings Overview UI for this game - require("modules.ui.gameSettingsOverview")(app, builder, game) - - -- We connect the UI elements to the game settings - local UIelements = require("modules.ui.UItoSettingsList") - local gameSettings = configManager.getGameConfig(game.id) - - -- We iterate through the UI elements - for widgetname, data in pairs(UIelements) do - local widget = builder:get_object(widgetname) - - -- Split the setting into keys - local keys = {} - for substring in data.setting:gmatch("[^.]+") do - keys[#keys + 1] = substring - end - -- Connect to the settings table - local pointer = gameSettings - for i = 1, #keys - 1 do - pointer = pointer[keys[i]] or {} - end - - -- We determine the right signal to use - local signal - if data.type == "Switch" then signal = "on_state_set" - elseif data.type == "SpinRow" then signal = "on_changed" - elseif data.type == "Toggle" then signal = "on_toggled" - elseif data.type == "ComboRow" then - signal = "on_notify" -- Not optimal, but it works. Isn't there a better way to do this ? - else - error("Unknown signal to use with type '"..data.type.."' for UI element '"..widgetname.."'") - end - - lgiHelper.removeSignal(widget, signal) - - -- We hide the option if it doesn't fit the platform - if data.os_platform and data.os_platform ~= game.os_platform then - widget.visible = false - goto skip - elseif widget.visible ~= true then - widget.visible = true - end - - -- Should they be active ? Is the related tool installed ? - if data.tool then - if not installedList[data.tool] then - installedList[data.tool] = systemUtils.isInstalled(data.tool) - end - if installedList[data.tool] == false then - widget:set_sensitive(false) - widget.has_tooltip = true - widget.tooltip_text = data.tool.." is not present on your system." - goto skip - else - widget:set_sensitive(true) - end - end - - -- We connect the UI element to the setting - if data.type == "Switch" or data.type == "Toggle" then - widget:set_active(pointer[keys[#keys]]) - lgiHelper.replaceSignal(widget, signal,function() configManager.modifyGameConfig(game.id, data.setting, widget:get_active()) end) - elseif data.type == "SpinRow" then - widget.value = pointer[keys[#keys]] - lgiHelper.replaceSignal(widget, signal,function() configManager.modifyGameConfig(game.id, data.setting, math.floor(widget:get_value())) end) - elseif data.type == "ComboRow" then - -- We grab the model used - local model = widget:get_model() - - -- We select the item that's already configured in the settings - for index, filter in ipairs(data.items) do - local currentFilter = configManager.grabInTableFromString(gameSettings, data.setting) - if currentFilter == filter then - widget:set_selected(index - 1) - break -- No need to continue - end - end - - -- We connect to the setting - lgiHelper.replaceSignal(widget, signal, function() - local selected = model:get_string(widget:get_selected()) - configManager.modifyGameConfig(game.id, data.setting, selected) - end) - else - error("Unknown type '"..data.type.."' for UI element '"..widgetname.."'") - end - - ::skip:: - end - - -- Windows only pages - local windowsPages = {"protonPage"} - for _, page in ipairs(windowsPages) do - page = builder:get_object(page) - if game.os_platform == "Windows" then - page.visible = true - else - page.visible = false - end - end - - -- We finally push the settings page to the user. - mainView:push(gameSettingsInterface) - end - } - box:append(button) - row:add_suffix(box) - row.activatable_widget = button - - gameList:add(row) - end - end - - --Topbar management - builder:get_object("mainPageTopbar"):set_top_bar_style(Adw.ToolbarStyle.RAISED_BORDER) - builder:get_object("gameSettingsTopbar"):set_top_bar_style(Adw.ToolbarStyle.RAISED_BORDER) - - -- Overview restoration when we exit out of the settings - gameSettingsInterface.on_hidden = function() - stack:set_visible_child_name("overviewPage") - end - - -- Credits - require("modules.ui.aboutWindow")(app, builder, win) -end diff --git a/modules/utilitiesList.lua b/modules/utilitiesList.lua deleted file mode 100644 index e31d503..0000000 --- a/modules/utilitiesList.lua +++ /dev/null @@ -1,15 +0,0 @@ -return function (gameConfig) - return - - -- Executables are ordered by priority (first only applies to the game, last applies to the whole sequence) - - { - {require("modules.tools.zink"),gameConfig.utilities.zink.enabled}, - {require("modules.tools.gamescope"),gameConfig.gamescope.enabled}, - {require("modules.tools.switcherooctl"),gameConfig.dgpu.enabled}, - {require("modules.tools.mangohud"),gameConfig.utilities.mangohud.enabled}, - {require("modules.tools.obs-gamecapture"),gameConfig.utilities.obs_gamecapture.enabled}, - {require("modules.tools.gamemode"),gameConfig.utilities.gamemode.enabled} - } - -end diff --git a/sst b/sst deleted file mode 100755 index 53f5969..0000000 --- a/sst +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -# Check if installed locally (main.lua is in the same directory as this script) or in the system (main.lua is in /usr/share/simplesteammod) -if [ -f "$(dirname $0)/main.lua" ]; then - # Installed locally - SCRIPT_PATH="$(dirname $0)" -elif [ -f "/usr/share/SimpleSteamTinker/main.lua" ]; then - # Installed in the system - SCRIPT_PATH="/usr/share/SimpleSteamTinker" -else - echo "main.lua not found. Please install SimpleSteamTinker and try again." - exit 1 -fi - -# Set LUA_PATH to avoid missing require issues, using the detected directory -export LUA_PATH="$SCRIPT_PATH/?.lua;$SCRIPT_PATH/?/init.lua;;" - -# Provide script directory -export SST_SCRIPT_PATH="$SCRIPT_PATH/" - -# Check if Lua is installed and run main.lua, accounting for the script path -if [ -x "$(command -v lua)" ]; then - lua $SCRIPT_PATH/main.lua "$@" -else - echo "No Lua installation found. Please install Lua and try again." - exit 1 -fi diff --git a/steam/init.luau b/steam/init.luau new file mode 100644 index 0000000..cfd0c9b --- /dev/null +++ b/steam/init.luau @@ -0,0 +1,4 @@ +--!strict +return { + steamConfig = require("steam_config_provider"), +} \ No newline at end of file diff --git a/steam/steam_config_provider.luau b/steam/steam_config_provider.luau new file mode 100644 index 0000000..0caa676 --- /dev/null +++ b/steam/steam_config_provider.luau @@ -0,0 +1,167 @@ +--!strict + +-- Modules +local process = require("@lune/process") + +local logSystem = require("../general").logSystem +-- local fsUtils = require("../general").fsUtils +local steamUtils = require("steam_utils") +local vdfParser = require("vdf_parser") + +-- Definitions +type SteamID64_Dec = number +type SteamID3 = number + +type loginusers_vdf = { + users : { + [SteamID64_Dec] : { + AccountName : string, + --PersonaName : string, + --RememberPassword : boolean, + --WantsOfflineMode : boolean, + --SkipOfflineModeWarning : boolean, + --AllowAutoLogin : boolean, + MostRecent : boolean, + --TimeStamp : number, + SteamID3 : SteamID3 -- Added manually later on + } + } +} +type localconfig_vdf = { + UserLocalConfigStore : { + Software : { + Valve : { + Steam : { + apps : { + [number] : { + --[[cloud : { + last_sync_state : string?, + quota_bytes : number?, + quota_files : number?, + used_bytes : number?, + used_files : number?, + }?, + LastPlayed : number?, + Playtime : (number | boolean)?, + BadgeData : string?,]]-- + LaunchOptions : string?, + --[[Playtime2wks : boolean?, + autocloud : { + lastexit : number, + lastlaunch : number, + }?]] + } + } + } + } + } + } +} +type libraryfolders_vdf = { + libraryfolders : { + [number] : { + apps : { + [number] : number + }, + --contentid : number, + --label : string, + path : string, + --time_last_update_corruption : number | boolean, + --totalsize : boolean, + --update_clean_bytes_tally : number | boolean + } + } +} + +-- Timer +local timeStart: number + +--[[ + Chapter 1 : We recover the Steam user config so we can get the last active user. + And also the SteamID3 to access their settings folder. +]] +logSystem.log("data", "Detecting user config...") +timeStart = os.clock() + +local result, userData: loginusers_vdf = pcall(vdfParser.parseFile, (process.env.HOME.."/.local/share/Steam/config/loginusers.vdf")) +if not result then + logSystem.log("error", "Failed to parse loginusers.vdf.") + return nil +end + +-- We add the SteamID3 to the user data, and also grab the most recent user's ID while we're at it. +local activeUserID: SteamID64_Dec +for id,data in pairs(userData.users) do + -- SteamID3 + data.SteamID3 = steamUtils.convertToSteamID3(id) + + -- Most recent + if data.MostRecent == true then + activeUserID = id + end +end +logSystem.log("speed", timeStart) + +print(userData) + +logSystem.log("info", "Active user : "..userData.users[activeUserID].AccountName) + +--[[ + Chapter 2 : We recover the user config to get which games have the tool enabled. + This section would normally have quite an impact on performance. + Thanks to some optimizations, however, the time is cut from 0.5 seconds to 0.04 seconds on my computer. +]] +logSystem.log("data", "Detecting active user game configs...") +timeStart = os.clock() + +local appParseSettings = { + file = process.env.HOME.."/.local/share/Steam/userdata/"..userData.users[activeUserID].SteamID3.."/config/localconfig.vdf", + stopKeyList = { + "UserLocalConfigStore", + "Software", + "Valve", + "Steam", + "apps" + }, + wordsFromLinesToRemove = { + "CachedCommunityPreferences", + "UIStoreLocalState", + "CachedStorePreferences", + "CachedNotificationPreferences", + "SteamVoiceSettings_", + "UIStoreLocalSteamUIState", + "UIStoreLocalGamepadState", + "GetEquippedProfileItemsForUser", + "CTextFilterStore_strBannedPattern", + "CTextFilterStore_strCleanPattern", + "trendingstore_storage", + "playnextstore_storage", + "GetEquippedProfileItemsForUser" + } +} + +local result, localconfig_vdf: localconfig_vdf = pcall(vdfParser.parseFile, appParseSettings.file, appParseSettings.stopKeyList, appParseSettings.wordsFromLinesToRemove) +if not result then + logSystem.log("error", "Failed to parse active user localconfig.vdf with SteamID3 : "..userData.users[activeUserID].SteamID3) + return nil +end +logSystem.log("speed", timeStart) + +local userAppSettings = localconfig_vdf.UserLocalConfigStore.Software.Valve.Steam.apps +print(userAppSettings) + +--[[ + Chapter 3 : We recover the Steam library config to get the list of games. + We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. +]] +logSystem.log("data", "Detecting games...") +timeStart = os.clock() + +local result, libraryFolders: libraryfolders_vdf = pcall(vdfParser.parseFile, process.env.HOME.."/.local/share/Steam/config/libraryfolders.vdf") +if not result then + logSystem.log("error", "Failed to parse libraryfolders.vdf.") + return nil +end +logSystem.log("speed", timeStart) + +print(libraryFolders) diff --git a/steam/steam_utils.luau b/steam/steam_utils.luau new file mode 100644 index 0000000..f50c8b0 --- /dev/null +++ b/steam/steam_utils.luau @@ -0,0 +1,39 @@ +--!strict +local SteamUtils = {} + +--[[ + This function checks if the arguments are from Steam or not. + I suppose this is where non-Steam game support will be added later. +]] +function SteamUtils.isSteamArgs(arguments: {string}): boolean + if ( + --arguments[1] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/reaper" and + arguments[2] == "SteamLaunch" and + arguments[3]:match("AppId=%d+") and + arguments[4] == "--" and + --arguments[5] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/steam-launch-wrapper" and + arguments[6] == "--" + ) then + return true + else + return false + end +end + +--[[ + Name : function steamUtils.convertToSteamID3(steamID) + Description : Converts a SteamID64 to a SteamID3 + Arg 1 : string steamID + Return : string steamID3 +]] +type SteamID64_Dec = number +type SteamID3 = number +function SteamUtils.convertToSteamID3(steamID: SteamID64_Dec): SteamID3 + local offset_id = steamID - 76561197960265728 + local account_type = offset_id % 2 + local account_id = math.floor((offset_id - account_type) / 2) + account_type + -- Check the -1 here in case of SteamID related bug. + return (account_id * 2) - account_type - 1 +end + +return SteamUtils diff --git a/modules/steam/vdfParser.lua b/steam/vdf_parser.luau similarity index 64% rename from modules/steam/vdfParser.lua rename to steam/vdf_parser.luau index 30e67f6..98391c9 100644 --- a/modules/steam/vdfParser.lua +++ b/steam/vdf_parser.luau @@ -1,25 +1,10 @@ +--!nocheck +--Note : Temporary + local vdfParser = {} ---[[ - Name : function vdfParser.printArray(data, indent) - Description : Prints a table in a human-readable way. Used for testing. - Arg 1 : data (table) : The table to print. - Arg 2 : indent (number) : The indentation level. Default : 0 -]] -function vdfParser.printArray(data, indent) - indent = indent or 0 - local spaces = string.rep(" ", indent) - - for key, value in pairs(data) do - if type(value) == "table" then - print(spaces .. key .. ": {") - vdfParser.printArray(value, indent + 1) - print(spaces .. "}") - else - print(spaces .. key .. ": " .. tostring(value)) - end - end -end +-- Lune Modules +local fs = require("@lune/fs") --[[ Name : function vdfParser.parseString(input, stopKeyList) @@ -28,50 +13,74 @@ end Arg 2 : stopKeyList (table) : A list of keys to stop the parsing at. Default : nil Return : result (table) : The parsed table. ]] -function vdfParser.parseString(input, stopKeyList) + +-- Status : +-- keyWait : We wait for a key +-- readingKey : We are reading a key +-- valueWait : We wait for a value +-- readingValue : We are reading a value +-- readingTableValue : We are reading a table value +type ReadStatus = "keyWait" | "readingKey" | "valueWait" | "readingTableValue" | "readingValue" + +function vdfParser.parseString(input, stopKeyList: {string}?): {[string]: any} local result = {} - local status = "keyWait" + local status: ReadStatus = "keyWait" -- Temp Values - local tempKey, tempValue, tempRecursiveInput = "", "", "" + local tempKey: string, tempValue: string, tempRecursiveInput: string = "", "", "" - local indent = 0 - local previousChar = nil + local indent: number = 0 + local previousChar: string = nil -- Until we reached the end of the file for i = 1, #input do local char = input:sub(i, i) - -- Status : - -- keyWait : We wait for a key - -- readingKey : We are reading a key - -- valueWait : We wait for a value - -- readingValue : We are reading a value - -- readingTableValue : We are reading a table value - - -- String management + -- String key/value management if char == '"' and previousChar ~= "\\" then if status == "keyWait" then + -- We reached the key and start reading it. status = "readingKey" elseif status == "readingKey" then + -- We finished reading the key and are now waiting for the value. status = "valueWait" elseif status == "valueWait" then + -- We begin reading the value. status = "readingValue" elseif status == "readingValue" then - result[tempKey] = tempValue + -- We finished reading the value. + + -- Convert value into extra, more practical types + local actualValue: any + if tempValue == "0" then actualValue = false + elseif tempValue == "1" then actualValue = true + elseif tonumber(tempValue) then actualValue = tonumber(tempValue) + else actualValue = tempValue end + + -- Same for key + local actualKey: any + if tonumber(tempKey) then actualKey = tonumber(tempKey) + else actualKey = tempKey end + + result[actualKey] = actualValue + -- We stop the parsing if we reached the stopKeyList entry if stopKeyList and tempKey == stopKeyList[1] then return result end + tempKey = "" tempValue = "" status = "keyWait" elseif status == "readingTableValue" then + -- We are currently reading a table. Not stopping until we reached its end. tempRecursiveInput = tempRecursiveInput..char end -- Subtable management + + -- We reach the beginning of a table. elseif char == '{' and previousChar ~= "\\" and (status == "valueWait" or status == "readingTableValue") then if status == "valueWait" then status = "readingTableValue" @@ -79,7 +88,9 @@ function vdfParser.parseString(input, stopKeyList) tempRecursiveInput = tempRecursiveInput..char indent = indent + 1 end - elseif char == '}' and previousChar ~= "\\" and status == "readingTableValue" then + + -- We reach the end of a table. + elseif char == '}' and previousChar ~= "\\" and (status == "readingTableValue") then if indent == 0 then local newStopKeyList = nil if stopKeyList then @@ -90,7 +101,10 @@ function vdfParser.parseString(input, stopKeyList) end if stopKeyList == nil or stopKeyList[1] == nil or tempKey == stopKeyList[1] then - result[tempKey] = vdfParser.parseString(tempRecursiveInput, newStopKeyList) + local actualKey: any + if tonumber(tempKey) then actualKey = tonumber(tempKey) + else actualKey = tempKey end + result[actualKey] = vdfParser.parseString(tempRecursiveInput, newStopKeyList) end if stopKeyList and tempKey == stopKeyList[1] then @@ -109,9 +123,11 @@ function vdfParser.parseString(input, stopKeyList) -- While reading a key elseif status == "readingKey" then tempKey = tempKey..char + -- While reading a value elseif status == "readingValue" and (stopKeyList == nil or stopKeyList[1] == nil or tempKey == stopKeyList[1]) then tempValue = tempValue..char + -- While reading a table value, before sending it through the function again to parse it elseif status == "readingTableValue" and (stopKeyList == nil or stopKeyList[1] == nil or tempKey == stopKeyList[1]) then tempRecursiveInput = tempRecursiveInput..char @@ -134,14 +150,8 @@ end Note : Arg 2 and Arg 3 are critical for optimization in big files. Do not hesitate to use them. Results such as going from 0.5 seconds to 0.04 seconds are possible. ]] -function vdfParser.parseFile(path, stopKeyList, wordsFromLinesToRemove) - local file = io.open(path, "r") - if not file then - error("File not found : "..path) - end - - local content = file:read("*all") - file:close() +function vdfParser.parseFile(path: string, stopKeyList: {string}?, wordsFromLinesToRemove: {string}?): {[string]: any} + local content = fs.readFile(path) -- Remove every line that contains a word from wordsFromLinesToRemove if wordsFromLinesToRemove then @@ -164,4 +174,4 @@ function vdfParser.parseFile(path, stopKeyList, wordsFromLinesToRemove) return vdfParser.parseString(content, stopKeyList) end -return vdfParser +return vdfParser \ No newline at end of file diff --git a/ui/definitions/cleanerPage.blp b/ui/definitions/cleanerPage.blp deleted file mode 100644 index 79fa5f4..0000000 --- a/ui/definitions/cleanerPage.blp +++ /dev/null @@ -1,10 +0,0 @@ -using Gtk 4.0; - -StackPage cleaner { //[MODIFIED IN LUA]: This page is only shown if the game is using Proton. - title: _("Cleaner"); - child: - Label { - label: "In the future, this page will allow you to do some cleaning up."; - wrap: true; - }; -} diff --git a/ui/definitions/commandPage.blp b/ui/definitions/commandPage.blp deleted file mode 100644 index e9b1707..0000000 --- a/ui/definitions/commandPage.blp +++ /dev/null @@ -1,10 +0,0 @@ -using Gtk 4.0; - -StackPage commandPage { - title: _("Launch options"); - child: - Label { - label: "In the future, this will be a page for configuring launch options."; - wrap: true; - }; -} diff --git a/ui/definitions/gamescopePage.blp b/ui/definitions/gamescopePage.blp deleted file mode 100644 index b5a11cb..0000000 --- a/ui/definitions/gamescopePage.blp +++ /dev/null @@ -1,215 +0,0 @@ -using Gtk 4.0; -using Adw 1; - -StackPage gamescopePage { //[MODIFIED IN LUA]: This page is only shown if the game is using Proton. - title: "Gamescope"; - child: - Gtk.ScrolledWindow { - Adw.Clamp { - Box { - margin-bottom: 16; - margin-end: 12; - margin-start: 12; - margin-top: 16; - orientation: vertical; - spacing: 24; - vexpand: true; - vexpand-set: true; - - Adw.PreferencesGroup { - title: "Gamescope"; - description: _("Gamescope is a tool from Valve that allows for games to run in an isolated XWayland instance."); - Adw.ActionRow { - title : _("Enable Gamescope"); - subtitle: _("May cause compatibility issues with some utilities and Wayland-native games."); - activatable-widget: gamescope_Switch; - - sensitive: bind gamescope_Switch.sensitive bidirectional; - has-tooltip: bind gamescope_Switch.has-tooltip bidirectional; - tooltip-text: bind gamescope_Switch.tooltip-text bidirectional; - - Gtk.Switch gamescope_Switch { - active: false; - sensitive: false; - valign: center; - } - } - } - - Adw.PreferencesGroup { - title: _("Resolution"); - description: _("Resolution settings for both the game and the Gamescope window."); - - sensitive: bind gamescope_Switch.active; - - Adw.ExpanderRow { - title: _("Game resolution"); - subtitle: _("The resolution the game will run at."); - - sensitive: bind gamescope_Resolution_Switch.active; - - Adw.SpinRow gamescope_Resolution_Internal_Width_SpinRow { - title: _("Width"); - subtitle: _("The width of the game's internal resolution."); - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 7680; - step-increment: 10; - }; - } - Adw.SpinRow gamescope_Resolution_Internal_Height_SpinRow { - title: _("Height"); - subtitle: _("The height of the game's internal resolution."); - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 7680; - step-increment: 10; - }; - } - } - - Adw.ExpanderRow { - title: _("Window resolution"); - subtitle: _("The resolution of the Gamescope window."); - - sensitive: bind gamescope_Resolution_Switch.active; - - Adw.SpinRow gamescope_Resolution_External_Width_SpinRow { - title: _("Width"); - subtitle: _("The width of the Gamescope window."); - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 7680; - step-increment: 10; - }; - } - Adw.SpinRow gamescope_Resolution_External_Height_SpinRow { - title: _("Height"); - subtitle: _("The height of the Gamescope window."); - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 7680; - step-increment: 10; - }; - } - } - - [header-suffix] - Switch gamescope_Resolution_Switch { - active: false; - sensitive: bind gamescope_Switch.active; - valign: center; - } - } - - - Adw.PreferencesGroup { - title: _("Framerate"); - description: _("The maximum framerate the game will run at."); - - sensitive: bind gamescope_Switch.active; - - Adw.SpinRow gamescope_Framerate_Normal_SpinRow { - title: _("Normal"); - subtitle: _("The framerate when the game is focused."); - sensitive: bind gamescope_Framerate_Switch.active; - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 244; - step-increment: 1; - }; - } - Adw.SpinRow gamescope_Framerate_Unfocused_SpinRow { - title: _("Unfocused"); - subtitle: _("The framerate when the game is not focused."); - sensitive: bind gamescope_Framerate_Switch.active; - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 244; - step-increment: 1; - }; - } - - [header-suffix] - Switch gamescope_Framerate_Switch { - active: false; - sensitive: bind gamescope_Switch.active; - valign: center; - } - } - - Adw.PreferencesGroup { - title: _("Filtering"); - description: _("Makes the game look smoother at lower resolutions."); - - sensitive: bind gamescope_Switch.active; - - Adw.ComboRow gamescope_Filtering_Filter_ComboRow { - title: _("Filter"); - subtitle: _("The filter to use. (NIS = Nvidia Image Scaling, FSR = FidelityFX Super Resolution)"); - sensitive: bind gamescope_Filtering_Switch.active; - model: Gtk.StringList { - strings ["Linear", "Nearest", "FSR", "NIS", "Pixel"] - }; - } - Adw.SpinRow gamescope_Filtering_Sharpness_SpinRow { - title: _("Sharpness"); - subtitle: _("Sets the sharpness of the filter. (0 = maximum sharpness, 20 = minimum)"); - sensitive: bind gamescope_Filtering_Switch.active; - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 20; - step-increment: 1; - }; - } - - [header-suffix] - Switch gamescope_Filtering_Switch { - active: false; - sensitive: bind gamescope_Switch.active; - valign: center; - } - } - - Adw.PreferencesGroup { - title: _("Extras"); - description: _("Additional settings for GameScope."); - - sensitive: bind gamescope_Switch.active; - - Adw.ActionRow { - title: _("Window type"); - subtitle: _("The type of window to use for the Gamescope window."); - - Box { - styles ["linked"] - - ToggleButton gamescope_Borderless_Toggle { - label: _("Borderless"); - valign: center; - } - ToggleButton gamescope_Fullscreen_Toggle { - label: _("Fullscreen"); - valign: center; - } - } - } - } - } - } - }; -} diff --git a/ui/definitions/mainWindow.blp b/ui/definitions/mainWindow.blp deleted file mode 100644 index b7b88ae..0000000 --- a/ui/definitions/mainWindow.blp +++ /dev/null @@ -1,147 +0,0 @@ -/* - Why not use LGI directly instead ? - - Because LGI doesn't support well in GTK4 many things that can be easily defined here. - Still, both are by FAR a much better solution than using XML directly. - Plus, I feel like using a universal standard would be a good idea to make it easier for people to contribute. -*/ - -using Gtk 4.0; -using Adw 1; - -Adw.ApplicationWindow mainWindow { - default-height: 500; - default-width: 700; - height-request: 400; - show-menubar: true; - width-request: 360; - - // AdwBreakpoint used to dynamically make the sidebar appear or disappear depending on the window's width. - Adw.Breakpoint { - condition ("max-width: 600sp") - setters { - sidebarToggleButton.visible: true; - sidebarToggleButton.active: false; - gameSettings_SplitView.collapsed: true; - } - } - - [content] - Adw.ToastOverlay toastSystem { //[INTERACTS WITH LUA] - Adw.NavigationView mainView { - /* - MAIN PAGE - This is the page the program starts on when it's launched. - */ - Adw.NavigationPage mainPage { - title: _("SimpleSteamTinker"); - Adw.ToolbarView mainPageTopbar { - [top] - Adw.HeaderBar { - styles ["titlebar"] - - [end] - Button aboutLauncher { - icon-name: "help-about-symbolic"; - styles ["image-button"] - } - } - - // This is where the games are listed. - ScrolledWindow { - hscrollbar-policy: never; - - Adw.Clamp { - margin-bottom: 16; - margin-end: 12; - margin-start: 12; - margin-top: 16; - - Adw.PreferencesGroup gameList { //[MODIFIED IN LUA] - description: _("Insert \"sst %command%\" as a game\'s launch options to enable it here.\nCommand may change depending on installation method."); - title: _("Detected Steam games"); - } - } - } - } - } - - // This is the page that shows up when you click on a game. - Adw.NavigationPage gameSettings { //[INTERACTS THROUGH LUA] - title: _("Game settings"); - Adw.ToolbarView gameSettingsTopbar { - [top] - Adw.HeaderBar { - styles ["titlebar"] - - // Button that allows you to toggle the sidebar in the game settings page. - ToggleButton sidebarToggleButton { //[MODIFIED IN LUA][INTERACTS THROUGH LUA] - active: true; - visible: false; - has-frame: false; - icon-name: "view-sidebar-start-symbolic"; - } - } - - Adw.OverlaySplitView gameSettings_SplitView { - /* - SIDEBAR - */ - min-sidebar-width: 200; - show-sidebar: bind sidebarToggleButton.active bidirectional; - sidebar: - Adw.NavigationPage gameSettingsSidebar { - title: _("Sidebar"); - child: - Adw.ToolbarView { - Box { - orientation: vertical; - vexpand: true; - vexpand-set: true; - - // This is the header of the sidebar of the game settings page. - Picture Sidebar_Banner { - halign: fill; - valign: fill; - } - - // This is the list of pages in the sidebar of the game settings page. - StackSidebar { - vexpand: true; - vexpand-set: true; - stack: gameSettingsStack; - } - } - }; - }; - - /* - CONTENT - */ - content: - Adw.NavigationPage { - title: _("Game settings"); - Stack gameSettingsStack { - transition-type: crossfade; - - //[overviewPage.blp] - - //[settingsPage.blp] - - //[utilitiesPage.blp] - - //[commandPage.blp] - - //[protonPage.blp] - - //[gamescopePage.blp] - - //[cleanerPage.blp] - } - }; - } - } - } - } - } -} \ No newline at end of file diff --git a/ui/definitions/overviewPage.blp b/ui/definitions/overviewPage.blp deleted file mode 100644 index be9264d..0000000 --- a/ui/definitions/overviewPage.blp +++ /dev/null @@ -1,279 +0,0 @@ -using Gtk 4.0; -using Adw 1; - -StackPage overviewPage { //[INTERACTS IN LUA] - name: "overviewPage"; - title: _("Overview"); - - child: - ScrolledWindow { - hscrollbar-policy: never; - styles ["background"] - - Box { - orientation: vertical; - - Picture Overview_Picture { //[MODIFIED IN LUA] - halign: fill; - valign: fill; - height-request: 256; - } - - Adw.Clamp { - Box { - margin-bottom: 16; - margin-end: 12; - margin-start: 12; - margin-top: 16; - orientation: vertical; - spacing: 24; - vexpand: true; - vexpand-set: true; - - Box { - orientation: vertical; - spacing: 8; - halign: center; - - // Game title - Label gameTitle { //[MODIFIED IN LUA] - halign: center; - valign: end; - wrap: true; - - styles [ - "title-1" - ] - } - - // ProtonDB Rating - Box protonDBRating_Box { - orientation: horizontal; - spacing: 8; - halign: center; - Label { - label: _("ProtonDB Rating :"); - halign: center; - valign: end; - - styles [ - "dim-label" - ] - } - Label protonDBRating_Label { //[MODIFIED IN LUA] - label: _("Unavailable"); - halign: center; - valign: end; - - styles [ - "dim-label" - ] - } - } - } - - // Launch button - Button gameLaunchButton { //[INTERACTS THROUGH LUA] - halign: center; - valign: end; - - Adw.ButtonContent { - icon-name: "media-playback-start-symbolic"; - label: _("Launch"); - } - - styles [ - "suggested-action", - "image-button", - "pill" - ] - } - - // SimpleSteamTinker Status - Adw.PreferencesGroup { - Adw.ActionRow { - title: _("SimpleSteamTinker Status"); - subtitle: _("Based on the game's launch options."); - subtitle-lines: 1; - - [suffix] - Label gameStatus_Label { //[MODIFIED IN LUA] - label: _("Placeholder"); - halign: end; - wrap: true; - styles [ - "dim-label" - ] - } - } - } - - // Game details - Adw.PreferencesGroup { - title: _("Details"); - description: _("Information about the game."); - - Adw.ActionRow { - title: _("Steam AppID"); - subtitle: _("The unique ID of the game that identifies it in Steam."); - activatable-widget: gameID_copyButton; - [suffix] - Box { - spacing: 8; - Label gameID_Label { //[MODIFIED IN LUA] - halign: end; - wrap: true; - selectable: true; - styles [ - "dim-label" - ] - } - Button gameID_copyButton { //[MODIFIED IN LUA][INTERACTS WITH LUA] - halign: end; - icon-name: "edit-copy-symbolic"; - styles [ - "image-button", - "flat", - "circular" - ] - } - } - } - Adw.ActionRow { - title: _("Platform"); - subtitle: _("The intended platform for the installed game version."); - - [suffix] - Label gamePlatform_Label { //[MODIFIED IN LUA] - halign: end; - wrap: true; - styles [ - "dim-label" - ] - } - } - Adw.ActionRow { - title: _("Size"); - subtitle: _("The amount of space the game takes up on the system."); - - [suffix] - Label gameSize_Label { //[MODIFIED IN LUA] - halign: end; - lines: 1; - styles [ - "dim-label" - ] - } - } - Adw.ActionRow gameLocation_ActionRow { //[MODIFIED IN LUA] - title: _("Install location"); - tooltip-text: _("The location of the game's files on the system."); - has-tooltip: true; - activatable-widget: gameLocationButton; - subtitle-lines: 2; - [suffix] - Button gameLocationButton { //[MODIFIED IN LUA] - Adw.ButtonContent { - icon-name: "folder-open-symbolic"; - } - styles [ - "image-button", - "flat", - "circular" - ] - } - } - Adw.ActionRow gameCompatdata_ActionRow { //[MODIFIED IN LUA] - title: _("Virtual filesystem location"); - tooltip-text: _("The location of the game's virtual filesystem assigned by Steam. (Only applies to Windows games)"); - has-tooltip: true; - activatable-widget: gameCompatdataButton; - subtitle-lines: 2; - [suffix] - Button gameCompatdataButton { //[MODIFIED IN LUA] - Adw.ButtonContent { - icon-name: "folder-open-symbolic"; - } - styles [ - "image-button", - "flat", - "circular" - ] - } - } - } - - // Links - Adw.PreferencesGroup { - title: _("Online help"); - description: _("Links to useful pages related to the game."); - - Adw.ActionRow { - title: _("ProtonDB"); - activatable-widget: protonDBPage_Button; - [suffix] - Button protonDBPage_Button { //[MODIFIED IN LUA] - Adw.ButtonContent { - icon-name: "help-browser-symbolic"; - } - styles [ - "image-button", - "flat", - "circular" - ] - } - } - - Adw.ActionRow { - title: _("PCGamingWiki"); - activatable-widget: PCGamingWikiPage_Button; - [suffix] - Button PCGamingWikiPage_Button { //[MODIFIED IN LUA] - Adw.ButtonContent { - icon-name: "help-browser-symbolic"; - } - styles [ - "image-button", - "flat", - "circular" - ] - } - } - - Adw.ActionRow { - title: _("SteamDB"); - activatable-widget: steamDBPage_Button; - [suffix] - Button steamDBPage_Button { //[MODIFIED IN LUA] - Adw.ButtonContent { - icon-name: "help-browser-symbolic"; - } - styles [ - "image-button", - "flat", - "circular" - ] - } - } - - Adw.ActionRow { - title: _("Steambase"); - activatable-widget: SteambasePage_Button; - [suffix] - Button SteambasePage_Button { //[MODIFIED IN LUA] - Adw.ButtonContent { - icon-name: "help-browser-symbolic"; - } - styles [ - "image-button", - "flat", - "circular" - ] - } - } - } - } - } - } - }; -} diff --git a/ui/definitions/protonPage.blp b/ui/definitions/protonPage.blp deleted file mode 100644 index 551d6c9..0000000 --- a/ui/definitions/protonPage.blp +++ /dev/null @@ -1,225 +0,0 @@ -using Gtk 4.0; -using Adw 1; - -StackPage protonPage { //[MODIFIED IN LUA]: This page is only shown if the game is using Proton. - title: "Proton / Wine"; - - child: - Gtk.ScrolledWindow { - Adw.Clamp { - Box { - margin-bottom: 16; - margin-end: 12; - margin-start: 12; - margin-top: 16; - orientation: vertical; - spacing: 24; - vexpand: true; - vexpand-set: true; - - Adw.PreferencesGroup { - title: "Direct3D"; - description: _("Configure Direct3D settings."); - - Adw.ExpanderRow { - title: _("Versions"); - subtitle: _("Control which versions of Direct3D can be used by this game. If you are unsure, leave all versions enabled."); - - Adw.ActionRow { - title: _("Direct3D 9"); - subtitle: _("Only applies to GE Proton."); - activatable-widget: Direct3D9_Switch; - sensitive: bind Direct3D9_Switch.sensitive bidirectional; - has-tooltip: bind Direct3D9_Switch.has-tooltip bidirectional; - tooltip-text: bind Direct3D9_Switch.tooltip-text bidirectional; - - Gtk.Switch Direct3D9_Switch { - active: true; - valign: center; - } - } - Adw.ActionRow { - title: _("Direct3D 10"); - activatable-widget: Direct3D10_Switch; - sensitive: bind Direct3D10_Switch.sensitive bidirectional; - has-tooltip: bind Direct3D10_Switch.has-tooltip bidirectional; - tooltip-text: bind Direct3D10_Switch.tooltip-text bidirectional; - - Gtk.Switch Direct3D10_Switch { - active: true; - valign: center; - } - } - Adw.ActionRow { - title: _("Direct3D 11"); - activatable-widget: Direct3D11_Switch; - sensitive: bind Direct3D11_Switch.sensitive bidirectional; - has-tooltip: bind Direct3D11_Switch.has-tooltip bidirectional; - tooltip-text: bind Direct3D11_Switch.tooltip-text bidirectional; - - Gtk.Switch Direct3D11_Switch { - active: true; - valign: center; - } - } - Adw.ActionRow { - title: _("Direct3D 12"); - subtitle: _("Only applies to GE Proton."); - activatable-widget: Direct3D12_Switch; - sensitive: bind Direct3D12_Switch.sensitive bidirectional; - has-tooltip: bind Direct3D12_Switch.has-tooltip bidirectional; - tooltip-text: bind Direct3D12_Switch.tooltip-text bidirectional; - - Gtk.Switch Direct3D12_Switch { - active: true; - valign: center; - } - } - } - - Adw.ActionRow { - title: _("Use WineD3D instead of DXVK"); - subtitle: _("Use OpenGL-based WineD3D instead of Vulkan-based DXVK for D3D11 and D3D10."); - activatable-widget: WineD3D_Switch; - sensitive: bind WineD3D_Switch.sensitive bidirectional; - has-tooltip: bind WineD3D_Switch.has-tooltip bidirectional; - tooltip-text: bind WineD3D_Switch.tooltip-text bidirectional; - - Gtk.Switch WineD3D_Switch { - active: false; - valign: center; - } - } - } - - Adw.PreferencesGroup { - title: "AMD FidelityFX Super Resolution 1.0"; - description: _("Note : this feature requires GE Proton, and is not restricted to AMD GPUs."); - - [header-suffix] - Switch Wine_FSR_Switch { - active: false; - sensitive: true; - valign: center; - } - - Adw.SpinRow Wine_FSR_Sharpness_SpinRow { - title: _("Sharpness"); - subtitle: _("The strength of the filter. (0 = strongest, 5 = weakest)"); - sensitive: bind Wine_FSR_Switch.active; - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 5; - step-increment: 1; - }; - } - - Adw.ComboRow Wine_FSR_Upscaling_Resolution_Mode_ComboRow { - title: _("Upscaling resolution mode"); - subtitle: _("Depending on what preset value you choose and your system, Proton will set an upscaling resolution automatically."); - sensitive: bind Wine_FSR_Switch.active; - model: Gtk.StringList { - strings ["None", "Performance", "Balanced", "Quality", "Ultra"] - }; - } - - Adw.ExpanderRow { - title: _("Custom resolution"); - subtitle: _("Note : overrides the upscaling resolution mode. This shouldn't be needed in most cases."); - sensitive: bind Wine_FSR_Switch.active; - - Adw.ActionRow { - title: _("Enable the usage of a custom resolution"); - Switch Wine_FSR_Resolution_Switch { - active: false; - sensitive: bind Wine_FSR_Switch.active; - valign: center; - } - } - Adw.SpinRow Wine_FSR_Resolution_External_Width_SpinRow { - title: _("Width"); - sensitive: bind Wine_FSR_Resolution_Switch.active; - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 7680; - step-increment: 10; - }; - } - Adw.SpinRow Wine_FSR_Resolution_External_Height_SpinRow { - title: _("Height"); - sensitive: bind Wine_FSR_Resolution_Switch.active; - numeric: true; - adjustment : - Gtk.Adjustment { - lower: 0; - upper: 7680; - step-increment: 10; - }; - } - } - } - - Adw.PreferencesGroup { - title: _("NVIDIA features"); - - Adw.ActionRow { - title : _("Disguise NVIDIA GPUs as AMD"); - subtitle: _("Force NVIDIA GPUs to always be reported as AMD GPUs. Some games require this if they depend on Windows-only NVIDIA driver functionality."); - subtitle-lines: 3; - - activatable-widget: Hide_NVIDIA_GPU_Switch; - sensitive: bind Hide_NVIDIA_GPU_Switch.sensitive bidirectional; - has-tooltip: bind Hide_NVIDIA_GPU_Switch.has-tooltip bidirectional; - tooltip-text: bind Hide_NVIDIA_GPU_Switch.tooltip-text bidirectional; - - Gtk.Switch Hide_NVIDIA_GPU_Switch { - active: false; - valign: center; - } - } - Adw.ActionRow { - title : _("Enable NVAPI"); - subtitle: _("Enable NVIDIA's NVAPI GPU support library."); - subtitle-lines: 3; - - activatable-widget: Enable_NVAPI_Switch; - sensitive: bind Enable_NVAPI_Switch.sensitive bidirectional; - has-tooltip: bind Enable_NVAPI_Switch.has-tooltip bidirectional; - tooltip-text: bind Enable_NVAPI_Switch.tooltip-text bidirectional; - - Gtk.Switch Enable_NVAPI_Switch { - active: false; - valign: center; - } - } - } - - Adw.PreferencesGroup { - title: "Wine"; - - Adw.ActionRow { - title: _("Synchronization"); - Box { - styles ["linked"] - - ToggleButton ESync_Toggle { - label: "ESync"; - valign: center; - active: true; - } - ToggleButton FSync_Toggle { - label: "FSync"; - valign: center; - active: true; - } - } - } - } - } - } - }; -} diff --git a/ui/definitions/settingsPage.blp b/ui/definitions/settingsPage.blp deleted file mode 100644 index 6c5669b..0000000 --- a/ui/definitions/settingsPage.blp +++ /dev/null @@ -1,59 +0,0 @@ -using Gtk 4.0; -using Adw 1; - -StackPage settingsPage { //[MODIFIED IN LUA]: This page is only shown if the game is using Proton. - title: _("Settings"); - child: - Gtk.ScrolledWindow { - Adw.Clamp { - Box { - margin-bottom: 16; - margin-end: 12; - margin-start: 12; - margin-top: 16; - orientation: vertical; - spacing: 24; - vexpand: true; - vexpand-set: true; - - Adw.PreferencesGroup { - title: "Recommended"; - description: _("Settings recommended for the best experience."); - Adw.ActionRow { - title : _("Use dedicated graphics card"); - subtitle: _("Use your dedicated graphics card to boost performance by a lot, in exchange for higher power consumption."); - subtitle-lines: 3; - - activatable-widget: dGPU_Switch; - sensitive: bind dGPU_Switch.sensitive bidirectional; - has-tooltip: bind dGPU_Switch.has-tooltip bidirectional; - tooltip-text: bind dGPU_Switch.tooltip-text bidirectional; - - Gtk.Switch dGPU_Switch { - active: false; - sensitive: false; - valign: center; - } - } - Adw.ActionRow { - title : _("Enable SDL's Wayland driver"); - subtitle: _("This option can give you smoother gameplay and performance in SDL-based games on Wayland. Useless on X11."); - subtitle-lines: 3; - - activatable-widget: SDL_Wayland_Switch; - sensitive: bind SDL_Wayland_Switch.sensitive bidirectional; - visible: bind SDL_Wayland_Switch.visible bidirectional; - has-tooltip: bind SDL_Wayland_Switch.has-tooltip bidirectional; - tooltip-text: bind SDL_Wayland_Switch.tooltip-text bidirectional; - - Gtk.Switch SDL_Wayland_Switch { - active: false; - sensitive: true; - valign: center; - } - } - } - } - } - }; -} diff --git a/ui/definitions/utilitiesPage.blp b/ui/definitions/utilitiesPage.blp deleted file mode 100644 index 5e87575..0000000 --- a/ui/definitions/utilitiesPage.blp +++ /dev/null @@ -1,93 +0,0 @@ -using Gtk 4.0; -using Adw 1; - -StackPage utilitiesPage { - title: _("In-game utilities"); - - child: - Adw.ClampScrollable { - Box { - margin-bottom: 16; - margin-end: 12; - margin-start: 12; - margin-top: 16; - orientation: vertical; - spacing: 24; - - Adw.PreferencesGroup { - title: "Recommended"; - description: _("Utilities recommended for the best experience."); - Adw.ActionRow { - subtitle: _("GameMode is a tool to optimize Linux system performance on demand."); - title: "Feral GameMode"; - activatable-widget: gamemode_Switch; - has-tooltip: bind gamemode_Switch.has-tooltip bidirectional; - tooltip-text: bind gamemode_Switch.tooltip-text bidirectional; - sensitive: bind gamemode_Switch.sensitive bidirectional; - - Switch gamemode_Switch { //[MODIFIED IN LUA][INTERACTS WITH LUA] - active: false; - sensitive: false; - valign: center; - } - } - } - - Adw.PreferencesGroup { - title: _("Utilities"); - description: _("Utilities that can be used while the game is running, depending on your needs."); - - // Adw.SwitchRow seem to be buggy-ish. The value gets inverted, and clicking directly on the button - // doesn't send the signal I need to run the functions. - - Adw.ActionRow { - subtitle: _("A Vulkan and OpenGL overlay for monitoring FPS, temperatures, CPU/GPU load and more... May not work on some native OpenGL games."); - subtitle-lines: 2; - title: "MangoHud"; - activatable-widget: mangohud_Switch; - has-tooltip: bind mangohud_Switch.has-tooltip bidirectional; - tooltip-text: bind mangohud_Switch.tooltip-text bidirectional; - sensitive: bind mangohud_Switch.sensitive bidirectional; - - Switch mangohud_Switch { //[MODIFIED IN LUA][INTERACTS WITH LUA] - active: false; - sensitive: false; - valign: center; - } - } - - Adw.ActionRow { - subtitle: _("Convert OpenGL games to Vulkan."); - subtitle-lines: 2; - title: "Zink"; - activatable-widget: zink_Switch; - has-tooltip: bind zink_Switch.has-tooltip bidirectional; - tooltip-text: bind zink_Switch.tooltip-text bidirectional; - sensitive: bind zink_Switch.sensitive bidirectional; - - Switch zink_Switch { //[MODIFIED IN LUA][INTERACTS WITH LUA] - active: false; - sensitive: false; - valign: center; - } - } - - Adw.ActionRow { - subtitle: _("obs-gamecapture is a tool that captures a game window and plugs it into OBS Studio as a source with minimal overhead."); - subtitle-lines: 2; - title: _("OBS Game Capture"); - activatable-widget: obs_gamecapture_Switch; - has-tooltip: bind obs_gamecapture_Switch.has-tooltip bidirectional; - tooltip-text: bind obs_gamecapture_Switch.tooltip-text bidirectional; - sensitive: bind obs_gamecapture_Switch.sensitive bidirectional; - - Switch obs_gamecapture_Switch { //[MODIFIED IN LUA][INTERACTS WITH LUA] - active: false; - sensitive: false; - valign: center; - } - } - } - } - }; -} diff --git a/ui/main.ui b/ui/main.ui deleted file mode 100644 index e9d7cb2..0000000 --- a/ui/main.ui +++ /dev/null @@ -1,1190 +0,0 @@ - - - - - 500 - 700 - 400 - true - 360 - - - max-width: 600sp - true - false - true - - - - - - - - - SimpleSteamTinker - - - - - - - - help-about-symbolic - - - - - - - - 2 - - - 16 - 12 - 12 - 16 - - - Insert "sst %command%" as a game's launch options to enable it here. -Command may change depending on installation method. - Detected Steam games - - - - - - - - - - - - - Game settings - - - - - - - - true - false - false - view-sidebar-start-symbolic - - - - - - - 200 - - - - Sidebar - - - - - 1 - true - true - - - 0 - 0 - - - - - true - true - gameSettingsStack - - - - - - - - - - - Game settings - - - 1 - - - overviewPage - Overview - - - 2 - - - - 1 - - - 0 - 0 - 256 - - - - - - - 16 - 12 - 12 - 16 - 1 - 24 - true - true - - - 1 - 8 - 3 - - - 3 - 2 - true - - - - - - 0 - 8 - 3 - - - ProtonDB Rating : - 3 - 2 - - - - - - Unavailable - 3 - 2 - - - - - - - - - - 3 - 2 - - - media-playback-start-symbolic - Launch - - - - - - - - - - SimpleSteamTinker Status - Based on the game's launch options. - 1 - - - Placeholder - 2 - true - - - - - - - - - - Details - Information about the game. - - - Steam AppID - The unique ID of the game that identifies it in Steam. - gameID_copyButton - - - 8 - - - 2 - true - true - - - - - - 2 - edit-copy-symbolic - - - - - - - - - - Platform - The intended platform for the installed game version. - - - 2 - true - - - - - - - - Size - The amount of space the game takes up on the system. - - - 2 - 1 - - - - - - - - Install location - The location of the game's files on the system. - true - gameLocationButton - 2 - - - - - folder-open-symbolic - - - - - - - - - - Virtual filesystem location - The location of the game's virtual filesystem assigned by Steam. (Only applies to Windows games) - true - gameCompatdataButton - 2 - - - - - folder-open-symbolic - - - - - - - - - - - - Online help - Links to useful pages related to the game. - - - ProtonDB - protonDBPage_Button - - - - - help-browser-symbolic - - - - - - - - - - PCGamingWiki - PCGamingWikiPage_Button - - - - - help-browser-symbolic - - - - - - - - - - SteamDB - steamDBPage_Button - - - - - help-browser-symbolic - - - - - - - - - - Steambase - SteambasePage_Button - - - - - help-browser-symbolic - - - - - - - - - - - - - - - - - - - - - - Settings - - - - - - - 16 - 12 - 12 - 16 - 1 - 24 - true - true - - - Recommended - Settings recommended for the best experience. - - - Use dedicated graphics card - Use your dedicated graphics card to boost performance by a lot, in exchange for higher power consumption. - 3 - dGPU_Switch - - - - - - false - false - 3 - - - - - - - Enable SDL's Wayland driver - This option can give you smoother gameplay and performance in SDL-based games on Wayland. Useless on X11. - 3 - SDL_Wayland_Switch - - - - - - - false - true - 3 - - - - - - - - - - - - - - - - - In-game utilities - - - - - 16 - 12 - 12 - 16 - 1 - 24 - - - Recommended - Utilities recommended for the best experience. - - - GameMode is a tool to optimize Linux system performance on demand. - Feral GameMode - gamemode_Switch - - - - - - false - false - 3 - - - - - - - - - Utilities - Utilities that can be used while the game is running, depending on your needs. - - - A Vulkan and OpenGL overlay for monitoring FPS, temperatures, CPU/GPU load and more... May not work on some native OpenGL games. - 2 - MangoHud - mangohud_Switch - - - - - - false - false - 3 - - - - - - - Convert OpenGL games to Vulkan. - 2 - Zink - zink_Switch - - - - - - false - false - 3 - - - - - - - obs-gamecapture is a tool that captures a game window and plugs it into OBS Studio as a source with minimal overhead. - 2 - OBS Game Capture - obs_gamecapture_Switch - - - - - - false - false - 3 - - - - - - - - - - - - - - - Launch options - - - In the future, this will be a page for configuring launch options. - true - - - - - - - Proton / Wine - - - - - - - 16 - 12 - 12 - 16 - 1 - 24 - true - true - - - Direct3D - Configure Direct3D settings. - - - Versions - Control which versions of Direct3D can be used by this game. If you are unsure, leave all versions enabled. - - - Direct3D 9 - Only applies to GE Proton. - Direct3D9_Switch - - - - - - true - 3 - - - - - - - Direct3D 10 - Direct3D10_Switch - - - - - - true - 3 - - - - - - - Direct3D 11 - Direct3D11_Switch - - - - - - true - 3 - - - - - - - Direct3D 12 - Only applies to GE Proton. - Direct3D12_Switch - - - - - - true - 3 - - - - - - - - - Use WineD3D instead of DXVK - Use OpenGL-based WineD3D instead of Vulkan-based DXVK for D3D11 and D3D10. - WineD3D_Switch - - - - - - false - 3 - - - - - - - - - AMD FidelityFX Super Resolution 1.0 - Note : this feature requires GE Proton, and is not restricted to AMD GPUs. - - - false - true - 3 - - - - - Sharpness - The strength of the filter. (0 = strongest, 5 = weakest) - - true - - - 0 - 5 - 1 - - - - - - - Upscaling resolution mode - Depending on what preset value you choose and your system, Proton will set an upscaling resolution automatically. - - - - - None - Performance - Balanced - Quality - Ultra - - - - - - - - Custom resolution - Note : overrides the upscaling resolution mode. This shouldn't be needed in most cases. - - - - Enable the usage of a custom resolution - - - false - - 3 - - - - - - - Width - - true - - - 0 - 7680 - 10 - - - - - - - Height - - true - - - 0 - 7680 - 10 - - - - - - - - - - - NVIDIA features - - - Disguise NVIDIA GPUs as AMD - Force NVIDIA GPUs to always be reported as AMD GPUs. Some games require this if they depend on Windows-only NVIDIA driver functionality. - 3 - Hide_NVIDIA_GPU_Switch - - - - - - false - 3 - - - - - - - Enable NVAPI - Enable NVIDIA's NVAPI GPU support library. - 3 - Enable_NVAPI_Switch - - - - - - false - 3 - - - - - - - - - Wine - - - Synchronization - - - - - - ESync - 3 - true - - - - - FSync - 3 - true - - - - - - - - - - - - - - - - - - - Gamescope - - - - - - - 16 - 12 - 12 - 16 - 1 - 24 - true - true - - - Gamescope - Gamescope is a tool from Valve that allows for games to run in an isolated XWayland instance. - - - Enable Gamescope - May cause compatibility issues with some utilities and Wayland-native games. - gamescope_Switch - - - - - - false - false - 3 - - - - - - - - - Resolution - Resolution settings for both the game and the Gamescope window. - - - - Game resolution - The resolution the game will run at. - - - - Width - The width of the game's internal resolution. - true - - - 0 - 7680 - 10 - - - - - - - Height - The height of the game's internal resolution. - true - - - 0 - 7680 - 10 - - - - - - - - - Window resolution - The resolution of the Gamescope window. - - - - Width - The width of the Gamescope window. - true - - - 0 - 7680 - 10 - - - - - - - Height - The height of the Gamescope window. - true - - - 0 - 7680 - 10 - - - - - - - - - false - - 3 - - - - - - - Framerate - The maximum framerate the game will run at. - - - - Normal - The framerate when the game is focused. - - true - - - 0 - 244 - 1 - - - - - - - Unfocused - The framerate when the game is not focused. - - true - - - 0 - 244 - 1 - - - - - - - false - - 3 - - - - - - - Filtering - Makes the game look smoother at lower resolutions. - - - - Filter - The filter to use. (NIS = Nvidia Image Scaling, FSR = FidelityFX Super Resolution) - - - - - Linear - Nearest - FSR - NIS - Pixel - - - - - - - - Sharpness - Sets the sharpness of the filter. (0 = maximum sharpness, 20 = minimum) - - true - - - 0 - 20 - 1 - - - - - - - false - - 3 - - - - - - - Extras - Additional settings for GameScope. - - - - Window type - The type of window to use for the Gamescope window. - - - - - - Borderless - 3 - - - - - Fullscreen - 3 - - - - - - - - - - - - - - - - - - - Cleaner - - - In the future, this page will allow you to do some cleaning up. - true - - - - - - - - - - - - - - - - - - - - diff --git a/ui/update-ui.lua b/ui/update-ui.lua deleted file mode 100644 index b61c29e..0000000 --- a/ui/update-ui.lua +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/lua - ---[[ - This script should be used after modifying any of the ui_definitions files. - It will compile the ui_definitions files into ui files that GTK can use. - If you do not, the modifications you've made to the UI outside of Lua code will not be applied. - - This is basically a workaround for LGI not working well with Gtk templates or to assemble widgets together in general right now. -]] - --- Define the list of files to compile -local baseFile = "mainWindow.blp" -local files = { - [baseFile] = false, - ["overviewPage.blp"] = false, - ["utilitiesPage.blp"] = false, - ["settingsPage.blp"] = false, - ["commandPage.blp"] = false, - ["gamescopePage.blp"] = false, - ["protonPage.blp"] = false, - ["cleanerPage.blp"] = false, -} - --- Add their contents to the list -for file, _ in pairs(files) do - local f = io.open("ui/definitions/"..file, "r") - if not f then - print("Error: Could not open file "..file) - os.exit(1) - end - files[file] = f:read("*all") - f:close() -end - -local function removeUsageLines(content) - local lines = {} - for line in content:gmatch("[^\r\n]+") do - if not line:find("using ") or not line:find(";") then - table.insert(lines, line) - end - end - return table.concat(lines, "\n") -end - --- Inside the contents of each file, replace comments written like "//[FILENAME]" with the respective content -for file, content in pairs(files) do - local newContent = {} - for line in content:gmatch("[^\r\n]+") do - - local fileName = line:match("//%[(.+)%]") - if fileName then - local fileContent = files[fileName] - if fileContent then - print("Inserting "..fileName.." into "..file..".") - table.insert(newContent, removeUsageLines(fileContent)) - else - table.insert(newContent, line) - end - else - table.insert(newContent, line) - end - - end - files[file] = table.concat(newContent, "\n") -end - --- Write it into a location -local location = "/tmp/main.blp" -local f = io.open(location, "w") -if not f then - print("Error: Could not open file "..location) - os.exit(1) -end -f:write(files[baseFile]) -f:close() - --- Make the blueprint with blueprint-compiler -local command = "blueprint-compiler compile "..location.." > ui/main.ui" -print(command) -os.execute(command) -os.remove(location) \ No newline at end of file From 62c26328d3232caa53a9871749d0b1ec7a3b154e Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Sun, 1 Sep 2024 20:21:33 +0200 Subject: [PATCH 02/20] refactor: Organize more into modules --- .luaurc | 8 + Source/Metadata/init.luau | 13 ++ Source/Steam/Configuration.luau | 199 ++++++++++++++++++ Source/Steam/Utilities.luau | 43 ++++ .../Steam/VDFParser.luau | 127 +++++------ Source/Steam/init.luau | 3 + Source/Utilities/Filesystem.luau | 71 +++++++ .../Utilities/Logging.luau | 86 ++++---- Source/Utilities/init.luau | 4 + Source/init.luau | 40 ++++ assets/desktop/system.desktop | 8 - assets/icons/256x256.png | Bin 21964 -> 0 bytes assets/icons/scalable.svg | 144 ------------- assets/screenshots/ViewLight.ora | Bin 417586 -> 0 bytes assets/screenshots/ViewLight.png | Bin 208520 -> 0 bytes general/fs_utils.luau | 105 --------- general/init.luau | 5 - init.luau | 3 + main.luau | 38 ---- metadata/init.luau | 20 -- steam/init.luau | 4 - steam/steam_utils.luau | 39 ---- 22 files changed, 500 insertions(+), 460 deletions(-) create mode 100644 .luaurc create mode 100644 Source/Metadata/init.luau create mode 100644 Source/Steam/Configuration.luau create mode 100644 Source/Steam/Utilities.luau rename steam/vdf_parser.luau => Source/Steam/VDFParser.luau (65%) create mode 100644 Source/Steam/init.luau create mode 100644 Source/Utilities/Filesystem.luau rename general/log_system.luau => Source/Utilities/Logging.luau (59%) create mode 100644 Source/Utilities/init.luau create mode 100644 Source/init.luau delete mode 100755 assets/desktop/system.desktop delete mode 100644 assets/icons/256x256.png delete mode 100644 assets/icons/scalable.svg delete mode 100644 assets/screenshots/ViewLight.ora delete mode 100644 assets/screenshots/ViewLight.png delete mode 100644 general/fs_utils.luau delete mode 100644 general/init.luau create mode 100644 init.luau delete mode 100644 main.luau delete mode 100644 metadata/init.luau delete mode 100644 steam/init.luau delete mode 100644 steam/steam_utils.luau diff --git a/.luaurc b/.luaurc new file mode 100644 index 0000000..632b85a --- /dev/null +++ b/.luaurc @@ -0,0 +1,8 @@ +{ + "languageMode": "strict", + "aliases": { + "Metadata": "./Source/Metadata", + "Steam" : "./Source/Steam", + "Utilities" : "./Source/Utilities" + } +} diff --git a/Source/Metadata/init.luau b/Source/Metadata/init.luau new file mode 100644 index 0000000..265a25f --- /dev/null +++ b/Source/Metadata/init.luau @@ -0,0 +1,13 @@ +local process = require("@lune/process") + +return { + name ="STweaks", + description = "A work-in-progress fast, simple and modern Libadwaita alternative to SteamTinkerLaunch.", + version="indev", + folders = { + config = process.env.HOME.."/.config/Stweaks", + gamesConfig = process.env.HOME.."/.config/Stweaks/games", + storage = process.env.HOME.."/.local/share/Stweaks", + cache = process.env.HOME.."/.cache/Stweaks" + } +} diff --git a/Source/Steam/Configuration.luau b/Source/Steam/Configuration.luau new file mode 100644 index 0000000..f91b0d8 --- /dev/null +++ b/Source/Steam/Configuration.luau @@ -0,0 +1,199 @@ +local process = require("@lune/process") + +local Logging = require("../Utilities").Logging +local SteamUtilities = require("Utilities") +local VDFParser = require("VDFParser") + +type loginusers_vdf = { + users : { + [number] : { + AccountName : string, + --PersonaName : string, + --RememberPassword : boolean, + --WantsOfflineMode : boolean, + --SkipOfflineModeWarning : boolean, + --AllowAutoLogin : boolean, + MostRecent : boolean, + --TimeStamp : number, + SteamID3 : number -- Added manually later on + } + } +} +type localconfig_vdf = { + UserLocalConfigStore : { + Software : { + Valve : { + Steam : { + apps : { + [number] : { + --[[cloud : { + last_sync_state : string?, + quota_bytes : number?, + quota_files : number?, + used_bytes : number?, + used_files : number?, + }?, + LastPlayed : number?, + Playtime : (number | boolean)?, + BadgeData : string?,]]-- + LaunchOptions : string?, + --[[Playtime2wks : boolean?, + autocloud : { + lastexit : number, + lastlaunch : number, + }?]] + } + } + } + } + } + } +} +type libraryfolders_vdf = { + libraryfolders : { + [number] : { + apps : { + [number] : number + }, + --contentid : number, + --label : string, + path : string, + --time_last_update_corruption : number | boolean, + --totalsize : boolean, + --update_clean_bytes_tally : number | boolean + } + } +} + +local Configuration = {} + +Configuration.Private = {} +Configuration.Public = {} + +-- Public + +function Configuration.Public.getSteamConfiguration() : string? + --[[ + Chapter 1 : We recover the Steam user config so we can get the last active user. + And also the SteamID3 to access their settings folder. + ]] + local userConfiguration = Configuration.Private.getUsersConfiguration() + if typeof(userConfiguration) == "string" then + return userConfiguration -- Error + end + + local activeUserID = Configuration.Private.getMostRecentUserID(userConfiguration) + local userParameters = userConfiguration.users[activeUserID] + + --[[ + Chapter 2 : We recover the user config to get which games have the tool enabled. + This section would normally have quite an impact on performance. + Thanks to some optimizations, however, the time is cut from 0.5 seconds to 0.04 seconds on my computer. + ]] + local localconfig_vdf = Configuration.Private.getLocalConfigVDF(userParameters.SteamID3) + if typeof(localconfig_vdf) == "string" then + return localconfig_vdf -- Error + end + local userGameConfigurations = localconfig_vdf.UserLocalConfigStore.Software.Valve.Steam.apps + + --[[ + Chapter 3 : We recover the Steam library config to get the list of games. + We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. + ]] + local libraries = Configuration.Private.getLibraries() + if typeof(libraries) == "string" then + return libraries -- Error + end + + return +end + +-- Private + +-- loginuser.vdf + +function Configuration.Private.getUsersConfiguration() : loginusers_vdf | string + Logging.write("data", "Detecting user config...") + local timeStart = os.clock() + + local result, usersData: loginusers_vdf = pcall(VDFParser.parseFile, (process.env.HOME.."/.local/share/Steam/config/loginusers.vdf")) + if not result then + return "Failed to parse loginusers.vdf." + else + Logging.write("speed", timeStart) + + for userID,userParameters in pairs(usersData.users) do + userParameters.SteamID3 = SteamUtilities.convertToSteamID3(userID) + end + + return usersData + end +end + +function Configuration.Private.getMostRecentUserID(userData : loginusers_vdf) : number + local activeUserID + for id,data in pairs(userData.users) do + if data.MostRecent == true then + activeUserID = id + end + end + return activeUserID +end + +-- localconfig.vdf + +function Configuration.Private.getLocalConfigVDF(SteamID3 : number) : localconfig_vdf | string + Logging.write("data", "Detecting active user game configs...") + local timeStart = os.clock() + + local appParseSettings = { + file = process.env.HOME.."/.local/share/Steam/userdata/"..SteamID3.."/config/localconfig.vdf", + stopKeyList = { + "UserLocalConfigStore", + "Software", + "Valve", + "Steam", + "apps" + }, + wordsFromLinesToRemove = { + "CachedCommunityPreferences", + "UIStoreLocalState", + "CachedStorePreferences", + "CachedNotificationPreferences", + "SteamVoiceSettings_", + "UIStoreLocalSteamUIState", + "UIStoreLocalGamepadState", + "GetEquippedProfileItemsForUser", + "CTextFilterStore_strBannedPattern", + "CTextFilterStore_strCleanPattern", + "trendingstore_storage", + "playnextstore_storage", + "GetEquippedProfileItemsForUser" + } + } + + local result, localconfig_vdf: localconfig_vdf = pcall(VDFParser.parseFile, appParseSettings.file, appParseSettings.stopKeyList, appParseSettings.wordsFromLinesToRemove) + if not result then + return "Failed to parse active user localconfig.vdf with SteamID3 : "..SteamID3 + else + Logging.write("speed", timeStart) + return localconfig_vdf + end +end + +-- libraryfolders.vdf + +function Configuration.Private.getLibraries() : libraryfolders_vdf | string + Logging.write("data", "Detecting games...") + local timeStart = os.clock() + + local result, libraryFolders: libraryfolders_vdf = pcall(VDFParser.parseFile, process.env.HOME.."/.local/share/Steam/config/libraryfolders.vdf") + if not result then + return "Failed to parse libraryfolders.vdf." + else + Logging.write("speed", timeStart) + return libraryFolders + end +end + +return Configuration.Public diff --git a/Source/Steam/Utilities.luau b/Source/Steam/Utilities.luau new file mode 100644 index 0000000..1977dde --- /dev/null +++ b/Source/Steam/Utilities.luau @@ -0,0 +1,43 @@ +local process = require("@lune/process") + +--[=[ + Minor Steam-related helper functions. +]=] +local Utilities = {} + +--[=[ + Checks if the arguments are from Steam or not. + Non-Steam game support later on will probably necessitate changes. + + @return If the program was launched from Steam. +]=] +function Utilities.isSteamLaunch(): boolean + local arguments = process.args + + if ( + --arguments[1] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/reaper" and + arguments[2] == "SteamLaunch" and + arguments[3]:match("AppId=%d+") and + arguments[4] == "--" and + --arguments[5] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/steam-launch-wrapper" and + arguments[6] == "--" + ) then + return true + else + return false + end +end + +--[=[ + Converts SteamID64 to SteamID3. +]=] +function Utilities.convertToSteamID3(steamID: number): number + local offset_id = steamID - 76561197960265728 + local account_type = offset_id % 2 + local account_id = math.floor((offset_id - account_type) / 2) + account_type + + -- The -1 is meant to be a fix, but could also cause bugs by itself. Keep an eye out. + return (account_id * 2) - account_type - 1 +end + +return Utilities diff --git a/steam/vdf_parser.luau b/Source/Steam/VDFParser.luau similarity index 65% rename from steam/vdf_parser.luau rename to Source/Steam/VDFParser.luau index 98391c9..bc57d3b 100644 --- a/steam/vdf_parser.luau +++ b/Source/Steam/VDFParser.luau @@ -1,37 +1,79 @@ --!nocheck --Note : Temporary +local fs = require("@lune/fs") -local vdfParser = {} +local VDFParser = {} +VDFParser.Private = {} +--[=[ + Contains functions for parsing VDF files and strings. + Lune does not support VDF files natively at the moment. +]=] +VDFParser.Public = {} + +-- Public + +--[=[ + Parses a VDF file into a table. + + @param path string -- The path to the file. + @param stopKeyList {string}? -- Limits the parsing to the given key path. + @param wordsFromLinesToRemove {string}? -- A list of words that, if found in a line, will remove the line. Used for (bad) optimization. + @return The parsed table if successful. +]=] +function VDFParser.Public.parseFile(path: string, stopKeyList: {string}?, wordsFromLinesToRemove: {string}?): table + return VDFParser.Public.parseString(fs.readFile(path), stopKeyList, wordsFromLinesToRemove) +end --- Lune Modules -local fs = require("@lune/fs") +--[=[ + Parses a VDF string into a table. + + @param input string -- The VDF string to parse. + @param stopKeyList {string}? -- Limits the parsing to the given key path. + @param wordsFromLinesToRemove {string}? -- A list of words that, if found in a line, will remove the line. Used for (bad) optimization. + @return The parsed table if successful. +]=] +function VDFParser.Public.parseString(input: string, stopKeyList: {string}?, wordsFromLinesToRemove: {string}?): table + -- Remove every line that contains a word from wordsFromLinesToRemove + if wordsFromLinesToRemove then + local lines = {} + for line in input:gmatch("[^\r\n]+") do + local removeLine = false + for _, word in pairs(wordsFromLinesToRemove) do + if line:find(word) then + removeLine = true + break + end + end + if not removeLine then + table.insert(lines, line) + end + end + input = table.concat(lines, "\n") + end + + return VDFParser.Private.parse(input, stopKeyList) +end + +-- Private ---[[ - Name : function vdfParser.parseString(input, stopKeyList) - Description : Parses a VDF string into a table. - Arg 1 : input (string) : The VDF string to parse. - Arg 2 : stopKeyList (table) : A list of keys to stop the parsing at. Default : nil - Return : result (table) : The parsed table. -]] - --- Status : --- keyWait : We wait for a key --- readingKey : We are reading a key --- valueWait : We wait for a value --- readingValue : We are reading a value --- readingTableValue : We are reading a table value -type ReadStatus = "keyWait" | "readingKey" | "valueWait" | "readingTableValue" | "readingValue" - -function vdfParser.parseString(input, stopKeyList: {string}?): {[string]: any} +--[=[ + Parses a VDF string into a table. Private side of the parser. + + @param input string -- The VDF string to parse. + @param stopKeyList {string}? -- Limits the parsing to the given key path. + @return The parsed table if successful. +]=] +function VDFParser.Private.parse(input: string, stopKeyList: {string}?): table local result = {} + type ReadStatus = "keyWait" | "readingKey" | "valueWait" | "readingTableValue" | "readingValue" local status: ReadStatus = "keyWait" -- Temp Values - local tempKey: string, tempValue: string, tempRecursiveInput: string = "", "", "" + local tempKey, tempValue, tempRecursiveInput = "", "", "" - local indent: number = 0 - local previousChar: string = nil + local indent = 0 + local previousChar = nil -- Until we reached the end of the file for i = 1, #input do @@ -104,7 +146,7 @@ function vdfParser.parseString(input, stopKeyList: {string}?): {[string]: any} local actualKey: any if tonumber(tempKey) then actualKey = tonumber(tempKey) else actualKey = tempKey end - result[actualKey] = vdfParser.parseString(tempRecursiveInput, newStopKeyList) + result[actualKey] = VDFParser.Private.parse(tempRecursiveInput, newStopKeyList) end if stopKeyList and tempKey == stopKeyList[1] then @@ -139,39 +181,4 @@ function vdfParser.parseString(input, stopKeyList: {string}?): {[string]: any} return result end ---[[ - Name : function vdfParser.parseFile(path, stopKeyList, wordsFromLinesToRemove) - Description : Parses a VDF file into a table. - Arg 1 : path (string) : The path to the file to parse. - Arg 2 : stopKeyList (table) : A list of keys to stop the parsing at. Default : nil - Arg 3 : wordsFromLinesToRemove (table) : A list of words that, if found in a line, will remove the line. Default : nil - Return : result (table) : The parsed table. - - Note : Arg 2 and Arg 3 are critical for optimization in big files. Do not hesitate to use them. - Results such as going from 0.5 seconds to 0.04 seconds are possible. -]] -function vdfParser.parseFile(path: string, stopKeyList: {string}?, wordsFromLinesToRemove: {string}?): {[string]: any} - local content = fs.readFile(path) - - -- Remove every line that contains a word from wordsFromLinesToRemove - if wordsFromLinesToRemove then - local lines = {} - for line in content:gmatch("[^\r\n]+") do - local removeLine = false - for _, word in pairs(wordsFromLinesToRemove) do - if line:find(word) then - removeLine = true - break - end - end - if not removeLine then - table.insert(lines, line) - end - end - content = table.concat(lines, "\n") - end - - return vdfParser.parseString(content, stopKeyList) -end - -return vdfParser \ No newline at end of file +return VDFParser.Public diff --git a/Source/Steam/init.luau b/Source/Steam/init.luau new file mode 100644 index 0000000..dbe4676 --- /dev/null +++ b/Source/Steam/init.luau @@ -0,0 +1,3 @@ +return { + Configuration = require("Configuration") +} \ No newline at end of file diff --git a/Source/Utilities/Filesystem.luau b/Source/Utilities/Filesystem.luau new file mode 100644 index 0000000..3de9ef7 --- /dev/null +++ b/Source/Utilities/Filesystem.luau @@ -0,0 +1,71 @@ +local fs = require("@lune/fs") +local Logging = require("Logging") + +--[=[ + Utilities for filesystem operations. Mostly a remnant from SimpleSteamTinker. +]=] +local Filesystem = {} + +--[=[ + Creates a directory if it doesn't exist, or uses it if it does. + + @param path The path to create or use. + @return The path to the created or used directory. +]=] +function Filesystem.createOrUseDirectory(path: string): string + if not fs.isDir(path) then + Logging.write("debug", "Directory "..path.." not found. Creating it...") + fs.writeDir(path) + end + return path +end + +--[=[ + Gets the size of a file or directory. Unimplemented. + + @param path The path to get the size of. +]=] +function Filesystem.getSize(path: string): () + --TODO +end + +--[=[ + Converts a size in bytes to a human-readable size. + + @param size The size to convert. + @return The human-readable size. +]=] +function Filesystem.sizeToUnit(size: number): string + local units = {"B", "KB", "MB", "GB", "TB"} + + local unit + for i = 1, 5 do + if size > 1024 then + size = size / 1024 + unit = units[i] + end + end + + return string.format("%.2f", size).." "..unit +end + +--[=[ + Returns a table containing every filename matching a pattern in a directory. + + @param directory The directory to search in. + @param pattern The pattern to search for. + @return A table containing every filename matching the pattern. +]=] +function Filesystem.getFilenamePatternInDirectory(directory: string, pattern: string): {string} + local result = {} + + for _, file in fs.readDir(directory) do + if file:match(pattern) then + table.insert(result, file) + end + end + + return result +end + +return Filesystem diff --git a/general/log_system.luau b/Source/Utilities/Logging.luau similarity index 59% rename from general/log_system.luau rename to Source/Utilities/Logging.luau index eec4731..5f5d7a1 100644 --- a/general/log_system.luau +++ b/Source/Utilities/Logging.luau @@ -1,40 +1,26 @@ ---!strict -local logSystem = {} - ---[[ - Name : local function color(colorId, message) - Description : Colors a message. - Arg 1 : colorId (string) : The color's id. - Arg 2 : message (string) : The message to color. - Return : The colored message. -]] type LogColor = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "grey" | "orange" | "reset" -local function color(colorId: LogColor, message: string): string - local colorList = { - red = "\27[31m", - green = "\27[32m", - yellow = "\27[33m", - blue = "\27[34m", - magenta = "\27[35m", - cyan = "\27[36m", - white = "\27[37m", - grey = "\27[90m", - orange = "\27[91m", - reset = "\27[0m" - } - return colorList[colorId]..message..colorList["reset"] -end - ---[[ - Name : function logSystem.log(type, message) - Description : Logs a message. - Arg 1 : type (string) : The log type. - Arg 2 : message (string) : The message to log. - Return : nil -]] type LogType = "info" | "warning" | "error" | "debug" | "download" | "data" | "speed" -function logSystem.log(type: LogType, message: string | number) - local logReactions = { + +local Logging = {} +Logging.Private = {} +--[=[ + Contains functions for logging to the console. +]=] +Logging.Public = {} + +-- Public + +--[=[ + Writes a message in the logs. + + @param type string -- The log type. + @param message string -- The message to log. + @return nil +]=] +function Logging.Public.write(type: LogType, message: string | number) + local color = Logging.Private.colorText + + local logFunctions = { info = function(text) print("["..color("blue","Info").."] "..text) end, @@ -57,7 +43,33 @@ function logSystem.log(type: LogType, message: string | number) print("["..color("grey","Speed").."] ".."Done in "..os.clock()-startTime.." seconds.") end } - logReactions[type](message) + + logFunctions[type](message) +end + +-- Private + +--[=[ + Colors a text. + + @param colorName string -- The color's name. + @param text string -- The text to color. + @return string -- The colored text. +]=] +function Logging.Private.colorText(colorName: string, text: string): string + local colorList = { + red = "\27[31m", + green = "\27[32m", + yellow = "\27[33m", + blue = "\27[34m", + magenta = "\27[35m", + cyan = "\27[36m", + white = "\27[37m", + grey = "\27[90m", + orange = "\27[91m", + reset = "\27[0m" + } + return colorList[colorName]..text..colorList["reset"] end -return logSystem +return Logging.Public diff --git a/Source/Utilities/init.luau b/Source/Utilities/init.luau new file mode 100644 index 0000000..66ed92c --- /dev/null +++ b/Source/Utilities/init.luau @@ -0,0 +1,4 @@ +return { + Logging = require("Logging"), + Filesystem = require("Filesystem"), +} \ No newline at end of file diff --git a/Source/init.luau b/Source/init.luau new file mode 100644 index 0000000..e1ecc1f --- /dev/null +++ b/Source/init.luau @@ -0,0 +1,40 @@ +local Application = {} + +local process = require("@lune/process") +local fs = require("@lune/fs") + +local metadata = require("Metadata") +local Filesystem = require("Utilities").Filesystem +local Logging = require("Utilities").Logging +local Steam = require("Steam") + +function Application.start() + -- Startup time + local totalStartupTimeVar = os.clock() + + --[[ + Chapter 0 : Preparing the environment + We need to create the config folder if it doesn't exist. + ]] + + -- Create folders + for _, folder in ipairs({metadata.folders.config, metadata.folders.gamesConfig, metadata.folders.cache}) do + Filesystem.createOrUseDirectory(folder) + end + + -- Development version detection + if metadata.version:find("dev") then + Logging.write("warning", "DEVELOPMENT VERSION") + -- Put the arguments inside the cache folder for testing purposes + fs.writeFile(metadata.folders.cache.."/arguments.txt", table.concat(process.args, "\n")) + end + + --[[ + Chapter 1 : Game management + What's the Steam config ? Is this being started through Steam or alone ? What to do ?! + ]] + + local steamConfig = require("Steam").Configuration.getSteamConfiguration() +end + +return Application diff --git a/assets/desktop/system.desktop b/assets/desktop/system.desktop deleted file mode 100755 index c2e7d71..0000000 --- a/assets/desktop/system.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=SimpleSteamTinker -Icon=simplesteamtinker -Comment=A work-in-progress simple, fast and modern Adwaita alternative to SteamTinkerLaunch. -Exec=/usr/bin/sst -Terminal=false -Type=Application -Categories=Game; diff --git a/assets/icons/256x256.png b/assets/icons/256x256.png deleted file mode 100644 index 1796bc04ca771c2266682f192d0249ea67a92500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21964 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 diff --git a/assets/icons/scalable.svg b/assets/icons/scalable.svg deleted file mode 100644 index 0cec0ac..0000000 --- a/assets/icons/scalable.svg +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Button - - OutsideCircle - - - - - DotCircle - - - InsideCircle - - InsideCircle - - - Middle - - - - Arm - - - Hand - - - - - \ No newline at end of file diff --git a/assets/screenshots/ViewLight.ora b/assets/screenshots/ViewLight.ora deleted file mode 100644 index 54dd31a0103b8f9ac56443fabd777957b3b483bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 417586 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%0DCRJT17RSEy3W!lpo!2jU~y#9NC1XZjmmoQad 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%0AqNd|L_oR^|o8sFb_V>c`i^xPz= zEM{-d78eh! zH}3W!XCew|!rr5@Blm!RdJabk`S+8>?c&_V%p&2-^_YyO4Zq8oSfOuz4ez*BDr~Qx zE??_-NM>6y)j;LsG8$#yD&c-kY#=s~KI7i9%afW{J?AFL8}?N2`=@S&)dxMI zGXF{6#g=;jmDDWR%l3pFUNJ;BPK}FMFYNM#WYeSoAtAAD?e1Ub&>wkrtNQq{>+zFw zN0fBy;O=d`UsHj+A-ke<-;%Ry<>$ZEno}iK8&D1{a?kgtnb{t$B~U{T{j1qb2qFg=w+5eWFk<_@+=_U#j<+N1!eJ4ExaU zP`8`}{){}GMzjL6W?fHI)~jh%mdV2032h12yuEI+y{p;y*n)tZ>0O_2K2c;@vM9kG zP5M#*%SV?D_65^2x(XU6t;WtZUxD!v;GRjMUEYp8I=Ih2Mv3}&gMe%25%rnZ3q+&Q zCh*K`df@TY)}ce}Dlkz~0GvU!<7FHbfUBIEnShpFmGJdGCi|BYk#{3(c#2Su$cc$e zbx1==VqMaq*0fTmaba4i;6sn%n8}xbF7IMOfBF8j-6V;NXnly#$j$qAD3RK4%Uv|6 z3dU9vBfPc8(`{`~(b_=*nCDoDKIStsEg+J`ua-Z{f zFID}^Wv(tDrq2KC`-{uRfqSkbM@;Rc`yt9Wu{HjH18D6FS#L3l?gZF#8pwfPq;kV^I|o^!T&Q%FuTvX^bSz z$ay-GO@;u=U_32Q@TYfCymN}E5xB8>FsEJ7qWy@K_Ds#6MkbXa6ltRJbc}IwddrB~ z#K-${pX*WNJ+;UeD}YS7g=2{Ku=wXCg6Pp8ZKfpEyL-%P!V0}53jcz9j7jl16NXPX z;W$Lg;9wfsodS91M1{*2?JY-t|HN#|(84RPQSHqa@y(}0Q@aQHCS?-iX&7Zh8er+E zIqmQ5)c_||cE(ek&i@ow41?w%DG34*>CoC%cDv_;lgSS#;hYNAaSL>NXp1u5h$)n> zxOcpp+Yziv?vbM$lL<^%$RylF<=r33ya1Gjc0wPfE}dj9Scby1Rh>a!$ zHNDgpq=L|?4X~;+Io7S9Eqj=Y&S6*#$km6KIFTo+n4g;r-hF-BCBK8peC^kM zhZ&oO#UBR<1DLzgI}q|)=USN9?hV^JbkbVgJyr9~}V_>2}|D_PCDjQ#<}VeIymRk!^(4u38*UiAz^ea5N-?X>iC-FZg-_ zlgAImOo*CznPjjP`&!4L?zvEjA#B-pWBbC4Z74OI^LfKO>ObLkp#dfqtkJ*a@v9Z3 zl9M=TFQ&!0m}X{m+f0^&J=5WzMWE-vD`;q!;M?N3arhOw zK)!W)utl34P%T}%O5;(!>KUX{J@co7Ly+Vbz}l&abJ6Jc_P2+a^zI#}Qx!Cv;208M zYawJF>6dBU3J7R~87MUBn(T#s!P$NJ%gwgspwW}pBTWx#_jv&O7jaFW zbQ?6idLcQY&$?q3kyos>B|ohke8MC~6MXgX(_xURa=sY{N*>~STB(ZA^=h5^ww^XQ z{1rYeUJ9+6<4-bUP`qQ#F+G%wCac7qZr)Q#Oy19L0Eg}W5q4kH9($v%QWMk91 z^kgMHcH#s+ux*jJRq>df3LEbV$+@X(jJzh%hXquuz$LnjF|xR=O!$7S?1YdXKEm_m zcHjW-bzA&1zNLTzmE9*EM3dacE%lEvR zSEjw1>D(M9v)rG?$TPGIN(_HSF%Vg~M6z>^^Tp*NHcBQu|I3#Kf$^l+e^Hof#`|AU z+eaE9t8l2qO2mdt8^!5XGz7l%;HLRt>C|E^13e?yyO=<2M5ou(5u!aW(7c`seCRy)y`_B>-ndP_oLQZ^yURH}x5bSz;yNy{sQy()$gTs9Mss2mPCDX# z?+qa>dn?-88>De}SJTK1@{4(wrUFRG!*1^X{@93{1Zq^8bmA{x6}Ni0;?nwd%byv^ z4N*9{xoT!6cz)}e{(Z4Ej$!TtkEPVS4m^!-MF)l3?7l%$ zdH?>dMyO8E#h=9R*E9|*ae1Yqn7C3cQTm;qIW87D>lAJCrA!Fi`o{!K=& zpVv(a2y$8#tI|fbbkyd=k3jZ=ZesFmitUS_9}pVP3%ZD5>{!7lRemNHo@wk2pKHcJ zmw3pS4u3ajmP@t<6FKpI>@OvD;%W+B6=!3E*S}Nde3tCm31ELY4Q=Qps89>T)QEv68Y!dd*EkLtgV5M$KzaiA}SIL}EJU0*2|U#)a*ZJ)yf zy1dRMcpBV&9;Z-TIw;=L1Tj|7i=cA}I_Kd}@UdHApvTYE=Ytt<-Ba?WLxxD z*nQ!UZCoh{4c6#4V7Nz61+vAK$0SQVr5J8Kh?%(dMbE^;b2Y2_?tZyKQ6ZSu>jY7t zj+)`2d605+G-p#2{&%u;5<>D>tUpEeMAAW9(yvC4>w2yKQMs6ysMZ}`6@kgJR)q`! zS<^YY==wyR83ga3qsO|z@Yjbea)}M*LX8*-p}hF`B@)u9!Vwtu2NG^GIy?rS6TaDY zI?4G3WR9(8=JBA0dnl3;prt6W{Um`B=v^H?r+DpQjdDka=3||@xb>*1WsE)T=>zAl z$xR4+8q$s}dvgFkP-w&VshsoEDpc5pCz-`&r5U7lP5*RVJ(B!sbFk!$TuFyjyE;3! zA(6=0&=J{EP7J}SVEwfbdC%&3<(%YI#JgY@Yab9AeO&JTYn8j)E<%1gLRl5>#}BtY zzr?-d%_`$?6EyTasq}uys{7(O<3DAU3T&|?$Xv3jvDq{SOmZ;wh>ACGoko)8*YvF& zm@=)vuaKA@sNR|+mA;6!Z;t1G%KDrv5>TNa-f?MKeUhdJi3*5HW9slCnYNQ^tU6(z zOWIGW45k}QsZ}V8QScS&?sK$4fYi3Pf%RRc>%$%LxfN+^_tfbzVVZT+l!Pp6jXv=z z5BDW$@z#VA@vtsSjRED7sk@($gP3NH#LuexBeqebx{XnQEWRNoN+gkJH_vF+$}aM) zZ~o*E@G}YOrofCt45Q*dn{*jbuU`U!ylE7=enOzj3S+rOlk$x}pGY;LbvHwNl4WOf zAlLWfKj7V8$GdIHWQ|GkK(QV>dI^4*Fgq1<4lKDuc{B>w_<X3k;U6~rBr;_B(CdAWtLq8b9=P>A0Z2krkvnBHbvo(tXM$Gec%>^3ffC<$(i1zf z2n`mt5xdEGCm9zm+~@@YTdr~Jw5bf%CR<1}KQgh5@DH-LO04xjNNUy3r$mkhlzgok zK`|rvWE!f-s|eE|IWIRTX<0(qkRgIW+ou4Ht&~8CF&&dbT{Gl9Xkg@D>|01W1d}O~ z&dxb7Gjo~nY5Q@Dr9oj7*Bnx#+DMiT0wlOu>6B(-15@SU)ZE<7zGc0mR>ExGwdfg! zX=n!w%TZP06Hu3oe1eTT_poR)6z4)Dx2ccaly3LY<5w+8-n*nvV@G^ERJo=@%}sgW zmFuFf+clPIS*6Q#uyzlxnI9f9qu@q01EI=sWTebezk5g4-p6q>8yU&%+QCl9qxunq zsxG4@TY|0JnuSmSfKm|f6Kk1X0~R6*zD_i35b(2-S|pLgtMN-NVSP@sp@hQDe zd=eTlM)*`pxw7^e*(|`tzl4?B2du!fd-{XtY9|rz9e=4sdcuSN?tK8+R#*Iozx>`* zu)?S?B|7JE&>L8|H%M&wtE{7x0L$7M00d+^~3~e}R|me zR%fST#^<8z;&u;y(arIgpWc1t8=_xv9e$VYfNuTPIO{(;!8lq( zA+kj{X^q^tAtH zGoxYA*1f1YXZL1@#~F6L3Q4|r?@!6oW9w#tFuRekQY6Mi>ygWFq{pF_39=D>y0sT| zROz+LcqDlXROj{bqT`|>>*f*WeDQd@<;J?86OV33rO}^HUi26J`gZC9KI$m(S4flb z-jzGtB#o372r^S1_3#(HJtE zs;U5#S;G-tz5>!D?kNg3omT6^17GCeVD$a#Fnoa34-DA}4`U~%&Eu^ff2l37_qQ#~ z?9e}qr~eSNXN;yTgEia7Yt|hcOFHmC-=8TQ?*r=-e4>3_rS-mev6lSIj4!(@nKKq< zkd?~Jb$2(eVHp};pABP3*dy)SgdZkOu)W8rYRE}oVT4>ovJ{mpnlfk-Nk1RYLeIyt zUBhQpFWK?!8cDL7&109p!P1TdwXT^cF61NzpxPzxd;7MSG|#K6^#8B}v_UB# zBQTKw*tB;BNQd!kM01dWRBclzu$@u?6_>ZW_OVw*ksV~VMmQ{!-`j6T(<`2Z{9;H8 zxs@=y$9Py~qLX;`DsqB2mh8eaa-*+%98=vyEQ+ zD38AC*3^pjt+-zR-o>t(==2su*vO@`%K zt9`IkbrH3ZQ7-O-z3{=^;9@T`qoVF`)D~MG0VIHQ%=4wbRk368q7;LnciQM3)zf z4ePm+K&>&`4q0G!bDu{!Y-bw^x^9TfplC!>Q*P#$ZTs5u_vCd*D3}`)#J#625SvDD z!I98uXPtD?q(if*#2W60UM-L!#U7)m2ZwUD8-KArHr#&EnUyHN#d41uq?Oq*nL3tbzG>A zFo)h_5jz&kO4Cd~wZfa8cS?vJ(03Jll5e^9!!kI^nNPl&95p$EZcYzdeqc)(i?t4G zPb)AViA^Ye*z4~i>cA<36S%TcAYstEpBMXQ-R;ESzGeq)lnvV#71oZWaJ z`qW{PQI=Kpvgn<0kBJ=1-X`s9#Qbks#l{GLT`i+d+)$St{M`J`GKji2G(uy+h?*L? zs*Y^n7Ubc<8mw3*dA9B=NOooQNE5X6$o7){$QT$$#Cz_zZyB2VWzhjX@_YT`iM*LT zuYQSNk&K@|>^xX*w`9X*{^UK7-QXz@NaG@WQ_Ifho%R-6)_jI~F0-;jdbcht-qoGi z{)vpBR>#5`p5zlM%gR~GFr_#AVtQ}XzXHFCCoj)+^lYWWfv*iiCUK$@&YeK1kjtB_ zZS8=I)~n@gXVv)e(g@|6Be_Lm^U9z*&h*DeiLQ^)w;YD5iwRfTF(YTadIaa% zhd0&oD~Gx(9SX4~U;@IAN-*Dn)rkXl9~)URYa>k9Eg{9hgp2XeASsknA)&q2E6A=?$BpbJn}Oqi0+sGiOZP z7OeJ5mGVn_I(&d%I~2`84Cu)+MAm9DY>id!%Eq|;(3!#6_Bbxg-RvK|Qu5jdpQq965twE&M7 z13%{HQ~DOiRui8c+R4uh;tef7W^x!dy(7}^(*}I#CuUy63@mEzXq}p$&#;kFRE_1} zs`5Je61hacCHQy`Ply+PN>txs#*XWFpH2IG>>7+%_Vn`dQpsZmgYZ}AD;d>wn=A*k zbPOhJn|^(eqsDI8QT-b;iRwKhd1UPM=@ES@Y5u2?$~DCWdZ4;#h6Z?&Ft z9JE_Jl;$YOq}{^fW5t{}m|#Kj?OS9}8wr-&bKH6cooQw7u=E0$M1M&R zX58&e@N{-Gk5gDlyl^or_umgx+ME)7IFfQO;pHK5IuuY! ztxjs7;s={n3I3#q#b24LO;QnvF1M{7yTGY#?V-*({ z{4rfIjZaEqA0p18-%2l`#6&P0hL>RV+D0Umev=<`l>12+nQk?jeDTM=+Aj z4Yx0NcnboIu-~`7xhM}C4@|h#(_fMV4~mUANjSENINV+{e_^DL^szR&(?-AuIU^ur z-rq%Ww*F+8svYO6cQqjlPw6^hK5Fu1%JN?hIe)a|D`w1E2~gKpN;OkxP(hT ziQa$3emRzY0fwG<4veyNURFz!guVg`kwBufCMaXSo-g*W@4?# zG4HVmt-Q&G9fT}G)6?ny0F9tSRf&Yewbi9S2*Y+>UbwZBi)BpSEuz^t(y|Px#Ijg@ zB1d+VK$Hy=qiveFIrEj4iDgUVX#jz6sQ-iQZ4u$1+GIu))=fJBmx{lRUki zTph}ZBY)C++?*t(h7Mo1M)0Ll%i|_>!>tCcvR>s-WX&!9DE?GXawjgOL}oz7=5}y@ zgfW&B2PKLB2mC)S=lICOff2V~-Y0kQaX8I1Q zKd3u33~M`be^1UU$d@`D&Z55nNMn=*x%8_%i(<=O(tr-C@l51LEP=K-Ce{0axWoS$ zR&9>N{g>N&2dahm@0nI!Rmg?oTMaR9XOWR29A2FUb8i#()a*d0nQuy&y4Y4K$@W;| z395-GK5Ll*N^`glr|Z(r3eA6=al=eW!pVPCtYtCHF4XYhf4&-uak05V(^HJ?ByRGm zVD(Am&DX%s9d}N=#ucvzhwgc|-3l-+7fcQE{~nkaJF(n8pS7@^KTl!iKy8<)I6Lw( z#DY^nASWb@n}Hh6GOB&IW_?~o-%Z1`0&iAXW2DSasQ%+me-XTr=UW0FvA%uTEZOIF zl0rru(j5sob`#@qFJ8OHJK+Ju?|~VCS&1<>G1<5y%VrWZZHZg3*ka%9Ka8g*M_Mm9 z>BX+VP-eU1&u-srY|C$xZhY08>OFtX4#$C5ZRG&r&$b zmGIwzr#IKvWjGS=y%iNNkxECahj;4gl04&w5as!ehU;DgL_G4l%JoT<|Am~&{|Pxm zk!zngRS8Ceqx3LU%hp8K_p&=T4}MaLI3EO_(kG)@1Cg+HAs;U!Rw()c^uF4B&EY50 zPT5>Mw~Khg4j|yrVNIy{J-tl7X1mdNAG2-D>5!rSxjw&YjQ75x{)5@g^wmHuhh;b* zBOWa%fVL&iZ}K{!a>F1(jPb39b45%XhRrTj@L=G>6vhQ_fj0E?R8iP)#reRv|5W%7 zhXS>B{F@cgxVr73%M=l5Xma@!66x$$BlAV?pDkGHo7`Rg7s8EN(OP-bB6q$pfjrnH zH+o;IK!5eBF3ufEaMv@?1p7mwu>S_#0vc`-dc-zhd^Pb<;iDZgED$#ur9sHALjgcL zqJ>;~r^W-6+wM;Wb=;2%2ez6R8DyPr7Mv*ST6}969}9sEx+J8wp3u_38COL6-hc?l zN78&iM|PsBzv!j6_NEO7CcCqXcN+(w;oWyn*Bz_5mcOjlFT5NC<}_{nec2_c1rEKntUR2;a zlDt3%vE8l|B$duk>~570B=#0!iZW;=;ssZ`PzI$<|D5+XZ*u4RY_0Wiw&% zA);JGYMhr!ly<2#Vtyv)ymkvmdLA#psu?vO=Q8=7&*M2KoyeMIQH)xO!>*#X^ZJo7L}f?-u>6Y$PR z+vZz@R#*^M&WNvQXwUNec?R7d+ECq&nzoZhC>bw)*63uu5A4K&<@@ki<%ZDV^5*7BzkCJv@{2J$mi41Y`ktF4 zp9a^1&v`zP2DoCue*ASytFWS))s82A=A7Hhqr4u6C^T(+G)qK>Wx_dcYL%{6i_47b zlk8atez0@ooxzuS%Qh6EN%=)NHIG|#9j0>=ync}zU`WsmVak8JT%f=#@~INcw{OC7jZW zk`KFoQthnSw%8de9kW-A4Y3?yNoa*#*C995XWrtMQv z6_p?mOWnbYpZ%bsf2xHc!4LHTPNUbITUQZ&UPFYFD=GUq}$wr*AMV)MYx ztnLR>G6|h!Qnwdf(E}K{nD5>CVsT4Ld0SCGr^oH9S2{dSa+xkS4O`kCzj5mR%top0 zob?7X#gA-Q$saAQUZfNbovh0Z1%k2zQAe~6J)kHO38?>F+!GFam%<9qbUlL;0 zu0tH>D$a&z^bM@*_707St9bS z`oog`ZgS03vFwYblIJ-kn_UR*R;t8EbL6m8lxU^HmFxfGvHhk(*E8*I(esbn-m6Q? zUW?Vbcr1i~XD{uaD=_rKIwRe1a*EH_Yd&{k zUU|B^_+(7`(EDAeaP3^=4GKHU{|+91$BAb&&SLMej2XXL$f?tq%$^*jYkO7Kj94_t z7tWB#D%Yw2&Y&Ce-}UPI%$MtgKm{L)>Gi|=Tcm4!WN$F4I`da$U(4-sm~2DQlFNu( zeH1zRoZ`ASnUVr%nZzN(v6QY95+ss!6%1t?Msa8oQ>9mf&K2KQG!I~CHS>0R)U zDohp4tU?=jH_s89%YvETa~m7>F_1&`zGd281grauq8QFSVRDx$kjL8DCuz%`7X|M5 zfV<$`D4%?M!m-YZVR6?1c1Lix)?^LUwvEmE`0il820O@X$P3j-(Zb>D zTx~OJiL*dcpAD**2Y=GS-%1GTZrExHvgG+S1O%Ky@=9$>8tt<_ngs z$Nok`89VIxy|w&^YzjqtW;}TfeSLC`Vdk;6PN@drlZ4W@V`mHat}i8}G)JRI6f_3v z-Vba28b+!WF*Z-T{}>_Cw{mR9k-e=2r=QI%yF8dAPf@G-LLa`&=`t^kWA+~IcsEnC zFabeTedGmGRFW~D0w_72qA1_4yLZ8jeLdff77~hb{*8!)4$;e?HT4hF zL~F`E8wD1PYmQ?7rw@cQ;}vPpp4aT6$DX1QW9}bfspW;Kc7CJk$%QA4M-ypHx?G-7 zwf><)*)nS}F~U@f$iW~$hI1@WosmEtdYhvWvg0u$6>A}zP=NS6o>gU3IRR7%;{b=V zL3v=AaI1!SemqabfhrTiH>sZyr%IX4b`>-s@nOrGjhkw#tvxS-(U6Rg`!u91t40-) zF^G|ckn)r+6P^pf#i`Xg3NFWxN&YE}y`P=hH>Z~xG&DGES5rd#68Ah^pfWRu*{*9g zSS&|rtWPZnBAwh<{85A!b-j2)Quo5+pfbGSZZ$G>^<_e~@L>WE)jWk;FwtA5BSME< zmR5)2{wAN%tiY;hH&i(NU{SVoJQp2synd3ep|<9J(=D)w{H0LTF0v(UO?2-s zWahSahtw)1hFDd$La{;mFQi{s6~PMVvwI^u`{BGhR zwqXux2e?-o=+&YhUP!csB4W)r$)rfMvRjp3-7xq*@f%lZC?vxxNlIBtoCj8ynALIr z+IHkxVq5OBbK9MZe~(ZXDrY~7-YPl(M_lW%t`Q zzFE%j?+aPCG$&LESpA4!q%Q2S82ps*EOQ;*b}=7SXWAm!a_$oCZ%>6nwq9muuQ>|; zUov1NfA$>`QJrKM1}|9}nJ{j?waJu)Eo^mySgct5UXpppP_8aX7*V2px3XelaIr{$ z@Rv(OsZ@{sepBNgbt%aN6SML?KaHHdsJA)qyE!7O=v~TPQMTnv`Zk#eura9Mr6g-7 zFRTCTD4^uD!(dY)g_V@#cvh=v(t2)4lK2(bjVncyXZ#Yq42%kUXT%N(E_H81b9@M(vmf*no0-5t(Vab4ENhI<2OVldAZp?=$szWAB&9DhkFD(j`|kk};*K?B4xXRbKMFRmYX(yAS| z5v#*TXYm~B!(a1-}^{#o>dxc_fc6s*6odrDj-%QC*Y45KIXU!bvRwD;? zs*#W4U{6u~eaGhMU_9t%OU$kP11CcAEIembyiIOSkQ6t6#;=wzcW z*rr}zK_COFQq6Ue%M(S0L+{~uQtIjK1WCe4B$W{pcI^h5UTI70-`GB-K83Aa5bYp) zrCG)3Db4S!)v<|;e09yje6H~G2j=#E{5!=Zw5QpH)nJvEly9t*q!d!56B!&KN4n6j zqnuoQj`u_JchF-@l|AMAlxD<(U*&T|(A8tdV$6nPfBskb;ONM~WuJCxFmPr@wWRtp z3r>t{^Mwa*SzQ&?(&@D?#t_l5ew$R6XXGrNDPgZ+-_Q`!vS&CWD*VrW8h*LgXNBq; zJS8b^aZ?SR$BFaq!adtT6a+T^&*ZA4Oadb`28qgfnjF!t{rQ9-^%pfi2pRRe_}mpK zT!ua}4wZySy`{XRBZblJ&+d`5*1ZTW&;3uT?(prrq9fi-g|Q49ZeMP^TEHonB9XM1 zvs%YmbGo$uBQX6z0yki(IY%ud_D)WxwQBu0j<9Bez4`HJ`?S_8g1!WemQMHp6{2Ez zrBI__J7m{{zRj)uKqKou^9EbADkf)5MY^B6bES1CaIN}Bj)bTTm6JVZ))^Lk5UTFM z6}vsOxwPL789+A4RpFDoZHzno9U>*~;)7qUoBt5eIKm|L)?V81;a~(0vC+B2SExS1R!%?k^a@7#cjh$By^Wm$rO+&s+5qAOUeX zF53tdJTCFB#F&kru~bLRt<(A&7BPb%h%SOmEJ^XK)p@-EFFeb(ypITplsJQroKK%` zUeH%`h(`H$UHf?%e|yIggKR+KkE~)MHaTSXDl(1XoyKI|_sN$9$h5zb(%5Kjs2#Z} zZMS|!h?!At2q?Q=Vs_@GL`AJP(;-FwXkXY^y+SXRIZY=pk`mz-rTfH~YQ)94>=Ag{ zdX~!YF`4+iH$L%t$X0-`gu+BG8f8^p9|GF-#wV5H-y#mh0pn7>Qk+%D3Zfcv9fF5$ zFjO4Arx>b-x39Y~tcexj?IB%kk}(cXkA(Dktr8jA*CMe6NV~i@dq|er+O2m-cRGB& z$>-bjOxnN9$#K(dBG>FXt&k4oC@pABn5${~xqZDV-kg2r&qu4BOv`*aaL(|4boV&K zt{DtzSn)~S&h(66kuEOj6mPIW_xfb)951a-U-JQ5k)CYBBFR{RUPR}TWN*Xc_WoV> zAY+&(Muaoo>(`kt{?Et!ivA(ejy2d)g^0KeSl_8OoShDLvD6e);kC>ta-S9GMAdSa zRb-M#Dh;^{cGLvT&fCA?%Bo1x(hJXk>-yqX2D_}F--*%r6)hggIhJ!T>|+9_Rr-$T zNB|EO!dz<63_734WzSiiVb;4J^>RG>g)ga+#EQ5C5elGcj5}S&=!u`7t_!)x(I1LSiCB0+*K{K|a4ics6*qh!|~mL^C$Y z*D`v&v`9dRf==xFya$~yUt^z&$m_z-y71!I$#f zVWwN{OYU88nZDM|jJ%E6^>B_{yNQ%!U~JNmVY#5?_t~&40;%V{XfgD11)q4TofD4c z`L1?|41G|!36z{YstkQS{3fZG27fH~g{hN;GDsMAUw@Kmug1d9%|{A@FImb-Q@gn3 z?GuL##PSKcbo!k?YZWJZm)5T-jQD()EEyfgTz;BX4^2czbM-_q(m>bgaCW0%2*ayR zAP5s3bAR7dL&YeD#h8c4@o)%Wtk58B25dyBJ}2ud*S&fTjPMxhjJHvReN)%JBY(Su_0=u3_J-mgZ zo9A&&&><%vAo`d(;`Vs+R^!*(+6B5vmi!Xx7_#D(F-c)AP5F;LXM>cjCzH}UJmiRG zrd0ZOeeBm;49oAXJO3s#^IZLQ&WocBgXe!ZpL09SPh8(4Af{wUuXDa4jFRd({d2H8 zLx$QCDPM*$A{81m_Cl89&-nk26GS1ZvN|&X^Y3aeyEt{C7(=k0Q?bS%tsxsI8mdSZ zuH?4Ve-$v0maeP`n{_A5<7*Cl%A=N?e%n3UyfM1R$a1Ce7IAsb;BSxabnoOZJA#r~ zddaFkF5XpiTsr=?|nr{RKtwv{4GHdU!t4r@7MW)IQ8UNbw$RkkP;nr zAF7y&W3cRNRmHW4KACTv2Rxt3SIFbAnNvR!NmR>Jv7Zu58gKoTzF=2Zw6sRr$RUD@ zbj1Gb^txd|S4wqt2+2VAA}t6<%wPlZcW0KZcOt~g`s=b7u{v(;+dQpk#4nIF_8vRHz zl9ccoY^Lu_{B>JO!11k`+@Mz6tPcH9)}Pt!SWb<2Cru$7{RZjlsYJHjGRY(y3C3rG zQ=<>VRQrka%=5(A+Y{6Th*AEdn1^a8ebG5d$fh`Og1vFta9=1N;}K;}%&6?@-%Bdj zDqym`i~l)75i%H}@)GGSjniip%`KCYk)nY_@AFdLF}j$`jXv-#4A^Gi#{*4E$a>R4f7L^c8hBt#W|;S#=1 z9yRsarD3S?Fo|7WKoXO(F~QvkAOKiEr@z&^Th2T=8)m5a@Ja}#JXigCqQKtY?PzI! ze(iQ76^>AS_(T2&nw|}L9?6E4+_MOmmJutq0G_qQl}EOfr!Le+_j3wS%^0$mOp0V& z-}?ufIpmvkG?glqIK7d~OTOasMgE^bXD(u>GxnYoDGAvuKE_hm>)1e%T})DJ2@*7O zslpDimX@%StUQYStEe13f8w8^L~G1(h{N9$w+W4ni#9NX2pf^8vMY#OmZJ;Iy>u0A z8}zUUB6Rx-c_S1@>?U_85g3QjRLSwOF;}Z*vueetyvuS!;5#z0Cc~7)R&SjXXEZ2} zk%@U`wbPamr)vNAU4R-5b;bFYLU2)!8U`m(mQ2%oA<8r0Dig22{VpDwcI87HGIzGD*vnl_sc%shNHsf)pWK+I)9-Y6L;EbTK1e| z6`gF8qhE{m1nR5NHn(T8{!~0l=4r?~YvIht#Ed1>T$a2Z>hvE8WyX66wzP4ctEy&2 zk)^wo`Me^zI`r3wJ|ySpH{{DFh`>E2jJawl%UBcwtw{Tz_DzH`gey=}jVnk&o+iXk zOHLx~RxZf+D{HnMD+A+JXmD-zntuG2T_ZBD(Ydr)9dq1O+*d(voKYHjE9;Lw`?8OZ z#}B-E54VZt4Gy(RGJl!d?|dKqo(@}9jH|ZoIJ#G#Ipjx1F{xcse|?LjNq3U&Y!$OA z1Vg5WxZoaa$Uzc~o1;J*fn8QnsqBLNsS7FcApc@k{ew&>E$v@BDOTz(^T0@>^Xh39 z0VlLz4Mr>BcV?lGQ=J%7+}vFP?h=XFmMq@K#|Mr=O7a&kf_0i}MVIwL5i+Jq-xIy0 zGs?p6chG;)GWC1VO?`iyF4$*7xG&TU@o6Ihm(s;G*l7{?ih z##K@6?}~Y5KQ4}+xc{FoWbl2>Vj_o;GG+W!B!xzp=8Oo>=N1@6rYYuX9YA)xE+a~T zahCU>V0@?_WW1w+O+G7PTc(6mY=~$X(DR$RISBrA!nGBBnlueCAOcc>=TO*u8rrs5o zmm|;h3OTXknkQW@tdTvJ94p<1cmuhh3{9!OPe(8-P=M;oETh-6qVU3!gVQeLpGYS| zI40*9shGZXs72Xp%u$yd6vkzUmn84r5cczxOLB!x3Uyc~qa2^V@IA?NTst!^=~l!% z=jhtx)xY~|YY2aTymE(L(?uk-(mw*nG=gsaR^3ekJ_l!`8_Q`@jP~z9**DT3?d^j{ zt>Mf(`MqybLiNW-JL{?G`5`yl)9%+k5L>Kq5V*%-S8xcp(=;O0(2*mxsLJTp5O!6Z| z3ENP~`$46&Z(TKxL;wy3xZn~92o9!pugn@2>)0d+)zKMX*FE}9nEg%N?;Ed4;O*@1 zr17T_L+(dH?cx@YiHF@ zt+3~4@mMKh`|}d^q1rc=k%<1McW^>x9&K2y%(b!Dd=g07=pyAbXEBE8b(rrF<75P= zk5*O;Sa9tB9$=^IMIJV+2yu+5x1S+>6SZ%3AcGsLCRr{FaGn3$_d1j2|9uf65&LtIIE_ z$FTHbS>=C3eWcgc*46-oDM$<7s@X)jmtL1FUmBsW9>B0kK^FvnpnFe$}JAL z*Ti-${N)&`fEVb$iq2;7zV`VVY?tRSNZSOGDHuA_i<{U`k<1)_i@*b+xw4+65oHfoNM&lMu~MT zbi;Ssn>UrH#w=#()5uek$p6^)Gbqh{lzEJ|e}+cgzDrrFC*D#Whmh!W!E!?UK!gKj zH2v-%9<3iKKPYJI<^QWTp@K7UeYwq3r^V&4(vuzU(N~U>MuA%G%o80A5LC38G55<4d$rg?Nbj?Sf{8_pWGovg7^;#O<)3-w>T(Z3k^a8$Lgq zfV3K=W8O*6%ZkOhU%X&ZbVx%xQN#;i!vjBZ!`x+pzs zxx8aaxLi=aWx;%jjX)zaFfemg`n7~BD6Gyk+HsFj)6L`sNz?)QJlUaWFsXJ0`oUF+ z$34IAb+Feteg`}vLcp`P40?Gp7NQUa|5YB_wo~k7ZlV^S05VBVJOcZTzBh5Im%B5V zg+j}>L2rm15i@VDr}*ykr*Mi9hiO$m)XrXb@YdI}4VL}n z{SA}SIWY=*b+nY*Q8hTR%$FXo>Oo^E0VhT7#v^4eWBdX8l~OsC(CTFGw+Y`e)~EYS z-$+}p{l%nD183Oua3v+r-;FuyJ@qm)dR$U}Ew@|F#Tdz<-L0&&zw9$YB=71+C>w3r zcz3Tq4Of@Fb}sP$4m$ri?(v0h{P81o3#WE}baaeeE!`a){^IaFdT(qH%_Jxh2~l(h z6{NYc(Czjurg^s2O-Z-fwYI->#VdX|u@Vif^{j4XUEBA(;U>7_X=Q@9rq_w9d&~O5 zFhqLc_s~1hPMm-NRud+nyp&gCf5_V0P}ou5v8JHAuG|Fn>$xS|)c#b@SUheEz`=4l z!}9t8m!I1*D|%ds?0mJudu8_1P+|QNrS#Bw*7uw|?13=sFmj%!K@f{R^BI( z(uVKZa&F#FPH~vWofcn_hDBpr+sJ-mUjk*#IF zjidv?5no`Z3mW+&V0+|HP&0XUJvbd54m^pUMNdKfk}GywAJ8d8-(@vGN3YWb-}k+aDm?*t^^h(ZV7N?Bo>Z9+RBH+=EoWl1UEbe9+W9 ztnqvz!pAq=gRGuT=GON4miTiZg{6!)uAK}0|H$12@nhr@3>A5Nv4T>zpHAU@?$eF$ zRzJUY?96xOxcE-Dq!DblXQj^bB@jiL>^Q^5Cm2f1?FwE5jantRZB0$h?HgO~R0!WK zqHZ{2ewU_jy+eE!%QCiEwBc9M{kq@RXNgJQX(mObVmKp?TE#P*IUqk}tD_vBdK!{S zI~S5)U!m~z?O`Uv)hb@2Aui{J@V=+>7a`wy_rbb%fq87At#xP>_`uy-Nd~=cZ4G4C z>*J>`-;tpOq=GU#`p(J1Z=3il*9fRYJgc+i+B(fnFI!h5pDyIDxjXJ!csTwPb~O7d zgh?`r=i#ZMd;dJk+g+$;av8K|9?_rp>~xbP&fBVl1czbCD+HG}4gB{ct*}@y0)DEc z&TpQcOs}UqufzSyNjWAycZjfp0Ag81d31x;{ng5?Ycje2>@2QQvfbfs>ZZ{71M#Du z?Zfxus9J}i97EpD{QWufQTy!&R9ty+nf^DU*6GHct}oIl+*~pIrKy@ue>=;Za2)Sb zq*YP#PP~l0L9bwHy_tGSY~zlMENOn?f6U<4Rug(22p2*tD1_17PA-TxttHyqY-mYZ zCwfm6HjUjdOPyeGT58>kSB`aCzODq>+V{st9Ed0~h*eF1k(BT&V@_^@Kwg+|kvzjd z#1+yT>o+2DJZ^$y+%?TT>vNSG)urp%QjxMK>CPqHV&0ddQ#`j*?KY^z4(x$}9$7aU zK{6eiAJbw`BAe+duBf+5PPt4)5*{xPUY#|OVl7qVve~XwJbHVUR<}w;D@LE)(rns^ z4aLYFg|JCU+CX{&=6rCd_MM7aOH^V=#1}JSa?8uSR|Z*LYqE7WZHep@p+xgF^TQ@Q)Ng?t`? z6?xrL8xh4X=zTaP%yQWs+OYtwRtX^aKhFrokU~J zv!vj{q#wH{0}fLr+&s5`YHKak+b3`HN|nbx&mRPZok7gzA`bU59IjAZ`>zc!&rlt; zN*~b(Io_N~zJP%d_&{*%Y399XEqKU!EXKRvb%!I^k1M#(IvkM&Nl}+kRGcs*l6Wy4 zpO{#9aB!fI_zXti+nPgDH92A2<|~h6!Q)`co{Barcsd$0T|sN{3T?sRu85obS&msT zn17GX4g%e%VRYzfAz+HyiNpd%Y8Toy)rFhyo+9 zFZj=C(4!n}?c;wB)8JA^D0)7Au9+9omCEH1(*5swm|7LKRN1dzzk=ISy1P1@$rgU0 znSixdjTac*^WQ0U{#IpYaK4sy^@sW%anKhV;@{yQ{%kkJohyZ0bCV`@Xwm#$lzjD z?^`F%bh#zBjqiKY#j!3&e~Mj~-Nhk)93u*CN~)^y(1lZN+cnvj-EuR0Zp~HI)TCl$rl#8<%cbt;e|IB&?{gg-9BNHQ zQjD&4A$QJ@CD;8adH&Z{+_RjIR}CGzr~SmJ2ilsN#c62-BgxE^<7#SZ1>o`4_BQ*- zYdBDNRR3l*%@7_Q9>i!0C_LTcE4?<4!Cfbd{s_XM(b3ryR!bFKUAkSn)fR^>DPv<} z$(Ri9D^0AoZ}+3ci6(v}Gpi~nD9|La$|^H-+*gnCLUcxw7=_zBA$%s8Y^mjHbP2|U z=L7)=uP1LW_hG%QfBz7~!ot$3vxvX<@y#mtzPsA{U1juUSrl4^tlb9S&nhMj0|V$? zBvjN&*OsYW6%mm@aDVa9(IitWmrJfIk};riYF&@@UgLZeASWl+s<%o8!I-YM)~>T% z(VNq8{N8@MM|0!VF5s)K=bkSXj+332M+PdAux5;u@R$I+t11XGC<7`p&1&UZ`QhQnqGDpu@SVBwG(SDw!IJuT^XY%WwEh0$#}BS;eyz*`^VtR0 zm3Hrb9&u2}qkMN(<+?3ux-Bj<3w4&P&U-4Lrls}0FXLlkVrpFuwYD}lSw==+p&1kY zFJq^tryx3WAfz+J%7t8u4Yn)vQ!F!emgOhU71dvdrnva{{Du`DZIH*h`s9M*IelMU;UHwiR5oieNpo}al8TC1 z@OtU}y_fOl&k`|Qu1B=NJ=v8VkIfUT1m$C-teXT6caXWiBdK+UyzYRqphcA<3>_U&68hzjr3Z=;18(@2}fwV+NG z6tFvR4-++Ge5K*x;hnXZYin!GtNyQ8Oh*aIHEYCtI`je3EL0m0+mHFy@R0zX|C9AOwo~4swhtLu^np&+>TyZEI_* z*mkA;dlM^+ofZu>^<-hDPf0wDy2bu%IhWn4A3zLX0pp^gvbq9ZSpG_4l#-G{axR7$ zH@oK`2Dh1Q*Ls|NY25%{H`j`PS@z=C2#(Mcu6&M`+ke?oj}e6B8{Ke;vVgt)sr?Yb zD6+l1{bl|3))o~vcS~~VGojp^93klDmVNH5LE8{I>i2xS*vXB|xX6q|<-b=zP3XU#hudiDCefEX`92IifmxX*-D|CbT> zEMI-v{FeX(qCg|;R(6RZz14@FR`n$pNpzFHBBNIq#P@1pT0f zk^TA)S%DIL@dAZl+}8I_+j_CSysJMPhfydxI=b*j$+%XBPaB){0;Yy*%ThJ%x0|gm z%rO7)jUU-?HH+nJ8CRDbKpAK@(j7-Rp&S9CDk&KXOk=5S`;C}UU-(PKUKl%ve`*pO zWY+W5qUV1{N@r#(bh$@TSfzPAE{bNBi6n<5a>c$|IO*r-=X>mA z2iMxI2?4q`gLt&vUM<>Q9yYA(0nnYTE##ApJp4~lU z)5CJ)AGmlHNy7+rv&aH|oV9S|z#~rex|k3LgrNCp2|&ir5Oh2ivnX(iINA%)-9r+l1^kx_9w-8JJqDXH_$ILYBsi#ov6IlpJXGD4wEMJ0|8 z(7)ExV{dOS=nHKia6rBhWvJ{+DhUOqNC}{d18?Bar8Fn!J&;y~af^p2&MyTdep|6| z5}>&AWC&=3a*~;fGhjJ*TPZs=4V4X+B36Jl9syDV@u6$qi`D#iyI*J2AJO?pqgG~S zC*Z;KkXle&U0tp90C*0%9Vt0EH76&h^mASJt#~F`Wqfv<=>pl*=Z92ORLziOPsxa*#3KGz7mUiDMr#hBw)EjJ;RCII*e%E{5IMC_0>wqAt6T>#8{ZAO0g`M{+G(3Uz4!PSkI$7%0d z=M`_r3?8{BOE3yy%-DA6%oQk$eW)fEQ8nc z!uJW{>+$peah_3C-<|7tbPlL!qOyQREHDN|aL$+M~)AY1T+x^*a^F{=BTyk>%yJy1;>Y04rm_Rawg&|>KVt!y?kQWX{Q3ZUHlan(IP{Vqqo!8FG%Bl>iubg)$ z^CvDf638p(@HP17AKUaQ)8q>KB8e+cH~OWycrJVHjyozl9u954m=l9e2EKl#P@Y&a zW@@)=M&7_68;Gm&7gwy8b+Bec|I^dpvTi6oE;$U-0s47etDTTPQ>t!xxi@o3B^e%j#hnrxF)u)>8cP4UYa>Y?K6Y>G6AI{f^!@fY725dGZzz;CC zdfw`bk?fR;jZFn8RVR=TDq7luyxUB6+YFP@wBoop%>2B(BA~iJ6*aZiFP;zqU3YhPAY4(LaXYCXTZ#I6k9WuFnwpvc zSMqXlvmH+lw)2NB?mR?GK6i(=xBHcmo;pfOF?t@m`JIS=cs;Mo?ypaQa;v*yMi!3b zy-H$YW|nXC9jTcE-KpRoAo9LYO!s}f>F0HU94!G_^Zvw3LL$h2 zGbq1DUOCReItPWNc(#WmDM>6TdfNXU%;0@L^ojG#zV?$0k|4#n;|Nmt1qF4Vs28p+_*rctkeMr3_`JuW&r8)^#~85#R|m-jD+s%e{+ zj&kc&)zvN6e}>|*TEzLBe$!8@wtNPiEPVNAQI1}y1GZjZ$uB6_n-C{fm5~XD!oJNC z7qBX9MUhR8+tmF0`k=yB6c+(LgPI4pP^s)d2)()n?LP;kr!6zTmUC_)7RIx zcTh8CGkJ~^lr0%c!D^lfJ=yVJy)%*p@(mbEN0;+xzY9@ctz=U{CfXr`Y%J z-(L*TRPN*_>cxL5 zWTwj-CXmkZ|My*hVPBz59hv1}hf+o%@;~CpF6?r5N}Q0}Wjft;xfnWQAQg`Qyr=W2 z#aPp0J(P0u)D1{RTIfgsc#xryks0WTmX&R4z!5nY#B)@Su#9kR*V9UaAkM~7DL?;m z)`QAlww>WA2MW&PcDJz3enU()lTR0vv&ZAjHt?QglGH%iLr(*Sj+&WS+4Jfkx_^TN z2UG}$Fiti-v?4gBz6J;HSNcAb{$sS$xz#uNBjHjP6OX!yPH z>;Rv~^GwU$Ff3rn_;$}D@!92yi;KZ&%5riMQqs~uYM{g?B#(%>)m~5naP#Ip`-Ua`LUbeQ0Uze)(sVBfuOI5i$ES^o{ezcXkUv zB)4O}kGb5(t;$gBy!YwgA&NW#TDY@FCv$9$tm`Bih(AnhY>JMR%B2=p>6n<ZERNZYaIvpm)cI!}+f(2iklNI_h!SQE&#V2JkM^_pyo1>US1s5GtUJfzVO~B$<<& z3&0%)>+RdpygZRMkINXc-u`||z$MgFREofd{IPLOXDghVFKRY4GKvTB(5x{r2ipsa zjGP1QPn9`FDaqw_lBHIrkqvT0!^WltxHNWn3!t)7>f)`b`N7Eyl^*?{k16cv@N|iY5 z{Kp5lzv(7NQ)5$88YZS{!8$_sHUPX(+3s<5Q2guHuh{0J0=v5wd9w+K`)vn4k(!}X zi`L>}^EInA-RRt##O39z_SQ#>8(HNwxdyW0h2yEOjs?3h%gMKwA*HFUE~_%4|4lU% z6%|3R%ky5wAt51wDk&i1_1J-W=1=V_FW*oMfTpeLCz{F@4xVoJ_SE&hocUts2K=s8 zlS96PgF{?GLIK!zqugRRE;F8L;)uxF$*UON zFCXVWBB!r7M%|J**_J4MQTrddgFQF_H%#P69Nd!)o$zgLPPg##@aXtn_Yg-cvH^SB zS#5w*H%ktPcyC5s|8<$TnAjeB$Bpc#wjVzffQwZIMYm9ASr`mh@b}vnFtVLC4a0{n z;D?5ePFAl{9oUia@oeE#r)gW|;$n5K`>Zi^Qn3$QTw33->6Cymcuwm5x+iLCH*RWI zWv)VZromPpG^AvL@eKYI0wgslsR;OLaodiE`k~=rfRi&jT-I!4`i)25;*Yk(WG=#!|}ov+6h=9)sY)R?(P1l`FTn9O4inzsuut-pkwD zvjAESD7v<*1xqPe*%=^&>rBUpptQlYUsm%ur67SpzXGTkV4{?uW`)r(5b$WN$E8KN zPLonht^2tN@avWrI}`mpeL&$u*O8G?5fuCat-&{Masdhh z#bZ9Gm;p^W{^8TEorV=o5CKXsu;mG~nmIt@0O>*d@wFll{ba?<`@E1pj+c9-mDFI3 z-QC^S&Fv}YR?DrLAhJNSDERoa)3;qH0dEO!aSm+JR=hfNoO3?PT`4$6Dyh5RG=7+@ zz7v_rUzx3|gms8gStB1mR@(oztt67Ya=N`5gIuhCS3RJAuh}Pf?EKf6>m?-LRw{R}tHobY_7}G!x>xnH2lF|F44EZE7L|{t zYcweh=3jXpEgp)tKP~a@nO@GqrVaj!z-m?iBS4`f-d-J+uCE)8Br}VHy5*%4-+N}p z3o^Uq(DXdljBa>xGGCe%NKOD7r6Bq-c?=!*N-eI(v!ZWx$qJ{6ffm>YtU2L4r(5_1 z_QlY~>2$K%x<-Ga4m~g#>D;asAR}RbTZZCkE`es*1yY^=@1G--VByo#(}fOS->h;_ zy1=9-nx`xP=TL9EQZY>5QYHvlUF`~hPJ}%!cCvr`_z0E*oR*)T4?Kws)YSXKznZQx z5(hp%8zg2SKqk`J`_)@|Xv%?&#Q=uU?B;9>7^Lzk`H|LvwYBf4%D%Ht&)ZrILNm0k z5{~fPb<+>!T7-GmF)kyAk5yze^7vNj#ZY~2JN6QPE1RF{vYPMYQ$y5dQq;O_lk099 z^IQ{-p4{qr+AW$0<&qQf z#jW#E_=h9+W~2`n>S94h_HRryJMTjc0CYMIq$AgH>-i?+t_~P7k2~8PM(8+PNXY*^ zDJiShwVkS}YH?%Zb>n4=PDQ6MFS$9e8Xnu}t{2Om$L0^Wmn9`7lVH8iDJE_Gm6|nT z@;s-3P@l`b>?RCk2Oh6SZC;N7bg%(Mlz{;W5c^`?78juFtvb`o56$M(RaNt$+yvEC zz&c>!;zGM+{_u*+`}d*CcYOAvz`tKza9nupmf_m2FAKG_f3(@GunBM6MNG^ewtV2D zR#U&k&97N>R$Okke$6L7tGUZ$yjyxN8k%i!bPsJ_ zEp+10NqZJ6rNjDr$wT|b1#+4u4$42DI2i&_x3Q1E3aWJIyiT>R>(>`T-P>rFCL7z_3|@z%De{W&)+Is-Q5Q z)f_>7eJdp;MOHlfV7`Ni^L?h!$n~Li#ogm%%6GTd(pTTq)8OV=TS9|?{_%Xy16FWc zgKeo-K}Xkvcyl*Pv$(H!wQ+n>Jk*u~#lT#Bm~N>3SNQF$=OOm9`K zF_3dFN&Yh-B+v;0=-1&jyJ>EzI=%$s!Rj)P9>t!br?>g?n@K@{6{$abP|(uSYFpH$ zPrSX{FD%z?umI(88PpSGFksVA3MBU4a$5@&13@#&u%*g^YVx?8QIC&_$pJYQ6&K$J zWXV^YvajqInbK3nuho#9 z?9;(Yv*o7qt<|u_gH-(+*DpDt>Ma1Q~RG#Cpccv17HvNNKp#?Ciin0K&|*#|Q4!rr|Eh@$DQApI77A z`FWl7;#x7Lg#{6tRT7Y4ksg(D6u--x_&p&%GA2LaB_55QY2It5>RuiX=cvXBpu^r=IHS zz)_WevXoAsojBVXb_Ql*F6FVi8tP8K4^S`GfM$SJ-J7r3wjYBUcu>)Fn$;p880hHe zB}GN!fY7#1-Jnc(IA2pZ%P6jAYXpp83E1eDJE&fYr%@j|uH;S+Fi-ISCb7ssbNE?CDjYcwktNl z%G(fvJbtfR2IKVj3JLWjGO7i_ic|0Yf4GgI-j_6UcP?Y{;kF*#5f9cBsUZGePfRzt zGm#7RHf>LjcR(Wof|v!y5f9PK^KvgA7`lDvI4~Zl4Ev2f!tTM6@lTzL8RMF7`OF_S%R=@57xAb{K z#YEFnt1vA0;6|q%3a5c1KF#H|3x?iw?)1tPYFm&38S%I|8c7>!gbo>rv8i z6IGsV4=|=B%FLx4Q15Ehe@CRX;-anKIntsy=5fL&Hf}FA?lDqLy3_U-OIbywwz282 zHk?*WYwQ1qx%Z5UY7MqU+lUJ2HlV102}ClIGl~L|GYAqyL~@WQ850-~6bXtTk~1hl zvZ$yCNKTSLM4%f)a)wt0xX-zFoO{oY_ud_M4ENsdrs-bm`|7Kjvuai?5jg9<1r&s; z#O!Q!j-o%e078Q+K1j6lZU{7_*2%TjyDZAa#>SbOU)f&~;-DPJF=)KC_(fpqiIB8c z##_=@5=Xu|vX}~fKV8zum9}|pr-(UTE1qCIFDJJd5)v5yZlE`P5?CqOP8#I|#Rzq< zsW`dNWTi+kV0Z^MnjHU|9=Q+*(IxxJ=N%*6B?dqTh@FMGTPdh*7dLIlzVJ7X`Iw&J zTtn8`UW1ycB|Z>+q=XPo!!pO<6lwRu*ekHaCy_ zn~!mw$*^%VTEO=$(X1r|&XA0$eNHNbIectCT!2|p;#x{6?73MOCa)X8rDMtc(pyWF zD_5eei>EY=uU@5@xR}wBg6RkZ@4$jGGczZ#%mZBOsgTofqM-dR)AB$D%*4677o``C z%j(&cGvrji0EPwO84Hi#H0#-NJEE~T7U?nle0rokVZ)}arWHX<4<0=VrU$=o22oC@ z=*F8O{R|XlG$`-`2aeW6H@x?xd~IWr8n0>XQJH!l%EJzDgoyp22F+ND4b^v*37q_V zz`%6)`GInTe2J;W?KiCU)dFierIAqDDL;I{LUwU}>*%D7)Td&+T2zz;!A^*czTHi6u2QsxvS$lFiS8k8xNS z$z>4})6X)gX{L4Vh=R{npXv50fuMught@0;Qnm1C(ElcN)S77V4rm8>_Nc{0_fF?- zkHDS2B?_HoW9IDt%bZZ!&NX4eF)r&4fw=g1W_ET(K|w))txf*4!u|zbW@brZ3&Y$B zFGaM=%gY};eAtlTImIGK<6GuV?GyFJs4Ur{B^_VBdq6)C_@`Mzyh6@={$#yeQ=zjB zP!WXOp_Tph8d`dB?0N;Kn3!a=bg$nXA0G$osG+NyD*14~*^f{6F`Wb`ZgL`WMHgtI zvZLb^Q?WQB@docG9Adyr&ZAxHbxl=ORS7*lFxxDn)pD=xp>5>kY8Nj)Tl8E}nQ1L{ z%cb8UwLvbKyDcX#?;`NhhA)o}<5vNNC?A-h&8Zn2G;OtftFw@8)_^7b5aTUUOVm}8em^$riM9V~4#^P0Ng(4s( z!{%wc;ImR3z7?i@&fN3o6X|U8CT2FB>4hpEL({L1j~(K=de3wGY2;w@B^wPOkp&JzcJ()c$Mh8k9~e0^bbIFu$ksi1J9)KaXYq)ug`!zh$h)f0snz>hqejas~@)d z;zi6PrB}amD%3MGGjr{G#E;?|ECbnqLrHrq1m+J*f%S3`I;G+PhkRXTCMH31f_o7j zQp}o^Ge#yRCSHIo`!`WFdB5X09?^$unM86_I~Z5&>;Lr&Yc`?uk7xwBIH@E8=tLb# zDfvyCQ!y=bNXQ`(g0g4*Km@1ZEnW6dI=A7|v_cLS00XpOeAh2_ZA!8Mvvge?D_iwB zr%$WgCfgNK*}r3$``R~Zr2TMEWaZ=<{0?%PPZ?7CVA)@E?9*Q0uMLw!4WveUyl#61 z+vRWEHHk$q9EjXvQ!&d%3D==&n^L5iLWyl!jZs}jEEo3Sey3)Es zN3*uzR-3*f#A{)T5g1GZ{unc67~mK3~5U3$aQ$J!`-!~ z^Y*+g@CUyK>ULzyRhz_LnL0U53{{ZtEiWd*Q1 z#i-{;f|*ymlUDedxf9#U14lZqu_bvC1kIj@((`wya<2`hND|@87Z0D$^%Zv&{rX_&gR# z=Zozx-JnH{+h#@2L?-Cux(!O0!_aff_Q~g6nq*)^^bQ%Xe+}d0(&F1qD-! z9DP%U`gdQ>PQH3jS@rZcH(z}%hjez`A3AGCOCzoPvU)}m^W;p;F5tteWqeM>*X5+s z+SSrzR@j5gWYjqB)y+n!giRAYJ@P-t%p}kcRw}1%oDyz zu6jFPcnTiZIbeML6nlN`yW5_k%VTHRx}9#k95|J$(BMfEV<<`#7i-k{IIu}TkJIk& zJ$(4_O6g_zWM*_5HTP!5^iOHeyPu0=PGJkyT$*_)T|h}W zLKn}rrRjmtkJ*N^a&zv4giTU^tt_tIEsR3N>Q&g>J(d)<;x`40cNUn^xEzgtzkBbh z8yl6&$Y^TH?;LY$z&tW8a>+ijLNp}((7vSZ<-9Z>r(F#Px;2vI!q17z?rNEl6zk+H zJQLisQryD3t372}dw$M-3p0G!$m3H>^U|je)mH&aN)hU{u#jaNnb>e=&pMVq!~Ht! zXx4D#&w3?aNhaR9xbNG}Df%iHD!#CMw9R*yX4v>L=fub9B{A)geZ4{*XEXd21&8_A zx-~UesCR1W8gAYAePkiUSX=ek1ii21rfu8*Ws9Y*$}txZL5hf{86Q<$*!eMq1Ar;&+Vp z`Zn@PEpLdFmpjzlnYOK^S4<}?Z`&7%jgN|yMUqA z-bu<8r~L~KHHSYJ7+cqE-%=WQ^?U4Y6W^ht#y{^(fvK8_Y^KMY6oO?gC{vSlv-O`qu4jqf|Ki9`tm_JG)mIhIgsS*LMxjhFPfXEo{`R~l@sZ8 zPGaZ@%M}O3nlF!@ZB_L75B{p~YnOQN^?cpdz@4(=TZ+HEa#r&-8QrP>_Erd0cKWNg zCtBE=#K~t*uSi_^`9IM%m50EhPJ!5 zNa)?7ABy0mVxD;B>YFJZJ)G5aXz*Fjgq_pJCniwyBop`_ zmG*zMw!Vtn?%c*B^f?VetbfS_6VF8Hrm(r*n~$5l+oTfmsDA%E(0|isjotmT2Vy&* zTUeJf~He&*pCz`gUhh13L>n0>W;57qwt%mC3)3XK_VnZTNX zhCAE$@;DOJQN0|PZCJXs(`~fab*?|O-&Vk(jMh03xOv-a!`p8yTcbaHI^XF^N~`$# z^|8Z^`FkjFiS(RLLM=dcHV>+ah~MAD(3@fTcd|h#$7SLg13i7C5Fbk4JM!&$y_Vf+ z1#Hh?eYc9gJ2hReu!2XS^LiQWAwJ7zni=|OY?t05y~yoyO>v$1ody>w$x%ERNIwLu zulD;JBVL#BtH|9B7`VS-FBpv88rgTT1;DOq@t=?6ZSOn^b@iB}BmZgv*hAU#dNy{t zPgG^LQcG?PH>(~RYHl6dX~q2KZo$6rlYm}0TR3Ykd=p$-sQ=)2#JPdU7Ty-!n2ruz ztJci84;~lSBvODU!?;cSv3~rgbXQ8|_@BMQkzUI#Y`S^Mz?&MlYeZszGorYKlBUFw zq=}sdVWMtM5k|LB!GXoYQLh!ZrKM3Xts6J;eix341&4-`5oc%n0(cESZe9ZRq;77W z{JVHYpNfiVsLdjy32P%NF;YV@0b=#Q&h*OU;T99!akof+00ZD+-)OlJoKeFx7=rjL)jAG0_v~RRWM% z6g2|>h>MGBdt>B_%@&yJAOBe{D!r^iGF$Zh<2yJ}4+is#BW4R=Fj~nsW5R1(ge>Zg~JOBe%SIv!=G*_6AYq3x1`; z{MPE%ufKsippP8=@EyS1!z<%w1Dyq22 zNe2%U{7v^e2w^%pLfDyau!GUgzsD7Lb<%&y7_WG9x3a|?&v9U}-<9i>>vyG*)Asmm z2;PFU7lX5{Y1`d8INZm0Mn0M{IA2~o zVS9WHWdGClmn-TOI3)33$Y~!Dau}@LKGh9Kd2Y$ms;g)&mMAYTA7reJ4)9eKX$oa_ z#MUg6S7~rsU+da;^{7;q?MOcC>Th(K;v9!p^_dB_;1-g%(JUR1@9d!zsH@ zNDTs6Z1kZ#tgfmW?X}o<#ICRtWx$t9P-Tx5SXlVU9}hW_fhcHeYv0rXONb2&+~XqR z=(VLNYCs?i_#W}8l9-B$%9BOUlDAgvCt=A4O{Mm2O#85Mm@0{dY|oyzC$)A`w5%8j zZSRTY{Dtn>^du&7!SajW7nJtaim%Kmb=sCvhVfd2xQj)iV6C^*mu&h?t7VwL^=LY; z#p|684GO45>iKZH-!A`Z18f-kAb{Itv8Xy^#%9}8(<=BU&P@LDuF8cxf7%}+C37rS_1 zJgFU~UvG+{nG-)D+>Nn5i$INl%&|7N5^M+40 zm!8@C`tB-9&X)b}^TSNPhO89i8ybU{)Eve>A0S0PWZ&T^C?GjLJ{}YiK}+QF?sEmc zQ?-~lIV&733G|CcO{ORN3bj<4*_-voOg1g;fKx| zu*|-m6!zw({J$wV{r~RGf`5Dc0qsw|ef}*-S|zzPAkADrJ%yh2r z)F=@b=}g$PUB>&L3u2=!Df)U%j#^C`&iv~0#KMdn*(o(G^nt6Z%*MjP(qIzl5r2O# z<4dPIw%Xdyv567;pul08cjUdXem8dwyOioP%CpO#GN!-|wB_3;V7p6D&^`=Ds{$y1 zShT`U@5qrcScErWTntr^q-Ml4TFXxBE(w++xWKx@7#4`nyop@0d53oj% z#$99!AzU0htW%*L{ISlxBo?W(Wy==$1_&S@_-?9vn&Lfc+32`xoP3~(6i!byhUX1csMhq*+s(*uiy z$>vKoLoaOJ)nTas!yCi{EnVGk`qjV*@0n^;QyPNUstKU+rTe%HV8bl|#enHCsGy{= zE!QT4@#PH(_zI0Lcjp;+PFse>L%4#N-0xIKb>xWB6>5U=0L@Nc*gbefLsyqIvgW{I z@I!Ski{7WJr^#F!;1p|RV8alF7{Bvx-Ko)TaRG%Fdz8?dMR39By9HD< z#m3Tix(q}hvj8?_XJ>a+I|NlCuU~WKShlKyM+l}54hkCVURlnibN_QT$EscP{{8!i z6F-)gVkR2vt=M@Bfu=E4n;U^J_O8N*+^$eEB(++ z$x1OE6`6WDj^cfmFJ8Pz`TX#J#XvQt|C@ey7WPlfF?TvUIAmM$UCQS>efsn`sw?HB z{b^Lp%#z~epYNfe9G;lFwf#FB7);_G;d6t_9^&c zb{^|o;Tu&ubTc;c-Xk4e_X2W?ikh%-&1sho$j2Axre9v_eSh!A;-Wh$gt6xmyNO{- z(B&m`I%`aghASq(A0)ufo;};qzBppz1>oXEwq3vMDs_Pyp8|?kNt)6Wk~sNzaAIL8 zAyruKKB1KJ)@co@1MHqRXOu4g)aa4(17BW1K~C^ymXwmJ=o|YwFj3A)@jM>(_g(h zDsbexmX40jstcjM`56Mf_d`i}c|V}_cMW`64$!ZH?1{^t?(Ih12-Y2I#8-5mKYuRd zI+=)STbq(4P2d_}_R7}Q>BwDyjbSeofNbHEJ}jQVi3vMxqgl5g};K`qX7QW3`+EYk)hZZD;ii16?Ph~9qTKb z0=mZnYzOR!lFqBE$fd2wC2M?QVhZ?V^6S^iqHfb*AG(VY(v)P@65!RU%R>R#hVN2L zP}}Ky;)cCY0}n$}Mq6pnYNo7u6To7Vmo8F>+8HC=SG!l9Jb7Z?Rg{k%6d!JrRSr3r ze|vTsTl2uF6gZEj(}}ur96|L|rYcE$8>|&oOH_`RtD8NKT8ox_T@I zlJT!6KD2!e5E;Lx?>fYQaV4{T#2lzKwz8nq4k(u^ynhm{YIFt#MDsv}SwkzS7XM)S zA64@C`T6GE?~1W8N>W-{>)-)m=oy*q6*6Eye7kq=W@cti&NZ-Zj@*dVmAq%_Q_iN6 zB&%aJWOR>qgq&-qKGuHlSmjL@>90nYA5>LW>uW?x-D%v?z{6`+Pmi*0pbP0FTU&q2 z&H{~t2M;!xTWE){R_#dg4 zNz3$iHzls-EeMIc1H^NaZ;Z;Yjl#4lj2FxGuo3kQ4O6w}cA@A66DsM2zlD~1cX@PWz-w1s02~cVM3ecS*E6eScL)q?FOQ zrM7vvom^5^%c;w7T+$)r2{h(@dVPL1n|+3jlj2-Mf>H*F)Apu7`>qBs-7rqWTPV*x z$bIb;IAJ(Hh$bL*F_dyPrf6~G*mN(`NV-oaKhO?D#)Eu~!)s11;*)7^JFiJ~_+`Cs z&fOkb*xYDeBYGe;;o$!LPG_gAtfnmVO7;`j-KS2UW__|&0nzQjBvnU;E|%0kJc-!8 zeHACXu7WU4VlLXD!T5{(?D_NOZN=c^05Skp*e~m?d%?r)%_Iv!m-WIL@?|#-F)k-f zVJ88srLgf*c^n1cmhW$jn)2;Uth(Rn6*`Y<0!2fwQ1yb}qApre$nNJoOkR{7@zRB_ z{b0q##g*;3pU3$!g|N_Ifa@+=HRIjDlOe8 z2%2VazXd-7eQqdf?7H*MFSH{v5k}-Fdi79{XSN*dNOtDu=Kg zK=^qpE5ZRP>kHUTLCAaMI8-kQ;GqedvS8O)7#R~PtY9Sp%3&T4GdSSVlD_!UrhNM* zuMi=mVgKt}9oq4DB}ZucFKk8u3^)b9o1&JWh+G?+@LEfZwZnuQlQT0jdEBNgF`IzC zAEJ|H+A}~}t8+MzPQ!*^ce-Z2QbGeNHJ190tkl8|r9x1#Xv;POsL-Mv;jHjHK52^7 zvYOfx_j-q?2C!CAUS6KAa7If?!b?}#P(7#TaG96-=eA5Q5mPeEzrQv_%$1(^C^c~w89u*R>eEflH`~Oc-wB>0Kn_#%))K# zY>NFr#keDz#Mb zzyaGD(HYbC-W%|fZrr$$-}h3cL^HSB{5X7hh%q)W0Maf%1xeI7U+%6Wghr|g*;Ss% zegmKp?&L}NXRmP8e|O{~H_-Q(YLcxK3oj}LZyI{X@6n^+nt`Xr+Eo6t4nh%Y9ZYir zYRy>T2jbE9}yT znZc{&3y3XEs*QYqbM6R)oY#D|j@2BmOB#~QN@RIQbCY$QT8%M%jdBmvOrr%s)MYEZ zOhM=Uki2}g2=rdE)H;`xoRY2z2MtH9Sd<4cG|BFa9I9Db?RpUDcL}XzfM|+yG2Xm+ z!|R_PO@B>e;ag>8L#K0h+S%J%hdz)Uq42jBizr~Wug$U0!drqXdV(?$8I8zDvoKyE zDaVB=`S~DEp4nMTMpH`&7)ICr4K%F;}VPE!u9OlN- zF6AngERI*UhVLMRJJYXqH6F-5;yHU3Q{r$89cKR+V&b3Mq`DCuiEYn&d)HLdJ>wJu zef^hRH~J`%ggK9P1;zpgfDQbb$%^w+z+RCh!3wZINCL|m!V~QDO(Be@&YxB|=*0_` zfHJjyvAuiu20wio(_a~y0{F+kb1n{oft_N_iY~D=D*?0Vq6@=W^K%1{DIz6A0XVXX zB@soBI;~rPRHb_@kqpp@?4%Wno$2-x7buwfbbs$WKuc_Yf-eR@^|jxQ>Ey{@9gatB zH$3|@HetRTx;sHW_uYaYYlMf{p%P=_d}{#7;L)cEL!FE&a>gD+^u~m6d7$PrwPpO^>u|9n7Mqq!CcIXilvg^_&sL z7Bq;<;v-@JnbWTKeK8|8Cc)XL`1-Y$w?)^!y1JOJ16U;1Pmo$-b9;j5>LQ`LPZ`dA zp#SjxUPfZ8No12%Zf87p{^HOBf1#c9&kb($Zh?T##LKIJ=K15tk7_HjjR(BzN)9HL zEp(~;7W6d?Rd7^$yLDiH#&K8!qJ)N*uV!}F{&Dx7y2Q(Z*^hQ-M(oa{dFFgaWNZBQ z;o)J80iu+`8IMe0j>cE7s<*QL87<>cSW_`m?cbjagdm6Z$3bodHJsao(%i!~MQ_qe zH+YkOyb}cebo{Bvn5GH>S<)L3R#UNJ6oCQex zIr;OW7hduHjwvk<&lz=Ektazj3;n~FU#u)NS*D4;*5j5Ii8h`oc{TgTbWYyO%CSZ= zV12|3!FxwlSGKa%@`S%#gNb-LQ_D5^mb0=p%{nqqu7}xGr3v*iHNFf#m)TCy*%epP zMjw}WUA;(3ze~$%kJ@BuU2*^0k`&VA92v{>{nyLq+k39twbJV3*>^I%xw@aO<)a>H z@@k22@V+5 z-}aDX4&axm3WW<}QiQEV9;d*_^J=5XSX>q?D=^+2ZZPtM^4kx?gs{!HP?&!S#h z?l&fxNJ}Aeq$=g4)4Enc>xu{X6c6WFMw$B37C&_z3GTasx>Wqx%O=ex^Ep%B#T-q; zU1hU0w^#kN6UcEN4cXz`!1eCFd}ZUWbA{DH(>}NUV`nrR&J~Udz17B*dzl z>pYZU@-95Bf8p&{lX*u0@k`w+&Xj$hzFwp>ZBS5Rdl_f5Yqa^zN8RG=`IyW1$-^IH z?)huCJZ=pVU>>hK><_XDlZx9{)cfDk2CDJKwWQ69KfG3MG2b{-?=V#|oZH_<&G({> zSFtH#bVd8Ken0`AO@iQwNM(nMdGu!AY_<;Fm&~vz{XiQgI(}WWet|EamVIfo=Gx#5 znVW$zKX`vv9CmPd%F}wa!GNqYW98y_{O>v2WLE7%t@#uuCmaKQPd$Jinh%z1f&y^_>TJfcKhI(|}uTwd8|8SfvAO8&dkAtgT?*g;(7` zyo&a(uyJrGO$^kuV8QTuU*5d$xh-!#tVe=kKrC{muhIhDMpnhBHmGIw)5cPy%A`Ie>vvw?P5?-X@n*#LH?acy zA)sJW@)hk6LUz3GSGv#^B>a5B~5!ztLI4P@MR*OBH2R4kYo85|t!p}ec;G&!i^F;T^j z1_EFe2OOMK2>UuZ10h`7ye|4Ka2=rL_o>7$EaGoi|tRK6v<$>cD}7zOn!kumMdO8JW9FMr-qEf`ay~&hf)!4um@< z78W@l!@)L-3=M#7ERT*IKQ7@hKl!B7I@ByIc-mQ#*{yR2Ir(Z6CJNaNsj)C_UASo0~i5%I6)ZGGS(x#n~V?Zp@l3ye-He4Yy`B6}i}B4Iyxq_*=GSer&OW z+e1mhu+zf9VlDHwP=amz8VeuzfN7{rWIG1|v2ldfZl~8{mOHayHrQAj7c^Wk!Cfp8 zxOBEnw-{#49^AX9T;jQeeY%;MTvd_c25CAus%B<5GRa{e!nxvFR{6k$OyG_kJF?y9 z?2ueP@bklQIe5jGgMGN4t^T!PX;4s5>}|4Lu;`KrpHx*>XE9udy&)d_b43n_UYbk zu#r?AAK=h(fk=sVEEIADf2N|P^=KPmCK&)>#l$#VkS1`X{;?bT_V3@nxRMk7j?zOR z*;P+YPOd3V?f?TLBkAjt69{mz^+aP{=Vg^!T)fA2g2{u`5TINM>${)z;;Yj}U&6WS zM;%1y0uZF*zymNEgpNoO@7>!L92`6ZzM(OU*8=MwUmhJM{d!^33`kwZZ`w*xo2-$NZB(`sYvn|sXrTD^d6RM*u_jgCIfz`(!+9;z~gO%48O0;Vie|Kx-;N(LC@ zLM{ZZj;3ksE%n9xD!f?+Crz->GaJ++kX2xpGC7gkjxNc z4Htj#UBHNij0-D%{DeUht5Vb7kO8fxK~MhgOBlVn^O z68yzAel$32nt>3`w4S@Ktf;_AjzSKD$|F{+mGuuf-hro6#dIi;JR}mBrDsx$|JrMt z2*}v=*K-pbFXc#T9*PUq$GNMH@RzMKZ(Js>0c(;eFE5{ODOrvyS)R&3NkfPAjM>bQ z@1E7+g04L`$#^^$Z-9BU$gU7faAXE7Ix{=FrlO)hroBCv=5Zzmx*7(V>({S;PkV{Y^G#fua;62x~4zttopZsF_$IOpc2K9mq?xhT%zP%U%w()kKrmrfN$T~b1Mu_dX8LDb(hZhwRYz@n+t3wQ_ zfmW*kLyeA(zI8%sVq$`U=|*V*_>B~=m1S6%kg`6NtZP-6)h~9N**Y^YF^AVq)VmGd#LMgF`D1CRv37|65plZ3d?yY39JHe6TnqvqzYRJo$RHY`*!b+ z!j}DB+rfG{jwWz=2$$^`wgYp8_2ybb7LG&p3>Vvszdk;O(>ajG`<6zr>lGxzfi9SC zvp~U6#pn#n>C{F{r^PSG!W}hEWq2>rK=;Oza z^cu@LFNfUXGT&h`2j`kX=xrP%mnI}qHKBj+qKHvsm{uORB z_v0NqPtSLl8JZ%sD1o3vIgF9xcr=C}QB&$ZcQjWbtzIOufQwR~blWZpe4r*Pq6&}OWD!I1TB&;e{2kP79pt`d3Qia$A{7<&V6pTv z+qZAW5-zbRMFRj?e`Tme`&+9f|AgeFO#>1==Nx(%mmx$r(x@!GMeW+k@&Za5uosO^ z)V0y^0>QS9g^ew^)0)FsAw_AeBoj{7+uJ+8(7lo#AU1#Di05n+&XUdVw2q69M=$~I ziNC}4Hoj=pS)frPwvhV!e^p15GBYzf#C^>#UMZ3tj>PZI!WMzu4h3*^sz(KNm6er8 z<}(uWS<>?)v~;ga>iMd0w62a$NKY>%D3d{;tYGjZy_k2=#GHIBZ(>;K84s0)u+k9Y zEu@`p#rimW=z8B5UiRA?!Giy|76YooLCdfkue<(~$J|R=t1`X!BB#|e&T73%?L&c? zPIYT*Yg(zTgfmn9zkXE=Ic&`^Vl?O`ZVFtZ20DgWt+$>UQm+9exTOqIEx`OV@ZfXq zVuCdOm#+wLHZiVe3v;U1gg7HkEaKt@5ceHvfd^7y-~mhRu+D`8JnZDA=c{h9UZttd zuXXjixm#;h!-J*J{QP{sqgx5Ow&N2M!4Ml>zkY4U>%)@Ft9wL%D72<%S~8(d@K?au z1u`=CQ3hd`Pdv&@Ab4s3YXXQ201StN09g?*&x^LW=y7(fPeYl-lJ5m;*;@yZHx3RJXM!RzPx|rv5`Mn`1+4Ks|R$~$)_6#iIjXV*aVorbNXFY6>tbtA1!%J z|F^~$72~sM`<2Q}L@1Rv>ptC#<-Bi5ct7{gY#^7d!VZP~WX*R^`jCtQpRIk>E6s@T zqdPq)+_&wb_dEBrl>Yt(Le8;C9f$EpYH=$`PYt^FmhM^4YP;Cl-TI!HdRa9udRH&K z54@3SGHkCaZF1sUTMq>ax%FKdkdZub@7%zq0DQ~9ImbO8rUd`3zJ*IOGJ2m2C6OX} zHV_WH^9k9v^XS^O3yd<$?b$?74n5R1b#MLRs+CQs3Cb;pbR-1!tzX2JsAFCNWQ14j z)Q+_4IRHY>;t9dO8Z^p(%Kx36=Y8Q{mD;BBc7F%v9XcBLuQZMDuQ#T!62#SbE!*OTVvan}d+0rr_|lcggw-=Zw?<$5 zRDjjtbghmK-PQUX=D|^+4S2%!cm4q2{NqC{SN{Ofb}XgjR}Z7sFK|dgV5eW~x+y)NOXQM2G#yJ z;3U#>UIw7F+RE}$Q-PxeAYJ%_l@D0+78}or!#G|8c*N6&p~g@5_onz6!8>unAF^+V zM|xtB*ues5QgBx>tmmBMx@#Fg`A2j#07yn4Z=HqCC}zRz0XDSCl=#oirh&b?H!IQ|eQ(#N~xIkvqYF9TMG^>%9W@R;dzb{#FA znd}P?C(e%b0jvi01pvN60F_#^vp3lEi!NF;r>eB1>mmA&OGt>E65L3zjXJjOwCu$f z|J(-V+z6BtmJ0$P079Hs>MLK97>36W(d`dzGPFJ({`Pn zfng}8MZW`3Q23qN6g01npui`7XWo z`2!&y${igO{x!G~oQ!PLI?jU{Sj=*uc8g_iX_=^o8c5n*Ct`fz9R+jDNz z;ahd&J%QDF)wO;r0vW)EvF-vf8uf`dP7+5N!ohVM?a~W$C}#-8(fK-gwo#}M+^}iu zDPiGDz#_fo8zQf+wHD)gH6$ptU?V+>D`XWFfnZ?K8CWWS9CkQ2W~@Gjr%s-fLdhV` zKma?%S~amg?jepVa~M*E6CJ{K>19IK25^u6ULNdVAcGuy(G?@3srK$=O`NHeYu$Ov z3RW3S3CBhQyhnS+x8Mxrc(V#libvF^B~TlM52A>X4oHSC#V!l2l!p<&p6|Mg6TyS>;7c}rFEq&9f z`&0k#Ql}b@*1B7Gc-En-9yrtYTRyKPL-RVK&XGNjXOgk|?@KXXhBVh_jT4BB|ChxB z0UHFVR4kh6g~euJn4VjntMMX^h8{coA??H8?GN7!5wpAQ0$K zWe6MQEy|uW`9H16jVD2j-oFmj$TflA0vh7Ti?uZdYXPPdhD8r=^S|eKZ-}v3SCI>5 zZ@9R*ag4zC?-wy?Ru#tEP#-6EyMG%#NoBo1ER$6ZM;d_TYN)D41G5<gaG$MCnW2R%r&f-%$Fzc#U=)?qI5Z;5V{P^+XKPTq0 zuT>p_&rrI1_bxy$O;^_fAx9#;465HyW+wywHWFvLA+JN&jamwST4CAw93Cl+G0kSO zsN@HXmvQbf{KkU^4{%tqpC1K2lcnM!9HEYUd&iNS795fp=zvLC_&^-%oMT)WqE?-2 z)BWy4pJwxsKnIBB*j1#htqmTX$=MU!EtXqfin{%rSqKgZiN|rV?4hKf8TnVcJm-fP zgM)*a*w_>>_lpAeXV0EBOe?+0uo$OHG;=4|zWKY<+#$w8Js)o4El0=1;CNV^B!Ou_ z2!ucF@-eYRN-t#3t4h{LaTu&UhU>UKBm&PTFggXGT(DsyZ8<<{Lb;Rx~3wS~2oqImc0SyX@?Oy!F z&&~ia(vaI3)ki-zc|WA&k6k^SjY;^F1cfjjm8(}{T_*>R1(d~f zbad=!4+#k|2k(Xpv1jjIOv2-MUN~j=V2!sVaCA7^P3qC1U^!PXVZj@zV79AE+hC#QMYMz;gGh+FJGp|E4+AV=ZQ}r$ubGRN6kn|N#QgZ2>LBIH<5wmRF0JP zjhR9`#S0D$48)0eU{e*=xh;ua=3px_U@NDu{M8cm+6w%15Hb$Cc9#@zM4Y`cv*J+@ zB{{j;(~}An3~IFg$>P5YI;~}xLx0*AcJ}-00l@`-u2SYts|ExJjxx)m5z8Nxjs;?g zW+Grj<>lqTg+*g7nx7k->mL{ZK7@nKGg~bKJ=r`|RDMhW4hU3dUw+TGfp;V_xoZ>e z{aplhslS>JN}wm&ns>L0mnOCb7%3^TzWmlVHVENX9XWNDi4u-|!?`(GH)?q33Om_f zR5>Xc32FhM1e3AK?c6Wl_)@WlhS~1ql3J77tN5`E??3yjl?1&XO3BOnfj4|(RCcQd zIAs6NpFxLJT-i7KU+)jrVipqYA^#!jbl;MBgP=JFwE(ys;cH(IZbhnE?^*g zL8Nm|)5Ih3y$cPd{NCQ24WJX%>7C~uinKp?grMv9R{?nF$&)8I7X*tN-~|9HSu`bU z0N*pOi~cMqstNQM)A!D!`ZzQhjvc0)D{}7NzptXH8G?%Yi8*uLF5;&XG6)nhv$8N> z(3GNu1e1*|t>PkhWY{E}wZzQ9q2%J?g1X2`2DcO;bnxH$?NCI8Ct)Xzz|jUCu=`iv zzJ1%Vkg1WP`C<0qg9q8b*)QMsB~B|Ts8dBkFaeaEuKw_;L_+By&JQe~b zv6V&p=kZA>+-NcIDyG>f{YWZJlYxmz2FJ|7ZC(wFS5;Gkn@q98QKm6V3o{ng;ezP# z@wqxW4|9dazFYF~nm1m+mS4atVZ0Xcq>K`M_Ry4yi}W}z7sqOsEKhN)O&N~s*w*p1 zW(IS?T47N_OV=|~(hFpF`kuq5ZU83Sx7LY?uJ_|RT?~awqh4}>h?5Tb9D7lvnYJvr zH{oFok3xTcKa+^aVrsx9f@AOGXYAYXZd3X1;6zitJm-d~&+9{4TMP+jw`|#hsT*F` zNmDp@&5iiuuiT2YD%(roM1)Ay3tdkJRZ*RjQ$`}}(K)mBBo zb1_dbTp;RNRajDD;suMAbd3bXh^y3o9-F+m*Ru%(-F*NZaT;`ZI1P9M>;?cJnn8L^ z=!us6_dQ{JR>@#i&5l5nZT=LJ|9=Wd?AF>}aL}5uwj=FEcnMCqBdtWlzk!H~;f@T@ z_G;fVssfV*4Yhkd|4jqv4U%22%)F&02`ECKMdImu%vx+o7pG*9kzczY+b;ExebWm| z<8$ug3rk!I6G2x`!!ODn-EB$jGwf8jmd?2?zvtciUg5SG+zwb=pyt~3WxJq=q`N{V3`PXJ)NK;xZ z;TS$G{ZOU`T+1k{^=fWAM7Dk>Y}8O!Rz4b8!-mOwrw}EhUt+0`jmv`~==g)S9otf<;9}Kb@TQi^7N*Pc10Oq$s2%C7)1Z z8VY}%ii#niY%lB0eac5Hdb!sLA4x)*!q?ZA%qx?e@c!{@XFW=Ulhg99wF1Gahbx-UN@LPaAVLvtYR>&#&y;+!!GC<7#;e%P z{I50cqZpASWPyCzE)7G@b9;$rZ)#M!S54-$Z<-PCKBi9uy;c8Jw!Z-1cjV&xq zO)HKPyyq)9Ddv`zd#W@x5#<7(v2d@Np5|sT0Wv9_R?D|S{@V!NVQ*S3`=uyaLSt>c zW75|QyV2l(FKB0HSA?j`rJ!b=yAVz@s;iT09kJZ9GH-yB8kfgIOTrsG#K%7E#g1GE zJ~X=eMK_eJv!(xP0p7$KNEbpVO0gfPE|{nmM!qy1PIs7aC~Q82I%NHPnYXrjK4WKR zZ@#mAFFuzACD>zQV@NV*y1g)aj9Si&7s-d^F+J zt5?(LY(CxF?fT~fnQ<5*hj^^$?qyV5eSQ^6)-(es2~!##@)UCG`kntl!j1x3gknx3 zZDv2eKCu&EA3m)F_J(?6`0fh{B)J`WDusbW6get=lT-yKBnG1a7n{aPrQ#zCSPMdJ^EXU5mp zt0J0)Xa%lV}6p!*$*H&_P!K4ji>@|nZmRa zt*}$7orl8WZ|4#mC4p6Y9PGf`wx6Kvb$Z?FoFxHGM!yNcacF6#TMJlK{uHpQmGaVUdL@l?ppBVws$4e>I8;fe`3G%CPr@f>nrOeMkVD6Idm z6c(R^f`5E01;A&V)Qu`_SP0ak|N8bk2KA|^C*_%DkPE>CgPi~k_N<|R7vP*-+3avu z4OUpOj(`srL+v&McJs81bZmXIXi>xw1a(eudLI4vit%%C?N?1qNGLt{bboIXpiwOB zzgzg-0Gs=B%GH?K2i1|;**rKXbDor;rK1yu&1BZ%C#3w80SDrwR5)mGz~u4K8ammg zQH_o2olfmmC^TL4TwyxBZ{I$gABK#CJ_!OE_y9l%YWYr>odX7Th~JvV&l!MwlfHo- zHon~u;qBT9yP~q*x3oA>W0Jk>Fg`KS1c>L54H+S^zQ)=*nOE=cq!Xd05u|wxLxBXUaU13sE5=2FO@YLOQoBv6`J;3v>uPgwQhnV8Q2NZ^5 zvLQP9I41Hwyq%ky``}X2oe?4Ioa{(yhRvdlbRWO}@#DuvI3QU9EQCbSjCb?Nzp5iH z8D6=l`r2m^?8@`yiIncO$665bUM>A8-Gz4woH8gd@OWfR0*-#fC$@>WWYQM*?RUQY%gtoAPGAfvYQ%)H&!4g4$mM5H=CC|o$$|J75IW{* zfokEn_m4{m>x*Z)P*QSxMQPSu41E}!%(}6@GQ2m`Xy=wJrCIX5z^A9+#N_r|B}T~Sz^kS1%TKYpi{RpEr(y;JA6{j;%^lRoK=dQ)+U zxJXhuYw(thtz8-RMDltCWhkkxQnC7Q4ywb=Iu%8kTxQGKDfmflok*W7P$enFc zL)YoGva~t}363uDKI2PZ8l=NI7avx3e=nocg`yDS zAs~NsqB9*Qd}DgOoDQ!(FbESBU7wur`FEs}Wx2SxH~_<|DRrC3OG3YEz;f^jMQeo& z(~i9B2;zeS1M811ZK}OaBocX?hA)n;um--<`xq~F8XwMzkK(8n9&H?M%|dwr)|xR2 zH|5%NpPU-$D#j<4QceTGC4Ib0jy-C}Pna}a}5Lwk# zRHDFkaZCYb_^Ym2IMZmwK#U9wQ=n)Wt@--Zv}KRDDQyfs@3*?PZM626f4lp1OUdCX z%Y~5B?$zAxZ%N|9?p-7U6}Y{^7jAj`YTL0RdU19vEhJ@S`Ppg*duU}`ax!z^(?`$Z zQ4BP6lZ?*PiLIyEf79SH(gh5&x!s;_S!KDFt;b(f#UK2Cn0pVPsMcm}bc}2j#Vn$L z3PwOs2?7!n(|`zqfMk^*Ip=5u6Ci`Y79>cNtmKS}f-sW9kP#5cAYsVib_2S<@6^5L ze78>3U%$1h_TDnAS?gW>c0W(Q-A|v=wwW+&O1~DNtJjikyRkS>z)~E$)6Si{4}X+q zH#~rNMeZ2Z8EncZVd4ZZgRSI~9Uf$(v@|yN80134%6qG51j2INEe4zTAGx}+?b|16 zmDTK@ogj4`-cWY-8RMz8d{_Gg8ugnuzuORZkeY-!tGb$BYVu4QOgZ?Jr87!NDX@=wr`&&ds@2;h#4_>$J z(2>P+TUkp>OGzKkCjk8mJ3L`80%Tz)S7M_G1iBTg)^>wWGfHU&uegz(E4XMrGgAO; z0Vi(apebPG0Ga&T)0ujiWxAy1#Ci>Q_w;R6Klqzleb}g-RF6j$j~+cLYBPBYgaANF z<>HJThb}>I!$3UNuV1fcqBh5vXq2W*vY4GT-LZXpcUJ41k$(fnkt5QIim!kj*4$jk zb(}%@RAQ^}nW`QOaT))PbS9h2&D2XvXy)$KoAfTVv5Mw3g)1za*R5OEQiiSCuldb! z00Xegul9UK9Y6F{RRh?`GO!X8ZKgO32@F=rFd;Kj2^SYfLjC&nYi%Lc7huPIro&Vs zVjWc4I&((l)~#D{1r=M`J325|%W}!xX4^+Y+sgsQ{K?F}bKt=n9zT98ZDR6HPfzdV z%a^QK&GCteC%=6DY(rMbbx^!_@80^28*2di%E`)x=Gaf@wdOjK=7*)rVIS!izdVYE zEMtad*06UFk$?4M@i%PMPC9z*m^gyrM;mroOpoch?LHMzb6VgNN|kAsFu?s?*}Z!= zsxSzIsU<)EO=HW~T$hvUfe`WZ@naP1GBZoWZpn=d++US{{wVSiClWoIjVRdAZa~67$=rR&w)Z@YZeHFkw3+P{6o_CiBog z7Qd5$AsVyu+S;i%jJ|)k$8g%@rhi|+NiA`&QH6Mw`gZ=fFD5*u77u?i$#nJoYRe~` zCrvZFi(S-#4{iiFXg6BI*Ewt>Ao$X#3pFmVF%#VL+u-02#u3zY)~Qzo{2}lHumZhl;*-Si3fDT-E&EOeIL0c!9wiu=nY&y6>jEh zr`e(`LDb}=4ek@5Hb&OXGZRCU$6HvqExM&&Mc6Wi3<()kJLtr7wDxtIW#C9|>{^9g z+4qh&K1D@C-C_6mz;y_RI1ISoDvQ;!p*eQTmMw^`KIP{d>twmy(y0i!fK?~DegdZL z4~6F^HL#BsAeEuH5X9G!PV&95(8?>2*$QM9k>L6B57XSI&znfSwii_>Tr&5&MkO7?N7&dT;4{GV zfny=LXYKj+>eOQPTqOgWwj}*|OS0G>vBGP|zVT;1?1~5Sxv(@CKx6kCS0<9KAC3x# zcLDybGS~>Vep-v21lgApox;>;7ohJr*x45@TmS|mfmQ|tuyxvyS2<=l}T(C{~8V`V+h&(AO5IGwDrG`rh8Xr^LIBw^Y)!*T8gin5W(#4t!l!!$wjMrwxH>?{ULJ=4U@in!6_3a^ z>}1D2MIZ&R)XnjhPn!V}KHnXho}Rweat7#3L#Aa6ZVK3V`0L7PMusVa#l^+??oy=t z4<2+{WoaqOKbYg;;Xz7@EE_%v*i9d}0INV$zY-!&ES-F|ixcZxAV_X3-2+Y;YfE4u zfeqXH4yHGph-VJ69sS9(JE*)|8ucSRJw2miVyfWLEx|Y8*gJ^TIFwIC1Y1(Oxz)TMJG-hqp*Vorl^m+R9>2-*+07i)UTP^CUZn-r3r58k z)u?don&;N7TemYabM`dSbf$#QyFZp9>FMk5U|?v_Z2mslRmLVP+_DEH=PiGIKMPbR zb!LSXwBUWt zi79+%yZWd$?`}(UB-#w$MqoBM+|iI_ov@QbsrqQ&9U2-MoYGKTpL9n~NvVOAzdwPF z@q{tK;TcWkVxreB?8gsHx$D;vNRAKc&mJDzzkff3_G6r!zGDLnIUEP==2Fau+b@7u zAd-L_=B#V;={1&c;CRn2aaby_8o&XMRe#-~!kO^_oDpuU0=@^f0l-$BZ(uQiDkCBy zYUmp(U4057VHMlj+FJfTuAbYZ=dZAB$^24lD`cD#e)^>y9xpKErpN;XWX02E;5lAZ zJqE)oOcWY(MF3o6+6;$SUwQiMndQ`o7I;z~U9vi}!0ncFmE(+OY~JNhudz^QTHeE+ zu-SO*#|<#oGSre|c6u*%dA!&!maVmSlPe~wFkg4%$mNQPihb_IiAB&N7n)CUok1El%y@0mp_xoC0>6?z>smmtKW0X8O8YdF+hlO zmetjb0^V+&4M5q?FeXFT;&ZmCK)_-u1|0f}7cXK4>B^f;MTB5g1jO|7#QX(~M(foV zjJT5qlnZ|Gm;I`bU+Dj3o8Wu_HqT>i`FJ51WTF^lBZm{D7qtGGKC4=Dhuh67^m zW4!Gvt)LJIh(pRlX#7UxY?PCNHM|j=$O1dyvR614A(&0TdJu<@?AW|{A8e|*JHA8H zJ+`*CEh7-eC+58`{|D@AVf)g-4+VUcxAoLRAaCIj5hVJxcaPuweR5^#9Tb!RcdO_V z4yG*m`t3;OjffeUJ2Ud3bFWsS8`T%1wnJg#>c=7u(Ao}j|*v)OAe=~ug z!xvdqU%y|4kNwY-<^SZ;|D1(w_~$I_e|^{GopV19i&S)1gd%TlcARKdO4jiNRLzmr z$Uy{@g0pUgr@KRWDT?sA8yXtc&NLaNsX0w)EvhO5AbA-S)cR%)zLm|?!fNUA$zMJ_ z+OQ}&lA0=yLIjKDTQxN`C?ygfohuh3-_u{8WY_j+SN4qX>@P7!A-n4UW_=4guAM)B z{?a2lfWKnPcgV4N?b>5N3}CmR)Y^4b)j0fp8j;C+D_5=*2y^@N=^QX$QSjl6GRy>m z>h9lx21QG1YHI=Ah(p-h=&qV!b^!%UmJhE#e?IRxWZznKf6WF~B2EFp$0jbyJOgX6 zJ;Q{Rh@>z8WV*k;e?%!iO}_}#29y$>I`4a2RmRRP6Xi>>VT4-}g|aXWyrkd|vrEn9 zEMgrTT-Ioqh7DaP4+yNB`t4L%H$V^s2@v_XwZGBNO%{sC8yNJvF`gk1e!m$>tY>6r zkF5`9hUcu#b9Tnz#du<2HPo`GoYm9Q!vHQ1xet&hK1KNh;J{iPM&0H+MCS9ehH4bl zYryWU=SF<YPbEL}Qh>)SYh1_#uV!$u3|7~#y1+Y&XYf5a5f8c;ZkrPekNNn{J zaw4#QpzYHmyWuapAXYC5HOx=sQAW!|oabn033o5r>{}$3!OFunXAoQ9MKPDWo|e`? zrhtnUm9enl1baOJvgiWgf{)o`H2_VkzQpVpb|=VDURPHar=6EMjh_NL!Lx}LGZge0 z>#5=~`7ZkC;X|7VPL*_NlzqYr!CkR|<8Ga4nSfv%JwG?o=Xr^#qAlMQ{8YS?D1neJ z{yPlpY;j(2T%4{(D^^rggrY$ynnhdlI?2Vws1FWN1*fSOdNBJo4j3u;uUWGukzL{e z4c++Qv&WCifh}3|Rv#S_ZhiPp1gvbC_&Q>zb5?UAdyJ~-3PSmo<;|7(2uJYtL){OAtsNBn!ocaau>o<>kS5smugL2#kLK4GR_9^gP=4*{XcNF|hK z!K1yA5wo0;Vz%|0HsM*5BTMEQg3u=vtpqbaGy`{!iR(FPg7d(`x1!5mI zG%?&8%0?L%aK0|K_{|JvNnvW~^OJ3RUZ2t^pvCs=`I#Zgsj@RHRowp7`bqU;P3C1i z30JGt9fTGcm;ju>>f(yC6;EY#)WhM=SPE1fwhb@ZrNS z=@@Hg7^ zJ4a2pSk%YF%8FaJ-h>%16m~Qk=f$16Q)+`u=RR&Ia7UPr$90`J8=?@eQqfxzlS2*t zCoW{tk`pa{e%p-)X$xag3t^aBRZca4r_`f12@a-<0htCUPYRoxnZU8yu$B6#o3fPu z1dCva-TY=@SfjObX9OM@rKF?)2sEaiam|18?b{X12_fFYxk_Mi_P%#T#r^~x3&l;Y zVk=gxXbC@{WRA0m0KB2bS-NS*_T9T}16cZV|Ae3JYhc<3iSX%wy+q2z-%(C9?baep zpJU?WN!WUZrYO1Tb1v#%&8Bi<@3~Bic8^YlC zdr}*XyjX$ON%QdVFo-xgBz3K&q2bFY5Obl`wQ_Jw@Mt!oJle2pw$$GzH&oR4cjz0y zUetB#)(O~;$Ks$sOnd;Uz&2ED5k)nwpFfWY3TA!z_uP#elaLYwf7G!hd3nhxD%Kk` zS4B!qC|?48pK8<`4G{q~z2Q}1)6u~qV@H&0YBgubGV6SbN629KK!9;NJf;Ee-@l)& z1xO1^MsVtEeEd~R*+K+s3Uh|IoSuFIOHM9dmX?%s!!j9u^PeaxIW;wf!w`0Ist6YlwrexhQymi>a*4MovV55a6tM>_`GK33!^FJd$N_uh~e!!otEUlflZB`t<2~B;Bjl(&}){=Qh}L#9O+*7I9X4^5jX0kN#1gRJFp?=eP2l=92X($1$xm zU_~}cV>@){A|QR8;h7)yZjC2%4PWtCHy)DLjl@Y^@{va`H9i6-+N@ zhxRUIhg$67ef4$IQiP{^zh=lNC>$nYeR8sH)ej2+u$D$vCTB`W#&}=Xr<8A=KE)|J zC6tpbXZ0w^3$4D{t|wR z?iW~2v3GAQs=fm4@X*fe(j{KM9HgvuM;AGx~fgIhuUIiSnn!%^3h zf3N$_A)j1%N<+MH(9hCM6 zmCa1$0(6exue6!}Qcz&$fm4Z`x-KZESki`uglylu86Db?UEO@C;o!^4| zunVv@k4Pl0U$-tJ+LVyFXD|}pvFIJ00c#!eLPO!1zE(HwR7WzsaMy0(MrshF@DMct zC5M`0h5q8khGVd*G^P0Y8Guq}m^@UD`vR4Q@MD%E)}MmvDNB(pyQFU@#5&7iDiKfg zFEQCZqeo80f8v}fOyEsG~CQXJa58bq?+!e&QV3- z#*uo8P2updB;&ojNJs@T04XjgL=ZaTbmu zY@h!A7X*uw%b?i8+$u{I=tp-ySNRug$6&eS-rvtfu-HF4K=@zfO$h%bCBrWuxb%S` zX*IQ$`u*^q%*)s1J8xiMaK{yXmc<`XTDqw%^VV{0_5bl~58+>PRHFLF)w16r@vtB7 zzXsS7X*JGdauu0<1DgS-LG`uR57lgwI#W^qW+kEAa2bGG=t7)89bK$mMcHm}dEnp3-C67%u!9MJ)$cO` zUu{JnFt=hd+57eDrXT6Let3+9ZFs1Ig#CvosLOY{wasL)7vtQy`+9nMV-5NVsQsFW z!T8iEs`0|O@%jxLvOJqt5`wFSMFp0w?c?eB20Kr`Jlz2onh#4%Ox#IEv079v$63!p z_TxB_!B5COwY{T5OVI~a4FLaO-7dC|TFlQ*tu4}o#oX{4vT{Ha!J13#oRB<+$) z>g5UugUD!OhQ7IFRhOT=s7HNAa(_3Pf<;)|9bl(V28IDGih?%lgFyX#K| zf`}m>LLO!i0E2l42F3#k&d>TGr4gaK+@b=n!dpubJF)JrScPIcz;`bD^BLpl;G;w= zeA%#}D){UJB%*89u2u6r(LMM(&y)Q1>*ZGwQR)lRluRJ$_a8jKCOKR_9LcNex3SoH zr06ibi)u`M>{55QR+&b;k9oU}0=FvIRBwWV_szBM%9Flu;Stzbip}tCFsJg1fNH7{ zr(e6aKdrHO&%bD8i08UU_buV9m6)srX3gg1Fqt$1Z;9rQWjX( zv17+b`NJODyS{p|V3n%v879?qle3D7ihv;f1T6ImH=Uzf?%pU5rw+BMi%eH|%rf!O zia{tFHWHcq{s0Ti=6tMA@5On;SYln)zgO7g`(4Hzq+- z(WfBeuf(dB+E_(N zcVPL7J_jLYHK*Yu=;ka+Rsh(}VkI>^oZO8Y-9p+)^%nhgC%zOGlDVGu)jb=0@<(Oz z>NQo>IM@k&cnWG`W8>9v_Uu_w7=$pOVV6m0yWnJrB&+_qis0F|*Fr7IgeESN0I}i~ z7b|L;Eo2{9x({jFa*rpJ2BJWp?5(CKGhY(H}fI0w$6Ze4Gj(3 zzJ1@7#0EY81dnv>2;E*B(-$aYuf&n|U+aIsxs>?i&5bX1Sc)u6mEr7gEv@k5>bbEH zj=KSYnVp`0Zx*kGh6n#30)4XWFcuCZCns+j(3kr7N7yy~m98IvPiY+;ooAguBjZq5 zfrQiThn(`cu#EqhfI#M1TOdW4OuXd27ZbiI8iku+a~|X6l@Gn>R%w{l{FB4JyL>;u zyRY_Yw{M4_3=klF_g-y}%GtRF_@WQMSN^AxMh>#xCF{E_`vF~a6nYq^sLV|iE^48G zfyl|p9X)uk)6VrTf~c$DzapLE`IF;^b>?K~U2YxW0u@4@0E_L3QJQl7+D}d#GCWuSu6K1_GgExhJYSkv1Q7D%gojRoHPT zQw2{!6q=6z3@#nZo!`HIZzx=t$gY~}pm^fM3DS?bs;>B-degNv)X%~x3JQ!5;u&_8 z@31IwmRN!;&lLYu$~1TRMf9lBB(Y`s(l(Qf%>E@2;G8hQ867Q-hspfr5t#F594&D4KcP{;qbjx-%dMEQ};o)I4b8KvkBzhg{sge>gtc*`+Xi#z-tGI;X`dDyp^RHx!GKj3 zkM=iuJoSIF~4h z;|u};S5e$*^k<2zgF`kfQ%sz4npGV&E;?GzI_OH(SYtdZo?bzKM-ADv8yS9BH@R$L z?49sSk&~dLa+m`RoeYS~CHq*6SyK7bkdUiT_@4O$h2hJey17vg z1wVN3;9!)b#-Q>fdreLl`L4iDAMNVV~Lnvx9N!E>3(#wi7zyE{FZtF52 zXM(>+%@LsY6aL?#)ZK3uzdQ=}2v}J@sgogSD9g|<;!2f)NfQ^X@vBtUiiXgX@!2Qt z?zQb-o?+cQHl6@<#nbS#(gJGzfK^^c$IzzQ)aSPL$>GA}M8D7K2`uqLHDgiXR))O( zGBPq2BR_D|ggC@|j?{`Ko*3tSp+oeO9YYPg$IW@nd-YPZuFRDvK=8V^iUt!H(Q$Ed zN=kkPy#B2tZp_8q2?GUmX$HDi2}0}WmP7#lOFHIsl;X8(Z+`tU8Df0r%c*W;E$BEi zE(az6mdxsCe2dU7xbLX&9Lrv{?Pot&k+`*HM^#;8BdpFfoS0~5h_*B=_5J^Du zahxZ>#v!rHD^=C6PTgT8f`}l>O7i5R$^3?iFlLmGpE9i;l_&+lvp)=^KY#wRLd0e=68)iCT(`JxB9dB_*Y3MnNm=Hq}nT=I>j#ZnX#=g1g0vNPtF|&{@BJ{fMA& zMMVYnOaiUbTx`Qd(P?9L4maD5+>!u6it#tY3>WzA<&iEwhHbX*+0!RfyM>a*ae{lW z>f5VR$_5neB;Cp|Vned77YdCWm5tzTym|5#V7{isvOJ-NZ0aEwSoHXXjBK zo)pSq7yCr;_o~@8*XCv>hWe%N8hI=;X3;dCrDC9=%)+I7kO?E!T;aIqn>TOXab0O) zzer&3mVQXwD$4g6P}kj-w<%f&vGYk>9LLoOJ5C=F7H*jt`V^lVyZTT6#|ODYc8THP zVe!kCUuY?E2=7gf+5ac?LJ7_~_^9vwavtdacZTLicmMJS@O%%`MFfZCbW77_Kwtrk zD+z>wpB4gwf)D##mY?;1m9qNZ=9MzDgJypm#<}W(Vey%n0uZ-TGqQF4?E2pq0uW*5 z$!eCV?~5~4S2^yBr!L^a=3J8L2;D8q7qIijI-Z5Oyah`AEsMtmj_(@>a1^J@#yz!9 zuB{+sZuoOhD}Y1qGt9KGYODLu?;F?wvBP1?3=?~W?u=Cm>W<-f=8Z%aOMi%{hPgO} zvM(V|{^reKEVN~w|K*A~93&OQMR}Pu8+Ph+7JJ*xQ7KqC4TuaoOYK`{0^zR9_YY?_ z8(~HVI}3q{h5=&28k$u!o5sfPl=v-H@D`KFh^|quv=Hzum@J(#Hr;dm5D55*TyMF0#L;wa21*1jm@O?w|;VM(!{Fv=OLl)!eg?;jr|@YiD9 z+oEhI09{|K=Z;CpjYg4S>?H<|3CkgZCE(LjWzO-ai1pQz1@(bNMMa;PPW4IHH_&a| zXlTkVCMK4Uu|T*R|BPq(5VSJn!n2n^jMLLkWB)UD;UHzJtds%xuWXzn2fiC8MWgI> z9+lqZ4UUC|WxI|8!i-za;5?T?59Yj|^qBBL3HJIsK^PAql#V3@&0Vpyv}{Px_XX%% zo1mV6MM7Bp5AiKR(m$fSynNG>n3VCpsXY<|(XxWyCH9=Gtmom2@r(@kfl&@s-f<$U zwI+<{h2aisBV5`R=7A`k#7ad>0kN@F4R;iFT4g2h$KSudQqia8`=%d{AOD3aVpx&8 zFh6J6S-b;0rK)ebl71e4uEsh-cYV6~Qtl*l_1d+))_F4l*qsi4db&gwG6EgP>$QDV zUW7e;x*h>L=1YaBFP#=|F7jhJLu`_ZkeL~Y$7|OkX?0FLVSFgrHJ$IT7at< zXkY9X14z5iqcD^+Z#J+%`9WAbz!a*smDbRrU6G32m}l;)c?zl z{Wq5C#10o&bfjo-k=a=Xq}wM?%8*c69)d2VhvEGKj3#llXC z$;?#3=08{^|8~75-vT9lWA_Y?p`v;7V5PTEIgl)Op9*kcc5r0vwZb6V28^$Pi((+4Y^G1r|8=0_(}h8n0v)ruKfSijR{y=WoYvXLUVO@Md(2y&8EFN@ABXcvMIy^ zW>oVs$7H1K=+8c;f3JWVT6NVhwN^IfKRCLH6{cGbA`-v@YJgcbYA(RHVaLk4EmZb@ zQg25ibbE0gaHeJ7bve1tv?d%J)mtbs{~my*@l6XM8vQ?2Lo(P7l`}Wq$Z^Q!pl(^9 z&~zuKv+aYBUfbo(h}r#X%E~b~sf;v+BgOnqXk1L{92ptGC13Xp2}`87`rfR6px8Guh#BkSH5@HD|vm z_57bQ-eB@$aGVwv7SD+4K&KIh0>&Hfujk{+41DxYf^Y{ja{_QuMt-yNG4gSGDYJNW z%-;fcIC}Ib-@Z?Q|B_BbY>5~bD6u}pR>FrpSd)0&!`tdEb1wSvU=JlDn37k`K>$}+f#4)c{*z%Ecpydv%&(rV_ zikO_7qHsG2rIWAUCFI;FW9jn_`<3&xvE_$9jD)Wol9*{GTK}GUh7rFCW%CY zWK!r?Qiy;1n+Fr5EWxT>#qqBB_0LoWk7u;fy{qF7vJHHtIFO$=Kl5#RcYJ-*#h;7o za8o|rtn=w$dWXA;f>`Ap%buYjEaswq-X`@HkO!rP^m1nOWnYJVO$Q}!J_QG`ySclI zXEI*b)7O`n4306Vjw%24B{i$jVroPS7d|H^XJpDDIw}gx#UDOoeuG^9=Iz_dt<$w> zV{yigY!tbpM^-Ocifvh{p=y?uWM6F@*;4LMb$Cd~xjlSFcv2i6bMWXy*HKF0M087M8!yhB42wJuO>q*HO61T zcIS;7H^L3UF7N@0tsT3`d|2(Q)rqB!!+k?;9v=E8CS05=_myTYby62~kv&8b%pC*G z932wu#>U3pzIn5M=ZA?YhxgML9@u}p$<;@FdbrWD*vBD*?_^PZgvsexG1pDHU`Bd+ zdQa#4rDbJV@|?BJPIdL>-0wfIw1Hks*xA_uRB@P^bGmR~3;cuIt+%JgQ%ey!6gHy~ zGpz>v&@;jnU=??2D({+=_lTCZ^HW{a5@RRX2;D%+WkCi7fFfdeNd1N0YL4t&G3n}`P;zahGU!OK$@06Xr{o#~m#kBM7HK&v=Ub^J! z;^Knc?wrn3WYQ1Cp!1ZXM0QJfC$m$d>mQv%g1;zB`_z7JYf59^Y`B@5pT9q5Q?ZW* z^~!)0+@=ay_5Y0>dI+QR3=DA0ie*n_I8m!1HQ<+Bn4MI(nG?L)^IbFOyHKWLaL|ZY zIZf@uLGu?5c&7JlRW+Z;>9GuwyMA5s$Eg3{9ijRYvQycrId*bjN??mmW->-I)g>e( zyo_Y!<$2@m4{rYJbKEvjljV04ua+aA8(RseIVv|-&G)!!B{ zrRxX{^CrJ=VjzYW`6&MuB1?#&SP#|WFe-^TJIoJR_Pzu@LH*$+rKh8F8BlTH{G`Xi zjeDY^SgQ_emugVouDFZHz{n_R)Bo|~Ssq?qz2;2IlajJ5EG*b#lxo-*f%VSd8u5Qw zqaco8Czal!8FFca5`PvbzBAKchodB?M?dzob+%uQ&f|z%dIerrFUcx>xI!yOzZ*N z&)83Y<6bP-CK8EFmd(x0rU@BI0~#6{ffI^}Wzx|Dq?aS9u%UYJZMi*vj`J=CPuC8| zYjE2H>iBn(eWm);;3*|OId7A$`)es&ji@OoP##{9tKyc!(iS}>4xigEz=jIB-vKDif+|X|Q^k@T~ki+WL&9>#cYBi?9{c#HjM61vBDv-jY zkFb&xZ}(*G6}WK>lHGPAN$Y=+yx@KcKF$6>u~TJF4>o{ccyRLQR$Ql?BKK7qZdsp!+ib?V6= zMYFNGy823=+LIRNySwf$LC@@+>mOCOwgy$+2=~$Y;-dW+d}QFgEfXiZvRj9+>COru z?5m`K{M%TZz4)Mb2(@-{j7ItrhLOZZk(D11jx?@jo2J>gP_{jr+Sj!o>P zngLtA+bliKuNob${i5%srMRtuX-Jq{-NhGRSj8XVHDgyxq3GM#+)!0j4XmF5Ghy9I z%ybLWZDtcaFm>X#@M2&$9UC8yj*mYc?kWH`6crOA0UswB-Khiv`+Rb{EZA=B{Jaxv z?&GQKdp8}9mB=hK0wc1vwlj{S>uwjjNV9J20lgU?(Tlb z%Nl*h(J=>%2OeQpV@v8l7u2^FV1u=I@S{f>mY%8FnbImtR2sIaI;jPM1xO@KVQrh813K#?{ z<0Zamh^Cl#2ZpnKldGJfVpN=RS^*Q2Z!|DT%(e#v1mGOgS*N_kW}AEW(k+P-b>O2Q ztSknC%d8<&qg{n3Pl-%ql=Y1DR80?iIG;J1#ltjVi<-nwltwTc(P%14!P(!-dQ- z5XXQ?qE;`46-t?YGXzSZ#<8NqL05F_vu9!fjILSqwb9hJ+qbW|nd(>|A4 z9hpW;4ISL)9Nee6lUs+G9OWjcR7Ml`6@PtC-FEou+msZZ9;=En4=u%~=MR9Z1ve^V zZa(_bsn=nC*0!dmMv|Z4LmbR}n13s0vi;d~0blNx4gEhQn%56ZPRY}yImG$;!b|81 za#lk*-NVh4C$(Qr`8NbcXVe|CdFC#udhOc&yjD)|R$_KxBLVU%Dow|t)Me_16Za1J zur~4-3PyDP?W^(1zQyW_l+L-3Y0o8i`}c{#_d=0dMS)}KuGQxj8q8Dywne2<1L=Z` zQ&oZ@RhUJNsrR<|Bv6Z8GU~?h>&)GWLc0phO6SscEkehuX2Oq4xFy}(+&a@QzS{BR zJf`UZahYCS3*S)*9`Q=m^BI$hdLyG0w9KS6`Qn5m>CAlbx>PhR_~$0q5pcV7$twvr zdAkP(eagD9;SxNgp!DmZeDN2*Z`S43SCj|Dfcxm&8x@6hgu5>vp4$)qJ2f|7H&L%5 zwj9Z?m5Kyz%zshVunrOlELj>(X_5oa^J#JcH+_BxRlQ)WN(M=;_P9e!UzYvzl-> z($jOxMp|0*YVgAd-JhA_r(C`-!s>k;uj%@pXsbZjcoh)^l%zS`^a1T{f@sTbxPaRp zKJ3!3;y&!)8a}!&v;I?1-=g3i;iqtrv6)fj_wT`gujGJl0b|-*y`FHlv7oTfa`dMp zJTZiFd=MX=ekvoc!sew-|Lrf>XpL6=sxk)sZQWy&lj-1fa7ImWvADO7&sDo_ppCDz z8&lcIGF11d;=u zm)ZZOC49KTMa$x|qknYj_Ssuq5|ytP=p>c{%I=PDuxgJD8+~;B-cRZ9nsOhxa+99$ zVq?WZ*mI}D{13iVSeAbHr9!)P+wv_RvA$b3#WcrqhJnj!t?Rn2s|ecnN3*`peZSt5 zWIEDick{-9(~Ix_>q_`!>c9=@x;_t+mHC9buYSyynmW%JcuXe)z*{)8Y0Ds@XOtC^g6je|2RpD)HU@bdsApENHI(4)$kO*VKfI?hD4W zazfL9raa}myd{uI0P6D#TOrd z6S-;Bo_A#NxfDke7N!#f%zr+|e9+uL>wFxzea*&H9QQEy%T=UWWUfj?x3kzAMPjr1 z;pXvKPD$&-E<5!5<#z+!#o`Y?KL*Dx!PaYV53EI8w3u#2I)xyzwDc+fdep7MB93A* z8M~n#o!dXx#ytNfci7GNYnT75SY7vvjRy}NL?KJo@aqMzznmuXnR@{OF)%UJVph!9 zd8QF5(H%j6W@BXwvtHWFFK%=iF6Kb9^g0)dluDGT!T zDT-lzyeU1=Y~336?PgF}q-9@iQL15pfaS5&?3^4`jAQ}UEm3W4w-!53@2#S#6fg=o z$xg0poh@nY#$=EmkAAZ4s5bWBPWR=_>%)VTjkvhFqR77Epm|VLd3kv<*((g_MIXd_ zR1XE(NA*~k^q8(maPpQHTtT?J>(%n|(eK?0z#B02$hXIFfNU%TCmGP`_^LZ80*uJA z9;(IqOVkrlN;6U|E|k1pP~>%(+UCmK`@WE=$~tdGm6(=f+iKIX5gxmAbcOAO3m2w~ zq?|&)Z(+sOVx?l}C69>fY5?l*FiMDvkA2#(7`So5DnjNyDn(sES=s-N4>#D@Z%VhL zv$GQ?XBjoUFl_W%`59n4DXh1*w+>IYcI?^(1b0#X1t@@Dt?4#z)2R_HMW68TaVx-A zh2wx#7?_zS*o|AVZQs+hTp({)`#|=%6p3Na9*um1Sk)|fr#un)ov?*IT-m?uB%b>C z?1UJFB!SPkr8?Vo^md;?V=WD{!@hhj6koI-40|FDfk&3VoeNH&mKqWW~DZ=!r8 z!cGW4ky1hOT3X>)JOV6Vzar$qdxH*xm)6wYn!2gUU-@)9)<0UDZpvM9G;Jf{uI4gc z)O>V{ewv&&D}l9q0155dpB%=qr4z_W8*+JwwA1OP-%ErH_OeHl|`jenR%h z`uxj;4|`?*I~*o>u)mu0=Kyfca@c`C+xOl7eTXQ1cQzw_=|3MuzkPcdj2*rUKK=CD z|H0s)SOss?-QAr?X7PONG+h;hgMyEGYc!@}KHuxG)YTYa&&%iAOl*|2zHKKbR##NK zabB2krr;q%A0^>%ldx=;Ca<4(<0;dD!otGEx^bXH7YoSNL+W2CyFPpyUJf^eNe5x% z$Qw6qR1_LS_21Uk1k5Zc3K<>420DF8JRW0tYbhQ(dbG&W`{&D7x#LwFB0)ov1aq2Y z2vEA)AaNMgOtswkCWnHix@sw@{o4n4Kr#li2l@oHt{oqe^RaIzU zAQQOXKDznubk$8wXLJ{Ca=nERvmgVGr#4nGbhN7s$KYl<&0$r?NGCbPX>NMm%w7>E z6(I3mtk|i83Eu*@JvcjaFMkL+?9k9qOlsl4DqFyBb*+i)i@FdIlK#m$6$gm8ld!jO zt|(~s2>{<49$-#luA5NB0XT!6u5JbXZhQOffyOjWUWX5;b%~|=n75!-1WZU~%{hkj7H5+zbCSj(RIyR;Q(Bjx~ zSN7@Cf6Lg*AJ#0I4WWyl`MkfQYkjT;}2E!e77MVQC-ubj*Z$dwV0kz+Rcl ztfX4g%Hf&3g&EA}UAXW_Nm&{5bxC*1FjU@nf6mg<5^iQurvyM!ON$yY?NpLfkZ>He zkD~wa{u=lp0yNk{Q9?axUJ!MqaVRQ;{OhnB<5S|bOq@mTp8b1Sy`t=KLWiE7p5NH3 z%Uyd9>Ptj-4M9|T>?o{|pvIBcnt+Mmh=_~eKTz;DGc!|DQNDE0mhj{^ecmzal=t-M z(?gniP9sH!dwY5+lFEelkPijIgTt1f;$bCjs=oNFr7>KdWAp$D04=@mzf1%Vc1=U0 zBP`hBrapZ9%!DlHNL?T|8g7f zqMJB#x9B(XjYHjnxw*M%SaXp$05p{Y!Cmf*f)>CA(3N4&4JO-Ra~|6Gvp$uhF;(cn z%_jw8RMJ}};UK99UCivducnv*OZmns<1F*Z)Xbg}*rVB*`B=1&8CA;j4F z_>0?DW*m||+Im#cKIAn;cxhQXBkhedCZrApn7@qWhziWJxDq4eK13kUnPM#fHIRlY z={JEsws#X7J?&K+NuE8j2r@&^6o;}$-HlqZqrh*VuMiUxOJtWoaH{JUSpO7UWbeR0 z&DXDw!CSAqcUMVCDcO0!36I8DSXj_GVL`3UaQnKMX$Q<{W7~j?vvVH!H7cGdzE5S1 zzGQ0p9*^AJ-8W(NmXDUMiHWq3kdSHPtA3lxfm>@YUcA`uGmPaR5WLo}eSk%*1qB7w zm6ahQBW7;TpLfGbqd$Lj>JIR|9gUou|H2`9??+FbITNc<=>ElJ_2t??i})wL*Gqkq z28tS3By-0X_f)!M7r1_rZCyu>DJskGJNJmoi;xq?3icRx0|lxQ*mQS{Yx%@221QS| z9lrYcr=xIC?s!UqWXv~Cr{QO~hgx#%YiesFASk^}N|Np9=)m4%1e1x0iNqPyP!e#S z&qiR!!^4C9XxPh*=PW<{jREI1n-(%Q2hp}*BGi8n3nydN%qO_o!2ytMg=hW`8O?(Y6EE7p`cP)F7m0>?t6^qGw z0CN-P-rPSrrMWnS=1SE!n-_Jd11pGIY$x~+8whkhxUy~OMlV*--cGRYN`9#%T331J z6{Gx-?E<=f+HCiZ?n`3r0m)0cHG7Hhfqf}scw~EJclX=- zAA_Ghdj|Y|`-Z)j()@d^E9>g&i2T!kyZ2mIANhOSF6gAwF&cRL4&HG=-|OS2h5)7T|ozX7Vn>HtH-IB^LHjaSNWgRG0E1n|F@@&r-`n8D56y&yO8 zb*rlEaILcO0Es)kXs#rCx88kY6@2O9#~iQaYc$LqZ@y}0a@;!40dT7|IfQdzNbToP z3mceaZe!}eBTc$hLHtX5psJ;ek>36M0dRa+iEV3Z8xgaP@Zlx+JsnL=)^TQ^QuU;; z(I8(RE!E>39FFHIUxd9gqT}2$-%K{kZpy#;Z^#;pS87>hIr~H0l!Bf&ap4ZKhvK_z?ge78~~=Fnne5sU+`f0c1nR z>ZWT}&L{u+(1fHH_0G0eG8b1Z*>v%BSu-!U_dcbogtH5rlUN_+fum&H%f!@@U)Ff< zn~659ueWzpaxynXZYALZ=FE$Wivgr*(1}YHmiY5coS|0B(ohwB-cihtw-Zx11)EJ> z4WBF`>7Tp_rHO(PH~d~#+>&5WP1G!!VDbFAV&&%#)#p#ehP+Z}Gr2+9{?}?VMGgXi z^wde=QGQz;r+V0r`uvYKe~F5Td|SWxQFt5@uDM&(To}iv>OsmP__z9 z)eDXLAJk2L^QKJ@Oz%Ei`9hKl#A!3t9Rz}mjGWvKGSk&Bc%J}R9WSM=$}bfT7t}a? zE$BKEx%0iS=gSA=rQNeD>}2)%Y(irAlaFnW_3doH$1aq&w9Fgka~+3GC)4qbA(dSM z?${|$9SoO0em8*-b@bRVQtOby>AmibK}4@4R}OOKES4;_8tLdv(h&3gnu09Wx;86* zzV@VGZ{XnOt)>+*Yrq{G53gkAAzfLf{3B5ek*vfC^5C zv}_TA>?MG-Y-J}>$q+V$lmu*n5JL=`VOZt_Xe&ZkVt^D6g-~pj2n-Gc7!(0RG-@NV zM0PRBh=72xtoFOHzjDq!?{~jh^Qn@q&nrqGwRYrFHKP=x1NOhE6?yCE>HP))i~F5_r5Y+o z70O~|{O-arena*v_8_y6>9dW}hd+Naz}v7GdTgmUo^y{9DomVt&7we^min=36uan# zXMHm!hBS@*zE{&KiGvPrv|<0)M%gcCgayRs1r602VJ*ENItw>yRGGR^o*CERnI&S| z!Y_vLiybnO4|}NoPsGY)!+LE*y|Jl%UkMn{wgaj7*EI6@9wMF7Eb%@kaanzb{yx*n zvvzC#AqH?Lo~)i>dlh&8-HNUn|AapaX^=I{s47=-sObl{qTYx}T&Y6(;P2y%nl4N^gwDQ(szQbv#g73 zVS1uQDDsZ$>CRqo9qk>sSaka*&;fUbga>HqKTdn&-}CeZ?Tn?Eq->Nh(BI*25*CTt zaSEP?7m9v#^9rV})`(2gU~m?XLH;GItRF|*OIely^UXEe zV-Vt%>$f)Wm(CX?yf06p*b4nTBYXmmD18~rlT$m2rzP$zi%}$Pbv14^4lrr=BaYxT zB4lCS>+x=mZIpNt5tl;HFH~zjLqqHUPay_=k!07pG zlB{1kY*4e1e3&mhW0f+IG9zqC3vIgzCOiDWvnMdocgZzt*be&QrQyDP(47M>2qW3u z<3qxu80Y7_IPv*{dBUYSm?Ip__%lhL=c3PZ(|d`f?S<2cT70Lg5v_KBG-9pwnljQW zkz&{C;wKiPezX&IX3>K%lYasZWVI6XJfw?6jU6WHj71hay$?r+*6m#_c3jw1r~kAW zdaPS^=k!e57)t zK2lcLDb@QcOMx}KGPXoeYLA|oRY{(TSj@=mIHiP-HtR|vV{l^1k$ zH|&ds6-wKdv5s~KH4+qmmTLf~*@Yz2d(#dbgscp^{Ja+ldc2UD?0V5Q;bRb(Yoz>% zzRNw{3&=JNG4$AV@_$eGNvj0c$&E|mshW>DJl8{i-l|?wnO6BLqO|=709e=iLS5Re ztF8^fPh1TO<~zGuRJ8y~Oe0jjmG)q}f|B|2ROk))yA{D?mod|e){e01Iv!p`ze-1_eE*)5T*Bo!O*O< zRTs_$erpxS(Y+G@H;g;=uSb3~aywlf3mH93ldBhTcHCwoCTTZD0<}z{0C{}jWNbO+n7mqf*XC6F{kzHO@?k3%OilFHKE#`4%3c~j=P_jM1!qq zTgT^`+jIaw5GlL!p*8H=IZyE*#JGyqep@;LG9sMi7Iqu!MT*}l*O`KSTRIVF)&R?* zZl{W&&|+{IpP}pP2M$-b^-D<2GgJzw1MU$ao|WeeEjJl!zYvipnX+dfzbnF|2G+g{ zXffx-f~h$8k0KlJ{nz_TMefFJ3}68BI+a;0@jn=9Ahc0?$bvAIPBkL4~zS;#}M0WHdjHIxnj*>~Uj-9CxlHckhv00=}|5hKo=jYAq z$ThUAA-;{C1E0B>#5I?tHgi`d^Kmkn&fdQPP)h>@6aWAS2mp$mI9PX-RAl!D0|1CF z0{{;I003=ea%W{^X>DO=WiD`TXJmW@R9j8Ac1uf<;_mJq+$pZbiWUlmV8z{~l;T$0 z-AZw{;1Zky#hu_3f)uwul=uDa{lA;VSxj=~%9a*Kkk&z2p{8qwRC? zaM7wc^~tlD-a2_|>#J4?3#C7XoDK!0b%e)f@_{1)G9ZdC|Hl`7)q&PhKhd4}FE3{) zIs|#QwqFv&nBaWt$gX9e$kCkMBB6IJwTD8Z4>J#T4+gkIYHC(y1f0y8n}1yUHhYCwUz{gRa^|9dKsiPWbA`pW6SP8>; zedAL1u^_?iq<|N>xvKT|P00AbarNJ3lEdER>aZZR{H-mKP5}l#J;ysdWL!mZ`?v9s z$qW+g*MCb|seFOP0vLFID-|&d;60U`K8=R=IKE-|Yos#0<1O>w(pH`TBhFA~)!&}@ zNr%CZSx_avUXHO;A3UHLM=QSy>lJMBc{I%;r*Bs zp4O}Z`8|#GLD#I|o6x?ru|W3IFkg>YlR)-#XN&&!q~ku!^4n=TtVf;X$-LJCN~9}; z!yliX{=g+rST9-m5;%s%W1T zE?~Utz&X5!OPwMyKIC0nyd|+1xD)4VLX}XGo~M<1H=^;nJC5~m)I?k-s^zcg%BXRS z^~wdR!c*%f8ejmOfZWrZ6~z`C@Y|LWc8(-Q)_a$NV}MqFn+UXFx(lM$qsiQ3S!cuz z*?jf{nRJChPCd8Wz-2S|<5hv^(LHxvmK(oxgBhOS7;F>C^4W!}Z?=y+csjypSAgZoNm7SVjD!X~BNvhZhgS8Y?)m&r;Kloz!h#ab zr{@mJJ(4mbe*N#1)O@B_r>W=8`lN5y_qykh#+Bi3^&W2?1Ln|BoFK3jD?rODG;~6umrYkMWBl0abY@dTf*Lx3ceAN6qp~Kpf89c%@x8^8-GTJUop9{y*JC5HJXS!1K7gc==mYf?J$SSxTp6Tj|1 z8+w|EF0B>f#wx?gPt_n-JtxPU`l|LyBH)~JpU~d=?V=f|%O0rKs2k&6 zi--NRP)3$4i&0v?Y*?_O>$B#^Qsd0wqTT$P%@&kWNjjboa%GYWF3Q6N($90|`Yw%| zy%OSPM~kj2dvf{Nz1Qt|bur(|u%~Remg~><-`2MF=)muo?Pp4v{R7HCuw78|G@%BI>X7UsfusouiG%`&8~RU4)nyh8eRP$N*mX@JzNT5-T!zt*Bl-i z-=6p$$8rTuDWloTedC*qvJug-H4 z=u%`_I3&{zrNyjQK0&pC?mbDSg^_#d>wcb56x;L7XS?2_e&OnS31v(uGmYhnEO=JC zKsYHisV05fD~Q7K|LL%-UylLj(9X*02ICuKBiFtL&HahPyyT%S7&F??%!uL*en)xC~R5q zX42%w-9f;0`IvgFCl3-$wp2v2Sk`Vl{@Co0CeqCJ_1O9~IC)ThQVG^}94Kx9jmEA-ZuwY#dB6rCwn38ydZ`=;ih`6rx|1Q2 zdpiFp2^sQ8wCvgjWVVVN&1N;hM#kW}NxEL6C#0>s-R^L!g)EtoLrO?%g%pa18w1qCbXa)3;qu~% zG9A=!ntbPUZc>J?ojkheJZLL6L_EY|-JBmgsn|#Wja+b%pZpjEm>#^d9ElPF3u3iFUL{xvS~cy{4Zcu>nes`FO0Cs6cyLT+xwT+ov#hNJn|t24oB#dm~!r^ zWWJYwL|X>I-?ew7f%d=#LBMW@BOO0v`h|ibEO$+!NF5pMVE-XWipn3tALqHayHQ5| zjv$D-Z=;zla~m@noEG(|-eBc8v#7qFH+EnnKdWe*p@0qk)%V&2M1gUwTwSZs>uHP; z+wT5)%(F7u-wa}WT;A>fa*BRxsBd@O4bctyjGuKyn~#)F%xv+^58Pm((mFl51h^m- zj`#A6f!iKVj$fEO%(FIZNC$*&Xzcdomgo3ZUFz=i`Wnm zKdF!UTOKZsZO~vEUs(~;KT4M~Sh?7RLW?w*P}$Q4Kn3cdFit_j4|+bh$?4*88@%cFW4D~Ph!xN0}KF#DdMrftO@_^>uWHW}smkT2)(4-l18&pb=+7Tr5UKVb{_ zr&vH+=C30ccv4m9zemzQXa54DjM_ss76cU1Ji$YTKe@VFoXr2j&$t{Z)3YH z9cyDgah{ga*++L?v|MxVth%^54is4y=)u7zHTe~ykn8V{lZ9`&?kc;ZXZ8q{@-{PU z9^DuE8_;JzCURkabI@?w^_pFkElC&T4%p7}6NUOc-00R>PL)O*)t@FR(B?8wr6@%; zW^1w~Nis?cW{?^9{+d*aF9MrMX1OJj5D;HZnxcSkWw_`Id4`b5yfi zTYb9r`L;6576Or?KXFz-m7fn+q2PhM&lY(kv9h@1Du$-BM8z z9qs!k@Aqs~z*LF$X#u;>ZoV!{+-@-cJg*T!{cS#h^5{YYY;m!d%FQUZQNMgv@!5N~ z=njb#zWXz2z1SG@njQ2_how*CV$o?rHrssCdaHG}Fs%_LEavKM7D8-nn|J99ZsuoB ze%FklRir7=2|yyabn2}M2TUA2bNVQt+i~*C@2FwiL;qoC#33D%%d)8J;;s;WD|Ew# zx6rdM8PG2C4hG_=PgE5Z0JF<=C$0isY!5cG-Z8oqfq(K&mq>HRxK@#p+G+Pp@OYl= zRllrg*ZIMMZmTDc;nkq_&fy_ho#CTtNrIqBQQh>?_siqTQMBxD z?Pe<2Jye#>a<=ZK8`^r=eUD$Wwf<2Tg$bp}@o@mimMtl-rpAfRSZUUJ%Z7V?e_?vM zuc7_!pcut(V&hIYcB5eT;QDM^a(O(g^1YS*Ooo=j{DqHtF%Cx)j0Zmb@*x5?ZlzlF zc`te$Hktprfsxfw@?PY{brcWX=b85Vvvi;HxkdYKRFfLrXF)+hmy6q?;5Zf00aCZc zac3bQ%9VGf5*^ppJ$IiK zjBJJFD*5Gc)>=@naSYT4>Q!4;cU-LEV<}}sz=RJB%SD`V*@Z!PTF=gOD3O&!)H@kQ z>E&(LmZG<7=y6JPNMAm~G-{$YXdO3SosrCa^?5GCx{aL|agu>2qv6B#jK^Ma(a!Gf z8g|y@OZ*Scn5v9lZ@a~AU!aTp!D!NtavBp!iuSvOlW)C``5;EOtxzY{tNgHObIdz{bXA(eL5zrFci$%B|V* z!~F$%L*5P)x^4GxZZ}tL`g;0(dD9k=?=6J<^rrpc#(VVz`Loq!FX(30{chH5lM{XB zc9rdtVB75`d)$cG=3T@F>6rHb@ypKd7jGNh=(j@$Hp)hhNZIWmzH}$MA;nvyPywAf zOI#JPJMNheZls2nUHGaB$4P!yNssQ8z^onBWYeUddAPqY2wZf?GWka&A_Bs%udgqE z28;GQ0=C8s^)F!e_AKWhV`oSnIMS?l7NEb<&}X6E254{pO_8n1&>>4oA3A4UJJS{I)Fp08|$@b`RO_>&or_!UJ`Hi`N z21-B!-A!w#s6e-3g^Bv^nqAwbO}w_VGCR}?ziC}_hyAjKScQVdgZhP_q>Jg4i^;9~-w__Ohelhgc1@9R;#iI`2*(MSjY` z2~jy1f6A05-zwg~k9{?3MX@6HFNJQ-Sl`VLj9A=Zq@5{}SQ)~yS^m*{F$E#gSnZSP zXtk3}9eTX*ocP@Kc0c#4!nbLc87o($xeP>^M%v6jg|Bz=yl)m(wo=S9b6_Ek0+As> zftsv6FE2ocO^9LPAY25V{|AA~bEpD!PM(mH~^#z(T{7 z$%8u<4}9fivj+o}UeHL`(iyOJdfj9B2#WIk)}XvyL~Hqa+l=jm7qBV%KUr*%yETnjK5R5IiVPT*rLXZO+Jq4f8oKBu#bfYjg0|gUUeC0TdTeL#8Lyo9+O{pb!xAUnShqc*@JvXVPzor{ zLzF1I{|xwJOz1;I#IlgKqRVUL z4T3saAJu<11eHx$+0T`=%+2XxVQI+T|1yC5cGcd0)*(Id;!XMxw&UN7#A;Y-xi=i& z3Fa%0BJU_=%sXhz=g_GezrgBu!lNfD6kt_&PL=RK+@2zR`8X`GBlXMkK@|4Rgfk@$ zner@Nz4Sv%;$wu=v1&S-)_c4>{*22uUGJ4Rd`QAKaQ8nyKQFu)e-A7p9e?3oy2%5< z^|sO~*AJaeg}JFJ3!Xe(98P#|oI#pqi54n;SNn0K-BF~ScYrLJhl!L!W1{x*SPd-O zkKAtt8ss1Bl~j6FnGxc;8)%!?Kse2m7Aj5D#zJtp=b+y;dO*XKIT&W!J^+Adn5m@l7? z37-xp_vVD^R2jo-8~X6Tf&{{&PWD*ZHvm@w!7!(K6rj{*gzcB>e~bF|o$xTtJrO&jT*Db;za(hhv0GQEtLIp>W=4mh;&-mTVSd`6G8oh8^@!|7(xbPb@ zP5RI$w0w*fJ76-o87Z9<`Uhjy#4?7*ha$-A$kHa`o*CLFw3k#r?A>hQZ3A<==RY z*0`%(^;dNmn{3<#aH1*SHXl!QM3!>|yx2gsuK5aTnf z$lM_HSh3!Y1VeC;1J$7I+nHW{i@v3xV|Q-_5A4t$d-S8evjlaR(jc826vC~8DT0ep zAt(u%;ahF(nPje@{nP3CGcuWy!~V>;%K~FZv0izx zQsQ@?3Ln!*0Q&Isb00f9cJk|=!Lw~XLTP+pK_aRmz`WYSnvn`bCVb^lN z`xU5m%FuE%|{EZoQ`r2ED*gL5#r{Sg2}=Y2=5SaH29O9UDk;xJ!j#-Rz@*k zWMf|_1u%8ORKSMt>T~7c&@Uf8jrUSgQ_#AKdB;85cMYY-^<_6HK{qnMGk#{oCq0S3 z<&4#Bok`>B;^F`kFO?prTbSBCuLKxvasS!1f`)GL^bs7kKt*e(t>8tNdPDg(wo1L6x3@2~x-7S7xT>W>KY&f9`Hc3k})hXTL7{bqr zmIv0I<^MD2wvD^{i}taL_6MI)u?O#ZyOmMuXyL9$jRJE_9uja$6*z<4Lr?mozE9%> zmifXm@>;TnM7|8=I60cax{85_PgEY}K&43^pCUoJvC}QbEsi`E;x?6kxAdFr6_nJI zhvIs!eY47_{@nnMyo%+E8-QilO)$;nz7~k@4k2FYPip&9K*);HeLJwg^f<^^z8JaT zew6hTrY>bOCCKL60`(fs!d*}smq4M%7S3+OKPN(|1Lwr$tX2cVYaA%#1jii;BLf4u z05fG+zW85Ti^cJ7f?Oe1fomzFLgN6QA)&b5z41QoInX3&+!G^A_TuV+97q zURjU79~%H${@;dRw!!qKyf9hT5$~~k`snEB+Lvvm?Tnq|y;I((PlZ#_pK?9Sy_8M^ z|FbQ+7N060Ec{s@wUb+$9{gYXk`Rp{Vrk4x#}o=g#BO_c*HU%l8JA<>Xm?>z%a(+> zexVouEf$jSSlT!^qd(bu1$=QQFQyX5vto{>_|HbvaNxUYeiX+q^GyGDS5=1jWb|Ua zQmB~wpM&IAeK+580EL_M9CdMpDLY6OWf{M~vb50OaiDkf9$>o1-MkFJ0U=&k_}t=z zdQ*!0lf~{D%S2Ca?@91*IZOZ&eB_qr=sk+svIb&7kFm=~EROc?qu0K4`_4lPjp3ir zjgkM2)jc>mRw}#L$*{`*b^Or4quc;G_5UYT{+gWIB0G{;}q( z#ZPy2j%g%?JKSC)$p|*y8Fynk;8zfGm zTJNPAD%$NRH!~{!V<11B<4-Ydd`dNi4CiXjB?r0XxWDca>&A3L68&fZvqw?&*fC2! z=rrNqQy=4?;a*t^qeEq_|C;qjs86!mmB|0ILLr3C&HsyZ{=YG4#r_*dUia*}7T655 zRLU<0zCB^Hj&+0Sz}Mk_{=rdhXR$Aw{f}tBY8q%4od-Vee`=zr|ECH$=p=9B)v1mZ z(wEN?4j~c%mErI>Wpn!vc0EX63Qior49JX$VPE~Dt6r7iFu+f1wY|vxiR_GHR7b^` z&0%qX5e*)XlGI^ZyD^P$t*k#+Q+Q#yAA^p>iC9yL1k{A{9)$~M8(9zk($QR4e!KS2bRga5Gd;}S{UeC zkM|~z3&F%2>PeuAQNRqM3s8~i|X>T|VCLTRXXxC@Qs)!=)Ovrlh zbN^6#h37+1zX;``j)xC^ukPB6``tX+;`3Ht>faaEAWk0iWW2n45%9bHR5z0!r8Cv# z((c9vD>M9Vp`Cso<)qLpQ$>U2WIc*RjIAOM5|*?cyBbk5)_tHbM&Xg`c)AI`#GbsZSc9;nX3y&6e^i%rLexKmSW`Ut;>EjH)=~;!j;LIW zE9)JD!E(tPU6Oqh=ug0?Zhg8=5iJY-oF6Ew`%YHp*Oa{Mj{xH)DV6%PZ8z)fY{*(+ zbEQ9B4ynB`mU2WgJ~gJw#|Ze>^Wzp}SBGLN!fp?$JzuiVZtdnN{uS3m`5^A;G8|fO z%|7<{ei|VQ#kx4Td}StXB0a`bY2}bG?&k()nb^1u^D4+8gwkn1hlJjo_m_y&5nuWP zRXr?FV;q_E_V&(Ev9*|_!v=v1YV8qb&1lkTmc0q@B?zd( zG{SjtY$S28?(l>5f(Dsg5fmkT_yG>c|>|k3!CCYRz zRbV8X#5+2ap-b_UehtS)_o?kQsqtEMM9uE#yze(rq-wXMzNztD#jR0OR4y)MYwM1~ zF8o%y#1-!Q53qc4=s23R$0{7)?9D!49kdZv6Jp+ST&lwD94|qDwct#tYz8mBp~{9c z>*Xv|&(YC@pFT1;f*)&r$`9I>t!;9Mu=U0L6K9~HnN@eV9E7WqUt>|G%I{td&dCT4 zp^|J#>e6BAb^if>y_bmh&gY&<5vA^ehdQkLS&3GeB}ooOT($M2wA7fG^y0__o*Uye zo?$ReD?gqj(;r4G)bs2dJ+vK@%)`(lVg2! zF$PR4MGV}*9g_&xqR5X|SXy?XX`MO3RrUOWj-6`p$foHMWS~K)CO*C?sUzU6V|H{w zw4Ld33`D@o;!1}-r9x@ul4viFXI#Jeo)YgwV391el3rMZN$=07AO5Dv7&H!h zzF*Onm?s7z-tXmq?;28PzIzAt`Wf!kUv4OQ^^;O7qao8Jh3)XSh)k^|e1W>u!%xcf z!T?9Ln!SdK^{R(kzUh@)!t=YO_T2a!`kG|?8??!&u6%to@+DcSDP@xIv?JB}NE5n% z`b2kcTqO3l1c@Oh&kq3TQ>};#38sjOu`J3ci9Hj-ZTlX0E^O49LJDfVjHsyNOPTp1 zO9QHnSwnmk8)2E@ms3t-)m1ixzSBnA$r`xR5I0U@FpVTx9UG{(I^c^2%4WkmOp&iZS7o0X_=5+W{1Z z++F{kpne)F=(!q>I%65nuttHP-VDKLC7I$9KRkA9H#pkcIL1F)YBgzqIlxf_q!T8m z8&Q|-?9%r;L{o+NYxpA#!(%P>Z9;g%R$`Ac=R=U_2wbRdr+}av{ewgpJ zk1bWjYp-AJ5HN7T>1@wuaDl9zA@VY&;5WX2uQR$N0=nb0X@${lpOc(3+gcNX@1Uw7 zQW>|xl$p$Y^Kn4AR|f0H1Zl=dOYbXU4J$|w=;g6{m=24Ka3TdKroSPbHbK4y6IRN+ zJ1i>MqI^R*_}Eqd_vQmC}4nmEiD-x{araEk9FA;pGm8W8v5 ziqK4#cZIfiay$Zm{qB*4e(cFqs4r4($P%- z{QOyoQ${@r5uJ2xHkOu#Bv`$;zxzV$4O3yh!--!_Hd&Uhug}0{b-5N=| z+LXMg;a~QT6zEagV8{!8bp(_zb>IiiVF~8)du&38@ZTMc6EwdgjsHSbAn~S(`%Tq1 zdgqUo6&(VkpI!w(EM8YB5!(*rzGEw&wq9sSJ9m!=Xno;a&tAy7+}SPU`csU%XE2hu z9~I33#35(LjVRu~EYh;`KBmCChc+VwJDxRj@>L&v(FvFX$U1+@L2yI@hdp{AhC}&Y z>Yr~>NpLeHgyV$4Kl5%Ez7@Zta}u=L)aYX9xKPx2_o;oAND?kM*)_!as~xJp`d2ln zE{8e89mwY*HLZYsOhv(-h~Co=ixOxJ{89p2m@4^5dEY3Gs&<0f;I{Io;ogF^ZRm4c zHi6aUknGxWJbl*sdU7j3OmA`s19E7D3PwDD_Zbz%_fZZ_euX?|tTJPFWw^1(7tQmj zogd4(rqAtc>M%(BLz#L9JLp5ayY{p(5|OCe=MBE>wWY7=f{-;?jeo42qt|^!7SSgt zFZIivEh(-G|9$}JxvN`04wY~!K&-&+(Vw-KNj)`iB{TT+O`=L}ZT7hmqsmx{Iq*Z$ zVpS_nm+z}r2=Xj`NV}OX1TU@@F?@p2C))kcOGX8=&Q13#2Mai6hepey-}NUkX}@xF zK65A`7buIYI)wb`=4u6(qG&Hak5aEK;H+(M!w4_1*GC5z*U}+%KV#3NNFt^%?8lZC zMUKP|U-Ja$&y)>g@+C5a9o;EdVVC~!1+`zJ%*o$UN`$DnGj-->8H<-jaF@hZJ8e#K5EtNS)5nLb0Q(r!gGvCI>x*EJg0OVw*E zXIG9sW{GFoymKJbrz)VbJ%J`DC?rSsZqe`I1!(*2Lz>dIAnyk1!+zLM<3&d78+P6BNN$5+jCka)n{d1#_N84_D=I@#=nx4aym|ShGX?nNtbOoE!;R4X#4x;yH&~P{ zSN*sfREI*cznOwif7Al?Vs~3SaakulK$+#-KErdLDn$J~e@>->12=E1NVp>hfe%w9 z3}N#7{>S-?4wbZ^8Do#|bs5~I(Gqt%;SMc!I3!^(|Af|YzM3Vjz-io=Y^5&EMR9aB zw6%qR0Y|6Bgt67;z*@gKwmTRNz&{(kphh=Y6(Ryg00;*9aRftqkRp3E*%C4KuM-kQ zrdI`t!ljv$7*Ggr{In_Y(EdGc9H*#Ot5f}iC`m4BRa-v%(&+<2SqbXvAJStS$V^*ZfdM&xqv|YWi_g=X{A6ge2($^{mXI0``Sn+^)3ThlENZp8HESN#G z@yKe*FQo{qIxO`wdYsnz2Rof076)494bvj|n%$(YBg+2JqU8;utZ}fYp($L77Z8xl zeV;c>wnSgGeBNNhTan8v)OZ}WMxFGD#}SrBzCE8Z!E-3!uvWDo0arJo@|NrNR3|8Q zj>QRiViZs%mafPZwxr!>jB(YrB<1=EQ`@Z(qqtTf zgOrkY!LwIA6|)z=UrU(=xTf#Tmb?|U{2&(JrDeV!#quS~y2skURGxOy*@cZZMNa!X zhpE@`wfi*XA?^49GB$kt-RF7@gaM6I9hOMfj6ExjyY4qSX7=Bsy^RpdzSrkfP8}ly zL^gk#&*^TT&ay){OQkbtoFk-|{K;SPYs??aR!;2YtK-ynw=a~I{gH1_fWT=9Eg zh9JBK5g9!;#nDT52Xrt&rtcq2#{%J!M7Hg=2akB|+pLDlY7MiWkvdLmDVOLX@`jYM zR4Hr7q~@z(HH7Z#pC*QqRu6?GgsVxsZ#@#*uhoZhs8WD0zP}!YTpj4mfxHExq4R?t zl8Fy@nGMyOhgpuhy4y$PF6NbP56|0fR<&M@ir^ne>16+w?J)*uXxz0L^At-FTi|O8 z@rRDgrO8MVw}A3AUrT6q8FVSjy~wEX%6?-y21%Dtxp8NX|n@3W37zu zs6tTz`~3X2rni=jf#RlO34~pRf=&%m1c`w9uhXx&HFw) zP?tc~OHD+jeS@7A!hwRA_nCqLfCZjOpfMIEV9|QX}~8n%I4^ zVuy1(ATbg=!xD%=e_vLgF?(;X8EszBWF3<@$-UHIMY51u()Wlz#X40=7JtyH`#2os za7D6NM6%i(cYt=Nzmd}SQwVj7LB88InpUY;aCxRC&NTuf&b2@-#G_vHQt{Qzsf7ym zDFq74v>?4f&;0Mj@de~)foRqg3u-*YY|>x`ChRNUf|(k?%R=?bDFs-vY_A_|4K_AD z#)+Dk3V$HX?awB~Kj6<-yA;P1L;Q|Yje6{E8G(ri08Df3=y%i{b>z#2BVH1zqcL`=eP(Yet%-acM8@bpI7$$@6>qCQciVn=29Ld}?I6fi-`W zJ9z2u6162e(O4FGJ>e+gpva6s5zxH~d(Oq1j-{1*a;$=0lEpasL!4ce9`~aK0Z#LH zq%2VQxs9X=NHp=`P?w33~&FX-F@)bWXl780lwR0yC1$RI{9YrgGUIeh`D_{ zmd(-u%R+6Gq>3G+)U7pBk==(-vM}q&o?OM&Bh{&yB&-#FLPT*#xB2C1$x5XK#PPh% z{#&JL7yAa1qqMUM!V83J-TDUdha-$pX{%j>`iO^xxn3UpEJYl6k^_TYrv-zLcY#R` zbEzYxepepeckN{BZ@lp59hju=Iey&dP7+{i-nU0G`5`j6BS%m|JYOoKANUf>W{9?( zrUeVQ$@6Vl^mKZ&`;W%zx&o95KDtDxn}jgyw3`4_4z5wb;ij?Wva|JwxC!GK_Stq~ zOH0I|a0mxFVdDOIcX#>oTr^xrXe2^?Cx^XG*HEbtt$)9gj)58gLqNR0A0)-{T*LE} zsQ~E<22g^ESnYf$fiN@SQ*{CyXQB>HW#|6J@NWgIDjE;J&kQHyg^rlC@U>oKbTRoG z+q2&W?K{}*7x9p~zx5MYzx<8}@l3YFyzY^`0$Z?tJg{H;IgSRHk=}hTwzih=`Lw3f9mqlp*8RxktpDGI6Ba5+8McK>~MzB-w~a9-J4r{8iZj^fXW z{tTF|3@XXZez zCe;r(FF&Fv=%V0($7$9XzkCdN&nUJuEqd*x8iEwYaybu)IAveOk6s)j)+$@Gw+*pw z&X87c@Xn6@SvJh!s*hl!WP08VS^YlPZW=(l$^R#qmI^<<&VAbGZFAav2e<)G)+&Oy zn<*el94En{E}$NRNRoF>K1U;8=Px{AqgXC zpW=JaPpnPWS8s>;84esi9#PDZ%I;o`Ox|wp*?J0+>YEY{d!fXWUf*G?Sj5-QVhEca zmF8Hms{9t~nXC99-K0u2S?s=$1&ZzVQWS0|Kv!YizF79=Q7mr`@oCB02vzY7$nZP& zHE6h3dIi04gVUoC|I(3I)%;n@VN`!g+Hr{rhU0Oa%gKvsAlNq3dtDbzq~W!C;;16K z*<=&D|0=_sXYF78Zbl!#&#`0nL<4d(@N-=3 z?EzmCqG?yLqy!wV#OLQH60~^VDEZq_Un|hc;V?FO1UbT&HiXEAr;e5<{VX88zD8j7 zTbu}!3+y40wtz!xrcE?-W%MP$dPh{k6MT&}86z+G?Ri5+@4)B#^ysJp`?yzpiG>7j zev}cD4*W85@ci~4Pb4|;KMC~!V1>SX*5n;U!QEZsX2sK_;PY!;3Nu_%XDPE2U7-hv zq+#N~VNo*fg8$}q20?f%sY$GS^Tem9g>U9TuMq3PH4}WS;HM*jCHU4Qf0n++ZAEE` zom4!RW!C4@+GW&t6Vr*{`6@0)5RcSF)n@qeAdf_vb8{8J^j7_A5yUw^5$j@}sV2cH zX`-eMT#jQ}_Cp_Ikci7$ys6r-=Rz^QTi9slT^g=FaY#Ad57IJ1fbe%wEz`mZBHISl z78Ol%6~0|;{Tabr-#hFJZPCQ?@67xqgQX_%<>xfze^{m&upD|*X~~$!MB<`0nGvZa z!LbSM<%(_XNo`9){3ksX4h!#CgtnCglT2sNR)Jr`gXCBZ!GtMf3Us3%%jKGq>BZdB zGul1A`Un}C>`tJ0PL}}(!f=1PuLGjU4y9YV3l8FzgGbolwtqAy($RaWsWM&=-BNVT z!ihJ1MGdgLzznZW#CEDfMO)oQgX96`yHf`RV{5o6!D?)CsCdr)oyrbVgnea;K8-!f}YFLiUaw1RqoJW;Vs6 z;%9-!{H|XcTrOwKnuNu(86^bQp&2n!)qRhPY#rLs2gR1X5JjRNSpPC6P(`9$(A)^! z+HY!}gqZR5Mim_v6`A91`eS`)cM$-ilhT~0$^P_>5*O=nfixELuiTCw2!BGoGYI1$ z9jc58&%+%g;7(K}*2j6_p;Lb-5p}TgmH@?QiAqM#dbo220~e0OYA4Fv!YPiSgi!{w zeA~#HEWZ2}ljX(F^mYIe>d%_ZIl7POhLw(c9! zs$ng2!mJ%rrMj_-cQ)pjGnmPPrJOT?=jSZD<+dba1??9Mp*pd70g@yu=WuJCtS!Ka&5+qqoDJ_E+{Fe>;)FWxfEZ#{ZCdgJ<*|?tLOMtrdi=^Uhv0C^r7`MH-_F( zoxU%oCHLoU?O}0=Q`~n4$~Ox3q!UfJ;5ImP<^lPZ>VXV-L4dN zGm&ug6ikxURz$bmQcxn#xNxX_&ULIB>L-ddmCVA<#bWEtAu&ZTsM{m)rO(`IuNN7t za6;G_aLri z{f!-u<5dU?9S4bsWBh16%CsO&!vSQ%P-HL?zaqb4QC7lqmP;oaqmUp%qrkicc^t14 zkf0Lu6*C7PsQsX3aCe>L&}bK;s;57(cubD2zN0JIaJaR-a?OtS0ThuZ<{k7a#imw( zl2nLg7wk784b_(hBvEZ{d^#mTOM^?%e@>s#`Ltrnjf zQtg1a^s>!Px7h*^j((80p<5aR6c4pt#ZK^+DC()3Ln&DZc0V)fJvjEw6eFrM*(Ib& zYH<3qmQ`bvowee-09~VDs%do+7t6ZrAXj5c0{Fb}eu&CCu}bUu;6x`m{Y5#pL%f93 zR4g~7Q$@PR*g=7I=r|9IsQ7%IsaZWET7staKfeo5MX;*Mi6{Mae{Yan^(`UTGvQw0 z$BAFIgwy3uOu=Tsj;W9OucB~2g}c1@esuRu*k`u#Bsf4pF?{fW+|=p_=rCWC;dG}W z9g_Gzk*@UaVa}_DV4%8N2`aR`$a=n5!c=p<7xROw8H8kG17M=)z8*y#TY$ zGfBxYD9L={T(5jfQv0*8=d}~T9mUsYjDYF&bolITk=O38mesF{nbx}A`!K|kB?U9{ zmC>k%y0&w6@lpurGJ&AUD48e!roZZoLjk&??aC+%y`H_7FGa zZjCoE-Oh`SY0NP&@`xZubs2k%(=`x>W@0iN4&;*0ull@z_pA8luDnTrK{>@Frq%us zi>L#+LrDN4?QZ9DHv_Nm0(9XofNw>>+x#(;Q?`H+n{&4YU0uEHo?e7XPKu0(rnA2A zMeltgFE2Fn;>6?|FNDO)QGZu%-rg9e4`F%fW>C`iMHV8`1FJeX1KxS}45Qs%w~Nn( z@iVs3&AYq3j!u#M=fYzj>}KdJZS%eI>~+%vwgU@y_@1)-+Ro%#l`Xb*hDr zAeS*6c-JGZkcXuC*(vG`qo6!CVW5Ti-24LNd(r1rU3}Q(erLFeqLYqHi_AI`I!?zcq;>H={^Z^Y6~cU|N9w8g;2^Fa2u zNHEc}7r#bfw7v4cXjeG~$-2_*Q?${Fgdfj0)FDC2=OZiP(E!}aWsTV8Zhl~fg;b?NMa#h9o8w;2wb9@#sgy6oyuC~A0T0Jox&o<}Yv)3iqRGgceIzrb+kk7>;WAjJnp-A|xrRDwf_ujSC z|Gc2tSgd7r3H@8qNLFByOa*riTKd*?r3p!-&?7i=p1ePwWlX+FU=Aiv=z_kBZV+wv z+dP-ZE~C^4gU7{^>-GOSB20TaZ2V$F&1T_uS>Sj5F3Utl{ggmd)0CXIK@LRbilxlQ z%N!R2OflISayT?nMlTpO6W;AZ&uG02LnB8QnAmdr8JxvGIYx{Ew6vA^vzfw#=tjwq z)7Fn>Tq?XSXD_r=$U>1+lwLkl^CnbAY(mHUbs{6O#;RT$b`M-s=v^&C=XZn!qk)pjbre%C6sUjgn>E zLp?eig9)@yvDT2$&xJ>_cEhkIy8FAvWF8pL7o!aK%<;S@& zt+KLKNF5QyzxS%*)2&7E0121aJ)yuql3x{9dd>=(tWYmA!L@)PBqZx?oat3Oid z({xCtTP;^M2M^OWUhZo>Zv+`TF68g-?w7xvGDE7`y(&6zCwv*?--Skj7+Bwz@&3kjd5Zp~wWUUlc0Lbx` z91JM*k;rB};ATsfk$V4DWpUtU8dMsPTq(jQVaPV|&W^(zW`q^m2Og0nnuACvq@YcL{kJw^XIhuvmi(`VKwt) zMcIfXb_f7Oq`-W+Wh7r!Mz{~)AfF(sm<1NO>fncB#Qu=Z$44Y8(t;9hi_z;$qUgmB zZvQH5rTxe=QG$tOnkUD#^u@r8>1sLq#Zb=wjqhLLc z%mPzVxia0-Cd`NQI#Nr~k7>3T&#x($Gk5byO2PNc}X>#U@fs}H&#u+S&kOo$T(CO{iJeT};4Zl}dZg+?4f&aZ@S=Y1$ zWmuzxOebtl5Lf%XOtw5u2z{p=SlM#fY!@B*;{T+7lqI6BOj(Mm=<|E~D}P3fOr3}`HGDLtrG zB&3^X(!|dpGgwDSBP;)|$RfPi*}qQK1ihBRva&D`MBQeR97ao$R$2|Jfg!q`Cj2r8 zrAg`Yk=>zhc~|*9`1{YisYq5s>6le;?1v2o7R*9$k8Q|3F$g&bdwO8%>wunc2<>5C z$!PIJej`o8lq>!PviFwD@4bJWPpF+WOC`ICDUR1Vi3QQ9D?d-3n8|y>Qg=-R0UsE# zBiU*TBjbsRR*`-qBA86+%i9`#?tP^Qr`X5dfKO087X^&;{3PgGu)zLCvnZ@_``E#Q zMc7gN6BD)IFyJ*>dE%{)1AzR#A$P_O%q>K{vADL@8k!Ky`Qt9&Yz*|<&ojO+U-Jf0V-Of+ZtttB_yfWSTcn}=w!9MZqn4Sp zR)JBp*`L6_#=K9s-OSEo61Hp`Y*l(a%eK}lyjm$F`9s0`UId+ zhYx9<(=Wl31|PciB%Q{bHB3s(3>;dPJ8Uy!UyKA=3LkH~uue{&6Lal@sO)|R7p-O$`wt_{n@v}KVtD879m_O_8Q zu>A&)vdtMpgB7nv#AnIJS$<2M;!BqCON;P!e zG~Is=;aylDwW8lu@3sZ+Y~3lFJl<5-`S}vqTaY72DDicrjs*xeoO!ID;(*e^xSMUZS0HMW2NaJGOW}K)B;xsseX*ynoIwv!n!Zq)EC8-2ZiXuolU%AQd+3G~tuKZ$6 zKKCEY)ro~1dMWtdRGtby#=i*}S!9HFT=WX-0iD_}*#?pkm@%)c|#) zpntA>rjvWZSJ8R96raZGJH(pfTx(ek>LoG>|O9(>-Uf#|S|t z2_&Y}B<|b57aHuJpf#MO`3S<3P(MjA7wlgGi8F}>FSIiMa}D#dh%~WDWKyu6#=5?g zta7IW^>cMsx7rnDluDK!2d)t=SzzW5j&nPrXlMtcY2Du#9h_VV-!Dw|om%L3yQg12 zw^)$&U8~*ZV6?q{A7Z&63Za)>)soPnIxwqBG`|9COUwTuCQz_B{^TQN7CuMHu>T$Z zzhJ5V2!TG8eU^9_FupziL{}z1!evEmw|m4(AFD%9LU?Q$MQKB>H@-7W0KBkcgZz3n zJ_R4C9&N%E8%Tg!jnTLLuFGS|E#GW)bhmshmTRq>cd>WYKt>f@XpH%dDj#7`~qB=Ag82}&6! z2%Or*Gf1Qq@-4--S%Z@F96@!6^z=cOtRAYaFDFFo8v#jc0+|C-d2t2bFN@kh_jwMc z3@)p5mV9A704c-^@`#8e;$$}j8W!CSB19I#8TO)J{B&gjQrT?5S<};Xn(DXBFMCCz z5AVv5CKo71UB0`%z7jlN+E9M{EAZv@c@<8A)$x2y$+liH9rw_s`b>bw@LLoER*~`*-T@Ae>5go05 zyF1KS%8ozClsCe+9Y?AgcJ8>L?7Sxs9r=|GEt4C;$NQ~LOQ#uEa)&{V(z!@!=G-n* z-89fJ+r75F{ZzTAr)N;wUNg|MBD0TJRk5p72I}^R3~j96me+nY8}@(XC2GQ5Z6hfcOkHRYNHrZtfJg)wE2JpCw6(c}GDwe5Q>Y&$ z3H4^X-~*VXfyi`buoTYUDC;%y*$tqI(jo4F$Aq<%6f2yS85{zs83`2;d$Tdli)7yr zk`F(-%!YX4Ycth89evWZqccvy1W350sB%WLgFP^O;qE}qBqD;+Wf)wpc3{UQZdIj8 zylmBSib~T`TKgN{=s*tE2q5rMySUpy;KJ-rNQ!oG5Me#5dH-4sYq6M5bjtPAPi7le zfGiimAjRO|+K>i0=3sqp>j)Pyy28a08{3MYgo4w)U#kXwtJD5(9J<9>8dJ52LZ0YI zNn+6(@n@1RGVTBHBWDTKS4YkBlTTs2y63um|YhIq8I3;1*Dg<)xf`$w(|w6dUlZ@N`G=lD4A36 zp%*pvtn6>Riy`QLA_fQ$n?}MB9d5az`TU0jm6bz`9~~+*e^jU6 zlGYp3#b1jIG`L--RnR)*F`+dIBuo;{oVlS#m;L~J-Pv@y?z+#}Dtq0q+C%uGvf^-y z?YoEz-EPr+?32ywT7s1fs^ER@lyxZ`9Sqp+Eba78mSG&Y3r8*}HnOdG+wjHqx;wff zj_`5xQk2a{jH#_~tk6X7=I^+a&3>6K^S+wwQ2O06>;fN*+@B@fP0|dwD0^uC^2qji zJ*8O;?-=#14tNwc zSm-O<^~g0qaCbQlP7^>m>h4dPb19%g>nL8tJ5nh31;|r|nhfge;5i!OgIRIl8~gwK zZ;!ataTt{vIxPtbLkid^Yw+gr4>&V4nmO7k$`_<<*ySP!!D8~?@@-*w>g09xo;kdE zZe>$TVhPK^GhZbb6Dv^+T#+=1zq>`z^eRSwN@JeUP3of{-Z4oPVF}JCzyH2#$8aQY z(XF4&V{4p1oXnggk*;Th_sT>pAwL|dcq)9?9sY1aB{I2iupx53#cT-FdiS0Pp9vjF znwsUFsKf1p;haNDO%@U7ILv65^FKe0@cgm<$MVx8Z#CuuRGhWBrye6kFQr(4ypEFr z9(938#UWYg>HV3>yQQIWFYr$KIqcFQwX-z&B)3nxw!S-~iK`*(pO)&;RU}U)GL2o& zrG6u<(#(9=Ff?8AQ46m(1nKVgZ?#0)Gu-8Xf2g~|Fb7_h~Lie#Vq`oCY`rdDgC0c-)TfLyG^HB?N7K&Jq++i}Ynii|GY-XC%XT=2^b6ie8t)m4lJ={&)HYJ7Y%B5 z4|U$~4lmF9hDxP{QXwb)!=i#bupU|j7^vrGV~YB$0ZJn#w#yNS^`zWqVQjpqkJ8pB zvQ@CV>|ma8_+-FJA60)!2ERFHKU?5-CFB}+D_%4;_Eauy9RQW6X=r?nO~yAXsL3pz z52ThFLAMX&l`RLk)@$yU`$jHgQftZK;)D}uv$rQu9kOc+R!3bcj&d`?>Cvc#3- zEln{a7@;h-Pp}@_3LabGUhaO=D{eZR)jsuTI;U|rn+%MK%}0a2s zCakfsec?>#nhwbCj&6JEj|5Qk;Q%!r@Sb+SWO`5NxN!Bra z+m)5(>=lfY@1@N^IsMS1csH5Zr0pTDT-&-eQ*us%WR&`5boG`v?>sSK2&b+&cM1(% znQjDpchzu_sbc&3W4znjfSrl|K1x)gY#Uzh^E(>M9ZuS>$R1Y7!fcVj4CbDxC0L5W z)9>~8X!uc)=6+hixl$NpKS>0GEw9$}(^RU)j2dw4d42EK_s>KhnQ7(0H+wu01KfNL z31s1S+A^LxU)_v3&+Y}9-J@48{w{A&XtuPL?_TlSuuk-rO+cWcPzyF z&53;rU3GRx2#+Zys76}rrwxg4Cln7isEAyTm_=C&vr=bUc5Cs?y(s5SE9^Uj9`w7) zA;Dnz8ZTl$?r7x7W0kEZbPHgugJ;T2V|9xX&ufEH<+!RGE5 z1W{%Eo@p_+O(EqyDWeGfFO2kkg0hS?xN@#4c;0~I&pK3JErsjqe{PX`T>1X?8ZO$MI_|gOf3_;c7JG&Zew?$o-GrtO-=UWwm+*V& zq=S%TXB?B?%cd*)8noA!Nn%uQ~BVP<5SE>P- z?zsNJ(KFXABmwaxGyL+Z*~JCCd@0D;g-ZXh2Ucy1j&F(e4Mnl!Dv&gx!JIu0IJpa zqa(pQe=zM_+4yI_bhF#>70jWiw*}Rb>XhZvO~_|wNi0hhCU8?@cN>Q1qLOn~G{t$z#)(XkksC$v=dzr(;wf=$cc_;gY zFQH|ik!<+b&`pYw4X`LaYQIm(sM25!P+us3K`p%74I6gB?4jsD4VIyM9MUBF_D3^a z|3n5RE(V_}X#Xv<=7itRg&03gZ%*uK8r!X}+fS`0nL(mdCh$)PB$S18$9I41e9p5% zk#zVW7#X22s4ER+cdV|gJeWz8XDBf|zyio6gt@ihdMZ$sbYu|2zMEBDHK4ko} zU;E^eN)7P8q?}StP!Hk3HR>`@=A^h0%LlhCm9+5h@BFknci7lp;Qzv4U|`w0IhYaL zF4VNt>6yGSgU_4-H0EAf5%*ekSc7EryQc$>6RsNQ*vgLT@>#KFroRureink9*LnLz zzf$)CN7s`5*D}uHarO$D?XBrU2_y2SO1 zTKw|JQ{~()J9Q=Ob|Ty>ANL7#C3Q2)T`;RgeuR96JwHFE`4Ev!+@ks&Q}q}TZj#UT zFR&|$Ap?sEQNHaKToT!zGX5GdyjUju?`Qnw!YV&>=jR|-E8TqNV#gz8*+pA?$vn!4 z|Ae{h)K?F^e_cp1RcqE)+tIg_twWNhjE}PcujQFz(Kue*D!T1X&+TuiIfCwP~0uAkFsDavIUCoabUZ8 zUh#6*0X=CZFDK9fZ$z_12i!14ZmH=-Mk8Jyj$dei?<<_T5G`3&)@9)+o~bNfkMW<& zR@{CU`*ghR)Fdd;{=#RxNCZn*rtS)Hq#+^yQt$@r0Qf26^^FYouFG<1lrn#SWl-yr z8YE?Z=DTt0BF1m&@eZ=0c7KhXaF3E7xHavvw9i_t?(Dt1b6i=c6#v+x!r)-iIl6jL z3g>qPQfaX9R%f2T+*4Zj&L@o7bB%X-X9~uIY_bZBgq^QLFn2M zMXh`+$5%R(9pMXBo@wMP;}ySkXH43L+W0r~?PV>04MVwm1mxal`#ywZw>;BvUly0r z$sud>HC({uH*ml#E5*N&>Ez|@QdqcpR9kYtph(MI(8xRdP}(^HWB{|WPlz;+3Qxy#$sri>%4(pel(>T_-fTcEEAXY`4Kdv>d42QY6NBg_5^KPdzS9PL ze9-^69{%r{C5D0E!)NQ-WvgF2Da0vO^4WbJA?Qu~bP7BS&L+G4m#Y4AyD2#Q<`p$rwlY7j#fxurtdy zZ9+2SBsr<#f$b~`m~sXV|1#-qqRR9s+pLkEgzs>(C@nU9q!G0(U(Ey{3_%6!n!EZp z3$i+X&F@x;w&m`&Cm-FLc5ybG#kv0h$Ayfg8dh%IL)BYAjajJ>f$-nj*-`~q+=jF{ zgBUe49}!iX)(22>v)cG=W$?_Fthqnb6%m$?D&Ec_^m<5rw3|A;{k69^Q=rwSQd}dC z#ewVD^(Z28#Kw`Mf~$43!(B)V@$f7vGc;uG3*0WQ^zes5PIQG5da<;bfUTh(;q)>)hmv?8{N zW{&>xnh!2Y|16pw_3|*f-OZMK<8!QhCUVBkzppk|ef{<5v{fNVrd*Ubb?!kLD}&7Z z4khhZvl8_3MlNz06ZMQaXv#p6@0=hU!!?OoTTQv4nVHP*b6Sa(96jzJL_11f`S$UL zqOTp2z!M*zt!WIs8>z$|&>3AirYVpgiZH<9!|!}GV>#Bp&#v(Oc`s|BVM z2G*?%cHy>BAPD;C8df?InNva(bGfkV7wxI-V!n%QLNpI6QUtrdvc{@J|JOCIqY`>TJN{5j9?vU5SGNmZH?pA6TUsJ?%N!8{`9547C2#J=a z3!_I&o1l25&@xz#_WGOB7Ddpl9`1r&HXwqtPewUOCb@Z9hA%VbjxXbnVG*?qE0OI*c2HJ(p6U*DejcE)A`)xajO*K_o+8{i^KpQ!Nz^iF)r#9J!C z5`LJQ-Al%E-uQ1+qjrPJI%x~Geafh4eyFj;{$?oK)>laGiIyE>o4zsgF$_opv!6?b ztp#_LzU3@um+$<}aE2UYC!42fvIu|1Mo&W5w3Q$tw|=CY{D6uRx|6s7e;NpcI13LB zc3xwu`a?6&@`Oj9LNz078E~*LfKorNUbqV9sOd~X!KAbXj#4RNb7E3>B_y^Sc8tmf zxRu*E;;5L@`oWxL+dZTU9ACCZJ73Y@{zb)k+CA~f!6+ZH<67Ylu_W^N(&SCeE}Ka3 zhik>>uKK*<>2v%>L8CVR*gS8CoIJlBZ2rx4bKeWpyl+Rsr=yM^%81c7)S3zK_M`bZ zO==dYwpXL5)%tQ6h{xv_tMLthIN=RGjtdicB~5iwHjmg}&j?>9JBN=}hCz&=rflK6wqRZg&{^7tn5A+Lh`${D2wO7YLC9re9uqpSOD zy!#lzpVrBA38zU$>GStv1779prHQ;<0x*D{%`bG~cl;dqp=#1FaU~}TE))W+^ocKY zvBKQd#rV7LT>+dErAqa9u`kBl!W-b2guTMZYtoreLT)+;7l>;`H{*OEw9iT$Us4FJ zJc|XN8Dj0?Wwh0-!}EIBNjKSI^gkfgSx~vIbZ#GBb|;hCsCDb$!+dfk#`;>fYERoLM?m|KzeIW6zoz|S_=v47iH zT=u_uzd$Ld3b=zl)pvH~=yrB**;m(2ox5J&>Tk5aGK_N$u*AE}w{V1Jr)uadVwDhv zvU?Z$#X0-GyceWu!;t6efKTXm{y@g&>*RB1wX$|`fHhcyu7 zi3uVckdh;%h0~2=TFyzc%j_)^>gs6`&Ir~@%sBvH+TW6MNTVuwZgKA-wPBneg7PV3 z_oPSq1bwi|^AUw{Xi#2WKBuz_zoSLmuKk@kcFIe_xnKsDC3~TIv;6V%QAq6n+Rgqw zL5_x?qz>_3YjFd82@lWcvaqn(K}BD3VQr99p9r^ei+T)tR03L>&+}HjsO0aakVbm( znUaPyNcGyzH~xX|2{d6d_5|;-P$gIqjKR&6&V4<`>@4q;>y}r_`SEc0O}I=+RH(QxPM_xBeKsU*9)Odzky;?|bN4T+F81Z=&;^^!MWMUPh@UCs!HfXeB6bdtzPP=qNJ+0y49{VCKJ?>oN0uZ2xS$6j}XGumZ z{A;BDzObm9(Bj;)^3-qYID9X!reChC^d?b~Ho|L$zaDg5fuo3WB?%e{r!m&$k)FAn z*a-$(<)wn~YK0*fOQHf7&>BXGPXlZXhM0J#Qrp(e2&p=8OHs3!fhX1UWmZXGW(1b# z3&}%C7|NyR$Z6SPDPVj!whOws+sajh+8#`rfMWnWU4VT*^oN^*-~0oJ_(S~V^(aKZ z_mvh`*d>vqy!RZRtigX(kL4^UD3bNKLsCX2_+|E%Ac6qB1}_ zhEWr>cN^ll_TPYvOa6}z2hYC6pN6aw>U?YmvtC_;`?y@2-HsLDfFI2W;&Q~OOhh!w zLpdHj^N?!Sr*1`$iCl4D`~v;15CqTUvcSea;?;I6uk%^hJB_9Xy&AFN#}0vuc2yyt zfcIzXq*%G=Tef=8?0PRQr05xc_qn~H4F zNuIZ@Ljl)g0h6~8d-&s-pUg+qOjSJ>P@ew*BGtDCY_m3b!TH;!r{R4;v2g3-!_ zDiNC;c+!#04KUSD8;35XA$clS)ee$EQcS9|AOmRFE~uBp#3CTG-s5XVNvft%n_IZE z-_5704)56W6M3zoSZ!qm#!HDAeLc&0_F72IBrk<_MyeB^DOgABP^3puf?f^SK(OQ; zN$%vOwErhTKA2kKX9AP0mc;oVs81YuSDbfBpRf&-JvXQx^+Ncj_+%Hy+&UREwTl7I zM9Vxn1$^P+bs$Lmc42O;JpKi(l0pKQA60l&PlR(LM+JLOEZO!RL#}5%FKW&{sjW>_ zG)d0{M_rZl`f5wBq3aWc3M%I3*9e%^%kmK&p}XyZ8(aHa;Ncg!S)K3I3Aao7?s0AN zyA&{yDW$hFeuz%=@A_@t}FDKn#ri6#E0D=)luegXNrJN#8k~Ikj+$({mR2uipvZb5=5<*vJacK z4Fr7}&^H3OpUk0>Rq_dv)wg*PY}1vWl2H?tEX?n{!?`eS{3@vx8ayG8^6T{uNA}|k zTnzO@^r=Nn^9J(&y2vt2M#9w8iBtOG=hD}9f@EnmQhELDXWz1yZ)9WR&Dxo>S!h{b z5-)z*uGP82#m$7F^L3wQJXekq>G^$&_nF}C@%OXWg!LE4LQbh)fD5q^^b2yCLqe+o zIx3#=0bqGK?uo>NR3bA(my;yyMcsQt2`oH<^VyBSaC;i(Jm3!v``c8#)H)8X-?hcJ z+eXMkeZY%AR0y6j2qT3KkR+y%1TL7jopl^E@?W}{Llf##kANUvP^jbM^GorhNtAxt2@Y6vzSx(JuhM`veu!_HUb-n4C6t<}3up zlS%A2*sd;BzlHskrP|-g^Ghb%{1!dl^rZCLozmp=`m*0Dn5nDUD}i6obb{LVy%fH< zs5B-DaLo`xgC-*&freg|Kld=ROJ!8r?9-Lcs>W=-+x>59<7Q#By4HW27T53LqY?9a z-7kKzEY)8ud^w7yGQ~n!*(#IzL}G|}cPODjwea$9yjdp>jWjFmHTh2}>(6U}7AWZf0yoqDUcVDuh$tY( zgcAg-h*3+T3s2||9KSnd%`qXf7gj+wdg|(hcf5UogiH1?9h{symO?Jvu5SsB3h8h@ zAanOAh~K`|+#iT0S%s%=K+^9`;7jhCU%#}rmY0{`TWhZMmC{Ak$;`#jp@$&E1hM`@ zn}l*Ay&>>fqVrKNg>ePGM@n*t7rvg7v>*5wIVTfUoN39QZe3mR>-^;8*GLIBOZw8s z4L6dvOWOK6!#WXSG;XPO+*JKqODP$dH3*XHdCQ@ccFL4q0cW9})Ntgm)d(yhQf=?E z6sCA+wi1&DFOg`MkSc?DogRZaYQ{S`Ir}2)hs( z+MK<%L8D;X3kH&en-IgO#=vm`T}}d7NYM~wnkHjSO8EH}THN-oQx#g_Wyp_6I|XDJ z^q#L>`|%=!W5>xqIP=*vg&%MJi`NC5&3`?4J2A3~@|7AT29@fSa~Q$smGtWcy;ECj z{U~26G3%gWp}rSPapsxo!?)LVTsb7U-^`cS;i~S|LEx(Vnh1GZ8C3h|J)>&L9hs13 z&#;LXzb7)trMHZy7peA7?xx>zHy6*yHhJwmuR=}B-uuck8+`XpXKp)lNf%|kyI#8&E_xjwE}~;yaFSyIuh5b;UiT%EdkA5on{6bC z`O}kfM%1*%(9U0W&?5rZ22F@W9GKiD+~Tzc{c6Z50Q(}&-{)!bU%we>f12En6U=l# z2dbH%Y%vkaVW0n+I`sk7w&$__`*&S0db^p=;IY7q0havLV?j>{(+Yo?*M=)0ZoTFkY&sn`~(aOr0Q@$yZ5wU))%(J5V$u%Ju3cTqj}E{YNAb^cQyQF_ zS>nFK>!%Qxi$4~+t4sSUh20?9i~N%ubpdCdJAJQ8@`=`t(w?_;+816w|L*fi;)&2%`N~~mCsul^)_?{k zff@Pz+=6MN>{i{3I`BrCE>3FOU6GHxsGasl81g4+C$|(54?bVs-Vf}J)Z`MfP<8mG zoDD*VCgQfZLi}IE0>p}%y*-BuC%hl%heQi27Qr=A=x>L_R0<0IdZ7O8r2ikdfWoO+ zTCi+ws=ktOPdIHR0kvn}+8<_hHH##AbkNUGyk*Nk&8V{p%Eo?e=E4C*4*%#M#2WKl z>*oospG`fT(!|2omRl473$Bl_5cND)os^_V8FJ`l0PJ5Lg+%hS}Wt{B>tdw%3LUQrK!E@Wn*=j zhY*>OzeC!-<_%M2)Zjrh?tH$>$VV76dEG!zUy0UUza!CkBYDWl zv4=EA*N$h$_zYoYeQP6_>rV0Q_fE4PZtW%~iU=TwqV2_)erQvxP;nHE7-GTkv)wB85R(O`Tl(_HfN0aPLqNWmas+!Ukn^H6oZk& zNMp4Uw6ctZAdw-ON&EkzLQgNKix2x>)0+!(OG&k9R4)q#t;5u`hg~C>$Hw^3Piahq zRvH7Fn%q==pnUc2iiPmw@zle8eRD?Rb9YXbiM(($ysFMjD+U&S(J|+1R2GKP)&GOv zRd@CbkCG%hZ%B_OFWYBc<@hBnHeVK94C%7%a&U@dtYl5jVfui@l3wlt`bd{*^?XCXS?g! z<4F)McS_`cA2?x>28PMm1K%@R?#4{KATcxNQ!a7^6?Sk-rrEGIoO+;qh(= zC`61T!8z1~FG6jG-9w0px8F|~!qk}P%Pfx2D8uOK11g#R&;Owgm7;NNw$p42u}}fQ z5E0yCQ3~@%&WmLa*cz#6F_9|9k8M8UB(Yl$PF2lKwRS&E5YN}BR3L^8!|s1KC3GX` zJL$(}HqZ{Yn}qdhyyq>Lq2n7|-nplWkA(v0X(;!cq9pIv&1lxQbzML1qR_@c_arB4 zypA=l3bJ-WS}`TkCUXzh`W4}gEs{od>Xi%AJ}1{nh%_Q5n7{AMp4pZ*mJXgr7#3bX7xkObN%T&@k&B1m1CZHok;O`tgF_nO% zpFc5$_N7TMOr|_mqNcO9w|Uj(wGX2QEORVh8)~R$t^0Ki)#P=={@brR^0N}u9_1!1 zvgk>-zAoyXcX-SWxwPl|TknA(tE99uG0!8y-h7r{WIYy$*8id2&yc~JYDceUxY1TE zeAGvE4#hbxTSPyrzmN7bo@qA2{P>sCC?d%+zcOPqmM8G zSSbqub!&4t-;OZZtFi>6P|z=il4(X5wxa2g8KZ(Z4v{BFlUN1t$NRMCSn7<+?*Ddm zK6Y4aPbCVcp2zhaB_&azb3{Q2FI)#HdItdk-TSh&tl@`=7eWEhYc)b*O_Jw-=jnw< zvntVinnie6EPGk}H5*gW*!ls{+wDylH4O$lP|)`|-bhM|Yg9Z824~Y08RW3FekiMk z*ulVDT|y2|xr4EhOi5Ju#<5$#De7jNv)iswR^DcXh5&@JzBX*Ys>tkiH{5EOtHtpXI`9HVuHH}y~W zE6{!AJ^WBCsV64`U)tPCE(%|cC(L{56Hu~=54d`~s1tR8i3iT$WeFKKXdt)7QS5J> z@z#kaJ#p>MZMi8{;?MqAB&GDgfLX|@{5W^62TX3)ptB9T4I25TJuV9{$V)(`diMli z2pS}$Qwotq-tr*N+e`|~{_tAj0f7{bweDkZL4m#8u6#H_VXA(xmlCTzn9+6u6Oa&d z#|e@%|Ei9ajYzg7KW(5{$u}io5u10woUXE+)Y+1<<0Ah*hVyzwnLKZT-x(9qdB+nF zg9yb53Hm(mZny@74tfNM2VZR?`f1wfl?TZ82ykT3Y_n)fXzwZiAXiGneA;`AuohM< zUtv%Sjy1teSBbdHcA8Y1#=G!3=aHMmZ4SZWxhz;Zypq+~>E-4D;UXnPpS4avt##A9 zZ(D5a=CYV@O?rZE_Mp}tW1;gmYd`%+V07r><+}p)h@rB2M~88zP5-6op2J#8?+A0> zSwiSMJ#m`#G31F($QQfmp7fRx<|;*Ke=DHS zK+>s->5}{Rl%LakVp+C2SQCC@vuS!Sw7Ii0KRRc97^MrMNZME~4mjm|IfG?6uk9S) zSy^&)pWWtbOAEI~EggUKLR)G9+DWXvAkdCqWk|RCQ=MuAi*1*b<{e@OV}=NC#gh5m zj{7ku_AI~qX?QA&gltp+UYa~CgeTevEclT8!) zpOA2ow~LO@4+YlbzohhtfZyYsV!AFJfD&DP6hY&AK4t7vI`e1tYUb`)zI zNt%VBA+DMEUxh4T@~_t!Yg~t1i2+}ut3|UQfGIHx%-OF@QLNw_!`lT!vdbNrHeQWx5-yu$Ybo=e)QVQpPO$_f4K9Y zcli8GzmIR-tZlM@Lfh`0FPNeM$Fk6;WqRwwiOU0)({DHS{6F}KT-BtH8D4_K`#%lH zOC$-vwEBHzYolOn!80V?-QL%HLx zd1m)B1$AOuw;4TZ7`gQZtN z>=m&+xx^1U+DOI<=HR6eu9$ieCB&dA{7^1wr#NZ|&QC&VoI0rp3#{({Bo*@il9aUi zXB+A59ab03H$pJEIuP#&lV&QST#B}jdGOpcE0Rl&Xr_wy`%nJFiRrTo{F8*oJACjdkG%GrNVypeH43YV4*3Qgi z2*Pq==xSLTXwx#;9L~j{dm02z7rQ8SM9)5G0j?N}id#}xB;iN@2R(AJEtpeL{WG(U+eMjOkmQ|25F>kcVAKq|8nah>k<9!T z?;l>lbbm`-+ zT4YPg=@SN0$jFh8vghvo2J%3QN%B#ESanQTHycFWIaMAw>Cao_aov&_6F2_iz*lqi z=A#wDfb+WhmlR>0Y@KKB%N?eZ60lA*3hs8k0R}KDFm#lvu*v^D*D!D?yRk7`j$6D@ zqnD1LSm#f5mFx9Ho6<})fOGuUCnf~cAjulPE4mj=`z7`C(zENCbN=RkW6VS5K^z-F zv5NK;4u9o}=^MiQ;r$bL3{8cfMgQ{TZO;_NbGi!foMFzlc1`V!b_P%+djFaS#@JM; z)1%X@CoP5id)}^o`@ERz3yT-^iz>HgnY-q?=jU&JJ*POZ*6=@JoV;mF@9Z7rSZ7@L zwDU_MR+70g=CwPb4=6!qszl@F`%es>9v)iit*&&;gt>bCEztQZF?+8064l4XQlUR; z?|+SrPbL_so)FPCL7nA8OBF(`KlQZ6Y(QhC`h`KonZ%3oDGPGDT$acx+bR9!fn$c2 zpXjP=PZS-q-S;+#xdaj6Ir*Nj+Szqpd^n%fhhLu3g2&t$F=Dob`EeT49widw?+1D% zCM-Ty74L=TYLK&o{>LM=1UU$2Hbo&D0^E+0;3}D7?(&s1`iWndpaJ+gKKv-%(dkWw zC$+axCwc^6Qf^#9v?o2pXloaV8J$+)1mXe^EBMjX&8k+mlGF3{gq%D3pPEMpeoRW5 z4H?w;FIg84kQ0RM*B+q<{JH%XeNs#aEcnrMVg!A{$h03tFRAU%i?~J1kfbMIt;{vG zIwSn=VZU2~QkzZIAXlu^Qw_h6(roSpTGL;Y%E`4TY z;{CAAX3bgpcJ4UiM5S4tgqkS_g?)Os0%R%4C8Y#uvx+<;|I)EIJ%e1z5l?1suiZ?l zeK9b-i6x8KfJcsgJYke%Hx>+8+T1_L;@7w3zjTZ>`dVP9-8^fRWC;_GAm1NarGSTg zOV}1Uiu(UhY1U6sc>mj$UYeyFmhSHEZV>@dx{>aVrMp2ImQos#ZdiIrkzAS;QM&Va z&ph+};dA{3XXbV8b6<1jHT3Z#%R1bi@I5)T1CBhXg)|D8Sy+R^n}872V@HfAmLhws zoW9Dc;gZx1WJr<9rCBUZ)g0@IVY6Z`lqTJE7o(<&Gd&wHNh-l= z4@kL4*&rVJT#8-YE$K_e&g|Ot?$KYR?bae%A;trkYh|ERyjv-cN_a{QFd^^UJim+o z&;1JbLOf4aRvx_0fn!A@W3H#YB{`pH`%A2MTM0%(G4ieJi=|*SKywe-y}T zw(zh>HZUEgsw1DVZN`uIvqPXWZ8>)9xDtNuFV~fJp7M?F@-5xY?i!jW%4L1PSM11m z-Mj0shen5`!y{k6{1Wpwr}L97Yc2%$Snb^u^7aGE?XKqqynWND{qFg`oZIuNbUU&S z(_6bIL61*sjUf^Gp>p5)lq4p8`x^YYmav*_Y3-hpBezo?*Aw4xDeAQ60SY_C$)z*1 zyYfMG3>KKsKxvlYC)#m`>&A_>Bf^l&6}AD#-zgG8yCRmtN>!1cP68}d&X#X@THE4o zUE!qxheBO`a_?u;ekwL8a(qgch}Q!NfTdE;7D@{hCmhp@a>e!%Zka$HaEl9^O5`TI z%7jSq4NDM*7=}DC5Ly~-C2+z|4MCMxqW-S0z!-O?v)jW(x;Tjp%jgIFj}&6$OTbW( znX$+aWgSP5!R_%nYq7s`o;fwN+dUux;AK6 z*UyULq&|*i_8CY&vrI-hZGr>G6;Kt!rHNOiqPy?dc<-KvPRd#h01-If;^>E1QHV(; zeJDRTVnu9Bl`l3e#c00JoRLA*pTez=-9KgZ$X0g{qPi^%|LV+O_GuT3hOitzRl7IWR6-t~_;N1lF z1RQH$EKAXaI7DxSe9nBmcW%`CtQ5Co;FV#?2l9=?i69u=s78f2Mj9s2$EC?P(~Hoi z)EIK8di^&C1WCI5yYtZu~NfYm1e_B19fUlcf~EedV3w8hA89aMgnH_ecRZm2msNmP->IMn~X!Y9wml2eO;Wpq$;6W8jh zYikfV5EfVxDw-t@n0zsf$Z@dvJ1wMo7Xb)1HefwK5&b>yNIRkl@mC`7JiHj5u5T#& z2y(@elb8!pJs2o2l>42QX+OK@AWY#Cw9lgYt$ahvKrD+@i8C)b14h0GL&H8_mY zc$fL}6+fCMDh80`G-cl@t`<_7`VyHNCp_c=?9Ec+u1v3fNC5C^JB2cr); zzvPyM(3iPW3NXegm-?4d$QR1|RC`_QGg|9uLncWcC*6Y##Y)PE+Z1}7xn;&IsCYC# zy7f%DW-DYL0~%&Qt&RA)m(Kbs(xA;>uUYU?0Z{Q!y+xvDHl~Uq17D*QKc8{PIPQ^` zM-kgAhVHVK>|OtIYwq;O)C+z5id@i8vHz~U;JF2&S2_1H_3^5sTtkG z!5nrmn%n95;`rmVUQkvx^%k#|BvW0%-lmz{h>Bm6^V<~*@1^d`1g~H|PMW;2&FMq< z1Z0f&buaZo_W4j$eP3p6cKb4JH9xKjr^zx={#JSop>wu-!d(|P7qHWry{K$ps5kA= zV9ai45XoJ9J`m`cX$b_B>=??m5-y&6zVs{ZoqoL=<-HtA4b5V0EG#4ZRWl0m`}NC_ z3wHJ-IJ;2z%_@@Rbx@bBeRbq=EjH=QjOG@V$o5CFPX-?@=(-tMgWPJX7Rr?9j2jCHi}od;U36- zBX*^jnZf^YfmC?*HeyhAJc}gy?D$PQlO7>R*Z}abhje74MXhRMGkOzz8aEu?>69sk zRePKk^eCCs%AZZI6!31p<4cmx0`s{eFyIZ7uL5U+BZqoDVMSJX3DuJ!AO`^ELRDl> zxFp0PI}`F$pv8(JbdTg)GV2KZPwrUVBeepv2v9?GL#9dvFp(jITn&Xbp^njhk{DN+ zK(AyYk5|3m+sGHl;B~k7@vUTGNc-5t+jT>Gj{jnO#^2qg29E00)-tu_q$o4Y&SXXC%gFzAwaNsp-%1Fi37#^YS?7Jc&p;;yxPa+YSua*xpb~IA2^i(w@gqX^Ga^ zpthW8RwA~wft+*k-@Rio2qLF3I{$Uh@?SYy9UN}bGvhHt+TdrRgkzAVl5 zos<23>Qa8^me+Za`0ewJ9u3dopFQJaeF6Hf|1O(#&FCpKz?4WJ_?z9YFOqv z$gjPfKpw4*3v0D%oFY;iU%E52)Oex^*FDcnCSBJ2ENP<_Ps1MenoL2z6n`gsPWPOH`~A?&)-&CALo z+TWOUE>HpixWOZ2$!Bda?0h)GG7osh4gG_VQDOA8U{;6$4!^yaQYuO!%Dgf z+V6k9{wb-5T=b4*Jml1V*h3*Tb$*&?|1@ZB%J>D~X-g1(-oWN6II2Sgmf}#Fsb^mN zn#Y-?KrUab~rf&!`bAJdvaj1bFFPs-}h@-8~A9G15THN zk_2aLq*xNHlLVEoQiERo)5=#u_Bnk0TFtHG#KL?{<&$0z5e|UF82FlWp=#W ztp6kUO>BvTVu*fElw=naOSQ&u=j^-qOpQhbDUp*pImeIgZo{awB@+qtlIcUkOag1c zz@zYu{Uu_sJ{sG`gu30hN=S{7zNz3OnheETY~u6`dgf%Yazcl~ONba$gth$#Tc#p? zRh3RHtyoMp!OGFiS`E3DQj#Kh+{4N>6B~aER2KutRs2#89{Lu(N`&tf=#w5;p?OdHbnBQ8HfQBtLvKMKms$eH{AR(0aR8Ky4Nj+p24>fa~{r zYlG#e$`ERc0j(5exJqn z_sO~Lcc6(lJ#v6#zu46VJa%Mo0WIqSeY!tuqJONyS0xSUk8=Fvj_JE|j^@Gd9eS{_ z2X*Z_N)^BO2JGCYX5gu^Rk}MQ)MW3*87bv4?c7&4GJNvb=xtBLWa4R6V-mnQ6JTuu zZO*wj>Q^2Ma?mC6EwQzPZoe$FDn+AmFnRV_A~*ED z|8ScM!-eRrz7MGm_d;I%{MII@>0RMur>}Lce%N#egTw64bM)_7fCGxhG-H$EzAgnO z%D89_*@tG;yd+!=N9x6ue5paxL;{e>TIHq-h;Sk=Ne=IKM;wutbBD`N_vuNC=Z+9e z7chinS6GUiyohX@ct;H$kcc&+45-89(-id1*&Pm-b5I*IY&#^AeL?QO{F5ldKw}stc z^qinAn<6uN482X}>=3HhIt4MC1w1j#I2BO2ZSCG{27$BDVUa-OBlZVmi>^6IpKLnU zO0h``UY_>84kNUS#%%{S_WRe8|M>=agKRFw*_%b6x z_JhV8QF&VwlxID8?73l5(8-0yq%M&aAmJ~#TCs}liNsY+v zhI#v76ZsMdJIca(PQ#h>kU#p+A$CFDiA_pFRk6)n=RU(z7IHgP822g!#JJ7fJPa(pBoh9N3*!Sz7%+8;8^3p z)WPm!37b#)RZX&E=l^F^Ws(CXUf9NFB6dJS zs}!?@*97iMA;aV3f*}_76bI7t>f)2QMr3vpd?k1I;R0$WyT7eB-joD{K5RV-K@a@P zSl_hwo0!u+@jSc2O1=-+Rm(K3G1aaS zj&f1>_Ma-=Y`qBb6o=%=S8Ge0}+PL%;@@77t}uVg*Cs3mt_%TADchQ{P+8bp2NF+mF%pnp49)%C87QZKu^rE zmv`iSJku>Hduh3lkr-iS3w%}K&9#P_6*Os#-9Q790hWM#?qiwtnj-RbrF6VPT}^XXfh}xT!~1!g(jyRE->_U5oEBp*$sshq zb@pSKgdldKPyQ8Jwo0Nta$6M0UIz^EgWEoy&~CjRt^;TYml$r^(R*Gt*E^c+%ei@9 z2Zeo4PD-8MDUqI)m2^*^zCuOGZ8ARjq(6GbTt6f6vOX44Cpq@^%}h^_Cig#z9jT-y zzjwVnZ1Xw!tsGddEP%gEaitNZ`{|ykci;Kxy#1GYGNWJdAFIUwj$?D+XKwrL8@~)E zDi6~3L~^BgQ!cZKZanr0hf34DQN4PNtPTF9_08MVjLdPv2^|8%TS(z z)6aAV&$L|$;z^R{q|987#bsFvAP=ZVK;IykQc`_V3?tWWf9NeH3anw8@Ry?N)~02J zpxw%`)hNto81V*;bb+?r37@>@l{wX`1hSUY-X28jN~;U=T-ayhdGxun)2V7C zUm}+gEBF@&{{^9!fMIriiw>lQ-B)Ke7;|7=4SriR9AufD?`J!#Wkf zH?-C+&3uQ{I*#Ll!NQS~)cpbWQ6=Ib32m{Zq%gj`q_gH~;6aVqSw%hm`EKIY_Pwsu z3|;U};`A(+-urhdnf$%aKm(!QpBubplL!oU3mK_WO(a{9VFI)WF~rJ7&)CotAq+!^ zivNhodSi=)nD6)Bx6UGI67-_z%o?KZ>Ju3MyMguJ@H8S6>3iic#jpJWzmxgf1L5UB zf97-;kfDi%an=ihS}(_*>K?7uyi$n9O(yxSWlAApeI1pSg12{M}AN@uwj@Q;x9zjZ=F$d{1Z0zL&6%((c^d99X=5MzvW(un2~xs6C7`TQVrgE7b?I2j#dOrZB)?HgR>k?Y#dZkto|eo%%c^ zXx867mYfVCvZr7rrFh@r9-4moc>_vw2-N*quQky7k2W*tBbdW8A(6F$?fOGL=G|&) z@$QvX_Gy3b)Jzfoagd@fMh?@t&0gWJey<{~cGb=i>cre|$D%?%fcZX-eLzf`_@m-f z5z6eOOVk)|$=G9(cUqHCGUzbvMo1IypN58}&t(kl;ca~}+fI?vhAaSv5He6;zY>dLA{0)lW2eYORu1U8;4 z$gpiJeIFb{;cwiV!`!S;vP|idyXRs;*mBr%OVM__H5beTTD^KDAZHU<(>yX(^3lfkgr@JJS~Opa zx)+XwaSuM0rGd!(-!8zhD4!rwt7kTW{1-bWC_yx^j01}!ihh7RY6+`s&?F+4u;{Qu zZ^HfqeIieMi^LuBheFCnl!fd;^k+S2-^y zGV;Pz%Ps~FF`61LQvdtkgF1S%zw5n2&ciWIjVy0PI25cv3`PB<*9e`4`XmY4z%2>~ zB@~I3*~$RXc48F#)9C&<8kpc)H7Nu2o_7D88Ys~8h!N40mlL17nAOk*QG>FKVa0kC zms8?HI7SG;a_SMPX%YZR+~T`t-SZ{;&H> z?a&FjXZE3*$U>La$I7iyNDdJhSv;NWD0E#i_|>lDbgM}3`EY$@Bg2_|0>H@y4{}*4 zl_df-s}=0k4;vy=6KKvU0_5~Mtr55e%6Cv(auv0xBOTscOt;9RF z7)v09Vyh}@v9p7^?VLgQMgxb&?ua$?Hq*GX266-V{BlD7^%Do(!yUV6{@!jS8Wif~ z)<1R#OOsq@blv=W1}{R9(BX@$XbyL$t^@|9Ug0q(MpiLt%9A#lA5ypbb-VQ4VF`MS zu<{hygv!_*#1k#qTMc!o{xiF3)$F$^NxNu$TK6K7I}dh3;)qkTqGaO*&#?6NoKsh9U# z_tH+-m-})qo?Yom@sydpK|LKk!&`J*i?dFs@rt%ht$rn@Au*SlQ%uR!vh38iI)F2f zj(-c*9apt!f&JcFZVpj=fW5VoiJZa2UHJIAQDI z-_{=DWoOLcP6B@8u2Ak7e=AO(Zcqjp!hRE5peSxPN<`SLo`TV8;1-i*`jr}FiC#5muh)U{lDO1UE;9FzAPLOLvJ&e}; z=`hi(QFwe!(BU{uVZlL&55^E}F9n;EV4B4>b>%l?*0Il}%?ISX zmXc4q0M)xuB0SlZo%|*e(%zXB%5_F3J1%{~*m9+o3HZw9A6$pOY=&hwU+e13PJBsa zH$MEFVNv{41CShf43a~B7e6^!AgT*}hTXo()L)NzZiW$dZ`Ie_t(FqTa&r71GVy28 z!#P9h$LvrK?45Fg<6SO!HZ+Zlu0nZHp z&wEbuDrtUozOZ;?Ngk#B{CSHC{+HnaHV$-L6H z1=6gi23$M$EApy4{E18U8BX>SF>$HeEn-f!F1*EwPPgbq{pd`Eo(v;yfQjPG$Rk6A0$yuw$^Pz1nqC!W7qngl}xP~d;Sa6 zRFXh6KfTWYo5)op-c%83V@OkkFP3D3hcOrf!5q)K(bO<)#bc!?MXESP@#$gOk&t-n z8UCLYbi$t2!cU)f3Z52@#A&;p2w3|Zxl*f!u^ePVOir6}-zx=mXm`n(oT4c6io3wspzIWSE zBq}ITzwi*$jxH29Z+%;=rWDj7uDgf64`||l+PT1CC6SEZTk}k9nzz~jT+9H6X%h2_ z2fBrwW+e7vb@(J>?(E94@Gzl)zCk&0-I3%~5^!nc=$ z@kzAiYhs0b!rQ(`34={Rk>J^0_xPJeCf9xu5lP^GUb1M#PT@RVbYg`!$|TW0xFWAG;X{ z3eyHW5%$0S3xie5`o&|=N=;kjowJ^r@AT#mqw<3lqI~xqHL8VSZTP3Vb<6-_Q|IMh zMwr6{)>GPol}#{4h>F^TyHL6G@`z1N(Y22fIbX9IUF`&>O`J~vu!K?h+%!9r7yfE< z)KR|MNSQ5WrvHDOWBPuW`RN)ZUW!#o$~x$nj7_W{1`aQyu#A=$i`BH+sL|w18h3%R zX|GUvQ`n*)qh8a~`;Z=US=Jt&xj_nbSAxojxPS;r2Tw|aZ z1(e-TLo0K%{(#`q!oEfD7|D$+tItzB!)W>VX+i(g*tN77%=ufRlrHH@?Bz^n4R1QV{!@ zWa9U~m4{4m)A20sMf$qIx&lU|qMf}GBcc-2L09@!cGbY!_p57v_``y-?+ZS-6tJ{f z#^L?BOQuRX**ZA6_F4WXHr3v>bPO!`Kq2jPHH;oF6L*70qD1Wy^EU}+Q$MCnS^q6a zDa8A@(6*HL+a}n)-#tBw^>*=r)$OcT^z{6&TT|-(P#Eu{)F2A0{oVE3|W)(K&WfLN&=}aprFr(xO^oUWW7l_j23e79c3Hlv4 zvf&@q$%^p5iOzKK70jpy9@(V^caA}KS*C7(82?K#CO_PW$Bkd|e|O^GPXH&2_WhJ5 zIhEY@*+>Pm-50%3TsTpnxOtUA;_;?6I3)g9^po|?5|;+2h{%r>+Cwh4&n<#~7=6^Z z6V8O z(!aWsOCt0%G6P~ce3K^sTE!Y6b*iT$_i!c1zN7C5{U?$hXIx;;h>^iIf*ZT?)5p7d zVw;R^uU*KI?}jPJ*|TA#*D&S0PevEn4(xr4b02}E&FPG@Fy*`Z|+MXP(Vi+w>` z8*Mv6l$;4<D4wedfe#xF`@&v9R3k7z@gP2Yur0^?RVOg;bVNo z-M}@n?-?yAt**OFfQMrNwyLV?@OS!hd+ORUpL#oD$<~q}3ANu*e!RsMERxDr#b#E&$HGUOuXG!dX^LjMjE|;$;mH(~YL(-_B z`>|baR8gE4Zv0nGScyY(FF&L#!HSC;l$7A%mdKuT#)+a!)2_R2GbA!(Fb&>|&)2;9}ve8jOo~VG;JC>sD zJ=S@B_J)mYE3<*Ao2 z?|@NIDdZ#!g{~zPiK!7R0eQCnkxcbt;?uRcoeGNf*lDQ>h&}#Y`_Lz z-Q}?58>F3i`*m6KN~@?G@)@|4b)@jhr0});?rxrZUQYV&r4$({u!*4s- ztfp>{xRDi{9wq<8sl*8qt(bVHo>1#zt=MrcR(^C4s;M(1^`JS*>e&w#am!X) z^UJAH(1Zji(3rQk@rueUa7&y6;k$s3qqBhjZN{uDhj&Sw zr%pr-Pj3U{OX+WOv<~V{>Ifv{*@S0qP)#}Ab6!dllZ3AA)ck@5TpsB$QfO4|+5f2& zwKw)mO->3#F_j65=!<1fVL!=fl-tF2tTF&T_zN-(TYT1$PU3UKI%~$Za92Zz@A{17 zx8h&^uKrXy@4yhPs)-M0C{h4K=PE;5{Gy3W1Kk65vUo0XutC8~O-Xo8o|f|pQ5gSF zIdZ6jw~@(Uvas8}SM9E68cO*%_w7RHB4XMMI*)N|7QE9c!~*53O6~GUynFE>%@s8< z``g@9yE=X=XmWZ!oy+5OajyA$hoi6mzs|Nix}o%dA3`mtPo*Y|Qvbr=b-jlpVAtFY z>mtY#83jyy!VR}UNoFyvDa5*LsMg5@z#%?P&o6$_c&E~^L}?FW%yEk5PSW%4u;8Kt zKevnM{%7{$$0hX!GxJ^OvFNzhY+sbMlrLm>bWC@y(82w67)?Z^YhPwS^1Tb5UZIFK zohRESLoY^wH6;)XCi)ETY=v3t(vIQBB#A15iK7Sh5*LO8zsZMG{rBL$=_9cML;6Mb zpWS+g>3V%*fBxi7k!eaD)1Bt0Hg(-t--Ug#_$}SZPZz%h-_zDNVg)mh;Bg}FzQo~H zpYcSw$MGRoOF0qj)eizxOOa9M9Kon`ezWl~@x1xHQ(>y~_S?HX(#+AU%z}-r+q=o1>Qt+YKdGzz}6}Aa*7hSvKeK zZQM{?AUOk=ah3@3Yg&6oA*Z>yXS$3rw$`4TR^020nx@h6FU&TDgbV(t@S72tg$Z># zyF&uP1!IBVKEN`L3zyFzyAA<~0W5N3KqTduj`WCT$uq}ZRn%{6Ga_oNWG-tA4cYI! zQ#WRyo*FvfptK2*3I=gLDp=(WD20z`h5Qf4?#3c7f4_fh+bEjIW5}95IIUPNpv5NE zzk0B~eQN}Pxvoi-WYp#TcGQm7#!DSy z-Z~&wySn49up+7{21ki9rCRz&Eu0JV{bE^XWwcuQv}e_1UXODfIOSWK5)yE~AFCyh zW5sfR(mkDMkG*?|d%7VNi+xX6CY4H)zuo+LM;50V6Mf)Q?yJ`QZumw(BG<-em>#zFg`(<vGR^5XJH%TJPgPN1RE_yRZBQ5-ryFD<*hNw( zzWwAgYWn_T;)7e*z*=B#jkGp7>bQI47f)j(PAYauDorKf84Dq$I~phz_e=8Do#a() zNZkc_X6yCyFUPME`B-|L))s;a-0@zu1wuL;G_lb z1(bIAHRuZru%#ODPkxqR zP7El08+{x@i%>;Ml~I98tk3r>@>9Om@D!Z!S=ou#n|e_(rnea`r1exb6KO9F1253f z-G7u@4};E99)CbD4~P;(*h7??XJBwnV+aB_rAP{vEPCqMB$EPCnH=KZs6*RlQB{lf zP^L~>?lMzko)rI%rrvMZ*7@zt0r>@O;} z>(`$RyY|r<)D1QN#~rFE)|D&c#{f>-`2amY!oTr`-XVX@9OkQCBo4L2x&;R?Dm(*MRVz8US^9VGff_Bh@Juu2-+iH(RdJ@Y^(3j; zcqifA`EXNm5D-va*0{y5(FigB8+n`JjD`)Hz20vd0gveIuA>|Ltz7mX z+KIV=M?Z||t@e#S93nBayfmX(t(@41g#J?*<|Ao{IOlMZyo=wkJl4;N+*x=4)7idO zR3^f{Gq8H9z7jMXI_b=7j<`d?=(y|ja^N~Hp!zErR_O3GSPNgDdxf_Uq z3?flbtMl0(mSM%8Js)3PG(Jsd0TBp85;{VHijPIf$Wsgoa{(0df2OTGjGYq!q^IY` z-ZhTNx@ph?>O$8=z*>#mW&i79mttiWo%9Qg#o{7D=hc#7pm_I_@UXlZ_h%U+<6 ze#&c^htBHBH@7KQ@JmgZXScIE+Uc1biuNJ3j)psFbH2eMu!0E`$6%JxoN1Cp%MUNy zTQn~|oZH}HnFZSFe<3C`IV`{i$ze(1v7#*pP~(*eeG;9wL^+VIo#4;k+iVN?fkB}S z+(D729#g9XR9G}-&0xi65g-_yEWv!hh$OyzWx}RL!3cNCJ?z+qHVOq((>8)c)=wW1 zbiHATjZ)Xd)$Ni`^Hitl;)$AEM2|SFk1XPXUOBQaC&KVAVYvt%nQ^z?b3|M`-cG4% zDHV05Eb6UkN${9pml1!w9XR$ z=$|V{IjW?uR58z#_}0l%jh5BFp4>FnBjNnqL*~-UeCO=E)u9qt%;4{5;XxdE?W(`Z zgB(#o%#5}IXknM%02+Ucs}i_XQvA=mR4i1tJrh+4|D>O*`(TYRU#|69lXUIZN zKzKCkW0GMHGITwj(XodTJwZP4Z*^(y&Q1gp>A1Z9u81+{-E9z;pN&CtqpRIx5Ts=2 z;KjW-^>}T8zkJNAYaksf1*x@cS94Bd)2*F{U6IC(RlE3bVKgIv+5JY{tug*5HOR7< zHBf^AMfr=Jn!X`l;A?uc4m}^NHUDtwqVP)wScB}qgoH$vSsbsDX$ZT}d;frVB$Ynl zE?#K%T%pXzFj#-0Tuvu^%9B>gBS}?FB;fe;2%FN<)%E&w6{VyKohH*8XP)YV^MG@#PYZGNq2S9 zU*66hX5f6*l)&IwuvgDXd8fp`V{u7M#|m)Hqds-tJ)_o@eHIn>@J_j& z!F_p(@>`+B1vtx#|J%Fq%nF-s(@9_bq<`M3z>N3a@c#&olv5~G0(}A?RVI!<47D9* zl^W%2*bv*Em2-(MUQ|$TZ^{(Pk>LLE*Yyjca-)HfFxx>Tz^I(UR>6@V3lSs!3Q+At zjWV#!w4S=e*VwrUk5DR~%tkGeZ+D_vX0$?ADi)7YZBjt`y^2l(1EE|N^115#o6%>c zv|rK_5GFbzHpF~Ls*bb-DJn|DxYSSpm`sgcI7e+@x?+@_Ozw#N8~JSJ)c}) ztS~$5kbI}PEpBOF%(MK9)x&_y4@9m>*sCG~qT_sRy$-%*$^Dbd7TEmO1`hO(y;N?9 z7$fBoZ=6i@Gx;%@{V}M)9o_jTVBbBls0aya5|cle_4$^L%+WX65+QwBzhCou%}pC( z6;a$+f>`E z#-za9{s2a(UGEr^0Qa3Px(0>?wodhYheV8E#&ZTok)sY_b43GkQZg2dxF@vnK4k@= z&?+6(@#vcI(vw94cni5v*>1^fM~n=gwiG4!OkxZv->c+4`OAJxC!&rKcG9P@rZIIE z$b6fK-13qpIF{n!Y^1aJf4cw|cl?E3Y$O@`;$auOePhcvaStmpe0BUX;?ZYcI<^jemsJ1?ETdTg$nMCD+lP}_ZnImKhiCecd`vjR7%8yx zn{RIXKD*?Lt%6(|J<6Q#_x+W6<3ImQ&*zRlRglW|FSo-@mt2qG_-s1=2YsdiFN24 zLMNll31rO2qN=IRjf3fJEEUt{Z|(vWX9c{A@^!{>rcnrQrsYLjrcglB=cZT3NK%mm zU-L7RdUz*fb0_|!c>e|TzF|YDKPa(-PLPFLSIX~;SO1e##S9qEH%#rW4>ckFg}I=uyOq zUdk{fAjE&%S6BHas6!lW>}-63yULHA=D;oP^}v<-@rA2x*+&1$unHBRp}&%ARkH3g zJE?%0rR=04aoGIG^eHe>JCRl{O~d5&7iLQFYRn7+4eTgdUD+4=v~)OELUrL0XPl|AJ$p1m2u@)ffR^o?X}r70A4fw?sWgycuXN>Jmo zQrL=n$lC5ali+E$r7e3Q>L0zU8EB>Z@sH5pL#0$i_yScoKhxWW-qdSE_-8?uSjXa7 z)|Oa4Xi*FojqmyIxY)yY})w$00-5@i%yUW_L^W z_uGfKu#%9x{@333t7-0Mb3iC1cMO~X^3+`I7O03WqDX1{2$Q6Cf~Av3sicWT5of6V z3^IPjASWHIR1p;PBX@S`96aP3%CW7A3G9`pzMZ&8Qt6$T z8@d>hUVfI?`>MU-LU2Xs(yHROgNG;y2q)4l+<{)BRV|Q8Mj<^r&cZf*@CqfS{rb-( zRCS7()gQpuZ>Y%L5*F{aHurB<7bN-bZVU&XSL%8lUO6gotHq!g1$}gdKZIY`;|ka( z%*ulFO?NzX>90NoPq;c3wcU&vNk1g^%`PRb%GXh%NhD9gBGa@QXzMkWgT-(dzxuQ zwvzfFOeb~6A?{4MRf@Lol4&^|J3cpBFK~NXpGWrfQtO{2I0MNxoL~7Tkv}TS6&uQe zo*f$*VRL)2)YWgp(i6$=NZFcMKHJ!Y9Itu?E0+r?#;^? zU2t-8vNp1P6D>h;yxiLg2O%%93@w3`abTr$r{o4Y!oAAfX{vY3su8v6&Tq&2Mg7E_ zKd^1TnD3 z-bK2rxhcI#LFjhM*B6!$_|bX~b&<~F@{bfRtIzspU%d&N~f2_@LKlF5! zuobKedj#SG;tewB0bi$g68eez9um#vHU1x0Zxt2?uyl(C2@C{xcb5Rc-Q5R*I|L6N zT!Op14G9t;xVysu0R|r=xclHPH~Zl~-`=<0x}REW)vBtl4tGx|cpF#tKNb#>W1v_2 zUPrJgqJ&82DwXkziJl9LWgqVmGPX}?`3go~3wlAHVJn3?UN!Z+{dG(P`g5A>>@CN2 z@Qa(BjSxeOz4OjI6L)w0;h@oLjb{BKQP zbp>3`sl3)Yz>i%%Crq-e;e_yZf9Fq->`Bt&7g%o>FV~@5C`@F9zE$!HnnnufXz9c7M*u!5)S@xrx3lY9ls!^G^EiFF%o0C<>k5vi3B!v_MDARA%0ep&%(msUqlt>VZ|%Whp?0#XMOG^2<<86#wI08vQLI ze&Sja}4MpEE1eN*^07Vn9zsu50xKA51NlH%_3`A6dv45gC-!O|v~@5lA9H}}kOah6W73ba|L{Elj4q1CHk95K2DC!|WZGIBPU|L%7mN=N zlMqC%zh5@V22MXl;G5xRDMn`lZC5w?#wKU=d7l&CUVj-I2`U2Q+q`W)5WUXEF<%>Ii&Z-FBN#x3ZY>Z}bs9aHL z?P?u(nNJ&xHvZCxmE|S8A@&g`mL`JQl^~sD&wVn|d1Yg3QdBaau**SH&MM;KklB6$ z;OXmKs&9DYI?Px0cG@#EX8L9fnfqQ9S3=6lV;@ubL2Fi329NXZ;lp_T@?^ow8mq@q z3ghIY>&~D+O+XMR{)QS8bU0>v>@y*6zIyqll{@N6#8G48^9@SOqGZXlp%!HWQrPEJIC>8dD?Go2-H|`(zV-L@U z(tOcWyIUd@8{&T*;>Tu@0Yu}$aZ)9+TUKEd3H;Qr;5xb!Y=>bvzioVTb5KZDn749Z z9f*Escs1g$kYfU+Cq8rE^Xh;(rWPIecKM@p&x23cCUPiAt6Lcs92r`GA*jhrM6RIb3%ZsoiX{ zObs@Up7}z(_4dXpx-10$5S1hf2aA6^KMVX7l)?l6Xn)6nw;=}$S8^zQU}Xs;C>z|2 z`G2DBVr!A}6O(f-Bni;~TPa?K3QuqId*RB2U?OWcR3V~~=3H}dWKY0mal$)EiYi!WXS7@&voQlH1nplJDm7ZFWy zspubAMa%|AlHWsDN#A5Sf_J&|DqDIGJGY%blrt zQ32;C9Mf*Kp`vsP$!y$HW)oc4>RJyvNJfE=fPbm2N6w)=9u2zdGPBkr9m4*Xwt3;w-_SRj1q>>uD?SG6_r+ z4|w|+$sjx~>JsL)*4_6~g^fAhB;aNnC&w)nEtN(HsyD(4OW(a}Vlyb(hbdz=%PdTmBz~l{15xJW4Ijgyu?h8Z;l?{>DR-s1aBS9yC zt!|I?ymDN;-U~D|ah-Kt?w4t3ILuu@QuU=T)R;udSmN~Bf(n)p8sZ`lppl}r8Wr;j zPY7Wg%?p*h3UE@2m9-;tn_F4P6oP%2>pqypv|L<~)(ilL5JpPjcy~dtULKdgcw*;E z*tq~>3=vJqKXqLvwVM~|jsas|vW_{&uIQrnl0*3j8AS?k+q6?nAf!+KK8K36+h3MP1(Kv z|0b&jXT_b0}F5^In8!?g#T^x}{r1ZY| zP-`kh&!dx=N7m^?(y6(89Hyy-&gNxXZ=F*^VQWPl-FFZT{i14F2%G zn*yul{mBOxUaV{?y$MZ2f^rfOj|<|2z{B?^DhOU*(&v#sULO6SA&M&I7*a8%P!@~v z?F~#rIq{?wjaeUxP6U5bE(xt-QvmzxV_DZ8BqQfp&d(AUX{3d zFEEeGC+><Q%i-z% zRKDCfHPP>#uY8!MLXgnO{F0XCFRl)`wnJ> zLr3}OCSC228Bg%^3;L}pwCsI~2Hpi-Tg&&}WvP{xW~_z$CJ!$hoyZ8Ug^12JL9@?L z1u0`|)Yz{5JJ)o@D2pPgde*Y<(5<3rdy(>qJGsVx%GBU>N&E$AdwaXGrp7XE^ZDTe z8)Tixw&vzydtT3M7o1qR5@G;M^AU7^I8Zyd2 z@Xu98Zn0^G7Um{7(l}aG;PNTo%WIM~VyH)Mb~*0J^#V}^a+oGMW&g#1{QaZz3tys` zPc(l`XWx=M1$YR_nN5da>64Ozqf<0Z{9KIRhuAp>Y7Vg*o}R0ww}k!fd!IDCMQ?3H zVt_0bpz@+vF=kxEke`tFL(cQz-x^>huf1fx4!aeW^ET1ti54dJ;*yMQcoPzJ>?buQ zD0>MH5G8G9=xIi|l4C*B;SW$yJ!eNl*MIvAXSG$Go201DIcLStgJ`SrJ>6QiMd*mI zOM*^U_+8Kis@+wxBqx zOjUe|@{LP;YGf2bv}AWAo3)K3%g&{aMMmrTW%n1rEbumE7kIT06#6jq*MHw{U1nYy zt(r+19lrBUq1+W}9zSGIHh)aCuPH_Qr=0TG?Xq*k;`N^7Efrczr+k;didR@)#@Ejh z81cXGx6#RNRD6<9_Q%b4A^2*xX35KnJ%A$`lZ-A4B*~MDc812~jaTgwdn&|} z&PGGoxyWkZz$3(SL|z#xKyDs9CqD;XHhN93aXY$9UGaJNX7bb}zVS1X;#UzPiX4?i zk`kfRk;zgX2Wpat_wJ}rioa1UDFZc6Sut-zO4il( zHGIgX=yb-`y{|~CF<~7?)xyv*w!&Dq&Up6)gH+$*t7|i~Ww9qH<&3kWz&DQFy=aMi z=vC9zJ98C=f{BhYT+lv((DV8}})OvQ-TD9o*FE@IdKLJihujS%K_EK zJ)^-0$gO@a7^ig@69!!_6LQoLA9!-Ak}dVu^IWDX#YbA}NwxDqtx3)x_w1KQYuiNr z(QP<=D7e+4>%+ji`MDEy8e0WN5t(^&8v(ka;Y^TUNGV8Q_(zZGTt=D3hV0=oAqF$A z5({Fz(Xl8rB!&lwKP{^NiRucez>Xvzh2W9di&jzjTkTJV(N8n^)IRJ|Ek{ZFR(7Zm z9G3WR1oS-F$eZj{z6yD}01i!qtx*?f(k=!5{Glg$LEtU5^)K~H@waLIEZBmb2SzFk zEo*I^0g6J-4SpM4^8@R7?mhTSlB%^n=wRf#^AC9NOLLbJLm($7BMlv(CF80PIAr2x zG!#xWBA2jtedoy1-_0wjP%>U5GdfLtW-E1s^EO>@Yy_gMQXTo0PF9Rp(`VxuJNqah zRYwe7a0of!=u!J{F+=SE$58ao`x~!o>rc=8PbgfR;(z7BQ_N@NXp6MUMH1J;!Le*=564H5(%Z2 zY(Dff6}+QGfO-2_a*Pq3vlKt|UkLD-mX2y=p%w@6bGGFpRkF(G^;2*H`z{bp6=Wj3 z0~Q;I=)eF+r$W`T)yXJfbUR2i)i26FYNgp*dHTmChI6b2q1;mWJFV1WTpU`-TT!>! zAAD?1e}nNAOdU%m;wAqSeu;R8Z6C#>EobiXnYskd(tLmhT^5%R3qyOIru~=8J3rF{ zKE4P&V5qV0Af%9dgLL zWmB*h8gzloX7q^UTN(fB&(=H!DXH|#+V?+J@!LHQvepFwX!tD9HJ^gzTKSfRVEf+7 z)vsc{PpDN&-$Az9XKZda6JsLJ5As9>c9%P`rJ9oAtxIN$6N|0gA!9f^pukT%Gsp|A zjg2xHU&5Nc+mmU=O8r*T(1oK2=0+v`vmsH=CTI+7$d>uG8V8U$j1D@50<7!y;%F{7{eVgDA4JcG8R>
Mz6y>8d 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

T{F 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 z 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

GGmjiC#*g=A39i&vvKE*b8EW2w%iW=4;LWa zo8EcZV_H;mM6;Isjz~c6EC>K|d-v>#18G&2yK;L)wlPXaB3&$Vs#}s&CiTU!0i)Wz z$IZkoo3mfU^TAGN>%$U&E@dMcDa}&Me5+PB8+v5NNEt`v+Gyw{e35GIlJ@CL%F#C{ zX3ZwYuc@$;jX7<>a_6;nUas8StHB0eCO`iyJ%G(^BSw2gKGs3aMDcJ_$x7_AA@0?y z{C=(cFsn%|x9mQ^P}7%t}347yJ++K+L8IQd5ebn-hu#V-Avne2VL$}-<;~jRJu9uMds36wOl{E zbP|%1248;W$NvsZup+WJ+h0sS(su$@g%V0^&kXH5$GG2vSolQ%BZ=)iNT;HE#w+tQ zrVaNG9G{jD+}TenseEliivUiiu=SaGlLd#awZ2KZKCM=EWCsqk5%)9kjEY621modv9jGS~YUhM139rE%Lr)E?wPn>Ub_8WY= z=JEV*lSOWxZ}k(r)g!aNA0g6($U!m3nUHLkT^QT}$JH~-h)t#{z56^p3i?~}P&e<> zY5XoBklWFrZ+Ln1V2)kqaa0|cSdjFdn57>Uh>aGz>_wPth!(*xA2CyJK!hjh-hcsZ zX9~bFEC_MA|8nIOD~0A2%f#cldK^cj{A2ghcNS@s`r7%Pd-Fm}`6+8vI#u59C5yJG zdDY?}aLH0fQzTEj1@wu;yoon_tRnPZd|sT23ok$6Y1jQ9oZg`|TR}y^IMYyL9!Cw4 zTXwj#+d`Zms{A$;Cdci#X~l8bG6wrzsGAl$S|7$A$;q=#Ac%m~MRwu=@x}+*Q9caj z{pJ1pw^4lL65H{wQF{AR>=Iu@gjSABo4%>Ci1}gC&sc5Zs&jyjp3ZG5Jx2Ys%ME|- zd`5aoj7zUxPtP4SZ)v&wVTt#IQf;&vvUf3OMPF91IWR60F}lQw_`stRq;DhYl|LG4 zi1|?@KVU$M9?|I=%s>XJ{#8{%PaW6kg%q^?GHOu_kFQC66_dmXS_e1h{RZ^F1xe#)*cJ19u6I-@Qy6##2h;6;;=lhO*4i!7< zn>nkMZ(g|Tgu4WdgsR8{^KPHZou`9OS8C~$|h^FeCjQ0yIS|6Vgo;5`jG*@2t6>H{5 z{UNb#Lrr0m$;N(x9NiEnL7?6U&H=b&LrB+vu^SyXBaRkT4W`!jyb7ZnpOY@(_y&1rRx691dUi@I5bUQ*vfBJFPtO z4{8_JdA(=9oTi`VR*^3-Gq=t@_1@zoEhTm4eOl7o>5+M2lN~Z}ul?I> zs7hi)3m4?Nf_`-_PK+H$3SeOt61}d>y}QAJ}hIIhW zR#Vu?9qf<%l5vib7|4R`PRuLtIvzqJy9zlpIxud7=jt=CnNY!#UJD#fANa+$qR%6v zXRVYl_(B8UDF>y&EP`g+(I-zUbS5rPKlVL*b9HU*{YL(_syGo@HJ0D`w(@J9+iw=_ z+}e95aH-8uUp6}D?&hj#x?N%?%tqA3xA^lb^Y}zYH%yO?p7_C~b&fj)Z85RXR*P=jEiV97GaW*vI>N+~>=iDiVi&tk;Gk#lCko1ssPjct|CBR~7$zkeCt!eySLC z5dlj?ck0XN410AR+%~eux`(TkH8sH@JTu^arh7bTLks&58AtAwo?#Ar6sg3pYkQ57 zyrbzL&E~B6!n@C?h1~+i1&I>J2 zvwRy;r@rv7`2Q3ZtiN+`mh%f&C&Q$$84Fl$>R@0D7kY6`3F`&u%4lUl``>UIY|MLz;`G0;xUjD?u<9hn z;&4~?B368n7fX)eOOP~qJd4M1+tCq?{tp;@|JY0=)JX5Ax{_+Fpvz`@S>l$HR`5*g zrN+uzt9eAIubCc*)bWYE%3}1mZ(02V-O%^fBQ1N98y|M9{FWRasWnwUEKVmp<#l41 zOX=v%HxG^oXpQaby`ug>r%sh4?!LE;tDn{5=u3i>p@ohGuYALPi~Gdnu0NwLx^`&m zW(9p(tT1H|>%r8rY0bC-a1lsj8T=R@%6ds5jU0y{65vuTR?gx|6 z{@0*7DbMg|L1;;ULq13!LYSXwXeu@l;{@2EZs+B_f%zpobgT)5SVMyu#^XD|hyidN zC34&i)-9k#8D1)Gj_yuKZa5mgpf3rwFZM2A#I@j-6xGfwx;Yu7PwVX5x$~25cje<9 z0^xyBX$qOu+-DyemJ$S(%I?KkTU*P~;ScD?7}QEYBdadq)qzlRW_-M9zB(`2bYXEx z&)~>_szLRbgKEt7im;>g3tCm_7anS`C|>biy4*XHcOZpkb0B?Cje5$BbFqA3Q@^x= zO`1V6sJ`MIMoBpb0Qe)>qqvaV2IKs} zQwEXw%H{FmaIhGW%jjoDxG3P&!viaz{97z2H|0WuXjOq3g4F}g1Ea4}`1-IFr*53m zxJ;`FV;}LEq?q%|-21-+#2ndz5E~H+Hu1?Pyj@h!f5HK@M)IHZfF7@iiw@XMA0kQN z6|+W}-3MPNvpm;JoRYxEB2gGPh$6)=R@vnevO*S+d-##BWPtxoj9Y8v)VCe=bE2%j zzoykKHrx>P^jF ztm@y=`r$BWmvLg(H+Dwnc}Y?Asm8GHDSRcA$2qjFuj_E=Er#{9CE~8HcaHs#rq1oI zUG!PLdo|$R*PNzZ^Qvj%CYXgyf`Ib@Rar2PT>Xv^8HYAgj4f0Yp*Hdj1PBKuH;m0f zL;XN!0ykeA>X|>;(zxp9I3E<$BzyejH2tz(+o;Vs41SeIuuZY4t_3Udi4;99cdbj$NYtv-&qLTp^u=4X?Dv zR^J_;lp-r6Y#8{drEa7>d3b+ZX?br_@^yLnY8$N#9gQMy#!+eBbH>K29Yp9KpZ&E- zyt6fwXKB#o^;(?|&WzF}Qgx-W3p9aks}pFPcK99>kGl}=DzMkT{7R=?`n28~oFpWU z1gF7KaG43o9&jaQPUOJABL@QNGZFLG)(x)*rkeRm3m^<3mR7_Zmh>Y;SgtDGc`cp~ zcS(V|nbvwn#(_A0?jFdq_W)KTDXnGd`k<4>!#x4|ZTqjUR{?pKguPI)qm*_x>u$9u zigm%l)a+5|M4*CQ2>%oOw&69@rsUV8D$1ahTMB@ zb-7ocWoYnTyVgG`(f@J4={5Ix*E|b9b%b%%$G_S;Z63`p-8EI+%Ch6ygjcEI@0$7_ zB2)Jt+056AG$0Z1dHhPE%B-gP?+04V?mMo{J#v~(u{dtmY2V`{c{4b;%A9{oh#;O(PwvVFpER@uhL07MI?AzV2JTp7Dz%R4XLwBlfFe39joe3B5$I;N7 zrk16@anH+eDDnlW4ZBj$zi6PItu)E+Sz=%pecSHniXMc}LMgJ^fg8G zbihj3R9Lg)cbkpa6pXnhL7g_u)PczXE0JhMBp6J}(o<6sGa_Q#fGLhybFwC`Li?4a zSq#VsU)>!em}AF}C%Y6MRE0QCW8v8=8Q#!$mw#(3wi`tWom6KYXVEb->aP8Wv5r+V zyWV{1w{J3zDr-U*);-g9H2So+>x;^m)1Dz)&pk(|x((CLM;dMCofz15<-w1$wPo)^ zUj^OlZMtkR)%7q@D4Duz@tfm=v2Lff9D2X))}`{ABnMKwbRIap6$Dk+N?{_cT}+2D zS9WDZ1-$&KKRl5$dRqAL)+<5k41r~r{Ci&26&07pIwTQiNKxdvTPvruCMW-Xf>o4^ z`zBu$%Fs8|(5ZiQDMVFQ-rXJZ_U&I3D4uImyPu)4#ZI1huw%y#%E-F@&W7~9@b7w> z(Z^Hj9Q%4M_F?8Ef;p>=7zcxY@5`SWPWx(VS9;MN^Ae*&g1gwAZv8Zq-ZUq7wba%gT& zhtFm6xdVEqG+8tc#<{;Xa}^n2bVRIhUvsIf|HZE>X~O(_+0_DQ44%gPwR>mm#)qC6 ztSnEGsW}ps`-`4!_S%2nphW8X|M{w_4XlIlYjhS$-(AKQ)T=>xust~z@lQ& z@==J|b+CoLJBmaFXkMOwkk!Q5wT_ zob7g%_3WlRKEzWQw6wv)D7U_EPiKN%E{W|H1{+{}22pBpXb0rq`H!QMVM7)q1@J~Q z2sVkX6EMg}*vF6W$H2>ePw3&Y)8&(%eoJ(NQc?BJ8+p`)_XX?uP0e#};#l&uP#y~L zAGSNAXBTj?=hSB_3I`jij`?r2o(>JPuL6Q7jr-za+?}pS01&VsxGbsxS24LhPidbl+`~_8gZa2+P$tqPHCKaLWH(!uDft zNK6b5>Q7@7k7yBan-w3r446`}{k{ciFQDh#P{D!Vn4z<8us{uWCUJ7aGyDc(Co%E% z_4O5Qe~{Jct0_rbMb;mmYme{AoLdBvg63-XQ_jN`>h@CF4LqMZ5s5;doC+Yosx!%6t9`ugO zKX(_*+FlP1HA&=@kc~ z7N_Xz9DSn4b=E}Qv6NheA<`kpZW0S_B#EC&UqYBztT9Xga4e>)# zy|NLiaZ^7HcT+2xH6KZD+P+vLJ8~g8ZOsjMJKioWEuB>hOSW4pF#cwuGN0*qsrTe| z>!H4nRssS>p5FHJJ&qyOehF5P_KriR90H`crqxg3zA0uyzaV(2amrqjR@SJ4y&`NP zp}W){opi0dy&q(MG05BzLBru!;@QY1FH z>vcxj2phdpRGJB0z!cQ^v)x}TnsYVC{FX2%%v~+7UZ?Xyio0`FL|BlBBy(T; zfi3$aqFo@y5IFfR?~wMw)N`~!XoCFV97Vtc{0k<6WD-&8wyzy}m`S2jUB^V9WUc|D{g4t#N;D$LWOqnwq=N zj#YDCrt>d94E7Uv|7o+l=OL>` z4U+WnagD+{bx;U|ijGjE%&@%tp6Dr4pcZ;bq_<%0<=rnYv@{<7;?8<8wVqe()BDa& zO8(A-qHnz3w>EFQ{jk-Yk2XhODy?>Jjp^LgME=gP5`l8Nyw`vDY{NGY3Jv0x(v!RB zEika$DYUPGUd@BS$TZta@la-;Dw_taRu-ed<(&s+N85}WFXijAsXn-OYe<8ov9Uuc zxr{=pXnsLPR`2I7?7elpybM&DN2Zeas3!)+f&$iyG6~A9h^0KRtvLVks}sxpAR~P` zwM2T={l)`V=(Ag;P|zOj?EfrtV(xp0jYLkN?$B@1(bsETml&RSID0s$BEt}XZ_|sj zBCs0m6wVDXwEgI)b93Ra2SbYi{-jY2f>mpwt01@^OiYB$yf=Ec@;Y?|m|~77y_+jj zaxysg`*SqsAZzOGyrt5l zIxKVlEG4gD_G=;EN|QL$eD9;BXCtUVyH;3SprfY5PbvOfxxrZ<-5yjNEd^`}H>HkV zMa`17$4!Qv+KHLY^VOW`m`ZIi2as%D&~3z+4cy0{vg_tokkeM_RWvzlnmJy zDVU@fdU_2m==j)(Cr;H0vQR|I02pIE|~XQoZY{Ll*P>Dh$Iju&kmqFdLWuxmWQ%z8QR zPRtQQZ|=HC#Z`9-rgp9@SyI~7U9(=Do4E7l3qBe(?Nw}1gAq|``0(xY_ityP{C#EC zV8rC#q?e=F?~;0_gAz9T^&D+ED9ZToglv(}NCRi9BTdKV*ROMU7)9onS9-tSa_aJ4 z38CZcTJ@yOFJX&);h|Qpd7FiET({Y);#W%!{CFQVxi8s7(RCzADk*uRpUF|pAhxiT zL*a*i{4*xMmS^{uX!_$!X_}0=h*k7{W!Ku{Vm&+`&NQBQ;C1&+jKxZ5_le6w8Rmzl*yR1fYJIsxExT8FHddIe? z8E3H6(c6Vz-N*!c*q*>$`~+pSZ@XP2Jv;81bAAtv7IVlJ1Ip%D--IVaQt*e5{<*tr zBOd5~e%L45O`K^K0fC(l>3L-e{I~MZMkJ`8uT{=wv-qV<2|wsmcRg)S>_{v{!Hu-bjg!7> z0{;6cUdnq6-UOd{2HWlP=O0&{*IKuJ+M*)q3a)FKteD96KSEnaE9Z15`QExt%tWr7 zAL;jEqhBsssNr~co0nO!vc-B^_v4TcCQp+jc<8yFSW_@U&m7O^Cd$f?OCO%dw*GI{ zAX(B&cfMXa#KhSHw~AFRm$^}Zau*i}JG{TdUZr@~;LfV~%}$(as1~w*M20P1DD$!3 zyeF?yAnJzaiwE*FG>(&*I+CseYfE2K1O$%8?lq(@Q1Ik=6gK2>dB;VW-6ZpqE|SAinj#9_zLW`oFIJ%@ZU`$)57w z*Z(3ucliGQ@hy6@1$_C8)YR&;1^&>_@uNR&K|4U~z=+QYJiIq?bE^S<2c)ojVrr_F z@PU!nj)rGcmsOLzH@m+swI2I(sfWE}5TicMyvalA#KO zsXj)o0ruLHv$L3|fcm0>VOF}cI+pa!k$^RSlbSzSVIZ@8_ilf9ty8Bo)7*DTvT9Ba z6R$&on65cVK8ukD|MSZW($I|p8{fvu+yAoVplUCyMm=dnV1l(v=qO>cLO zNKY5UBR0j;By}*9WRr02$w0TdH`gH3go+qJd{Bl>7&G`=b1+7BM+`jNqIRImlE70`9@Yl%5-&Kg9kS4#j$7VlXuz=|054 zea+gnly@FK4u*9Ngpzy#t9{!?tA?BmvkS-)cE0}4Q`Q&9WeR8|7JUVg<%21l-0>9! zWf4Yy#DWErnzq6&8!=O{NYYF|F|D07h$V3}dPn(j^4-Yt$Qxt3t+bkw5{!kuk`lD8 zhK{P=V|ME>O_ znZ$z{M%e3o_bLfx%vvK3qXzA#VHi?pM4vt@e&DPIQMgMtx zaI;ixs(HEsZ7C+O#IA&lQux+yDuVkrfiFNUJ_n==@x5>V#Xv=$q;g3Ik`aWZJCY$3 zNbwzZuD6>owXmQ0an@sYOx4(UD}WJWyvVtQ1&m%JYiDrS%^_$F!b36=08}liN;(v{ zh6Yu|9En1KgnUU3%%d>VLO}UJLyzD%PfVNs7FMVy9<=Lth-r|Mp66PiRI(Nk=LjUXXmxEo8M>VKv8xC%;ua7p99Ybgm)G z_FtQ;NBdK{QK_!#+6@~v$lKYCnT;IcW<)>KhbJn)#Fi!iDTT3d?3x?=Tg$$An74mc zJ^#3Yg6Zp%rc5JkJ{Qx^HiJs6<~$k6G}NMvTx%lU^9A^OYOmUyvN62LFW#@ZFQKuo zf_=m5>qQElK}w=^x8e(gBDR*8iFDkKmvo(AmfVuhY!+kE``NjrVBvqfEU71dM&ZB{ zzrSojrU5a}yS>fmE?7Fm^aUR=BoRQ(?O~Sv+2Pg*Be}o^8qAHSDbJi(b6Z!ma;)af zkCY7?SQOlx);(YAx`~77xJmVSwWrbMQwym@6N~$Ro5`0H`+63t`TDFApB}zdn;IH+ zakoIip4#QYsQq#_J#l*&@BM7zW#E?m>+X@=InK0i;%O!GTp2BFtJ9pP|EXFkocl2Z zMP!x;R&A}JW4=E0G-bvUX<#XA+qJ8*up`Yt8vgg|;1z?0((Pbd_(rkp+0 zZ&F+}DSs;+?e%vhK$bun$r$uRe~#2ZE+3zjTEkqOeH6GRF=wTe2M_}|V~sJ!;btFQ zf3)6>v@2Lo0r3flshF};!dhpaNPQ;Xwr@W@`md@cnwf0Zy0G=i;creq+Br%e3ON|e zTL#dEq_RD0y_J&T>(`$9@tM_*S0WY}hJ0`ChbbSmKd{YZZ8Uquz2fn$#a~{T4BXHx zk{H=zxH1wmH=7u_2-dO zMkHiHGJzQsM$^fc-biR_5~c`Dz4%<;6eOcuZMLpFe@_iQ05}m$CutMkK5u+wEB&J& zxQ+8#+t-u*LsNM_>^`bJuIv}hurs646N~B_^G}#~JJs+rB*f(s-_q)mZ}jtnr6W3} z^J^^X4PxKMT^e>0sB0Hh7Lmd_G1turuI&98D_O^EaLV#=A>bpar!&x&wgPxc+%@GyOy1s_&*{KTMTcIv&z%1t)UHIePMc zWccyTX<@y$?%kSHzsvVF7`(1A<3F2iLVtK;hU55w_lLiIXO$lx+rN&Eq1x=Fkp0i2 z9$oj}-V8aT)Kb11>;hbYT1g$|W(Q0N9JIT;Wg*IJ&qU z+vflnKR|6y={3L5CX0$si9YgBc*22id;uKFWA5xashsWZK~z~r=iVGSGijT2C+zOK zv{8R6P7Cv1M!g9(KezE{s_$k-#_bCO?n_~;^Ap`E$9{Z%=-nxGpeLcEdam>Ln~(9uuOS2|Lh5$pX+7Z^Ixr_FS{4*XD;OM^~B!%<9oLqxc#Wq zl3TTRQ^v!q>Y|VuY*6TM)8`f!Oq*v7%t@_ya>2|{`o4R>kw=L-6HUUrF5ERhQcQ&P ziyLZ*6)S8`Q7WuQsct<_T)e(dx;=!~Vd(CYX-=o(Io_dQokRTrdjP`71u4O3WV`0D zlGKgU+URO_nBvaxHfMPfzp-uW)jRS&cE{BE8^6%g{pbi(-mSVrY-_-eBdnLq`x+bN z9cTc{3dQ3*feCNhW#i;iDP}$Tk zKMNn7YWOHv+l6CX$_gWExIHbmuPjza4l25M>rZppFUN^a z)An}C6;~&&=mwQm`ezLYON57A(VPAH;lhlmwmLIDy)yWC*-J%tO`|Y`k^z?M0NYd?<^)WZ;%pN^Au zn;oY?#KMG6dAYldG25X{o^4U)7M+LN1-r(pj);|fd1OSptH^<@aE{>7G?xYXYL}^= z2*py9TQwetUx7rGs6B~>GAzuw`R8VZn_uFS_qujEvtn8IqvIh}Jc%iTGpdNg_qQ|_ zx#^7Hc(k+b4vaWJ9pgv z?p-`Ls^YViPwHN^g{*ws6rHS=+e%$-zUlYk7fVvt_h0btDK9OpOciHLkl$qXZfipu=!1?lEx1(6z%(9Okg5h@m$7c(Jn}41*r2-&Bb?Ny# zu-|TuTuU2?f>1JG>{pX$s@mE*pJScF$qPD(5y>gGr?hK#9W~hISMgcox|(=|`ZMkE zqe_gU)#Kbg4=8r5nWz5QAoyTIE8n$&<%PAu-yipnDUbD*=~apR?BDik{L3mQTKmic z9a0`UyHgF-H0Dx8tv&?p;_+6SO{g2X+)#X!N2Ry?qV`=~aXX@#d{SX{LZ6I1cbHGLmAzD*Wmsg`N!FtE7*FY>xr0t~v5^Ji!P6 zpY0>cPNZ>>*=Iz;0XS!4hPnB3nn5jAJP8sed@C%f1gvPpB069(vy0okCkEwcLC?Y| z8DvzL!cAcs@mX577cYgJu9y&4+K3S+G)RbV>CV5&MmIkGK8nN+;}jwsS>kvMnyV13 zqc3_{pB{s-lLUNyPB&`6PJ*{|57x06zL=%|Ha#Wor~W$e482BPZQ_uhdz&h;a)Hc@?dk;01wV%ja#eA8kbqEIu&0SKNq@ z2p#!u^Volb9OaQO^BY;Urf8#hMs?2&o!Ugf>vz|uYf|)GW-7(Q+1?g6r`sW}Y5lX5 z<07LdM_asY!$4W2&0nZE@^5?`Yg);N9qff9-HXj$jYjWT(UWSP9hs5I2(iSNvzUAd*&7ApX&K$z$-wI0Ipg`9|Ci>7y zT)HF#);57_T1RJeB})#bo<_6$&N4L zO)ozWsNWM(ede3HuC6UlOF(@KnDaMK6*OU=#C~Tm#di)U^WN#zcWy_=kTU zjM@-iLO^0u`t`fz#`hI6j+#$2`roqNd`v-KhC%N@_tL--fji1d%UhxfLaEii1znzS znYp;Q@uf)Kox9Z~uN*}gXw1uAj=TT*_IzJ^-W8V}YqJIhx49Vp)%)3h_e7#{%-5M) zO_v7Qm#KM#PcwcSU_GiHmo>cF@Qtz1ov5hy7`5iXnTrBC_;ZNnBVqE`PjDHK#~e@s z6$6N<;J8stpwh{*Z5Jb>@!sCva)4KGv2U73==sF-G^nryEkoRS8UC{P;#c$_0EQmB z_iq7B&kfs;aCM=JkOtTX(*RH}D*;^8A(B7>>j96q$F=k~m)F8C;tq}Zo^IhLIgm&Y z-7NuWHHPCabA!T@t@2fQnaKPTJm_6QLU&+*dj;7%#DD_awm^reX6I;fa9xrhZVH%L z!ZiFAu*_(DfMI&xK0ZEng`;95hyeMP*OHTAN|#~P#0#a>DP9SE%}3~>-$F7zR=gFu z0ZcRqB-%A2>+pRYnc<@yJrDa-Sl|bqlv`rv;fdK>YuF^ltgt9W!^yt+NkH?{)lv~@ zS!2c?VpYL0={frg^Y#Uu|O<9+IN6AS;@-s<*E=KqPz!UY>KlGI2(zB$02EC z&U@L&$Y^19{3P%$kgwrm9)v1u6AKI4t_18&upsU}ctBM7Y;xW*VCq6F=!?hhfP)`C z-a0^AcPIsIg*Fo$(vtap4*V!1v;0mwag4U{pTqWC2J4d;8WXz(UfzWFV$e&xSpkt1t+H=ZD+k?(ljN{+wlE6JK;SoSse)d9jE`%9X&L2fn-+0EIUk)c* zl97nkXil49?C{b~%V@?k?m0iWga!1rED2fw^h z`Mz|W*1nZi{UE*O!MpZjGEBT(bsQIq57%FpffTKhRe0XM&ib+U539|KOWj33`!7qZ z_T&qo+ddzxCpnT4YV>`puqa)MwSw~&iAN6(0MiI@Oc>rEXE`kFdfEuI-J4UIk7L^wtr|{A{`Q6Y`#wd zs{UE-cAvTV;vJcIf}WLJ|7G<}x&6lG?W=D;q@!U7uc{Aqx$$atw{YWMH`A}^ZCd)^ zB;k~k*RiDS8u>jzR+R2Q&qek8=V3f9iAq}M>U=Dt->tYid@|Qkzu1BoI{-FB(XbgN3`T)v##{I8 zqw{_EkPYNKtf9Mi!5p>#ztR(AA;1DL_`rliTc0O`@NSF;0@}}J+!5;PcU?=%%67T_ zRaI5hGcuwAfYcQ($$)Wjw9&zY5(}JyJZfWOJ#fH& z7hWacSN65ol8uW?6}tyRs+0^b2z$`ZPE*IGYVileYoyfiTl@1Lx&ion+upr3?cAVc zcNH{OO%~si(tMDfU_}ZYIDU-Fh_Li+1Q+Vtft0j>U|TEA=rh_5j}1GUll3lUF)&u9bT3QThB=zZUn!zJa&=4oqyF zH;uEx=1-O!z1M!c%aubS)bUEvHJ7|8XXdQ6xrT0vW@;x+RP;I6e}B6XQ=pq6A-g3c z*c8p>~eb&K;UxQIRqRs5xOc%JoQ+IbFeE6;1}8MtwqJwL0wPDajnQ}3qVjxEYrRxBH< z$JeSUC=a|#?>28}ds4cO5nHp(x>LYFSXTzdRS-9F&n)KgE zIzLNpN??gj$3Sv!&JFDv#&5A``uPG*pIcDzDb&6{`;6<_Ug_P}l1@Gy0H|~^=d{zd z7zW!-k7UjEwwLOhP?o!Wb8+7n>V-^?3^vVavmLwzY9oMb#_Fjp!a9gKnaeI0 zlZY$xGz|&9z7)E+GJtXsMVy8T*3EHKK*-5o!Qf0$}k- zOS;8t-&M`lx%_(yJ@aVoot><0`c`iEPrcv2QATR(eZx90^_02UCTA`K!GDptW5l&z z)(LK8V(a%RIp3hmVE*{2*-_4zF6qeGDw*r*2PgU&W3rr95^8g7*_hRTQza`PgspVG z?&4o6Do>C@PPF>Pe@@Gk{g6;$AQ#NNG{3#`+2K0;8QY@xknz;i)P<;%Xf4n!qFkfc zb%+U9J<5lcs)+Bu7@lCrPKVy~F(MYW0PicRaoK=eR8tw3aZAhT2kHRQtH~;f9 zX7hUk6bKj%mvWf9yU9GJnM(Tc&_JVEQtLzJ{?X$N&uhNK3O8Fd)eLumYfZwF&>7(c zxIY^b+^_BYGcBOD&jiSBb8^ZC=jdOcyhN$7Dm7m%J;~=+==|-$Iu2XEA4hXf7=LEu zXOl7B8CarQ6T%}<_D$oat(Qolr^(quhmCj7nFFuenPz&V=e}vsqsCi~E^93sc%Gg) zq4G0ul{bRPhXUdryDkGwh<{qEYWWJ6Ah`7#?22HMzD&Prvq5oz7M)#VB-m`*urQg725byc5~&mr-+h{~v45;y^wmJ-Or4~RNx`F>yyv?Y+@bv*$a1W{c8gG=6CaSr@2quAWNR<(Y7Xp2}i?!>#qf#zy8F%e>=c zR;o{Kk<6CqLu|}Fq>WHsb)eP+no2g#N!v}_FQV`t7D=XVoXsD@)(S2R_ z@{IUcUN6IVsvv08#3+q00Z7&gs3?$ihk!f)Y^gMlOQrB1zIWH*p*r&{*N(W4h=f14 z8a8!X;m`nue>@)zXd7mLd}LsH(De!~he-E!GEi1$#w_MFI$0H*BPAsz59|7k^v96L z0=*jX6*U-`OkcjCRnO?;7w@2L zvZ9M+1R^aiO;0Z`cjz)}Uf{Mq5iOPd{^$KYXNqbe_Unpcs)1yPn5)%#rT+4+GZ$f$ zor`sCYiJ0;M4+LtBhTIxz@Gk?w{EtzB53jgdPbUUk)l=#fZ%I7EfnYX;Fk6>H8Ck- zx?)uGXY!R)dxInCg%@fsb@QaskMkOz`!Bh7dcQlc#`4Rn=d-SVA;}((Us3(Ou5^j^ z>BQmhdQ!f+>f9_`Ss(XGRmb-HL0g_D*EfA6>(!+M=QHG`k9_US$a$;iu00#Ij)rFM zRK$iBku6&Bk29^@B{IGpEx&Thrf`dE+!f16rm1`zJ8t{6yE*q>5MQ}D+8NhIkWFbXMIh%mtgm~j% zXjDMy*5kj@{1M8&KTunLH(@~`k;!fCbHUVqGsnSPB3x@;wWzlsvA9E;Ra_3stQs!Y zjxqvR0&xKc917b;w0U;L(^`)`hM!w^nrnp-xf0CXiE#r^O)^pk!m=kcp~y2)HL}V! zx3fw`u($#`#0n&coUpdG&i+XU=Fgrz&)+=W(7cC99!EtRXeQt`r+;W;K{O4b@L=w%zFMdcyMh5od~^D*1x z2xe%<^o~URASpgT<5wS^849b*-hdKmDv6s5ky?%P2 zXTMxT!na8`P{090dibAAdakzP-X13jtHzy=<6n8nG>LC)PoO`_;*p{ErfsmvcbQS< zZLsP{o<)ZQLqhbn#-Z(fC( z;jrAos^~qu_v#l>v-;(xR(7#xTUS;Cb2`#JmR#4rQ9KE7%p^t(KmX+H8RwiF`ROJ@re!#DwA%__r9o!IiX}E3e7Pg>WX#?H)%=a0{7v;9gLiZn$uqDS z1l6#DzK5tP1Z52t1yYi&AJtnS!fn#~n40E zPziUgDK&WcQ7~Kh#nD5iwMFu$-1s8Ko*r(WS+uG<88p}x)5Og*@bahShfI+(F&ZCYs|;C-D_5qCKu1m)BIGG zjS}XV-05^~B~CQJ%hdk+1ur>(>;ke^x$Tdc`4h?asuhj|^O8Tx>@Zn(E`2)@CeF znFQG0md;)0leH?m)~|LbslZo3<8YHGnO2}LyCC`$(`Eq;T_LI<7lGsT2{ft_`-z8+x4++svZ7Q}pYvTiGXy zrZh9;4+~T{F_<+xryZ>NOCwiFOKY?GhcdSx^&tGHGm6@Nxev2mqrVCMc)*`73m>;R z1edaqkml0!vF^ERef(H_Qhi%|q=Pa$jhClJ-B)spEw|A5ER^a!5`Io=adKdCa&gRa z@|?;di`&#Q`x9Ht`hr*OE%mWq6XRVH=2P6_C&)TuW^;0`^j+tkqC09O<%feuIltZY z9%NwkI6U9GkLDll(Y9f3QeMpuh}gGr?PBUlV$X@!XRfS&Lc{Qw(otg3qHYhT%kF`wiQ%iwPahwg zn$DpQ;#+50HD&tf&@9L2)a$9ra@)5TP$@aC3pi38`~Nid-QigG;oEn6Jg8_WM4>V& z6=h@;86jn4WQOd$$!L)hB4n3jXYW}Qm5_Pcl4O$|!h3$z?{~b%``6p?97j*w_ji28 z^|`L|Jg@6w%Qri5g`suFt?8UpB!&L3a3>~=5DAFg-vk+wY`dS!wyit*}zw&6Y zcJ+5rq09I^K9A7e-4x=R_E2xqzyHvOdgIL#U4{?MJI{arIr&kjMcuC^<5QTc>1~!B z)2;8T%za(OnhbAFRiqc)j4?c~v+=H@>H3X(o-IAs+5B@nbUbx&`A#$R4bhEfx*DgQ zg$^zcCJhfKSt!kN^*BurSs1-jnr^Ds8PrR^y1Y!oZDRj)ZuGyQS;2|nDJAltw=z}2 zc)*Tf!)UgOfyPdgI7e-IFNC9zR|`egN7?*`oRqYe)bPn-FA z5{YeOY^=tfMx3J8()SdFsHe`yOwRqDPp6j7nf{L6Ww?h#5?LH|ljV1%!`DdYYthiZ zbAVAM?o&+{e&uF4XR`I-I=oKj1>OkeQQ>D475+UF${>A$Z)_xy{P!;}FHbEk-&+(Q zzMko4$y?RhYpJZPoEwgt`|r}w(70EwL;SAbjwP>GtM23`RNSo4d2sQi>A7trlD5jl zm;U9w>8SbAM@2k2pQj~nb%Z<9e$PYEbw{J?;-OH>$;&gy(8n(;$lcwkr~+rmSk*O; zry}_a-ml;*PmRskaI?rcKP&4@hb%54DQ#e2kZs&b<(YVJGd^X#rPq=QPq}^LdiE11 zt{WJ{JG;1Kb+O>Jp3Th7C1qtPfTP84@tHPrYJ7vVue_K3Td_@^hEm`3!jJhSB}K*9 zxjB1wjK$mM^=)m5_y>vvewvuyG2FwuBuIQGlf!>(v-YuQ3&UGI&CRb%ONEq_m6Oxc zx&C{Dv3O{qtt|qV;5sk;b->Zkti&i)XfCe}d)p-pE=E>gwcbFgKErEl=+2#Wk>{P{ zLGmUgBwV$!n)IgwCPnhuTb-#F7I*jEi^9Uf-P<3;i0Zag=<$i_7&NDM_5AOMd|YXN zZ4_2NxiA`@*Lp4q{Gg9aqaq7+uOA1-Y>%goSn^$0AuaCR_ChR^(QTyD-@|+U#K9L% zIEjvW72Pdw-+JH+@EGMs!s8NA=vkC;skO=$Vi&4Vzr1lt8%F74yBm7`)btD%j-)p3 zEB*CgSC24B+mxBU_E0VR0Rg65PHDF?VSWo`nvR!T@3^oek1PqNkF7j9!Xw%9o!6kmO!NT$eP0yP{;UV}UyPS#pZ0&U48)t;&Uc)V=Y ztz^1ZfSr@G33~sT*C$=2{LW83Jb3%p1*rx+aXg`xB5pgA6}>D2f8e^b^yA^-;Tg0K zS7SsL^O=TjOWqWK6hol~QS~Tz#)CXtqM>q_po{&CBTPwVjg(`>Z+*h)al9QE?H;*h5U)G@I5HO#DAxH|S z5OO1lj31`2)fp$X@=eTo(Zb4{-L-uKtr^PuW+ApZDzykUJPmNxFr4Lp+LbPDB*^aB zw{HX`hy02dU=sXXM|JBLP|3*(xMq#sAidrvW4m!!aw zc|4d*`sf)DK#f~-&{K^der$qr(GKc$V=Pg`bqyfQ85q`AN#D2;9);5UV{KUyW@cu1 zptSPdU+EoozrI~i4dyxay zEfBxWCd#>92JBJsurl(1cpsf8LnZoI zAfzfdmQ+nOR${C%?-*od|b}t^_Qr zq&IJ5k;WZRSX4BN%7MeHD-)}m&9V{_Br)jqOf7jM0z>4L-K+%UquTMSt=plTS_hC<^uo& zul(F*UM+rBE{&P46V`I*c8YhyeFvEt7ak(hD27!!SS)W~dI5#d&kZ5Hs#(LKi&g60 z&&WL`<95fZ8_@F2&h^^{#;?SLyACTvH^6wT4Ierm5Vj7t;{gOgY+^Nti3pPfiH102 zAl@A((sZqq_tAOoa#$t#a}dodq#E!z%wwGe3aBjDg#7bY#8V+CCIdZ7!vLILG&DAr zx3RGaz9Bfbe?pM@4b6n>TvnZKcY$x+q)@bOcN7(G)L7O1J9qAc1Paq*1bjA4mabQiAcY3&GHz`5_3rs{!&hp6_M?);}J? z+Q6zXq0>XjJEPMTrF-}8J$rfBf4BX4nW`+dPu8+Ge2w^i_N)Ai%A;?*VkMB{!-u_0 z{9!r@zi_bEi}7G4Zgo=G#KdH;+B2=KUc{cjpC7v$xo3%)2W6w|;Nb9OcBPkb0VDR{x?nYchSRJLbjc85OHpGq0%E;$;6rHg)duk3~&FE%FOKAx^`=7KFe<& zZmUZ@9Ms-}Wh*0PyS>FSyMtw5kci44p04VeW^{=*KXbao25x1i_DHI~lKI$d|HSk5 z`MKVM3Mc-!1apiRPhVLc>sfhoL^kYM(;@)muMVZt49C%pPjEve5dPM_yiO4=u}p_J0fRtgsv7g-`HgTlhX zzIP8AbGP$!|LDso@*6^v4&n$^yK$p`dO;E8dg9`az;`pq2+|e3aN$nr?++)3amd}w z4L_aALPK>UKzvn8dhK<)byb5wMZUzA)+=JW*DkNAnTi&UiD=ry=%(4ns=DpsAtyU1*B*iCDV#++JG*`{(s$FxJriW;zkW>j zS4NZDgyh<~%ajGw)YKG}mG@Epg3p)jYM;N4VzWevMuv}lxVUuc?X#ypImz@|s(_Af zL?s&8wqV|YD>#?sfO|g|IOk|6E9nj zwQJ48%`F)Kf}Yq*iDhM4Xt;V+K_L)j={&Rhk#fNlF?DvWg`GPyH61=& z=N#jDWO^Fys869Je?n3c`_H;a@<0wq!d`w<1Fu+2LBsD4rZoN|y= zU2UwVObZFivCthS4-XrUbrmUNp)R6(apL&6c?q1=Mbzj?MfGANnMuR*ZNa(`>^Lmt z>gsAW--Xx*C+%_7Ofk1It&)-wXEcG&L8%o;N2QQa)Y2#?d|V1Wh?_y0Cx8BYnUaEn zaO6;XG#KvlZYnRk4||joa&zs!W-Q$a-Aq%99P@qo`%wdO~zq!rGDri`0nTONoVr z{2Fcx{rrxn2HtL-0fHx_q|)dpHq(rs360K!6()+3(^v7g z*kxBtJC3NMU>v3|MZMtkc-c1Ep40oOimHy>O1VkQp@=wixVNvqPC~40X7+}~2qK&9 zoA1F91IpJJD-{^yP!uibl1n7}{Q}A|S7&k(kBWI& zg!gq!YWstWr)AG9hAB6jo?ePNW8nM8&3)!MmI=K^89e9%oC~*wHr=~0)?IP~k^Au2 zn39~F+)V43uI0fZveOiGS|sBAq{PH}ye=!7TC*Xo_}U~iH#ZOCu!n1%fRITJ7F*JB z8Q1RYvyU#*OCvT65j?WfQVgSm$5+C28%8DW{im z84FAT*1+|na#2mtgWoLOJMlcC$_)WbU7c#2o0|gPmc-FB-E}t*OT*IWhs6zWotYF$ z^KMB@N;=SD@L}c8I!*B`Yu;;)GC^xjoAyKOW?x_5*h+RD*)#my_i6^Foi;O%>(?%b zFulM!??Or3d%;yE(lM?@^8-1hW59&li=DDkOXk#YHV=bxm{qT1Yn$Gk7CAoLt=Qhz z?XIL0MC=l%1&vWwslC*-$Q;_ue6z=SjPnc90|yX1m_S9#fBSbjbc{SK^u9SYdTA2H zb&8n-RScZIdg0&ADn`!S+%lb^`Pfb-&WMVCP9-`^X8BKCraAkPt+iGin1$r{cnJvM z=2N=;>=>AzN|xKPP>y7+e}5)o*R%xlmmHQH-*Pu%-H`Z_aGJwwkm_nmL@qq3q5@a1MQRQj`VxOJvtH+Ua&x~CdNib zWm<1Jbii99RvK0rCBLWR7;64yLNAnxtcFYEJWdWBm*UzQ#04xyaOV*i$y-=hl+zi! zw(k6-`3gQbkc`vL<~P*TngE=@zU=pWDZ;cd#kP5D70!$^bc}nv#q?-B2~z`7JD+?gsPD?$0Sx{SEEj6h#_Q3F z&lJl&=eiI;JR)I_i8Lf)gE^a@i5%(uSt^uKTW6TdR)3bLzmDQQs=&91*aQO@L#`Xi z!HMZ~urW%|Wix|IN}VbaBE_+#o{pF8*IYfJVc(`tm}kfu>>#=rq#P!80Ln4Fo95R9 z8hy|0Y)MOELIQ1zK|kEj)rS!RKeklNMi`c;Ok_p79-OYV8+BUhb+-sz{#7==Rg&Fb zaS=y-Dh$=IhSb3wn2$=*z;EYIrRJ*FZ3~u7mHT-IB1c-M=duMYLUU2NgiFs%V#5m1D{HY!CmR<>Iy?SZZ$1CA$Xj|CMJzkZ%=>f3I^nY zJj1IHW=U|j)&%7~$y**!6X>+g(a?myLZCXX<2KQBQw6^BYMi=5t${&)RU0klTASbl z{DlDP4+#b=L|#`>X+4%GD&IQE#ZVVlyY~}+{PC)6`e|!Uo4OlQ2Zs)s$DeJ}VHG#o zx~-Z=m}t9w&ab?5%}ru{E0}A*kEZm+5!~ZJc#QA}|2@#FLyUfc zjDFj?Bg%@VtT+c`R_Cl&SYy6jJNF9Osj`^}FMD_Q$KpT+y1 z^Gi6(qx<*jUuU7NhX^Uhv@Nrk0zra2&M4U3FX4}U?S?!nyxG0`O2#QXSSLtr`wz_b zAQ<+GZM#BTNF=!JA5a@`jaZAyY1j4j^#R-JJ%bNP2o3p6#fr%ux0{-qd5+Q7p0nqT z7*F37Ji^y9lJT=E&FRUTU8M*_cZ_$JERAz_thxUmsVlg!bpLu27hhh@4c|x-k^div zS7c^hwRC^Yg{Lc!3nd+7%cuGz_ZNwK}Uc4=-f(TT##Qcsv!O&~2?_yN!dJ!tUsC|!i4?%SU zfjH-JkhOPoBr;c@+DOKbu|yDt8+N*=os0Zr$8sUC@HTy zWO}q?nSO*v!9ZXj*rdDZYVgP|CyRovwk=qOrqU!98<(MBe-K$>x zmKRNL;t#Pw5c%XKPr+n2|<=Uq>BR)q5{MU98E((yYm>yh^V zpn4ctH^dx}zteW2{An5YOYUkNb)X&HbD$%wP4qHv)#Jd; zt9QPYW)OzZnrvCot8y+ji#yw$cErf1kgkd&!?e$|Q!Q2G1qUXAZ0ol*4k>7xc^TR=t=bv@(9Ur<+_bU<=ckDRFblpe)@-OG&W&D)M{X>y=#?q|H z9m|wMNB&;gwEvgkmiLdcI*+$}rO9Yni@$MQtCN8hm){2-V+yVs$?yzM*OEJX-hKks zj?{KezT$FzeAj&bFJ}$@b1Ug=i%;-l+N1K@yu1_yO-}|E-|KNqt5PGk8O;}H;(~8~ z@0{3d+wg5g?{puB3ITtLF3*5je1_Ac+gvrXJfQk%EeGO4*DvA9l^A;P#dJmLGj zZgz;mTqVKlBNNxL`rxgK7rwZMwCh_0C|&7`-5?%rPDk=e_3w0`Fg=EZS5o4e`wA7 zEmOANBrzud{2^$pD3@_QB2tD6qz2%`ylmON1az02v%t%%l7w$0CFSilU(_>%WaYx; zxek3=Ph|b2ftI+H-8H_vX?^0VRHQeC)1R$^A?BS?e&nEx?fZg0Vmp$4q=WSt{7>um zT>_~GR5z4aeFD8&o)W!$T>-t4!BI7I+v6Sw4jfR_(n1^C0E*lL82@KOt1(~1Hl>~U zQlrSqwGJaA;`UjwpX<`5x5pL;+6Rf?Lj(nzS2}x~Afz)nmlw%pEpqOQ3d`TN2!BPI zt`hDvm0SJ!^9=GzeMOSjkv_^X&n^e`Qk?1S_C1|_oOni&y>_;?gUH8GKuBA<*qjF5 zSuy~=9HD(AkP`yy3JVVhiXMw3XA@}3|HTM=gC#SX85WHcwIWh55)@7_F8QM1;F}^>3?aWB>-u8spD@xfT<5sPK=Iiy7w+S@2C`_)p|(90Iea?@7fCnK|9vxIdNOBqL-fkbQ2+%5wA-|r=>vd=GCwg~c4t!+C-PDVn41P&( zrO&}c%|f$Yqys;Z%-(~%PifO5xcItWr0pdG)}_xps6aGeT_mMM@0 zzyfL@kQi+QlL|xuNuWrt!G})V9uQzto;Z>vn0D6d;-N0LrLn>v0n*4JJ&Qp@9yuR# za|50#fTQQyOY6V;4#kBl0-0CVa#aG#r&eJ7ny8mv6D=$}WVW#Ew!GZ4 zT9TBMG=m}%*O6Z%T_A{e8PQrTBtTX}$XLq$^q*|*?Bs0Z)(^W?nYS;w23WMQq2X89 zF~WQyb>oJzy49u6OIt`xdkX$&`4@Da#h_5g#gs;oM?7^4mPeVvF_e(gl+*zsi`e#?#m{gPe~r<75<;dyypLk z%&XW-pL8VF{7k3z&ZoPgvNjdC@&177-gG*hwWtvP)cdHi-K*3Oa7?7Pyg`1wmh6MS@f{zt@s+=8i+1h6s|#_2 zlxppdNa>-!1Ql@*KD1mTy77z3L*+XEK0)jCzqF$^{o()L55Kxam^Abv_3sA)LP$|i zW+1r99(x5CQw~JOIypzFy^qmT?J%KZ{=h9u;67!bu4bTXxeSinid@&kxBqbi-<*v4 z5;!9$2!s_}TwE&iCfrsXOG`=OSD5~BO6acx&1v0F-dT3?du*x|UY- z@W_ZATDc_0#ohY4B-_{onSKg7y_x{)3W&vv86q2Nv8ZfGfFPX4pk;vcJDea(Bw1om zka7ea6Rzv%yo_>RSs47a4%zQ($|;oDBlJO%UzQhcXGr*F*A2i`utUylPHt`z;%TH_ zD1jCN=!j{HBcvcWS#ZdH1?a$S(Oo=vcGQj#R$yX?S0r$LFd~Wy3N-VMEUb32qxPD% z^_QHH7Hx}qJa5zsxqaj%iYN_toy?YRiUt7S4+f^UW zi&gv(p1^>TxiPS~0M~C}GErDdlMr0NHWJVzh!v#N-xd3s}^huAx#74s0b&qe5{CA9sh>jl?ugN_6Tm#B9a`|8Pg!K6&Z`2jA}9bq z{Z0^mNIf*fa}%sBXz>?V=may5S7*x+)D&=bcFuNRb<=R2Z6*c>6G=EY@SoYJy<@YZ z6>k%I8L&4Xo>MC;#e;%_jgh_r_!@0_mB38l{cM3)CxfYZ^X5%J?e$w_NNQ3mv`qwe zAB*KhkgpH|CiY3qhN)Y9*i-oJ?th9mZX`p+`K(Skrf)L9kkPyL!r{XUAG zv5dbYdIJB8b|Q)H`m4#POaZ>11bx?<;0kG^QU;=RbQZ4r03&eS2D%c!u| zlaAWcDOex7ux=-3_w!QC?>Q9%(}XPqvF7b*+@?+I3C{>*DN!bZ2xiDod?6NiiAqhk zzZT9FOa^?JjCGL>Xe%w!_(U(qU$t|Bo+aQ@U2uq^u)?G-YvgpuApg(L1_$42|KtB@ zvxp@G$>SBY!|?1z<)A_93NCJ&pEAV8j{fuGD4}_S6sgjNuGS+3o)U~Y#;IN(fIUv2 zdr6#TaCF{jbKP3HnL|ia0I%ZBE)O}oVb|inZ5bbfxD0yguAjci!XarN5FH zS|!~1ownsy<}PCyDMFu+n*V*fAUr^R*Trn;L9*eV**Q2=bITGw@Wi~!bq=(|B+N0@*cFX%P-js}ZWt~kDA8s@G6q$04azcpb#WCU&J&`uX)dn!N_0I7f0SaXcZgnX$aE_WgCF+{&H^mC zZ)YP2>wm_|*A!bRbUGwSZ0wAzg53GZ`-sGZQkF@QlogkWZ9@`oMrttXqo)qS8*4;7 zGNfZRO=zT`XN^LyMwoCTLTv$J3?v`k!Vbl(Aq3U?xO5`_+j<6G%fAlc*RL;#l}a24 zkWUcGGni^DXJfQd60Lj}6bl1FD3KOxEZkmgqd8)T1Gk>N8ltlNv3$7RySHwf>9na! zgeeCXLxkZ3F+I)OH&(|*p#e+nj23HahaZx;J}NJdVBDd~Oh9x8vq7-@ptn$dm_@^> zKZxMbKnmZgjY!0&DV--!cqbcEvAi;07Q#|8;W`0H&Es+A?nxH@eV-oYxu)sL*`C)V z3)S;jMc;dTqEHeVlwYP3mclp2=iPrWGwyHMl2Q)`l9EPB?1Cbn^OU8{APR~$O9bLOuy0vajw;aQw zdGN{}X8*K*!Z_1&8;sI9rO^QUIiV;)^3*N8aCqly@gmHaEDoLhZAUV_Mz;C*py-RZ z6hlC{uh)>{Syt76!xMrXJ6sC>kyE}#@%fQzoi_*5iK5bfFFyD2S;Y8_&6!=qt7+46N{L4}k#ryG_s{gy zAu!OV(1@1bl*tw(ZLzOE&Jf&A%xs)v=mAIIGS&*nkTz@q#)NQ>L1kQ zj|+7DsM|imXLehO@Fxn4vrF$96#U#mII**@(k-;rGw$gu`B^n`;|Pq0?*^$6k-dQE zRIOkWp#8s$HFz+DV%Gr?;T>T;W6I*eT{cYOR7wfqe(`d-CSt$w-JX16s)F?vV?3*} zmsI(0%zQ&8^KbR(mHFT{zqc+sR$c1)aU9TbR)>kta#_~G{xr3=KA&3Zd}ql*eGP<; zkx?SL%%16zA(0wdAam~S?jCek;V-KR`0TD37UvY3pZ}XCppf-}oxP*?FP9ySla@OK zb|n|8_>%jd&pX@8Rh7#U5hvFzmf>%eE`r_U=}{*GiDGxeP{J}#*f){|*WI%2oL?PtVf&8Y9CV?rZL6qq5l#{9V$=hk}0` zIiPzyi0-!Ilhs?7x4SPkMt8S2HfB9d%i9pzn?ienjqMsTDE<{S-vwbEk&uiva*9;tdP_Ess4;kv!+TO zW+K8AIU${^JF2A9%kxvMSU|X_%Iys6EL`Jp zgb(qUDJdy`l4>_s)C#>Wy2+~TdNff&bSbdbvQ^`f>Em-iZoT{;dTSCOWhPtbO2Sj^cDFgFF9PIK>Lb7Dv6QNp zQzhPJT)7kbU2A13L^)L@<2wz=%Y8S3m5fw7f9&t8f{Z-JvbQ|8C1=$Vc`1mVA&A1k zuA72z^f@)f=H|x6S5W!``zVrp`>bg{#pZcHbMCE{5c`{l?0&Ypp@4}uCF@=K^q~)_ zN9GPVm)puz>voTXTaOQ^aQ>aNwvYt5VYe=Z?L`~3)0`Z%O?i>_obl4;U3wjlneh66 z?L54SN0`<)kWr5oDyJ>BKbA#3YUSGIV&jsZ`)z||{p&MLnB4FzAxR1e3rTL+%o`|1<7|FbuFee3?c zMWQCpiUr!kK=CF zxu`QYWr{j*$Rid|Ddur&6u~_mh)cA%e4#x-D^pGI|Zr^ z+Fz%v&git2>9}L@esZ)sZF+gqGl+?kn2j6XAEd-pWeYUfb*I#FY_;EEbcCEKlYNHG zR*^W^{tFljp~`b^ElIUeEq-)!ekn3dKnnnnh?|Y_RACjhy-?M5&oR5sb(50Hlsi=Y z)(E5@cNIDAG`8iEYlb`fC_Abn`nDEL92=wZWFssit#HK4)E^8~9o4c<%G+EXl#XjV zvQV_0Wl+U0e>_sGVz93}svtP3xi>ATRdamL<|6VdElSujA(jJFhr1oi1$rz=Ub;$)m1=v_*joj2(~G8fL+6MI$YZq;<)7!DWOofL*rri@S#N&j zv^)=I{k2WFk-1d7b1NTXGJk7`w$tfes}yocJ4OU##bAe?{P$nVk2DzQO`K9Jl3&{~ z^V6+)nM@%R=jeTT#!7oNVswsDn}r+#`Ae#dSJ_h<;9wc?IenM+-Cm!+mMZnrEs;^p zsE1@m+znhshNqXmiO}_9oRlYNYYm&z-;;ZY7juyxdKGtIr*uXYrSCaKu^1f|Y9$6d zhxX{?cBR0?y;o+`PWSDp3ioZ!Rax5)Tyc7Z&aERkdX?03?Y`uifz$PAaTYiZxiU{r zJ~^3Y_Iz85_qnrHnd>YolRa7aUl4bfWxggjI;$2#*YR2*bZyB88S7gVA37$^PkSZ* zgf0=bF)2S07l{}xE!JcV3crtUF&VHlu1X)-eI@(NwQZiPe|?eMdWwe%ZCY`8-~l~4 z1CITX<&GYgVa(08NwD{npJD7DhT_$lYZe+}+` z6_gLVs=er_JBrO^h)YdYxH9v{%XpSg2JbM@_x0YF|LS)MO$sG0j|Az>`eBh!C&|jQ_e-$;e-AH0o#-VDZK+#PX@i^d-|*; z{?&HeCF3T``tN#q;m5AV{acGk7Lx2*wJR(S#sW!Pve0(i!=$LJg> zZkZ4B&C}%XxN?AjSff6yLvvbZt}#Rmmdw1t-KTCO>7-A))(+^k$T~2xz1%<;rHorF z8*UC1hK_PHP7oWEu7T1(*Nmg<^LNGhz`gv5xDM@O&qhDlfs#_4Q9@1D=M`G%;z=X9 zgX7Cz##@D_eO<;<$;@lqqcTs?^RZ<1lX|x_7XEDF%N?E_(KTZ3&xLphb~V8JOz|99TS?+h zQD0Z_0g)4*FJF}%ApGsVJ+3QjB&~e1I4dTA{^e{MA?SoZ^n| rOBzfP$>+r4H~dw=nzp`2@sE3X 1024 then - size = size / 1024 - unit = "KB" - end - if size > 1024 then - size = size / 1024 - unit = "MB" - end - if size > 1024 then - size = size / 1024 - unit = "GB" - end - if size > 1024 then - size = size / 1024 - unit = "TB" - end - return string.format("%.2f", size).." "..unit -end - --- Missing stuff here - ---[[ - Name : function fsUtils.getFilenamePatternInDirectory(directory, pattern) - Description : Returns a table containing every filename matching a pattern in a directory. - Arg 1 : directory (string) : The directory to search in. - Arg 2 : pattern (string) : The pattern to search for. - Return : A table containing every filename matching the pattern. - - Note : Used to for game detection to work around Steam not updating the libraryfolders.vdf file immediately. -]] -function fsUtils.getFilenamePatternInDirectory(directory: string, pattern: string): {string} - local result = {} - - for _, file in fs.readDir(directory) do - if file:match(pattern) then - table.insert(result, file) - end - end - - return result -end - -return fsUtils \ No newline at end of file diff --git a/general/init.luau b/general/init.luau deleted file mode 100644 index d649aa4..0000000 --- a/general/init.luau +++ /dev/null @@ -1,5 +0,0 @@ ---!strict -return { - logSystem = require("log_system"), - fsUtils = require("fs_utils"), -} \ No newline at end of file diff --git a/init.luau b/init.luau new file mode 100644 index 0000000..b63bbd4 --- /dev/null +++ b/init.luau @@ -0,0 +1,3 @@ +local Application = require("Source") + +return Application.start() \ No newline at end of file diff --git a/main.luau b/main.luau deleted file mode 100644 index cd423bb..0000000 --- a/main.luau +++ /dev/null @@ -1,38 +0,0 @@ ---!strict --- Startup time -local totalStartupTimeVar = os.clock() - --- Lune Modules -local process = require("@lune/process") -local fs = require("@lune/fs") - --- Internal Modules -local metadata = require("metadata") -local logSystem = require("general").logSystem -local fsUtils = require("general").fsUtils - ---[[ - Chapter 0 : Preparing the environment - We need to create the config folder if it doesn't exist. -]] --- Create folders -fsUtils.createOrUseDirectory(metadata.folders.config) -fsUtils.createOrUseDirectory(metadata.folders.gamesConfig) -fsUtils.createOrUseDirectory(metadata.folders.cache) - --- Grab arguments -local arguments = process.args - --- Development version -if metadata.version:find("dev") then - logSystem.log("warning", "DEVELOPMENT VERSION") - -- Put the arguments inside the cache folder for testing purposes - fs.writeFile(metadata.folders.cache.."/arguments.txt", table.concat(arguments, "\n")) -end - ---[[ - Chapter 1 : Game management - What's the Steam config ? Is this being started through Steam or alone ? What to do ?! -]] - -local steamConfig = require("steam").steamConfig diff --git a/metadata/init.luau b/metadata/init.luau deleted file mode 100644 index 1843401..0000000 --- a/metadata/init.luau +++ /dev/null @@ -1,20 +0,0 @@ ---!strict -local process = require("@lune/process") - -local metadata = { - name ="SimpleSteamTinker", - description = "A work-in-progress fast, simple and modern Libadwaita alternative to SteamTinkerLaunch.", - executable="sst", - icon_name = "simplesteamtinker", - version="indev", - developer="JordanViknar", - url = "https://github.com/JordanViknar/SimpleSteamTinker", - folders = { - config = process.env.HOME.."/.config/SimpleSteamTinker", - gamesConfig = process.env.HOME.."/.config/SimpleSteamTinker/games", - storage = process.env.HOME.."/.local/share/SimpleSteamTinker", - cache = process.env.HOME.."/.cache/SimpleSteamTinker" - } -} - -return metadata diff --git a/steam/init.luau b/steam/init.luau deleted file mode 100644 index cfd0c9b..0000000 --- a/steam/init.luau +++ /dev/null @@ -1,4 +0,0 @@ ---!strict -return { - steamConfig = require("steam_config_provider"), -} \ No newline at end of file diff --git a/steam/steam_utils.luau b/steam/steam_utils.luau deleted file mode 100644 index f50c8b0..0000000 --- a/steam/steam_utils.luau +++ /dev/null @@ -1,39 +0,0 @@ ---!strict -local SteamUtils = {} - ---[[ - This function checks if the arguments are from Steam or not. - I suppose this is where non-Steam game support will be added later. -]] -function SteamUtils.isSteamArgs(arguments: {string}): boolean - if ( - --arguments[1] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/reaper" and - arguments[2] == "SteamLaunch" and - arguments[3]:match("AppId=%d+") and - arguments[4] == "--" and - --arguments[5] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/steam-launch-wrapper" and - arguments[6] == "--" - ) then - return true - else - return false - end -end - ---[[ - Name : function steamUtils.convertToSteamID3(steamID) - Description : Converts a SteamID64 to a SteamID3 - Arg 1 : string steamID - Return : string steamID3 -]] -type SteamID64_Dec = number -type SteamID3 = number -function SteamUtils.convertToSteamID3(steamID: SteamID64_Dec): SteamID3 - local offset_id = steamID - 76561197960265728 - local account_type = offset_id % 2 - local account_id = math.floor((offset_id - account_type) / 2) + account_type - -- Check the -1 here in case of SteamID related bug. - return (account_id * 2) - account_type - 1 -end - -return SteamUtils From 5386ed2746a68111af770755ed53878fb36522ca Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Mon, 2 Sep 2024 10:31:44 +0200 Subject: [PATCH 03/20] perf: Improve massively VDF parsing --- Source/Steam/Configuration.luau | 133 +++++----------- Source/Steam/VDFParser.luau | 260 ++++++++++++++++--------------- Source/Steam/init.luau | 2 +- Source/Utilities/Filesystem.luau | 2 +- Source/Utilities/init.luau | 4 +- Source/init.luau | 13 +- init.luau | 2 +- 7 files changed, 183 insertions(+), 233 deletions(-) diff --git a/Source/Steam/Configuration.luau b/Source/Steam/Configuration.luau index f91b0d8..678edfb 100644 --- a/Source/Steam/Configuration.luau +++ b/Source/Steam/Configuration.luau @@ -1,20 +1,14 @@ local process = require("@lune/process") local Logging = require("../Utilities").Logging -local SteamUtilities = require("Utilities") -local VDFParser = require("VDFParser") +local SteamUtilities = require("./Utilities") +local VDFParser = require("./VDFParser") type loginusers_vdf = { users : { [number] : { AccountName : string, - --PersonaName : string, - --RememberPassword : boolean, - --WantsOfflineMode : boolean, - --SkipOfflineModeWarning : boolean, - --AllowAutoLogin : boolean, - MostRecent : boolean, - --TimeStamp : number, + MostRecent : number, SteamID3 : number -- Added manually later on } } @@ -26,22 +20,8 @@ type localconfig_vdf = { Steam : { apps : { [number] : { - --[[cloud : { - last_sync_state : string?, - quota_bytes : number?, - quota_files : number?, - used_bytes : number?, - used_files : number?, - }?, - LastPlayed : number?, - Playtime : (number | boolean)?, - BadgeData : string?,]]-- - LaunchOptions : string?, - --[[Playtime2wks : boolean?, - autocloud : { - lastexit : number, - lastlaunch : number, - }?]] + -- Note : More options are available, but unused by STweaker + LaunchOptions : string? } } } @@ -78,22 +58,15 @@ function Configuration.Public.getSteamConfiguration() : string? And also the SteamID3 to access their settings folder. ]] local userConfiguration = Configuration.Private.getUsersConfiguration() - if typeof(userConfiguration) == "string" then - return userConfiguration -- Error - end local activeUserID = Configuration.Private.getMostRecentUserID(userConfiguration) local userParameters = userConfiguration.users[activeUserID] --[[ Chapter 2 : We recover the user config to get which games have the tool enabled. - This section would normally have quite an impact on performance. - Thanks to some optimizations, however, the time is cut from 0.5 seconds to 0.04 seconds on my computer. ]] local localconfig_vdf = Configuration.Private.getLocalConfigVDF(userParameters.SteamID3) - if typeof(localconfig_vdf) == "string" then - return localconfig_vdf -- Error - end + local userGameConfigurations = localconfig_vdf.UserLocalConfigStore.Software.Valve.Steam.apps --[[ @@ -101,39 +74,47 @@ function Configuration.Public.getSteamConfiguration() : string? We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. ]] local libraries = Configuration.Private.getLibraries() - if typeof(libraries) == "string" then - return libraries -- Error - end + + print(userParameters, userGameConfigurations, libraries) return end -- Private --- loginuser.vdf - -function Configuration.Private.getUsersConfiguration() : loginusers_vdf | string - Logging.write("data", "Detecting user config...") +function Configuration.Private.VDFHandler(filePath: string, errorMessage: string): any + Logging.write("data", "Parsing VDF file : " .. filePath) local timeStart = os.clock() - local result, usersData: loginusers_vdf = pcall(VDFParser.parseFile, (process.env.HOME.."/.local/share/Steam/config/loginusers.vdf")) + local result, parsedData = pcall(VDFParser.parseFile, filePath) if not result then - return "Failed to parse loginusers.vdf." + error(errorMessage) else Logging.write("speed", timeStart) + return parsedData + end +end - for userID,userParameters in pairs(usersData.users) do - userParameters.SteamID3 = SteamUtilities.convertToSteamID3(userID) - end - return usersData +-- loginuser.vdf + +function Configuration.Private.getUsersConfiguration() : loginusers_vdf + local usersData: loginusers_vdf = Configuration.Private.VDFHandler ( + process.env.HOME.."/.local/share/Steam/config/loginusers.vdf", + "Failed to parse loginusers.vdf file." + ) + + for userID, userParameters in pairs(usersData.users) do + userParameters.SteamID3 = SteamUtilities.convertToSteamID3(userID) end + + return usersData end function Configuration.Private.getMostRecentUserID(userData : loginusers_vdf) : number local activeUserID for id,data in pairs(userData.users) do - if data.MostRecent == true then + if data.MostRecent == 1 then activeUserID = id end end @@ -142,58 +123,20 @@ end -- localconfig.vdf -function Configuration.Private.getLocalConfigVDF(SteamID3 : number) : localconfig_vdf | string - Logging.write("data", "Detecting active user game configs...") - local timeStart = os.clock() - - local appParseSettings = { - file = process.env.HOME.."/.local/share/Steam/userdata/"..SteamID3.."/config/localconfig.vdf", - stopKeyList = { - "UserLocalConfigStore", - "Software", - "Valve", - "Steam", - "apps" - }, - wordsFromLinesToRemove = { - "CachedCommunityPreferences", - "UIStoreLocalState", - "CachedStorePreferences", - "CachedNotificationPreferences", - "SteamVoiceSettings_", - "UIStoreLocalSteamUIState", - "UIStoreLocalGamepadState", - "GetEquippedProfileItemsForUser", - "CTextFilterStore_strBannedPattern", - "CTextFilterStore_strCleanPattern", - "trendingstore_storage", - "playnextstore_storage", - "GetEquippedProfileItemsForUser" - } - } - - local result, localconfig_vdf: localconfig_vdf = pcall(VDFParser.parseFile, appParseSettings.file, appParseSettings.stopKeyList, appParseSettings.wordsFromLinesToRemove) - if not result then - return "Failed to parse active user localconfig.vdf with SteamID3 : "..SteamID3 - else - Logging.write("speed", timeStart) - return localconfig_vdf - end +function Configuration.Private.getLocalConfigVDF(SteamID3: number): localconfig_vdf + return Configuration.Private.VDFHandler ( + process.env.HOME.."/.local/share/Steam/userdata/"..SteamID3.."/config/localconfig.vdf", + "Failed to parse active user localconfig.vdf file with SteamID3: " .. SteamID3 + ) end -- libraryfolders.vdf -function Configuration.Private.getLibraries() : libraryfolders_vdf | string - Logging.write("data", "Detecting games...") - local timeStart = os.clock() - - local result, libraryFolders: libraryfolders_vdf = pcall(VDFParser.parseFile, process.env.HOME.."/.local/share/Steam/config/libraryfolders.vdf") - if not result then - return "Failed to parse libraryfolders.vdf." - else - Logging.write("speed", timeStart) - return libraryFolders - end +function Configuration.Private.getLibraries(): libraryfolders_vdf + return Configuration.Private.VDFHandler ( + process.env.HOME.."/.local/share/Steam/config/libraryfolders.vdf", + "Failed to parse libraryfolders.vdf file." + ) end return Configuration.Public diff --git a/Source/Steam/VDFParser.luau b/Source/Steam/VDFParser.luau index bc57d3b..fa17416 100644 --- a/Source/Steam/VDFParser.luau +++ b/Source/Steam/VDFParser.luau @@ -1,5 +1,3 @@ ---!nocheck ---Note : Temporary local fs = require("@lune/fs") local VDFParser = {} @@ -20,8 +18,8 @@ VDFParser.Public = {} @param wordsFromLinesToRemove {string}? -- A list of words that, if found in a line, will remove the line. Used for (bad) optimization. @return The parsed table if successful. ]=] -function VDFParser.Public.parseFile(path: string, stopKeyList: {string}?, wordsFromLinesToRemove: {string}?): table - return VDFParser.Public.parseString(fs.readFile(path), stopKeyList, wordsFromLinesToRemove) +function VDFParser.Public.parseFile(path: string) + return VDFParser.Public.parseString(fs.readFile(path)) end --[=[ @@ -32,150 +30,158 @@ end @param wordsFromLinesToRemove {string}? -- A list of words that, if found in a line, will remove the line. Used for (bad) optimization. @return The parsed table if successful. ]=] -function VDFParser.Public.parseString(input: string, stopKeyList: {string}?, wordsFromLinesToRemove: {string}?): table - -- Remove every line that contains a word from wordsFromLinesToRemove - if wordsFromLinesToRemove then - local lines = {} - for line in input:gmatch("[^\r\n]+") do - local removeLine = false - for _, word in pairs(wordsFromLinesToRemove) do - if line:find(word) then - removeLine = true - break - end - end - if not removeLine then - table.insert(lines, line) - end - end - input = table.concat(lines, "\n") - end - - return VDFParser.Private.parse(input, stopKeyList) +function VDFParser.Public.parseString(input: string) + return VDFParser.Private.sanitize(VDFParser.Private.parse(input)) end -- Private +type VDFTable = { [string]: VDFValue } +type VDFValue = string | VDFTable --[=[ Parses a VDF string into a table. Private side of the parser. - @param input string -- The VDF string to parse. - @param stopKeyList {string}? -- Limits the parsing to the given key path. + Note : I was a complete idiot for not using a stack to do this FAST. Feel free to laugh at me. + + @param input The VDF string to parse. @return The parsed table if successful. ]=] -function VDFParser.Private.parse(input: string, stopKeyList: {string}?): table - local result = {} - - type ReadStatus = "keyWait" | "readingKey" | "valueWait" | "readingTableValue" | "readingValue" - local status: ReadStatus = "keyWait" - - -- Temp Values - local tempKey, tempValue, tempRecursiveInput = "", "", "" - - local indent = 0 - local previousChar = nil - - -- Until we reached the end of the file - for i = 1, #input do - local char = input:sub(i, i) - - -- String key/value management - if char == '"' and previousChar ~= "\\" then - if status == "keyWait" then - -- We reached the key and start reading it. - status = "readingKey" - elseif status == "readingKey" then - -- We finished reading the key and are now waiting for the value. - status = "valueWait" - elseif status == "valueWait" then - -- We begin reading the value. - status = "readingValue" - elseif status == "readingValue" then - -- We finished reading the value. - - -- Convert value into extra, more practical types - local actualValue: any - if tempValue == "0" then actualValue = false - elseif tempValue == "1" then actualValue = true - elseif tonumber(tempValue) then actualValue = tonumber(tempValue) - else actualValue = tempValue end - - -- Same for key - local actualKey: any - if tonumber(tempKey) then actualKey = tonumber(tempKey) - else actualKey = tempKey end - - result[actualKey] = actualValue - - -- We stop the parsing if we reached the stopKeyList entry - if stopKeyList and tempKey == stopKeyList[1] then - return result - end +function VDFParser.Private.parse(input: string): VDFTable + -- Trim function to remove whitespace + local function trim(s: string): string? + return s:match("^%s*(.-)%s*$") + end - tempKey = "" - tempValue = "" - status = "keyWait" - elseif status == "readingTableValue" then - -- We are currently reading a table. Not stopping until we reached its end. - tempRecursiveInput = tempRecursiveInput..char + -- Handle escape sequences + local function parseString(input: string, pos: number): (string, number) + local result = "" + local len = #input + while pos <= len do + local char = input:sub(pos, pos) + if char == "\\" then + pos = pos + 1 + if pos <= len then + local nextChar = input:sub(pos, pos) + if nextChar == "\"" then + result = result .. "\"" + elseif nextChar == "\\" then + result = result .. "\\" + elseif nextChar == "n" then + result = result .. "\n" + elseif nextChar == "t" then + result = result .. "\t" + else + result = result .. "\\" .. nextChar + end + end + elseif char == "\"" then + break + else + result = result .. char end + pos = pos + 1 + end + return result, pos + end - -- Subtable management - - -- We reach the beginning of a table. - elseif char == '{' and previousChar ~= "\\" and (status == "valueWait" or status == "readingTableValue") then - if status == "valueWait" then - status = "readingTableValue" - elseif status == "readingTableValue" then - tempRecursiveInput = tempRecursiveInput..char - indent = indent + 1 + -- Parsing logic + local pos = 1 + local len = #input + local stack: {VDFValue} = {} + local currentTable: VDFTable = {} + local currentKey: string? = nil + + while pos <= len do + local char = input:sub(pos, pos) + + if char == '"' then + -- Extract the key or value with escape sequence handling + pos = pos + 1 + local parsedString + parsedString, pos = parseString(input, pos) + parsedString = trim(parsedString) or parsedString + pos = pos + 1 -- Skip the closing quote + + if currentKey == nil then + -- It's a key + currentKey = parsedString + else + -- It's a value + currentTable[currentKey] = parsedString + currentKey = nil end - -- We reach the end of a table. - elseif char == '}' and previousChar ~= "\\" and (status == "readingTableValue") then - if indent == 0 then - local newStopKeyList = nil - if stopKeyList then - newStopKeyList = {table.unpack(stopKeyList, 2)} - if next(newStopKeyList) == nil then - newStopKeyList = nil - end - end + elseif char == '{' then + -- Start a new table + local newTable: VDFTable = {} + if currentKey ~= nil then + currentTable[currentKey] = newTable + currentKey = nil + else + error("Malformed VDF: encountered '{' without a preceding key") + end + table.insert(stack, currentTable) + currentTable = newTable - if stopKeyList == nil or stopKeyList[1] == nil or tempKey == stopKeyList[1] then - local actualKey: any - if tonumber(tempKey) then actualKey = tonumber(tempKey) - else actualKey = tempKey end - result[actualKey] = VDFParser.Private.parse(tempRecursiveInput, newStopKeyList) - end + elseif char == '}' then + -- End the current table + if #stack == 0 then + error("Malformed VDF: encountered '}' without a matching '{'") + end - if stopKeyList and tempKey == stopKeyList[1] then - return result - end + local data = table.remove(stack) + if not data or typeof(data) == "string" then + error("Malformed VDF") + end + currentTable = data - tempKey = "" - tempValue = "" - tempRecursiveInput = "" - status = "keyWait" - else - tempRecursiveInput = tempRecursiveInput..char - indent = indent - 1 + elseif char == '\n' or char == '\t' or char == ' ' then + -- Skip whitespace + else + error("Malformed VDF: unexpected character '" .. char .. "'") + end + + pos = pos + 1 + end + + if #stack > 0 then + error("Malformed VDF: unclosed '{'") + end + + return currentTable +end + +--[=[ + Sanitizes a VDF table by converting string values to their proper types. + + @param input The VDF table to sanitize. + @return The sanitized table. +]=] +function VDFParser.Private.sanitize(input: VDFTable) + local function convert(value: any): any + if type(value) == "string" then + -- Check for number values (integers or floats) + local numberValue = tonumber(value) + if numberValue ~= nil then + return numberValue end - -- While reading a key - elseif status == "readingKey" then - tempKey = tempKey..char - - -- While reading a value - elseif status == "readingValue" and (stopKeyList == nil or stopKeyList[1] == nil or tempKey == stopKeyList[1]) then - tempValue = tempValue..char - - -- While reading a table value, before sending it through the function again to parse it - elseif status == "readingTableValue" and (stopKeyList == nil or stopKeyList[1] == nil or tempKey == stopKeyList[1]) then - tempRecursiveInput = tempRecursiveInput..char + -- If it's neither, return the original string + return value + elseif type(value) == "table" then + -- Recursively sanitize nested tables + return VDFParser.Private.sanitize(value) + else + -- Return the value as-is for unsupported types (shouldn't happen in a VDF) + return value end + end + + local result: {any: any} = {} - previousChar = char + for key, value in pairs(input) do + -- Convert both the key and the value + result[convert(key)] = convert(value) end return result diff --git a/Source/Steam/init.luau b/Source/Steam/init.luau index dbe4676..57d2a81 100644 --- a/Source/Steam/init.luau +++ b/Source/Steam/init.luau @@ -1,3 +1,3 @@ return { - Configuration = require("Configuration") + Configuration = require("./Configuration") } \ No newline at end of file diff --git a/Source/Utilities/Filesystem.luau b/Source/Utilities/Filesystem.luau index 3de9ef7..03ade83 100644 --- a/Source/Utilities/Filesystem.luau +++ b/Source/Utilities/Filesystem.luau @@ -1,5 +1,5 @@ local fs = require("@lune/fs") -local Logging = require("Logging") +local Logging = require("./Logging") --[=[ Utilities for filesystem operations. Mostly a remnant from SimpleSteamTinker. diff --git a/Source/Utilities/init.luau b/Source/Utilities/init.luau index 66ed92c..cff6506 100644 --- a/Source/Utilities/init.luau +++ b/Source/Utilities/init.luau @@ -1,4 +1,4 @@ return { - Logging = require("Logging"), - Filesystem = require("Filesystem"), + Logging = require("./Logging"), + Filesystem = require("./Filesystem"), } \ No newline at end of file diff --git a/Source/init.luau b/Source/init.luau index e1ecc1f..dbf5471 100644 --- a/Source/init.luau +++ b/Source/init.luau @@ -3,10 +3,10 @@ local Application = {} local process = require("@lune/process") local fs = require("@lune/fs") -local metadata = require("Metadata") -local Filesystem = require("Utilities").Filesystem -local Logging = require("Utilities").Logging -local Steam = require("Steam") +local metadata = require("./Metadata") +local Filesystem = require("./Utilities").Filesystem +local Logging = require("./Utilities").Logging +local Steam = require("./Steam") function Application.start() -- Startup time @@ -17,7 +17,7 @@ function Application.start() We need to create the config folder if it doesn't exist. ]] - -- Create folders + -- Prepare folders if necessary for _, folder in ipairs({metadata.folders.config, metadata.folders.gamesConfig, metadata.folders.cache}) do Filesystem.createOrUseDirectory(folder) end @@ -34,7 +34,8 @@ function Application.start() What's the Steam config ? Is this being started through Steam or alone ? What to do ?! ]] - local steamConfig = require("Steam").Configuration.getSteamConfiguration() + local steamConfig = Steam.Configuration.getSteamConfiguration() + Logging.write("speed", totalStartupTimeVar) end return Application diff --git a/init.luau b/init.luau index b63bbd4..ab32c1e 100644 --- a/init.luau +++ b/init.luau @@ -1,3 +1,3 @@ -local Application = require("Source") +local Application = require("./Source") return Application.start() \ No newline at end of file From b6520dd33ca5b487df80633490cd0e287c0a5073 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:43:54 +0200 Subject: [PATCH 04/20] feat: Add DarkLua & Lune bundling --- .darklua.json5 | 16 ++++++++++++++++ Makefile | 29 +++++++++++++++++++++++++++++ Source/Utilities/Filesystem.luau | 4 ++-- Source/init.luau | 1 - init.luau | 4 +--- 5 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 .darklua.json5 create mode 100644 Makefile diff --git a/.darklua.json5 b/.darklua.json5 new file mode 100644 index 0000000..20ba341 --- /dev/null +++ b/.darklua.json5 @@ -0,0 +1,16 @@ +{ + "generator": { "name": "dense", "column_span": 150}, + "bundle": { + "require_mode": "path", + "excludes": ["@lune/**"] + }, + "rules": [ + "remove_comments", + "remove_spaces", + "remove_nil_declaration", + "compute_expression", + "remove_unused_if_branch", + "filter_after_early_return", + "remove_empty_do" + ] +} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4c5a0e6 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +# Metadata +PROJECT_NAME=stweaks +INSTALL_FOLDER_NAME=STWeaks +VERSION=indev + +ifeq ($(PREFIX),) + PREFIX := /usr +endif +BUILD_FOLDER := dist/ + +.PHONY: system install uninstall clean local + +# -------------- Packaging -------------- +$(BUILD_FOLDER)stweaks.luau: + @echo "Using DarkLua to bundle Luau code..." + darklua process init.luau $(BUILD_FOLDER)stweaks.luau -v + +build: $(BUILD_FOLDER)stweaks.luau + @echo "Compiling project..." + lune build $(BUILD_FOLDER)stweaks.luau + +run: + @echo "Running project..." + lune run init + +# -------------- Cleaning -------------- +clean: + @echo "Cleaning up..." + rm -rf $(BUILD_FOLDER) diff --git a/Source/Utilities/Filesystem.luau b/Source/Utilities/Filesystem.luau index 03ade83..65de798 100644 --- a/Source/Utilities/Filesystem.luau +++ b/Source/Utilities/Filesystem.luau @@ -25,8 +25,8 @@ end @param path The path to get the size of. ]=] -function Filesystem.getSize(path: string): () - --TODO +function Filesystem.getSize(path: string): number + return 0 -- Unimplemented end --[=[ diff --git a/Source/init.luau b/Source/init.luau index dbf5471..fc449ed 100644 --- a/Source/init.luau +++ b/Source/init.luau @@ -33,7 +33,6 @@ function Application.start() Chapter 1 : Game management What's the Steam config ? Is this being started through Steam or alone ? What to do ?! ]] - local steamConfig = Steam.Configuration.getSteamConfiguration() Logging.write("speed", totalStartupTimeVar) end diff --git a/init.luau b/init.luau index ab32c1e..41fe616 100644 --- a/init.luau +++ b/init.luau @@ -1,3 +1 @@ -local Application = require("./Source") - -return Application.start() \ No newline at end of file +return require("./Source").start() From d46d15d0a0e85a4ad8352ea9732251ff3c9cd209 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Mon, 2 Sep 2024 12:54:32 +0200 Subject: [PATCH 05/20] feat: Implement size detection through du --- Makefile | 2 +- Source/Steam/Configuration.luau | 4 +--- Source/Steam/VDFParser.luau | 2 -- Source/Utilities/Filesystem.luau | 29 ++++++++++++++++++++++++----- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 4c5a0e6..6be732f 100644 --- a/Makefile +++ b/Makefile @@ -26,4 +26,4 @@ run: # -------------- Cleaning -------------- clean: @echo "Cleaning up..." - rm -rf $(BUILD_FOLDER) + rm -rf "$(BUILD_FOLDER)*" diff --git a/Source/Steam/Configuration.luau b/Source/Steam/Configuration.luau index 678edfb..07bad54 100644 --- a/Source/Steam/Configuration.luau +++ b/Source/Steam/Configuration.luau @@ -3,6 +3,7 @@ local process = require("@lune/process") local Logging = require("../Utilities").Logging local SteamUtilities = require("./Utilities") local VDFParser = require("./VDFParser") +local Filesystem = require("../Utilities/Filesystem") type loginusers_vdf = { users : { @@ -66,7 +67,6 @@ function Configuration.Public.getSteamConfiguration() : string? Chapter 2 : We recover the user config to get which games have the tool enabled. ]] local localconfig_vdf = Configuration.Private.getLocalConfigVDF(userParameters.SteamID3) - local userGameConfigurations = localconfig_vdf.UserLocalConfigStore.Software.Valve.Steam.apps --[[ @@ -75,8 +75,6 @@ function Configuration.Public.getSteamConfiguration() : string? ]] local libraries = Configuration.Private.getLibraries() - print(userParameters, userGameConfigurations, libraries) - return end diff --git a/Source/Steam/VDFParser.luau b/Source/Steam/VDFParser.luau index fa17416..84b5961 100644 --- a/Source/Steam/VDFParser.luau +++ b/Source/Steam/VDFParser.luau @@ -41,8 +41,6 @@ type VDFValue = string | VDFTable --[=[ Parses a VDF string into a table. Private side of the parser. - Note : I was a complete idiot for not using a stack to do this FAST. Feel free to laugh at me. - @param input The VDF string to parse. @return The parsed table if successful. ]=] diff --git a/Source/Utilities/Filesystem.luau b/Source/Utilities/Filesystem.luau index 65de798..4c56d3b 100644 --- a/Source/Utilities/Filesystem.luau +++ b/Source/Utilities/Filesystem.luau @@ -1,4 +1,6 @@ local fs = require("@lune/fs") +local process = require("@lune/process") + local Logging = require("./Logging") --[=[ @@ -21,14 +23,29 @@ function Filesystem.createOrUseDirectory(path: string): string end --[=[ - Gets the size of a file or directory. Unimplemented. + Gets the size of a file or directory. + If Lune gets a function for size, it'll become used here in the future. @param path The path to get the size of. ]=] function Filesystem.getSize(path: string): number - return 0 -- Unimplemented + path = path:gsub("'", "'\\''") + + local handle = process.spawn("du",{"-sb",path}) + + if not handle.ok then + error("Failed to get size of path "..path..": "..handle.stderr) + end + + local result = tonumber(handle.stdout:match("^(%d+)")) -- Grab only the number + if not result then + error("Failed to parse size for output ("..handle.stdout..")") + else + return result + end end + --[=[ Converts a size in bytes to a human-readable size. @@ -37,12 +54,14 @@ end ]=] function Filesystem.sizeToUnit(size: number): string local units = {"B", "KB", "MB", "GB", "TB"} + local unit = units[1] -- Default to "B" (bytes) - local unit - for i = 1, 5 do - if size > 1024 then + for i = 2, #units do + if size >= 1024 then size = size / 1024 unit = units[i] + else + break end end From 6b79bcc46f44783dd5a1560b5a217cfb6dbb8bfb Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:26:25 +0200 Subject: [PATCH 06/20] feat: Steam app detection's grand return --- Makefile | 2 +- Source/Classes/SteamApp.luau | 23 +++++ Source/Classes/init.luau | 4 + Source/Metadata/init.luau | 1 + Source/Steam/Configuration.luau | 154 ++++++++++++++++++++++++++----- Source/Steam/Utilities.luau | 1 + Source/Steam/VDFParser.luau | 6 ++ Source/Steam/init.luau | 1 + Source/Utilities/Async.luau | 30 ++++++ Source/Utilities/Filesystem.luau | 1 + Source/Utilities/Logging.luau | 29 ++++-- Source/Utilities/init.luau | 2 + Source/init.luau | 1 + init.luau | 1 + 14 files changed, 227 insertions(+), 29 deletions(-) create mode 100644 Source/Classes/SteamApp.luau create mode 100644 Source/Classes/init.luau create mode 100644 Source/Utilities/Async.luau diff --git a/Makefile b/Makefile index 6be732f..db509c4 100644 --- a/Makefile +++ b/Makefile @@ -26,4 +26,4 @@ run: # -------------- Cleaning -------------- clean: @echo "Cleaning up..." - rm -rf "$(BUILD_FOLDER)*" + rm -rf "$(BUILD_FOLDER)" diff --git a/Source/Classes/SteamApp.luau b/Source/Classes/SteamApp.luau new file mode 100644 index 0000000..6e013ff --- /dev/null +++ b/Source/Classes/SteamApp.luau @@ -0,0 +1,23 @@ +--!strict +local process = require("@lune/process") +local steamImageLocation = process.env.HOME.."/.local/share/Steam/appcache/librarycache/" + +local SteamApp = {} + +SteamApp.Interface = {} +SteamApp.Prototype = {} + +function SteamApp.Interface.new() + +end + +export type SteamApp = typeof(SteamApp.Prototype) & { + id: number, + name: string, + library: string, + location: string, + size: number?, -- Slow, done in UI (Currently unused) + protonDBData: {any}? -- Slow, done in UI (Currently unused) +} + +return SteamApp.Interface \ No newline at end of file diff --git a/Source/Classes/init.luau b/Source/Classes/init.luau new file mode 100644 index 0000000..cc71c7c --- /dev/null +++ b/Source/Classes/init.luau @@ -0,0 +1,4 @@ +--!strict +return { + SteamApp = require("./SteamApp") +} \ No newline at end of file diff --git a/Source/Metadata/init.luau b/Source/Metadata/init.luau index 265a25f..366ff21 100644 --- a/Source/Metadata/init.luau +++ b/Source/Metadata/init.luau @@ -1,3 +1,4 @@ +--!strict local process = require("@lune/process") return { diff --git a/Source/Steam/Configuration.luau b/Source/Steam/Configuration.luau index 07bad54..f4888b6 100644 --- a/Source/Steam/Configuration.luau +++ b/Source/Steam/Configuration.luau @@ -1,16 +1,30 @@ +--!strict local process = require("@lune/process") +local fs = require("@lune/fs") +local task = require("@lune/task") local Logging = require("../Utilities").Logging +local Async = require("../Utilities").Async local SteamUtilities = require("./Utilities") local VDFParser = require("./VDFParser") local Filesystem = require("../Utilities/Filesystem") +local SteamApp = require("../Classes").SteamApp + +----------------------------- Definitions ----------------------------- + +-- Note : Most of the entries are unused and simply for informative purposes. type loginusers_vdf = { users : { [number] : { AccountName : string, + PersonaName : string, + RememberPassword : number, + WantsOfflineMode : number, + SkipOfflineModeWarning : number, + AllowAutoLogon : number, MostRecent : number, - SteamID3 : number -- Added manually later on + Timestamp : number } } } @@ -21,8 +35,23 @@ type localconfig_vdf = { Steam : { apps : { [number] : { - -- Note : More options are available, but unused by STweaker - LaunchOptions : string? + cloud : { + last_sync_state : ("synchronized" | "changesincloud")?, + quota_bytes : number?, + quota_files : number?, + used_bytes : number?, + used_files : number? + }?, + LastPlayed : number?, + Playtime : number?, + Playtime2wks : number?, + LaunchOptions : string?, -- IMPORTANT ! + autocloud : { + lastlaunch : number, + lastexit : number + }?, + ViewedSteamPlay : number?, + BadgeData : string? } } } @@ -33,19 +62,70 @@ type localconfig_vdf = { type libraryfolders_vdf = { libraryfolders : { [number] : { + path : string, + label : string?, + contentid : number, + totalsize : number, + update_clean_bytes_tally : number, + time_last_update_corruption : number, apps : { [number] : number }, - --contentid : number, - --label : string, - path : string, - --time_last_update_corruption : number | boolean, - --totalsize : boolean, - --update_clean_bytes_tally : number | boolean } } } +type appmanifest_vdf = { + AppState : { + appid : number, + Universe : number, + name : string, + StateFlags : number, + installdir : string, + LastUpdated : number, + LastPlayed : number, + SizeOnDisk : number, + StagingSize : number, + buildid : number, + LastOwner : number, + UpdateResult : number?, + BytesToDownload : number?, + BytesDownloaded : number?, + BytesToStage : number?, + BytesStaged : number?, + TargetBuildID : number?, + AutoUpdateBehavior : number, + AllowOtherDownloadsWhileRunning : number, + ScheduledAutoUpdate : number, + InstalledDepots : { + [number] : { + manifest : number, + size : number + } + }, + InstallScripts : { + [number]: number + }?, + SharedDepots : { + [number] : number + }?, + UserConfig : { + language : string?, + BetaKey : string?, + platform_override_dest : "linux"?, + platform_override_source : ("linux" | "windows")?, + }, + MountedConfig : { + language : string?, + BetaKey : string?, + platform_override_dest : "linux"?, + platform_override_source : ("linux" | "windows")? -- IMPORTANT ! + }, + } +} + +----------------------------- Script ----------------------------- + local Configuration = {} Configuration.Private = {} @@ -58,37 +138,73 @@ function Configuration.Public.getSteamConfiguration() : string? Chapter 1 : We recover the Steam user config so we can get the last active user. And also the SteamID3 to access their settings folder. ]] + Logging.separator() local userConfiguration = Configuration.Private.getUsersConfiguration() - - local activeUserID = Configuration.Private.getMostRecentUserID(userConfiguration) - local userParameters = userConfiguration.users[activeUserID] + local activeUserSteamID3 = SteamUtilities.convertToSteamID3(Configuration.Private.getMostRecentUserID(userConfiguration)) + Logging.write("info", "Active user SteamID3 : " .. activeUserSteamID3) + Logging.separator() --[[ Chapter 2 : We recover the user config to get which games have the tool enabled. + + Note : Error handling should be added for the scenario where the configuration can't be loaded. ]] - local localconfig_vdf = Configuration.Private.getLocalConfigVDF(userParameters.SteamID3) + local localconfig_vdf = Configuration.Private.getLocalConfigVDF(activeUserSteamID3) local userGameConfigurations = localconfig_vdf.UserLocalConfigStore.Software.Valve.Steam.apps + Logging.write("info", "User game configurations loaded.") + Logging.separator() --[[ Chapter 3 : We recover the Steam library config to get the list of games. We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. ]] local libraries = Configuration.Private.getLibraries() + Logging.write("info", "Steam libraries loaded.") + Logging.separator() + + --print(userGameConfigurations, libraries) + + local steamGames = {} + + for _, library in pairs(libraries.libraryfolders) do + -- We check if the folder exists + if not fs.metadata(library.path).exists then + Logging.write("warning", "Steam library "..library.path.." doesn't exist. Skipping...") + else + Logging.write("data", "Checking library "..library.path) + local appManifestFilenames = Filesystem.getFilenamePatternInDirectory(library.path.."/steamapps", "appmanifest_") + + Async.asyncForEach(appManifestFilenames, function (_, appManifestFilename) + local appManifestPath = library.path.."/steamapps/"..appManifestFilename + local appManifest: appmanifest_vdf = Configuration.Private.VDFHandler(appManifestPath, "Failed to parse "..appManifestPath..".", false) + Logging.write("info", "Found "..appManifest.AppState.name) + end) + end + end + + Logging.separator() return end -- Private -function Configuration.Private.VDFHandler(filePath: string, errorMessage: string): any - Logging.write("data", "Parsing VDF file : " .. filePath) - local timeStart = os.clock() +function Configuration.Private.VDFHandler(filePath: string, errorMessage: string, logging: boolean?): any + if logging == nil then logging = true end + + local timeStart + if logging then + timeStart = os.clock() + Logging.write("data", "Parsing VDF file : " .. filePath) + end local result, parsedData = pcall(VDFParser.parseFile, filePath) if not result then error(errorMessage) else - Logging.write("speed", timeStart) + if logging then + Logging.write("speed", timeStart) + end return parsedData end end @@ -102,10 +218,6 @@ function Configuration.Private.getUsersConfiguration() : loginusers_vdf "Failed to parse loginusers.vdf file." ) - for userID, userParameters in pairs(usersData.users) do - userParameters.SteamID3 = SteamUtilities.convertToSteamID3(userID) - end - return usersData end diff --git a/Source/Steam/Utilities.luau b/Source/Steam/Utilities.luau index 1977dde..f5cc66a 100644 --- a/Source/Steam/Utilities.luau +++ b/Source/Steam/Utilities.luau @@ -1,3 +1,4 @@ +--!strict local process = require("@lune/process") --[=[ diff --git a/Source/Steam/VDFParser.luau b/Source/Steam/VDFParser.luau index 84b5961..6b3bc2d 100644 --- a/Source/Steam/VDFParser.luau +++ b/Source/Steam/VDFParser.luau @@ -1,3 +1,4 @@ +--!strict local fs = require("@lune/fs") local VDFParser = {} @@ -164,6 +165,11 @@ function VDFParser.Private.sanitize(input: VDFTable) return numberValue end + -- Check for empty strings + if value == "" then + return value + end + -- If it's neither, return the original string return value elseif type(value) == "table" then diff --git a/Source/Steam/init.luau b/Source/Steam/init.luau index 57d2a81..52c4abe 100644 --- a/Source/Steam/init.luau +++ b/Source/Steam/init.luau @@ -1,3 +1,4 @@ +--!strict return { Configuration = require("./Configuration") } \ No newline at end of file diff --git a/Source/Utilities/Async.luau b/Source/Utilities/Async.luau new file mode 100644 index 0000000..ad07421 --- /dev/null +++ b/Source/Utilities/Async.luau @@ -0,0 +1,30 @@ +--!strict +local task = require("@lune/task") + +local Async = {} + +--[=[ + Executes a function asynchronously over all elements in a table. + It's similar to Rust's rayon. + + @param tbl The table to iterate over. + @param asyncFunc The asynchronous function to execute for each element. +]=] +function Async.asyncForEach(tbl: {any}, asyncFunc: (any, any) -> ()) + local total = 0 + local completed = 0 + + for key, item in pairs(tbl) do + total += 1 + task.spawn(function() + asyncFunc(key, item) + completed += 1 + end) + end + + while completed < total do + task.wait() + end +end + +return Async diff --git a/Source/Utilities/Filesystem.luau b/Source/Utilities/Filesystem.luau index 4c56d3b..d0d7b05 100644 --- a/Source/Utilities/Filesystem.luau +++ b/Source/Utilities/Filesystem.luau @@ -1,3 +1,4 @@ +--!strict local fs = require("@lune/fs") local process = require("@lune/process") diff --git a/Source/Utilities/Logging.luau b/Source/Utilities/Logging.luau index 5f5d7a1..3fa7d39 100644 --- a/Source/Utilities/Logging.luau +++ b/Source/Utilities/Logging.luau @@ -1,3 +1,4 @@ +--!strict type LogColor = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "grey" | "orange" | "reset" type LogType = "info" | "warning" | "error" | "debug" | "download" | "data" | "speed" @@ -19,34 +20,39 @@ Logging.Public = {} ]=] function Logging.Public.write(type: LogType, message: string | number) local color = Logging.Private.colorText + local dateTime = Logging.Private.getCurrentDateTime() local logFunctions = { info = function(text) - print("["..color("blue","Info").."] "..text) + print(dateTime.." - ["..color("blue","Info").."] : "..text) end, warning = function(text) - print("["..color("yellow","Warning").."] "..color("yellow",text)) + print(dateTime.." - ["..color("yellow","Warning").."] : "..color("yellow",text)) end, error = function(text) - print(color("red","[Error]").." "..color("red",text)) + print(dateTime.." - "..color("red","[Error] : "..text)) end, debug = function(text) - print("["..color("grey","Debug").."] "..color("grey",text)) + print(dateTime.." - ["..color("grey","Debug").."] : "..color("grey",text)) end, download = function (text) - print("["..color("green","Download").."] "..text) + print(dateTime.." - ["..color("green","Download").."] : "..text) end, data = function (text) - print("["..color("magenta","Data").."] "..text) + print(dateTime.." - ["..color("magenta","Data").."] : "..text) end, speed = function (startTime) - print("["..color("grey","Speed").."] ".."Done in "..os.clock()-startTime.." seconds.") + print(dateTime.." - ["..color("grey","Speed").."] : ".."Done in "..os.clock()-startTime.." seconds.") end } logFunctions[type](message) end +function Logging.Public.separator() + print("---------------------------------------------------------------------------------------------") +end + -- Private --[=[ @@ -72,4 +78,13 @@ function Logging.Private.colorText(colorName: string, text: string): string return colorList[colorName]..text..colorList["reset"] end +--[=[ + Gets the current date and time as a string. + + @return string -- The formatted date-time string. +]=] +function Logging.Private.getCurrentDateTime(): string + return os.date("%Y-%m-%d %H:%M:%S") +end + return Logging.Public diff --git a/Source/Utilities/init.luau b/Source/Utilities/init.luau index cff6506..8a03ec1 100644 --- a/Source/Utilities/init.luau +++ b/Source/Utilities/init.luau @@ -1,4 +1,6 @@ +--!strict return { Logging = require("./Logging"), Filesystem = require("./Filesystem"), + Async = require("./Async") } \ No newline at end of file diff --git a/Source/init.luau b/Source/init.luau index fc449ed..5e50579 100644 --- a/Source/init.luau +++ b/Source/init.luau @@ -1,3 +1,4 @@ +--!strict local Application = {} local process = require("@lune/process") diff --git a/init.luau b/init.luau index 41fe616..c3bad89 100644 --- a/init.luau +++ b/init.luau @@ -1 +1,2 @@ +--!strict return require("./Source").start() From c24e9c14c8968fe25b0b14f9df80181abf841285 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Mon, 2 Sep 2024 20:05:39 +0200 Subject: [PATCH 07/20] fix: Remove accidental leftover --- steam/steam_config_provider.luau | 167 ------------------------------- 1 file changed, 167 deletions(-) delete mode 100644 steam/steam_config_provider.luau diff --git a/steam/steam_config_provider.luau b/steam/steam_config_provider.luau deleted file mode 100644 index 0caa676..0000000 --- a/steam/steam_config_provider.luau +++ /dev/null @@ -1,167 +0,0 @@ ---!strict - --- Modules -local process = require("@lune/process") - -local logSystem = require("../general").logSystem --- local fsUtils = require("../general").fsUtils -local steamUtils = require("steam_utils") -local vdfParser = require("vdf_parser") - --- Definitions -type SteamID64_Dec = number -type SteamID3 = number - -type loginusers_vdf = { - users : { - [SteamID64_Dec] : { - AccountName : string, - --PersonaName : string, - --RememberPassword : boolean, - --WantsOfflineMode : boolean, - --SkipOfflineModeWarning : boolean, - --AllowAutoLogin : boolean, - MostRecent : boolean, - --TimeStamp : number, - SteamID3 : SteamID3 -- Added manually later on - } - } -} -type localconfig_vdf = { - UserLocalConfigStore : { - Software : { - Valve : { - Steam : { - apps : { - [number] : { - --[[cloud : { - last_sync_state : string?, - quota_bytes : number?, - quota_files : number?, - used_bytes : number?, - used_files : number?, - }?, - LastPlayed : number?, - Playtime : (number | boolean)?, - BadgeData : string?,]]-- - LaunchOptions : string?, - --[[Playtime2wks : boolean?, - autocloud : { - lastexit : number, - lastlaunch : number, - }?]] - } - } - } - } - } - } -} -type libraryfolders_vdf = { - libraryfolders : { - [number] : { - apps : { - [number] : number - }, - --contentid : number, - --label : string, - path : string, - --time_last_update_corruption : number | boolean, - --totalsize : boolean, - --update_clean_bytes_tally : number | boolean - } - } -} - --- Timer -local timeStart: number - ---[[ - Chapter 1 : We recover the Steam user config so we can get the last active user. - And also the SteamID3 to access their settings folder. -]] -logSystem.log("data", "Detecting user config...") -timeStart = os.clock() - -local result, userData: loginusers_vdf = pcall(vdfParser.parseFile, (process.env.HOME.."/.local/share/Steam/config/loginusers.vdf")) -if not result then - logSystem.log("error", "Failed to parse loginusers.vdf.") - return nil -end - --- We add the SteamID3 to the user data, and also grab the most recent user's ID while we're at it. -local activeUserID: SteamID64_Dec -for id,data in pairs(userData.users) do - -- SteamID3 - data.SteamID3 = steamUtils.convertToSteamID3(id) - - -- Most recent - if data.MostRecent == true then - activeUserID = id - end -end -logSystem.log("speed", timeStart) - -print(userData) - -logSystem.log("info", "Active user : "..userData.users[activeUserID].AccountName) - ---[[ - Chapter 2 : We recover the user config to get which games have the tool enabled. - This section would normally have quite an impact on performance. - Thanks to some optimizations, however, the time is cut from 0.5 seconds to 0.04 seconds on my computer. -]] -logSystem.log("data", "Detecting active user game configs...") -timeStart = os.clock() - -local appParseSettings = { - file = process.env.HOME.."/.local/share/Steam/userdata/"..userData.users[activeUserID].SteamID3.."/config/localconfig.vdf", - stopKeyList = { - "UserLocalConfigStore", - "Software", - "Valve", - "Steam", - "apps" - }, - wordsFromLinesToRemove = { - "CachedCommunityPreferences", - "UIStoreLocalState", - "CachedStorePreferences", - "CachedNotificationPreferences", - "SteamVoiceSettings_", - "UIStoreLocalSteamUIState", - "UIStoreLocalGamepadState", - "GetEquippedProfileItemsForUser", - "CTextFilterStore_strBannedPattern", - "CTextFilterStore_strCleanPattern", - "trendingstore_storage", - "playnextstore_storage", - "GetEquippedProfileItemsForUser" - } -} - -local result, localconfig_vdf: localconfig_vdf = pcall(vdfParser.parseFile, appParseSettings.file, appParseSettings.stopKeyList, appParseSettings.wordsFromLinesToRemove) -if not result then - logSystem.log("error", "Failed to parse active user localconfig.vdf with SteamID3 : "..userData.users[activeUserID].SteamID3) - return nil -end -logSystem.log("speed", timeStart) - -local userAppSettings = localconfig_vdf.UserLocalConfigStore.Software.Valve.Steam.apps -print(userAppSettings) - ---[[ - Chapter 3 : We recover the Steam library config to get the list of games. - We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. -]] -logSystem.log("data", "Detecting games...") -timeStart = os.clock() - -local result, libraryFolders: libraryfolders_vdf = pcall(vdfParser.parseFile, process.env.HOME.."/.local/share/Steam/config/libraryfolders.vdf") -if not result then - logSystem.log("error", "Failed to parse libraryfolders.vdf.") - return nil -end -logSystem.log("speed", timeStart) - -print(libraryFolders) From 91506faa1edcabdae0a9c89b86967835a442f300 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Tue, 3 Sep 2024 13:18:02 +0200 Subject: [PATCH 08/20] chore: Moonwave comment attempt --- .gitattributes | 2 + .luaurc | 13 +++-- .vscode/settings.json | 3 +- init.luau | 3 +- {Source => src}/Classes/SteamApp.luau | 5 +- {Source => src}/Classes/init.luau | 3 +- {Source => src}/Metadata/init.luau | 9 +++- {Source => src}/Steam/Configuration.luau | 64 +++++++++-------------- {Source => src}/Steam/Utilities.luau | 12 +++-- {Source => src}/Steam/VDFParser.luau | 16 +++--- {Source => src}/Steam/init.luau | 1 - {Source => src}/Utilities/Async.luau | 13 +++-- {Source => src}/Utilities/Filesystem.luau | 20 +++---- {Source => src}/Utilities/Logging.luau | 38 ++++++-------- {Source => src}/Utilities/init.luau | 1 - {Source => src}/init.luau | 4 +- 16 files changed, 100 insertions(+), 107 deletions(-) create mode 100644 .gitattributes rename {Source => src}/Classes/SteamApp.luau (82%) rename {Source => src}/Classes/init.luau (79%) rename {Source => src}/Metadata/init.luau (78%) rename {Source => src}/Steam/Configuration.luau (83%) rename {Source => src}/Steam/Utilities.luau (74%) rename {Source => src}/Steam/VDFParser.luau (88%) rename {Source => src}/Steam/init.luau (84%) rename {Source => src}/Utilities/Async.luau (52%) rename {Source => src}/Utilities/Filesystem.luau (77%) rename {Source => src}/Utilities/Logging.luau (65%) rename {Source => src}/Utilities/init.luau (91%) rename {Source => src}/init.luau (91%) diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..179e626 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# LF normalization +* text=auto diff --git a/.luaurc b/.luaurc index 632b85a..2e18d4f 100644 --- a/.luaurc +++ b/.luaurc @@ -1,8 +1,11 @@ { "languageMode": "strict", - "aliases": { - "Metadata": "./Source/Metadata", - "Steam" : "./Source/Steam", - "Utilities" : "./Source/Utilities" - } + "lint": { + "*": true + }, + "lintErrors": true, + "typeErrors": true, + "globals": [ + "warn" + ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 351a6a5..90e05db 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,6 @@ "luau-lsp.require.mode": "relativeToFile", "luau-lsp.require.directoryAliases": { "@lune/": "~/.lune/.typedefs/0.8.8/" - } +}, + "luau-lsp.sourcemap.enabled": false } \ No newline at end of file diff --git a/init.luau b/init.luau index c3bad89..bae5fd0 100644 --- a/init.luau +++ b/init.luau @@ -1,2 +1 @@ ---!strict -return require("./Source").start() +return require("./src").start() diff --git a/Source/Classes/SteamApp.luau b/src/Classes/SteamApp.luau similarity index 82% rename from Source/Classes/SteamApp.luau rename to src/Classes/SteamApp.luau index 6e013ff..c442add 100644 --- a/Source/Classes/SteamApp.luau +++ b/src/Classes/SteamApp.luau @@ -1,17 +1,16 @@ ---!strict local process = require("@lune/process") local steamImageLocation = process.env.HOME.."/.local/share/Steam/appcache/librarycache/" local SteamApp = {} SteamApp.Interface = {} -SteamApp.Prototype = {} +SteamApp.Object = {} function SteamApp.Interface.new() end -export type SteamApp = typeof(SteamApp.Prototype) & { +export type SteamApp = typeof(SteamApp.Object) & { id: number, name: string, library: string, diff --git a/Source/Classes/init.luau b/src/Classes/init.luau similarity index 79% rename from Source/Classes/init.luau rename to src/Classes/init.luau index cc71c7c..3474157 100644 --- a/Source/Classes/init.luau +++ b/src/Classes/init.luau @@ -1,4 +1,3 @@ ---!strict return { SteamApp = require("./SteamApp") -} \ No newline at end of file +} diff --git a/Source/Metadata/init.luau b/src/Metadata/init.luau similarity index 78% rename from Source/Metadata/init.luau rename to src/Metadata/init.luau index 366ff21..7e3f148 100644 --- a/Source/Metadata/init.luau +++ b/src/Metadata/init.luau @@ -1,7 +1,10 @@ ---!strict local process = require("@lune/process") -return { +--[=[ + @class Metadata + Application constants used throughout the program. +]=] +local Metadata = { name ="STweaks", description = "A work-in-progress fast, simple and modern Libadwaita alternative to SteamTinkerLaunch.", version="indev", @@ -12,3 +15,5 @@ return { cache = process.env.HOME.."/.cache/Stweaks" } } + +return Metadata diff --git a/Source/Steam/Configuration.luau b/src/Steam/Configuration.luau similarity index 83% rename from Source/Steam/Configuration.luau rename to src/Steam/Configuration.luau index f4888b6..879a858 100644 --- a/Source/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -1,4 +1,3 @@ ---!strict local process = require("@lune/process") local fs = require("@lune/fs") local task = require("@lune/task") @@ -10,8 +9,9 @@ local VDFParser = require("./VDFParser") local Filesystem = require("../Utilities/Filesystem") local SteamApp = require("../Classes").SteamApp ------------------------------ Definitions ----------------------------- +-- --------------------------- Definitions ----------------------------- +-- Steam files -- Note : Most of the entries are unused and simply for informative purposes. type loginusers_vdf = { @@ -119,12 +119,16 @@ type appmanifest_vdf = { language : string?, BetaKey : string?, platform_override_dest : "linux"?, - platform_override_source : ("linux" | "windows")? -- IMPORTANT ! + platform_override_source : ("linux" | "windows")? -- IMPORTANT ! (Too bad it seems to never be present in Linux games, and sometimes not in Windows games... :/) }, } } ------------------------------ Script ----------------------------- +-- STweaker + +-- TODO + +-- --------------------------- Script ----------------------------- local Configuration = {} @@ -138,8 +142,10 @@ function Configuration.Public.getSteamConfiguration() : string? Chapter 1 : We recover the Steam user config so we can get the last active user. And also the SteamID3 to access their settings folder. ]] - Logging.separator() - local userConfiguration = Configuration.Private.getUsersConfiguration() + local userConfiguration: loginusers_vdf = Configuration.Private.VDFHandler ( + process.env.HOME.."/.local/share/Steam/config/loginusers.vdf", + "Failed to parse loginusers.vdf file." + ) local activeUserSteamID3 = SteamUtilities.convertToSteamID3(Configuration.Private.getMostRecentUserID(userConfiguration)) Logging.write("info", "Active user SteamID3 : " .. activeUserSteamID3) Logging.separator() @@ -149,7 +155,10 @@ function Configuration.Public.getSteamConfiguration() : string? Note : Error handling should be added for the scenario where the configuration can't be loaded. ]] - local localconfig_vdf = Configuration.Private.getLocalConfigVDF(activeUserSteamID3) + local localconfig_vdf: localconfig_vdf = Configuration.Private.VDFHandler ( + process.env.HOME.."/.local/share/Steam/userdata/"..activeUserSteamID3.."/config/localconfig.vdf", + "Failed to parse active user localconfig.vdf file with SteamID3: " .. activeUserSteamID3 + ) local userGameConfigurations = localconfig_vdf.UserLocalConfigStore.Software.Valve.Steam.apps Logging.write("info", "User game configurations loaded.") Logging.separator() @@ -158,7 +167,10 @@ function Configuration.Public.getSteamConfiguration() : string? Chapter 3 : We recover the Steam library config to get the list of games. We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. ]] - local libraries = Configuration.Private.getLibraries() + local libraries: libraryfolders_vdf = Configuration.Private.VDFHandler ( + process.env.HOME.."/.local/share/Steam/config/libraryfolders.vdf", + "Failed to parse libraryfolders.vdf file." + ) Logging.write("info", "Steam libraries loaded.") Logging.separator() @@ -166,7 +178,7 @@ function Configuration.Public.getSteamConfiguration() : string? local steamGames = {} - for _, library in pairs(libraries.libraryfolders) do + Async.asyncForEach(libraries.libraryfolders, function(_, library) -- We check if the folder exists if not fs.metadata(library.path).exists then Logging.write("warning", "Steam library "..library.path.." doesn't exist. Skipping...") @@ -175,12 +187,13 @@ function Configuration.Public.getSteamConfiguration() : string? local appManifestFilenames = Filesystem.getFilenamePatternInDirectory(library.path.."/steamapps", "appmanifest_") Async.asyncForEach(appManifestFilenames, function (_, appManifestFilename) - local appManifestPath = library.path.."/steamapps/"..appManifestFilename + local appManifestPath: string = library.path.."/steamapps/"..appManifestFilename local appManifest: appmanifest_vdf = Configuration.Private.VDFHandler(appManifestPath, "Failed to parse "..appManifestPath..".", false) - Logging.write("info", "Found "..appManifest.AppState.name) + + Logging.write("info", "Found "..appManifest.AppState.appid.." : "..appManifest.AppState.name) end) end - end + end) Logging.separator() @@ -212,15 +225,6 @@ end -- loginuser.vdf -function Configuration.Private.getUsersConfiguration() : loginusers_vdf - local usersData: loginusers_vdf = Configuration.Private.VDFHandler ( - process.env.HOME.."/.local/share/Steam/config/loginusers.vdf", - "Failed to parse loginusers.vdf file." - ) - - return usersData -end - function Configuration.Private.getMostRecentUserID(userData : loginusers_vdf) : number local activeUserID for id,data in pairs(userData.users) do @@ -231,22 +235,4 @@ function Configuration.Private.getMostRecentUserID(userData : loginusers_vdf) : return activeUserID end --- localconfig.vdf - -function Configuration.Private.getLocalConfigVDF(SteamID3: number): localconfig_vdf - return Configuration.Private.VDFHandler ( - process.env.HOME.."/.local/share/Steam/userdata/"..SteamID3.."/config/localconfig.vdf", - "Failed to parse active user localconfig.vdf file with SteamID3: " .. SteamID3 - ) -end - --- libraryfolders.vdf - -function Configuration.Private.getLibraries(): libraryfolders_vdf - return Configuration.Private.VDFHandler ( - process.env.HOME.."/.local/share/Steam/config/libraryfolders.vdf", - "Failed to parse libraryfolders.vdf file." - ) -end - return Configuration.Public diff --git a/Source/Steam/Utilities.luau b/src/Steam/Utilities.luau similarity index 74% rename from Source/Steam/Utilities.luau rename to src/Steam/Utilities.luau index f5cc66a..56d164c 100644 --- a/Source/Steam/Utilities.luau +++ b/src/Steam/Utilities.luau @@ -1,7 +1,8 @@ ---!strict local process = require("@lune/process") --[=[ + @class Utilities + Minor Steam-related helper functions. ]=] local Utilities = {} @@ -10,7 +11,7 @@ local Utilities = {} Checks if the arguments are from Steam or not. Non-Steam game support later on will probably necessitate changes. - @return If the program was launched from Steam. + @return boolean -- Returns true if the arguments are from Steam, aka Steam launched the application. ]=] function Utilities.isSteamLaunch(): boolean local arguments = process.args @@ -31,9 +32,12 @@ end --[=[ Converts SteamID64 to SteamID3. + + @param steamID64 number -- The SteamID64 to convert. + @return number -- Returns the corresponding SteamID3. ]=] -function Utilities.convertToSteamID3(steamID: number): number - local offset_id = steamID - 76561197960265728 +function Utilities.convertToSteamID3(steamID64: number): number + local offset_id = steamID64 - 76561197960265728 local account_type = offset_id % 2 local account_id = math.floor((offset_id - account_type) / 2) + account_type diff --git a/Source/Steam/VDFParser.luau b/src/Steam/VDFParser.luau similarity index 88% rename from Source/Steam/VDFParser.luau rename to src/Steam/VDFParser.luau index 6b3bc2d..22c803c 100644 --- a/Source/Steam/VDFParser.luau +++ b/src/Steam/VDFParser.luau @@ -1,12 +1,12 @@ ---!strict local fs = require("@lune/fs") -local VDFParser = {} -VDFParser.Private = {} --[=[ Contains functions for parsing VDF files and strings. - Lune does not support VDF files natively at the moment. + Lune does not support VDF files natively. ]=] +local VDFParser = {} + +VDFParser.Private = {} VDFParser.Public = {} -- Public @@ -15,9 +15,7 @@ VDFParser.Public = {} Parses a VDF file into a table. @param path string -- The path to the file. - @param stopKeyList {string}? -- Limits the parsing to the given key path. - @param wordsFromLinesToRemove {string}? -- A list of words that, if found in a line, will remove the line. Used for (bad) optimization. - @return The parsed table if successful. + @return The parsed file if successful. ]=] function VDFParser.Public.parseFile(path: string) return VDFParser.Public.parseString(fs.readFile(path)) @@ -27,8 +25,6 @@ end Parses a VDF string into a table. @param input string -- The VDF string to parse. - @param stopKeyList {string}? -- Limits the parsing to the given key path. - @param wordsFromLinesToRemove {string}? -- A list of words that, if found in a line, will remove the line. Used for (bad) optimization. @return The parsed table if successful. ]=] function VDFParser.Public.parseString(input: string) @@ -167,7 +163,7 @@ function VDFParser.Private.sanitize(input: VDFTable) -- Check for empty strings if value == "" then - return value + return nil end -- If it's neither, return the original string diff --git a/Source/Steam/init.luau b/src/Steam/init.luau similarity index 84% rename from Source/Steam/init.luau rename to src/Steam/init.luau index 52c4abe..57d2a81 100644 --- a/Source/Steam/init.luau +++ b/src/Steam/init.luau @@ -1,4 +1,3 @@ ---!strict return { Configuration = require("./Configuration") } \ No newline at end of file diff --git a/Source/Utilities/Async.luau b/src/Utilities/Async.luau similarity index 52% rename from Source/Utilities/Async.luau rename to src/Utilities/Async.luau index ad07421..2c420b1 100644 --- a/Source/Utilities/Async.luau +++ b/src/Utilities/Async.luau @@ -1,23 +1,26 @@ ---!strict local task = require("@lune/task") +--[=[ + @class Utilities.Async +]=] local Async = {} --[=[ - Executes a function asynchronously over all elements in a table. + Executes a function in parallel over all elements in a table. It's similar to Rust's rayon. + Pretty big upgrade compared to the previous implementation. @param tbl The table to iterate over. - @param asyncFunc The asynchronous function to execute for each element. + @param func The function to execute in parallel for each element. ]=] -function Async.asyncForEach(tbl: {any}, asyncFunc: (any, any) -> ()) +function Async.asyncForEach(tbl: {any}, func: (any, any) -> ()) local total = 0 local completed = 0 for key, item in pairs(tbl) do total += 1 task.spawn(function() - asyncFunc(key, item) + func(key, item) completed += 1 end) end diff --git a/Source/Utilities/Filesystem.luau b/src/Utilities/Filesystem.luau similarity index 77% rename from Source/Utilities/Filesystem.luau rename to src/Utilities/Filesystem.luau index d0d7b05..f912203 100644 --- a/Source/Utilities/Filesystem.luau +++ b/src/Utilities/Filesystem.luau @@ -1,10 +1,11 @@ ---!strict local fs = require("@lune/fs") local process = require("@lune/process") local Logging = require("./Logging") --[=[ + @class Utilities.Filesystem + Utilities for filesystem operations. Mostly a remnant from SimpleSteamTinker. ]=] local Filesystem = {} @@ -12,8 +13,8 @@ local Filesystem = {} --[=[ Creates a directory if it doesn't exist, or uses it if it does. - @param path The path to create or use. - @return The path to the created or used directory. + @param path string -- The path to create or use. + @return string -- The path to the created or used directory. ]=] function Filesystem.createOrUseDirectory(path: string): string if not fs.isDir(path) then @@ -27,7 +28,8 @@ end Gets the size of a file or directory. If Lune gets a function for size, it'll become used here in the future. - @param path The path to get the size of. + @param path string -- The path to get the size of. + @return number -- The size of the file or directory. ]=] function Filesystem.getSize(path: string): number path = path:gsub("'", "'\\''") @@ -50,8 +52,8 @@ end --[=[ Converts a size in bytes to a human-readable size. - @param size The size to convert. - @return The human-readable size. + @param size number -- The size to convert. + @return string -- The human-readable size. ]=] function Filesystem.sizeToUnit(size: number): string local units = {"B", "KB", "MB", "GB", "TB"} @@ -72,9 +74,9 @@ end --[=[ Returns a table containing every filename matching a pattern in a directory. - @param directory The directory to search in. - @param pattern The pattern to search for. - @return A table containing every filename matching the pattern. + @param directory string -- The directory to search in. + @param pattern string -- The pattern to search for. + @return {string} -- A table containing every filename matching the pattern. ]=] function Filesystem.getFilenamePatternInDirectory(directory: string, pattern: string): {string} local result = {} diff --git a/Source/Utilities/Logging.luau b/src/Utilities/Logging.luau similarity index 65% rename from Source/Utilities/Logging.luau rename to src/Utilities/Logging.luau index 3fa7d39..e095123 100644 --- a/Source/Utilities/Logging.luau +++ b/src/Utilities/Logging.luau @@ -1,12 +1,13 @@ ---!strict type LogColor = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "grey" | "orange" | "reset" -type LogType = "info" | "warning" | "error" | "debug" | "download" | "data" | "speed" +type LogType = "info" | "warning" | "error" | "debug" | "download" | "data" | "speed" | "special" -local Logging = {} -Logging.Private = {} --[=[ + @class Utilities.Logging + Contains functions for logging to the console. ]=] +local Logging = {} +Logging.Private = {} Logging.Public = {} -- Public @@ -20,29 +21,33 @@ Logging.Public = {} ]=] function Logging.Public.write(type: LogType, message: string | number) local color = Logging.Private.colorText - local dateTime = Logging.Private.getCurrentDateTime() + local time = os.date("%H:%M:%S") local logFunctions = { info = function(text) - print(dateTime.." - ["..color("blue","Info").."] : "..text) + print(time.." - ["..color("blue","Info").."] : "..text) end, warning = function(text) - print(dateTime.." - ["..color("yellow","Warning").."] : "..color("yellow",text)) + print(time.." - ["..color("yellow","Warning").."] : "..color("yellow",text)) end, error = function(text) - print(dateTime.." - "..color("red","[Error] : "..text)) + print(time.." - "..color("red","[Error] : "..text)) end, debug = function(text) - print(dateTime.." - ["..color("grey","Debug").."] : "..color("grey",text)) + print(time.." - ["..color("grey","Debug").."] : "..color("grey",text)) end, download = function (text) - print(dateTime.." - ["..color("green","Download").."] : "..text) + print(time.." - ["..color("green","Download").."] : "..text) end, data = function (text) - print(dateTime.." - ["..color("magenta","Data").."] : "..text) + print(time.." - ["..color("magenta","Data").."] : "..text) end, speed = function (startTime) - print(dateTime.." - ["..color("grey","Speed").."] : ".."Done in "..os.clock()-startTime.." seconds.") + print(time.." - ["..color("grey","Speed").."] : ".."Done in "..os.clock()-startTime.." seconds.") + end, + -- Might be used for an easter egg feature in the future... + special = function (text) + print(time.." - ["..color("orange","!!!!").."] : "..text) end } @@ -78,13 +83,4 @@ function Logging.Private.colorText(colorName: string, text: string): string return colorList[colorName]..text..colorList["reset"] end ---[=[ - Gets the current date and time as a string. - - @return string -- The formatted date-time string. -]=] -function Logging.Private.getCurrentDateTime(): string - return os.date("%Y-%m-%d %H:%M:%S") -end - return Logging.Public diff --git a/Source/Utilities/init.luau b/src/Utilities/init.luau similarity index 91% rename from Source/Utilities/init.luau rename to src/Utilities/init.luau index 8a03ec1..6b9014d 100644 --- a/Source/Utilities/init.luau +++ b/src/Utilities/init.luau @@ -1,4 +1,3 @@ ---!strict return { Logging = require("./Logging"), Filesystem = require("./Filesystem"), diff --git a/Source/init.luau b/src/init.luau similarity index 91% rename from Source/init.luau rename to src/init.luau index 5e50579..e5afe3e 100644 --- a/Source/init.luau +++ b/src/init.luau @@ -1,4 +1,3 @@ ---!strict local Application = {} local process = require("@lune/process") @@ -25,7 +24,8 @@ function Application.start() -- Development version detection if metadata.version:find("dev") then - Logging.write("warning", "DEVELOPMENT VERSION") + Logging.write("warning", "This is a development version of "..metadata.name.." !") + Logging.separator() -- Put the arguments inside the cache folder for testing purposes fs.writeFile(metadata.folders.cache.."/arguments.txt", table.concat(process.args, "\n")) end From 67447df1e06290c0ba089dc90246b5073c2c7a92 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Tue, 3 Sep 2024 17:51:04 +0200 Subject: [PATCH 09/20] build: Use Rokit --- .darklua.json5 | 2 +- .luaurc | 1 - rokit.toml | 8 ++++++++ src/init.luau | 1 - 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 rokit.toml diff --git a/.darklua.json5 b/.darklua.json5 index 20ba341..e052af2 100644 --- a/.darklua.json5 +++ b/.darklua.json5 @@ -1,5 +1,5 @@ { - "generator": { "name": "dense", "column_span": 150}, + "generator": { "name": "dense", "column_span": 175}, "bundle": { "require_mode": "path", "excludes": ["@lune/**"] diff --git a/.luaurc b/.luaurc index 2e18d4f..b1e499d 100644 --- a/.luaurc +++ b/.luaurc @@ -3,7 +3,6 @@ "lint": { "*": true }, - "lintErrors": true, "typeErrors": true, "globals": [ "warn" diff --git a/rokit.toml b/rokit.toml new file mode 100644 index 0000000..ec9a932 --- /dev/null +++ b/rokit.toml @@ -0,0 +1,8 @@ +# This file lists tools managed by Rokit, a toolchain manager for Roblox projects. +# For more information, see https://github.com/rojo-rbx/rokit + +# New tools can be added by running `rokit add ` in a terminal. + +[tools] +lune = "lune-org/lune@0.8.8" +darklua = "seaofvoices/darklua@0.13.1" diff --git a/src/init.luau b/src/init.luau index e5afe3e..f411c84 100644 --- a/src/init.luau +++ b/src/init.luau @@ -16,7 +16,6 @@ function Application.start() Chapter 0 : Preparing the environment We need to create the config folder if it doesn't exist. ]] - -- Prepare folders if necessary for _, folder in ipairs({metadata.folders.config, metadata.folders.gamesConfig, metadata.folders.cache}) do Filesystem.createOrUseDirectory(folder) From 6cbfcfd5701f7f85916ef8b002f365f808c6edb0 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Tue, 3 Sep 2024 18:03:32 +0200 Subject: [PATCH 10/20] build: Add StyLua --- Makefile | 7 +- rokit.toml | 2 + src/Classes/SteamApp.luau | 6 +- src/Classes/init.luau | 2 +- src/Metadata/init.luau | 14 +-- src/Steam/Configuration.luau | 228 +++++++++++++++++----------------- src/Steam/Utilities.luau | 14 +-- src/Steam/VDFParser.luau | 25 ++-- src/Steam/init.luau | 4 +- src/Utilities/Async.luau | 4 +- src/Utilities/Filesystem.luau | 21 ++-- src/Utilities/Logging.luau | 34 ++--- src/Utilities/init.luau | 4 +- src/init.luau | 12 +- stylua.toml | 9 ++ 15 files changed, 201 insertions(+), 185 deletions(-) create mode 100644 stylua.toml diff --git a/Makefile b/Makefile index db509c4..cfb9db7 100644 --- a/Makefile +++ b/Makefile @@ -19,11 +19,16 @@ build: $(BUILD_FOLDER)stweaks.luau @echo "Compiling project..." lune build $(BUILD_FOLDER)stweaks.luau +# -------------- Run -------------- run: @echo "Running project..." lune run init -# -------------- Cleaning -------------- +# -------------- Extra -------------- +style: + @echo "Running linter..." + stylua . + clean: @echo "Cleaning up..." rm -rf "$(BUILD_FOLDER)" diff --git a/rokit.toml b/rokit.toml index ec9a932..f98c9ba 100644 --- a/rokit.toml +++ b/rokit.toml @@ -6,3 +6,5 @@ [tools] lune = "lune-org/lune@0.8.8" darklua = "seaofvoices/darklua@0.13.1" +selene = "Kampfkarren/selene@0.27.1" +StyLua = "JohnnyMorganz/StyLua@0.20.0" diff --git a/src/Classes/SteamApp.luau b/src/Classes/SteamApp.luau index c442add..61023a1 100644 --- a/src/Classes/SteamApp.luau +++ b/src/Classes/SteamApp.luau @@ -1,5 +1,5 @@ local process = require("@lune/process") -local steamImageLocation = process.env.HOME.."/.local/share/Steam/appcache/librarycache/" +local steamImageLocation = process.env.HOME .. "/.local/share/Steam/appcache/librarycache/" local SteamApp = {} @@ -16,7 +16,7 @@ export type SteamApp = typeof(SteamApp.Object) & { library: string, location: string, size: number?, -- Slow, done in UI (Currently unused) - protonDBData: {any}? -- Slow, done in UI (Currently unused) + protonDBData: { any }?, -- Slow, done in UI (Currently unused) } -return SteamApp.Interface \ No newline at end of file +return SteamApp.Interface diff --git a/src/Classes/init.luau b/src/Classes/init.luau index 3474157..689f870 100644 --- a/src/Classes/init.luau +++ b/src/Classes/init.luau @@ -1,3 +1,3 @@ return { - SteamApp = require("./SteamApp") + SteamApp = require("./SteamApp"), } diff --git a/src/Metadata/init.luau b/src/Metadata/init.luau index 7e3f148..b8cd78f 100644 --- a/src/Metadata/init.luau +++ b/src/Metadata/init.luau @@ -5,15 +5,15 @@ local process = require("@lune/process") Application constants used throughout the program. ]=] local Metadata = { - name ="STweaks", + name = "STweaks", description = "A work-in-progress fast, simple and modern Libadwaita alternative to SteamTinkerLaunch.", - version="indev", + version = "indev", folders = { - config = process.env.HOME.."/.config/Stweaks", - gamesConfig = process.env.HOME.."/.config/Stweaks/games", - storage = process.env.HOME.."/.local/share/Stweaks", - cache = process.env.HOME.."/.cache/Stweaks" - } + config = process.env.HOME .. "/.config/Stweaks", + gamesConfig = process.env.HOME .. "/.config/Stweaks/games", + storage = process.env.HOME .. "/.local/share/Stweaks", + cache = process.env.HOME .. "/.cache/Stweaks", + }, } return Metadata diff --git a/src/Steam/Configuration.luau b/src/Steam/Configuration.luau index 879a858..c802e1e 100644 --- a/src/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -1,12 +1,12 @@ -local process = require("@lune/process") local fs = require("@lune/fs") +local process = require("@lune/process") local task = require("@lune/task") local Logging = require("../Utilities").Logging local Async = require("../Utilities").Async +local Filesystem = require("../Utilities").Filesystem local SteamUtilities = require("./Utilities") local VDFParser = require("./VDFParser") -local Filesystem = require("../Utilities/Filesystem") local SteamApp = require("../Classes").SteamApp -- --------------------------- Definitions ----------------------------- @@ -15,113 +15,113 @@ local SteamApp = require("../Classes").SteamApp -- Note : Most of the entries are unused and simply for informative purposes. type loginusers_vdf = { - users : { - [number] : { - AccountName : string, - PersonaName : string, - RememberPassword : number, - WantsOfflineMode : number, - SkipOfflineModeWarning : number, - AllowAutoLogon : number, - MostRecent : number, - Timestamp : number - } - } + users: { + [number]: { + AccountName: string, + PersonaName: string, + RememberPassword: number, + WantsOfflineMode: number, + SkipOfflineModeWarning: number, + AllowAutoLogon: number, + MostRecent: number, + Timestamp: number, + }, + }, } type localconfig_vdf = { - UserLocalConfigStore : { - Software : { - Valve : { - Steam : { - apps : { - [number] : { - cloud : { - last_sync_state : ("synchronized" | "changesincloud")?, - quota_bytes : number?, - quota_files : number?, - used_bytes : number?, - used_files : number? + UserLocalConfigStore: { + Software: { + Valve: { + Steam: { + apps: { + [number]: { + cloud: { + last_sync_state: ("synchronized" | "changesincloud")?, + quota_bytes: number?, + quota_files: number?, + used_bytes: number?, + used_files: number?, }?, - LastPlayed : number?, - Playtime : number?, - Playtime2wks : number?, - LaunchOptions : string?, -- IMPORTANT ! - autocloud : { - lastlaunch : number, - lastexit : number + LastPlayed: number?, + Playtime: number?, + Playtime2wks: number?, + LaunchOptions: string?, -- IMPORTANT ! + autocloud: { + lastlaunch: number, + lastexit: number, }?, - ViewedSteamPlay : number?, - BadgeData : string? - } - } - } - } - } - } + ViewedSteamPlay: number?, + BadgeData: string?, + }, + }, + }, + }, + }, + }, } type libraryfolders_vdf = { - libraryfolders : { - [number] : { - path : string, - label : string?, - contentid : number, - totalsize : number, - update_clean_bytes_tally : number, - time_last_update_corruption : number, - apps : { - [number] : number + libraryfolders: { + [number]: { + path: string, + label: string?, + contentid: number, + totalsize: number, + update_clean_bytes_tally: number, + time_last_update_corruption: number, + apps: { + [number]: number, }, - } - } + }, + }, } type appmanifest_vdf = { - AppState : { - appid : number, - Universe : number, - name : string, - StateFlags : number, - installdir : string, - LastUpdated : number, - LastPlayed : number, - SizeOnDisk : number, - StagingSize : number, - buildid : number, - LastOwner : number, - UpdateResult : number?, - BytesToDownload : number?, - BytesDownloaded : number?, - BytesToStage : number?, - BytesStaged : number?, - TargetBuildID : number?, - AutoUpdateBehavior : number, - AllowOtherDownloadsWhileRunning : number, - ScheduledAutoUpdate : number, - InstalledDepots : { - [number] : { - manifest : number, - size : number - } + AppState: { + appid: number, + Universe: number, + name: string, + StateFlags: number, + installdir: string, + LastUpdated: number, + LastPlayed: number, + SizeOnDisk: number, + StagingSize: number, + buildid: number, + LastOwner: number, + UpdateResult: number?, + BytesToDownload: number?, + BytesDownloaded: number?, + BytesToStage: number?, + BytesStaged: number?, + TargetBuildID: number?, + AutoUpdateBehavior: number, + AllowOtherDownloadsWhileRunning: number, + ScheduledAutoUpdate: number, + InstalledDepots: { + [number]: { + manifest: number, + size: number, + }, }, - InstallScripts : { - [number]: number + InstallScripts: { + [number]: number, }?, - SharedDepots : { - [number] : number + SharedDepots: { + [number]: number, }?, - UserConfig : { - language : string?, - BetaKey : string?, - platform_override_dest : "linux"?, - platform_override_source : ("linux" | "windows")?, + UserConfig: { + language: string?, + BetaKey: string?, + platform_override_dest: "linux"?, + platform_override_source: ("linux" | "windows")?, }, - MountedConfig : { - language : string?, - BetaKey : string?, - platform_override_dest : "linux"?, - platform_override_source : ("linux" | "windows")? -- IMPORTANT ! (Too bad it seems to never be present in Linux games, and sometimes not in Windows games... :/) + MountedConfig: { + language: string?, + BetaKey: string?, + platform_override_dest: "linux"?, + platform_override_source: ("linux" | "windows")?, -- IMPORTANT ! (Too bad it seems to never be present in Linux games, and sometimes not in Windows games... :/) }, - } + }, } -- STweaker @@ -137,15 +137,13 @@ Configuration.Public = {} -- Public -function Configuration.Public.getSteamConfiguration() : string? +function Configuration.Public.getSteamConfiguration(): string? --[[ Chapter 1 : We recover the Steam user config so we can get the last active user. And also the SteamID3 to access their settings folder. ]] - local userConfiguration: loginusers_vdf = Configuration.Private.VDFHandler ( - process.env.HOME.."/.local/share/Steam/config/loginusers.vdf", - "Failed to parse loginusers.vdf file." - ) + local userConfiguration: loginusers_vdf = + Configuration.Private.VDFHandler(process.env.HOME .. "/.local/share/Steam/config/loginusers.vdf", "Failed to parse loginusers.vdf file.") local activeUserSteamID3 = SteamUtilities.convertToSteamID3(Configuration.Private.getMostRecentUserID(userConfiguration)) Logging.write("info", "Active user SteamID3 : " .. activeUserSteamID3) Logging.separator() @@ -155,8 +153,8 @@ function Configuration.Public.getSteamConfiguration() : string? Note : Error handling should be added for the scenario where the configuration can't be loaded. ]] - local localconfig_vdf: localconfig_vdf = Configuration.Private.VDFHandler ( - process.env.HOME.."/.local/share/Steam/userdata/"..activeUserSteamID3.."/config/localconfig.vdf", + local localconfig_vdf: localconfig_vdf = Configuration.Private.VDFHandler( + process.env.HOME .. "/.local/share/Steam/userdata/" .. activeUserSteamID3 .. "/config/localconfig.vdf", "Failed to parse active user localconfig.vdf file with SteamID3: " .. activeUserSteamID3 ) local userGameConfigurations = localconfig_vdf.UserLocalConfigStore.Software.Valve.Steam.apps @@ -167,8 +165,8 @@ function Configuration.Public.getSteamConfiguration() : string? Chapter 3 : We recover the Steam library config to get the list of games. We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. ]] - local libraries: libraryfolders_vdf = Configuration.Private.VDFHandler ( - process.env.HOME.."/.local/share/Steam/config/libraryfolders.vdf", + local libraries: libraryfolders_vdf = Configuration.Private.VDFHandler( + process.env.HOME .. "/.local/share/Steam/config/libraryfolders.vdf", "Failed to parse libraryfolders.vdf file." ) Logging.write("info", "Steam libraries loaded.") @@ -181,16 +179,17 @@ function Configuration.Public.getSteamConfiguration() : string? Async.asyncForEach(libraries.libraryfolders, function(_, library) -- We check if the folder exists if not fs.metadata(library.path).exists then - Logging.write("warning", "Steam library "..library.path.." doesn't exist. Skipping...") + Logging.write("warning", "Steam library " .. library.path .. " doesn't exist. Skipping...") else - Logging.write("data", "Checking library "..library.path) - local appManifestFilenames = Filesystem.getFilenamePatternInDirectory(library.path.."/steamapps", "appmanifest_") + Logging.write("data", "Checking library " .. library.path) + local appManifestFilenames = Filesystem.getFilenamePatternInDirectory(library.path .. "/steamapps", "appmanifest_") - Async.asyncForEach(appManifestFilenames, function (_, appManifestFilename) - local appManifestPath: string = library.path.."/steamapps/"..appManifestFilename - local appManifest: appmanifest_vdf = Configuration.Private.VDFHandler(appManifestPath, "Failed to parse "..appManifestPath..".", false) + Async.asyncForEach(appManifestFilenames, function(_, appManifestFilename) + local appManifestPath: string = library.path .. "/steamapps/" .. appManifestFilename + local appManifest: appmanifest_vdf = + Configuration.Private.VDFHandler(appManifestPath, "Failed to parse " .. appManifestPath .. ".", false) - Logging.write("info", "Found "..appManifest.AppState.appid.." : "..appManifest.AppState.name) + Logging.write("info", "Found " .. appManifest.AppState.appid .. " : " .. appManifest.AppState.name) end) end end) @@ -203,7 +202,9 @@ end -- Private function Configuration.Private.VDFHandler(filePath: string, errorMessage: string, logging: boolean?): any - if logging == nil then logging = true end + if logging == nil then + logging = true + end local timeStart if logging then @@ -222,12 +223,11 @@ function Configuration.Private.VDFHandler(filePath: string, errorMessage: string end end - -- loginuser.vdf -function Configuration.Private.getMostRecentUserID(userData : loginusers_vdf) : number +function Configuration.Private.getMostRecentUserID(userData: loginusers_vdf): number local activeUserID - for id,data in pairs(userData.users) do + for id, data in pairs(userData.users) do if data.MostRecent == 1 then activeUserID = id end diff --git a/src/Steam/Utilities.luau b/src/Steam/Utilities.luau index 56d164c..cbcb29b 100644 --- a/src/Steam/Utilities.luau +++ b/src/Steam/Utilities.luau @@ -16,14 +16,14 @@ local Utilities = {} function Utilities.isSteamLaunch(): boolean local arguments = process.args - if ( + if --arguments[1] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/reaper" and - arguments[2] == "SteamLaunch" and - arguments[3]:match("AppId=%d+") and - arguments[4] == "--" and + arguments[2] == "SteamLaunch" + and arguments[3]:match("AppId=%d+") + and arguments[4] == "--" --arguments[5] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/steam-launch-wrapper" and - arguments[6] == "--" - ) then + and arguments[6] == "--" + then return true else return false @@ -40,7 +40,7 @@ function Utilities.convertToSteamID3(steamID64: number): number local offset_id = steamID64 - 76561197960265728 local account_type = offset_id % 2 local account_id = math.floor((offset_id - account_type) / 2) + account_type - + -- The -1 is meant to be a fix, but could also cause bugs by itself. Keep an eye out. return (account_id * 2) - account_type - 1 end diff --git a/src/Steam/VDFParser.luau b/src/Steam/VDFParser.luau index 22c803c..74406ba 100644 --- a/src/Steam/VDFParser.luau +++ b/src/Steam/VDFParser.luau @@ -57,8 +57,8 @@ function VDFParser.Private.parse(input: string): VDFTable pos = pos + 1 if pos <= len then local nextChar = input:sub(pos, pos) - if nextChar == "\"" then - result = result .. "\"" + if nextChar == '"' then + result = result .. '"' elseif nextChar == "\\" then result = result .. "\\" elseif nextChar == "n" then @@ -69,7 +69,7 @@ function VDFParser.Private.parse(input: string): VDFTable result = result .. "\\" .. nextChar end end - elseif char == "\"" then + elseif char == '"' then break else result = result .. char @@ -82,7 +82,7 @@ function VDFParser.Private.parse(input: string): VDFTable -- Parsing logic local pos = 1 local len = #input - local stack: {VDFValue} = {} + local stack: { VDFValue } = {} local currentTable: VDFTable = {} local currentKey: string? = nil @@ -105,8 +105,7 @@ function VDFParser.Private.parse(input: string): VDFTable currentTable[currentKey] = parsedString currentKey = nil end - - elseif char == '{' then + elseif char == "{" then -- Start a new table local newTable: VDFTable = {} if currentKey ~= nil then @@ -117,8 +116,7 @@ function VDFParser.Private.parse(input: string): VDFTable end table.insert(stack, currentTable) currentTable = newTable - - elseif char == '}' then + elseif char == "}" then -- End the current table if #stack == 0 then error("Malformed VDF: encountered '}' without a matching '{'") @@ -129,20 +127,19 @@ function VDFParser.Private.parse(input: string): VDFTable error("Malformed VDF") end currentTable = data - - elseif char == '\n' or char == '\t' or char == ' ' then + elseif char == "\n" or char == "\t" or char == " " then -- Skip whitespace else error("Malformed VDF: unexpected character '" .. char .. "'") end - + pos = pos + 1 end - + if #stack > 0 then error("Malformed VDF: unclosed '{'") end - + return currentTable end @@ -177,7 +174,7 @@ function VDFParser.Private.sanitize(input: VDFTable) end end - local result: {any: any} = {} + local result: { any: any } = {} for key, value in pairs(input) do -- Convert both the key and the value diff --git a/src/Steam/init.luau b/src/Steam/init.luau index 57d2a81..8c4a6c2 100644 --- a/src/Steam/init.luau +++ b/src/Steam/init.luau @@ -1,3 +1,3 @@ return { - Configuration = require("./Configuration") -} \ No newline at end of file + Configuration = require("./Configuration"), +} diff --git a/src/Utilities/Async.luau b/src/Utilities/Async.luau index 2c420b1..69fdde6 100644 --- a/src/Utilities/Async.luau +++ b/src/Utilities/Async.luau @@ -13,10 +13,10 @@ local Async = {} @param tbl The table to iterate over. @param func The function to execute in parallel for each element. ]=] -function Async.asyncForEach(tbl: {any}, func: (any, any) -> ()) +function Async.asyncForEach(tbl: { any }, func: (any, any) -> ()) local total = 0 local completed = 0 - + for key, item in pairs(tbl) do total += 1 task.spawn(function() diff --git a/src/Utilities/Filesystem.luau b/src/Utilities/Filesystem.luau index f912203..0114ce9 100644 --- a/src/Utilities/Filesystem.luau +++ b/src/Utilities/Filesystem.luau @@ -18,7 +18,7 @@ local Filesystem = {} ]=] function Filesystem.createOrUseDirectory(path: string): string if not fs.isDir(path) then - Logging.write("debug", "Directory "..path.." not found. Creating it...") + Logging.write("debug", "Directory " .. path .. " not found. Creating it...") fs.writeDir(path) end return path @@ -33,22 +33,21 @@ end ]=] function Filesystem.getSize(path: string): number path = path:gsub("'", "'\\''") - - local handle = process.spawn("du",{"-sb",path}) - + + local handle = process.spawn("du", { "-sb", path }) + if not handle.ok then - error("Failed to get size of path "..path..": "..handle.stderr) + error("Failed to get size of path " .. path .. ": " .. handle.stderr) end local result = tonumber(handle.stdout:match("^(%d+)")) -- Grab only the number if not result then - error("Failed to parse size for output ("..handle.stdout..")") + error("Failed to parse size for output (" .. handle.stdout .. ")") else return result end end - --[=[ Converts a size in bytes to a human-readable size. @@ -56,8 +55,8 @@ end @return string -- The human-readable size. ]=] function Filesystem.sizeToUnit(size: number): string - local units = {"B", "KB", "MB", "GB", "TB"} - local unit = units[1] -- Default to "B" (bytes) + local units = { "B", "KB", "MB", "GB", "TB" } + local unit = units[1] -- Default to "B" (bytes) for i = 2, #units do if size >= 1024 then @@ -68,7 +67,7 @@ function Filesystem.sizeToUnit(size: number): string end end - return string.format("%.2f", size).." "..unit + return string.format("%.2f", size) .. " " .. unit end --[=[ @@ -78,7 +77,7 @@ end @param pattern string -- The pattern to search for. @return {string} -- A table containing every filename matching the pattern. ]=] -function Filesystem.getFilenamePatternInDirectory(directory: string, pattern: string): {string} +function Filesystem.getFilenamePatternInDirectory(directory: string, pattern: string): { string } local result = {} for _, file in fs.readDir(directory) do diff --git a/src/Utilities/Logging.luau b/src/Utilities/Logging.luau index e095123..4680c4c 100644 --- a/src/Utilities/Logging.luau +++ b/src/Utilities/Logging.luau @@ -25,32 +25,32 @@ function Logging.Public.write(type: LogType, message: string | number) local logFunctions = { info = function(text) - print(time.." - ["..color("blue","Info").."] : "..text) + print(time .. " - [" .. color("blue", "Info") .. "] : " .. text) end, warning = function(text) - print(time.." - ["..color("yellow","Warning").."] : "..color("yellow",text)) + print(time .. " - [" .. color("yellow", "Warning") .. "] : " .. color("yellow", text)) end, error = function(text) - print(time.." - "..color("red","[Error] : "..text)) + print(time .. " - " .. color("red", "[Error] : " .. text)) end, debug = function(text) - print(time.." - ["..color("grey","Debug").."] : "..color("grey",text)) + print(time .. " - [" .. color("grey", "Debug") .. "] : " .. color("grey", text)) end, - download = function (text) - print(time.." - ["..color("green","Download").."] : "..text) + download = function(text) + print(time .. " - [" .. color("green", "Download") .. "] : " .. text) end, - data = function (text) - print(time.." - ["..color("magenta","Data").."] : "..text) + data = function(text) + print(time .. " - [" .. color("magenta", "Data") .. "] : " .. text) end, - speed = function (startTime) - print(time.." - ["..color("grey","Speed").."] : ".."Done in "..os.clock()-startTime.." seconds.") + speed = function(startTime) + print(time .. " - [" .. color("grey", "Speed") .. "] : " .. "Done in " .. os.clock() - startTime .. " seconds.") end, -- Might be used for an easter egg feature in the future... - special = function (text) - print(time.." - ["..color("orange","!!!!").."] : "..text) - end + special = function(text) + print(time .. " - [" .. color("orange", "!!!!") .. "] : " .. text) + end, } - + logFunctions[type](message) end @@ -67,7 +67,7 @@ end @param text string -- The text to color. @return string -- The colored text. ]=] -function Logging.Private.colorText(colorName: string, text: string): string +function Logging.Private.colorText(colorName: string, text: string): string local colorList = { red = "\27[31m", green = "\27[32m", @@ -78,9 +78,9 @@ function Logging.Private.colorText(colorName: string, text: string): string white = "\27[37m", grey = "\27[90m", orange = "\27[91m", - reset = "\27[0m" + reset = "\27[0m", } - return colorList[colorName]..text..colorList["reset"] + return colorList[colorName] .. text .. colorList["reset"] end return Logging.Public diff --git a/src/Utilities/init.luau b/src/Utilities/init.luau index 6b9014d..59023f3 100644 --- a/src/Utilities/init.luau +++ b/src/Utilities/init.luau @@ -1,5 +1,5 @@ return { Logging = require("./Logging"), Filesystem = require("./Filesystem"), - Async = require("./Async") -} \ No newline at end of file + Async = require("./Async"), +} diff --git a/src/init.luau b/src/init.luau index f411c84..bdcb6b0 100644 --- a/src/init.luau +++ b/src/init.luau @@ -1,7 +1,7 @@ local Application = {} -local process = require("@lune/process") local fs = require("@lune/fs") +local process = require("@lune/process") local metadata = require("./Metadata") local Filesystem = require("./Utilities").Filesystem @@ -17,16 +17,20 @@ function Application.start() We need to create the config folder if it doesn't exist. ]] -- Prepare folders if necessary - for _, folder in ipairs({metadata.folders.config, metadata.folders.gamesConfig, metadata.folders.cache}) do + for _, folder in ipairs({ + metadata.folders.config, + metadata.folders.gamesConfig, + metadata.folders.cache, + }) do Filesystem.createOrUseDirectory(folder) end -- Development version detection if metadata.version:find("dev") then - Logging.write("warning", "This is a development version of "..metadata.name.." !") + Logging.write("warning", "This is a development version of " .. metadata.name .. " !") Logging.separator() -- Put the arguments inside the cache folder for testing purposes - fs.writeFile(metadata.folders.cache.."/arguments.txt", table.concat(process.args, "\n")) + fs.writeFile(metadata.folders.cache .. "/arguments.txt", table.concat(process.args, "\n")) end --[[ diff --git a/stylua.toml b/stylua.toml new file mode 100644 index 0000000..65e2e31 --- /dev/null +++ b/stylua.toml @@ -0,0 +1,9 @@ +column_width = 150 +line_endings = "Unix" +indent_type = "Tabs" +indent_width = 4 +quote_style = "AutoPreferDouble" +call_parentheses = "Always" + +[sort_requires] +enabled = true From 936357c3c57d5e7cb483b9d74f8931c413fd654d Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Tue, 3 Sep 2024 18:19:31 +0200 Subject: [PATCH 11/20] build: Add selene --- .luaurc | 3 +-- Makefile | 8 ++++++-- selene.toml | 2 ++ src/Steam/Configuration.luau | 8 ++++---- src/Steam/VDFParser.luau | 12 +++++------- 5 files changed, 18 insertions(+), 15 deletions(-) create mode 100644 selene.toml diff --git a/.luaurc b/.luaurc index b1e499d..093fe80 100644 --- a/.luaurc +++ b/.luaurc @@ -1,9 +1,8 @@ { "languageMode": "strict", "lint": { - "*": true + "*": false }, - "typeErrors": true, "globals": [ "warn" ] diff --git a/Makefile b/Makefile index cfb9db7..4e2aa83 100644 --- a/Makefile +++ b/Makefile @@ -25,9 +25,13 @@ run: lune run init # -------------- Extra -------------- -style: +check: @echo "Running linter..." - stylua . + selene src/ + +style: + @echo "Running code formatter..." + stylua src/ clean: @echo "Cleaning up..." diff --git a/selene.toml b/selene.toml new file mode 100644 index 0000000..49bce28 --- /dev/null +++ b/selene.toml @@ -0,0 +1,2 @@ +std = "luau" +exclude = ["luneTypes.d.luau"] diff --git a/src/Steam/Configuration.luau b/src/Steam/Configuration.luau index c802e1e..b047dc6 100644 --- a/src/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -1,10 +1,10 @@ local fs = require("@lune/fs") local process = require("@lune/process") -local task = require("@lune/task") -local Logging = require("../Utilities").Logging -local Async = require("../Utilities").Async -local Filesystem = require("../Utilities").Filesystem +local Utilities = require("../Utilities") +local Logging = Utilities.Logging +local Async = Utilities.Async +local Filesystem = Utilities.Filesystem local SteamUtilities = require("./Utilities") local VDFParser = require("./VDFParser") local SteamApp = require("../Classes").SteamApp diff --git a/src/Steam/VDFParser.luau b/src/Steam/VDFParser.luau index 74406ba..b56560a 100644 --- a/src/Steam/VDFParser.luau +++ b/src/Steam/VDFParser.luau @@ -48,15 +48,15 @@ function VDFParser.Private.parse(input: string): VDFTable end -- Handle escape sequences - local function parseString(input: string, pos: number): (string, number) + local function parseString(string: string, pos: number): (string, number) local result = "" - local len = #input + local len = #string while pos <= len do - local char = input:sub(pos, pos) + local char = string:sub(pos, pos) if char == "\\" then pos = pos + 1 if pos <= len then - local nextChar = input:sub(pos, pos) + local nextChar = string:sub(pos, pos) if nextChar == '"' then result = result .. '"' elseif nextChar == "\\" then @@ -127,9 +127,7 @@ function VDFParser.Private.parse(input: string): VDFTable error("Malformed VDF") end currentTable = data - elseif char == "\n" or char == "\t" or char == " " then - -- Skip whitespace - else + elseif not (char == "\n" or char == "\t" or char == " ") then error("Malformed VDF: unexpected character '" .. char .. "'") end From 38cb5dbda467c87193987328c33d6261897f9648 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Tue, 3 Sep 2024 21:24:53 +0200 Subject: [PATCH 12/20] feat: Steam app classification --- src/Classes/SteamApp.luau | 64 +++++++++++++++++++++++++++++++++--- src/Metadata/init.luau | 1 + src/Steam/Configuration.luau | 32 +++++++++++++----- stylua.toml | 2 +- 4 files changed, 86 insertions(+), 13 deletions(-) diff --git a/src/Classes/SteamApp.luau b/src/Classes/SteamApp.luau index 61023a1..9c42c57 100644 --- a/src/Classes/SteamApp.luau +++ b/src/Classes/SteamApp.luau @@ -1,22 +1,78 @@ +local fs = require("@lune/fs") local process = require("@lune/process") + +local Metadata = require("../Metadata") + +-- Constants local steamImageLocation = process.env.HOME .. "/.local/share/Steam/appcache/librarycache/" local SteamApp = {} SteamApp.Interface = {} -SteamApp.Object = {} -function SteamApp.Interface.new() +function SteamApp.Interface.new(appID: number, name: string, library: string, location: string, platform: ("windows" | "linux")?, launchArguments: string?): SteamApp + -- Is the app configured to use STweaks ? + local tweaksEnabled = false + if launchArguments and launchArguments:find(Metadata.executable) then + tweaksEnabled = true + end + + -- Does the app manifest specify the platform ? + -- Could be simplified + local osPlatform: ("Windows" | "Linux")? + if platform == "windows" then + osPlatform = "Windows" + elseif platform == "linux" then + osPlatform = "Linux" + end + + -- What type is the app ? + -- Current way of detecting if an app is a game or a tool... not the greatest. + local type: "Game" | "Other" | "Proton" = "Game" + if not fs.metadata(steamImageLocation .. appID .. "_library_600x900.jpg").exists then + type = "Other" + if name:find("Proton") then + type = "Proton" + end + end + + -- We return the object + return { + appID = appID, + name = name, + library = library, + location = location, + + size = nil, + protonDBData = nil, + type = type, + osPlatform = osPlatform, + + protonConfig = nil, + tweaksEnabled = tweaksEnabled, + } end -export type SteamApp = typeof(SteamApp.Object) & { - id: number, +export type SteamApp = { + appID: number, name: string, library: string, location: string, + size: number?, -- Slow, done in UI (Currently unused) protonDBData: { any }?, -- Slow, done in UI (Currently unused) + + type: "Game" | "Other" | "Proton", + osPlatform: ("Windows" | "Linux")?, + + protonConfig: ProtonConfig?, -- (Currently unused) + tweaksEnabled: boolean?, +} + +type ProtonConfig = { + compatdata_path: string, + version: string?, -- Another file needs to be checked for this information, currently unused } return SteamApp.Interface diff --git a/src/Metadata/init.luau b/src/Metadata/init.luau index b8cd78f..941ff02 100644 --- a/src/Metadata/init.luau +++ b/src/Metadata/init.luau @@ -8,6 +8,7 @@ local Metadata = { name = "STweaks", description = "A work-in-progress fast, simple and modern Libadwaita alternative to SteamTinkerLaunch.", version = "indev", + executable = "stweaks", folders = { config = process.env.HOME .. "/.config/Stweaks", gamesConfig = process.env.HOME .. "/.config/Stweaks/games", diff --git a/src/Steam/Configuration.luau b/src/Steam/Configuration.luau index b047dc6..915e372 100644 --- a/src/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -71,7 +71,7 @@ type libraryfolders_vdf = { apps: { [number]: number, }, - }, + }?, }, } @@ -165,16 +165,14 @@ function Configuration.Public.getSteamConfiguration(): string? Chapter 3 : We recover the Steam library config to get the list of games. We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. ]] - local libraries: libraryfolders_vdf = Configuration.Private.VDFHandler( - process.env.HOME .. "/.local/share/Steam/config/libraryfolders.vdf", - "Failed to parse libraryfolders.vdf file." - ) + local libraries: libraryfolders_vdf = + Configuration.Private.VDFHandler(process.env.HOME .. "/.local/share/Steam/config/libraryfolders.vdf", "Failed to parse libraryfolders.vdf file.") Logging.write("info", "Steam libraries loaded.") Logging.separator() --print(userGameConfigurations, libraries) - local steamGames = {} + local steamApps = {} Async.asyncForEach(libraries.libraryfolders, function(_, library) -- We check if the folder exists @@ -186,16 +184,34 @@ function Configuration.Public.getSteamConfiguration(): string? Async.asyncForEach(appManifestFilenames, function(_, appManifestFilename) local appManifestPath: string = library.path .. "/steamapps/" .. appManifestFilename - local appManifest: appmanifest_vdf = - Configuration.Private.VDFHandler(appManifestPath, "Failed to parse " .. appManifestPath .. ".", false) + local appManifest: appmanifest_vdf = Configuration.Private.VDFHandler(appManifestPath, "Failed to parse " .. appManifestPath .. ".", false) Logging.write("info", "Found " .. appManifest.AppState.appid .. " : " .. appManifest.AppState.name) + + local configuration = userGameConfigurations[appManifest.AppState.appid] + local launchOptions + if configuration then + launchOptions = configuration.LaunchOptions + end + + local steamApp = SteamApp.new( + appManifest.AppState.appid, + appManifest.AppState.name, + library.path, + library.path .. "/steamapps/common/" .. appManifest.AppState.installdir, + appManifest.AppState.MountedConfig.platform_override_source, + launchOptions + ) + + table.insert(steamApps, steamApp) end) end end) Logging.separator() + print(steamApps) + return end diff --git a/stylua.toml b/stylua.toml index 65e2e31..5477162 100644 --- a/stylua.toml +++ b/stylua.toml @@ -1,4 +1,4 @@ -column_width = 150 +column_width = 175 line_endings = "Unix" indent_type = "Tabs" indent_width = 4 From 58de1e50355bff302aab90c92c894acd7f546466 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Tue, 3 Sep 2024 23:00:29 +0200 Subject: [PATCH 13/20] feat: Finalize App Platform detection --- src/Classes/SteamApp.luau | 9 ++++- src/Steam/Configuration.luau | 63 ++++++++++++++++++++++++++++------- src/Utilities/Filesystem.luau | 17 ++++++++++ src/Utilities/Logging.luau | 9 ++--- src/init.luau | 2 +- stylua.toml | 2 +- 6 files changed, 81 insertions(+), 21 deletions(-) diff --git a/src/Classes/SteamApp.luau b/src/Classes/SteamApp.luau index 9c42c57..f3d3a05 100644 --- a/src/Classes/SteamApp.luau +++ b/src/Classes/SteamApp.luau @@ -10,7 +10,14 @@ local SteamApp = {} SteamApp.Interface = {} -function SteamApp.Interface.new(appID: number, name: string, library: string, location: string, platform: ("windows" | "linux")?, launchArguments: string?): SteamApp +function SteamApp.Interface.new( + appID: number, + name: string, + library: string, + location: string, + platform: ("windows" | "linux")?, + launchArguments: string? +): SteamApp -- Is the app configured to use STweaks ? local tweaksEnabled = false if launchArguments and launchArguments:find(Metadata.executable) then diff --git a/src/Steam/Configuration.luau b/src/Steam/Configuration.luau index 915e372..c823efb 100644 --- a/src/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -124,6 +124,15 @@ type appmanifest_vdf = { }, } +type compat_vdf = { + platform_overrides: { + [number]: { + dest: "windows" | "linux", + src: "windows" | "linux", + }, + }, +} + -- STweaker -- TODO @@ -161,6 +170,18 @@ function Configuration.Public.getSteamConfiguration(): string? Logging.write("info", "User game configurations loaded.") Logging.separator() + --[[ + Chapter 2.5 : We recover compat.vdf to know if a game has ever used its Windows version. + We can't use it directly to get the platform details, as games that have previously used Proton will still be set to "windows" here. + Logically, a game completely absent from this list is a native Linux game. + ]] + local compat_vdf: compat_vdf = Configuration.Private.VDFHandler( + process.env.HOME .. "/.local/share/Steam/userdata/" .. activeUserSteamID3 .. "/config/compat.vdf", + "Failed to parse compat.vdf file." + ) + Logging.write("info", "Compatibility data loaded.") + Logging.separator() + --[[ Chapter 3 : We recover the Steam library config to get the list of games. We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. @@ -170,14 +191,13 @@ function Configuration.Public.getSteamConfiguration(): string? Logging.write("info", "Steam libraries loaded.") Logging.separator() - --print(userGameConfigurations, libraries) - local steamApps = {} + local steamAppCount = 0 Async.asyncForEach(libraries.libraryfolders, function(_, library) -- We check if the folder exists if not fs.metadata(library.path).exists then - Logging.write("warning", "Steam library " .. library.path .. " doesn't exist. Skipping...") + Logging.write("warn", "Steam library " .. library.path .. " doesn't exist. Skipping...") else Logging.write("data", "Checking library " .. library.path) local appManifestFilenames = Filesystem.getFilenamePatternInDirectory(library.path .. "/steamapps", "appmanifest_") @@ -188,22 +208,39 @@ function Configuration.Public.getSteamConfiguration(): string? Logging.write("info", "Found " .. appManifest.AppState.appid .. " : " .. appManifest.AppState.name) + local location = library.path .. "/steamapps/common/" .. appManifest.AppState.installdir + + -- Does the game have launch options set ? local configuration = userGameConfigurations[appManifest.AppState.appid] local launchOptions if configuration then launchOptions = configuration.LaunchOptions end - local steamApp = SteamApp.new( - appManifest.AppState.appid, - appManifest.AppState.name, - library.path, - library.path .. "/steamapps/common/" .. appManifest.AppState.installdir, - appManifest.AppState.MountedConfig.platform_override_source, - launchOptions - ) + -- Do we know the game's platform + local osPlatform: ("windows" | "linux")? = appManifest.AppState.MountedConfig.platform_override_source + if not osPlatform then + local compat = compat_vdf.platform_overrides[appManifest.AppState.appid] + -- The app being absent from the compat.vdf list means it can only be a native Linux game + if not compat then + osPlatform = "linux" + else + -- Gah ! We still don't have the platform... time to check manually. + Logging.write( + "warn", + "Platform not found for " .. appManifest.AppState.appid .. " : " .. appManifest.AppState.name .. ". Using manual check..." + ) + if not Filesystem.directoryContainsLinuxData(location) then + osPlatform = "windows" + else + osPlatform = "linux" + end + end + end - table.insert(steamApps, steamApp) + local steamApp = SteamApp.new(appManifest.AppState.appid, appManifest.AppState.name, library.path, location, osPlatform, launchOptions) + steamApps[steamApp.appID] = steamApp + steamAppCount += 1 end) end end) @@ -212,6 +249,8 @@ function Configuration.Public.getSteamConfiguration(): string? print(steamApps) + Logging.write("info", "Loaded " .. steamAppCount .. " Steam apps.") + return end diff --git a/src/Utilities/Filesystem.luau b/src/Utilities/Filesystem.luau index 0114ce9..3bd4eb6 100644 --- a/src/Utilities/Filesystem.luau +++ b/src/Utilities/Filesystem.luau @@ -89,4 +89,21 @@ function Filesystem.getFilenamePatternInDirectory(directory: string, pattern: st return result end +function Filesystem.directoryContainsLinuxData(path: string): boolean + local files = fs.readDir(path) + for _, file in ipairs(files) do + if file:find(".sh") or not file:find(".") and not fs.isDir(path) then + file = path .. "/" .. file + + Logging.write("data", "Checking file " .. file) + local contents = fs.readFile(file) + + if contents:find("Linux") or contents:find("shell") then + return true + end + end + end + return false +end + return Filesystem diff --git a/src/Utilities/Logging.luau b/src/Utilities/Logging.luau index 4680c4c..ffb3962 100644 --- a/src/Utilities/Logging.luau +++ b/src/Utilities/Logging.luau @@ -1,5 +1,5 @@ type LogColor = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "grey" | "orange" | "reset" -type LogType = "info" | "warning" | "error" | "debug" | "download" | "data" | "speed" | "special" +type LogType = "info" | "warn" | "error" | "debug" | "data" | "speed" | "special" --[=[ @class Utilities.Logging @@ -27,8 +27,8 @@ function Logging.Public.write(type: LogType, message: string | number) info = function(text) print(time .. " - [" .. color("blue", "Info") .. "] : " .. text) end, - warning = function(text) - print(time .. " - [" .. color("yellow", "Warning") .. "] : " .. color("yellow", text)) + warn = function(text) + print(time .. " - [" .. color("yellow", "Warn") .. "] : " .. color("yellow", text)) end, error = function(text) print(time .. " - " .. color("red", "[Error] : " .. text)) @@ -36,9 +36,6 @@ function Logging.Public.write(type: LogType, message: string | number) debug = function(text) print(time .. " - [" .. color("grey", "Debug") .. "] : " .. color("grey", text)) end, - download = function(text) - print(time .. " - [" .. color("green", "Download") .. "] : " .. text) - end, data = function(text) print(time .. " - [" .. color("magenta", "Data") .. "] : " .. text) end, diff --git a/src/init.luau b/src/init.luau index bdcb6b0..09c24f3 100644 --- a/src/init.luau +++ b/src/init.luau @@ -27,7 +27,7 @@ function Application.start() -- Development version detection if metadata.version:find("dev") then - Logging.write("warning", "This is a development version of " .. metadata.name .. " !") + Logging.write("warn", "This is a development version of " .. metadata.name .. " !") Logging.separator() -- Put the arguments inside the cache folder for testing purposes fs.writeFile(metadata.folders.cache .. "/arguments.txt", table.concat(process.args, "\n")) diff --git a/stylua.toml b/stylua.toml index 5477162..9dcacf6 100644 --- a/stylua.toml +++ b/stylua.toml @@ -1,4 +1,4 @@ -column_width = 175 +column_width = 160 line_endings = "Unix" indent_type = "Tabs" indent_width = 4 From 2fd66fc5f8f08e20cf41c26f44b5ad483e8c83cb Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:25:45 +0200 Subject: [PATCH 14/20] fix: .PHONY in Makefile --- Makefile | 2 +- docs/STEAM_PROBLEMS_LIST.md | 47 ------------------------------------- 2 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 docs/STEAM_PROBLEMS_LIST.md diff --git a/Makefile b/Makefile index 4e2aa83..85b59a7 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ ifeq ($(PREFIX),) endif BUILD_FOLDER := dist/ -.PHONY: system install uninstall clean local +.PHONY: build run check style clean # -------------- Packaging -------------- $(BUILD_FOLDER)stweaks.luau: diff --git a/docs/STEAM_PROBLEMS_LIST.md b/docs/STEAM_PROBLEMS_LIST.md deleted file mode 100644 index 779fa78..0000000 --- a/docs/STEAM_PROBLEMS_LIST.md +++ /dev/null @@ -1,47 +0,0 @@ -For *"fun"*, I have compiled a list of every single problem I consider shouldn't have happened that I've encountered anyways, going through Steam's configuration files. - -I put them in order, from ***most annoying*** to *least annoying*. - -This is meant to warn people to not create code that may cross these issues. - -___ - -# Problems - -## Linux games don't get removed from *compat.vdf* when going back from their Windows version. - -### Conclusion - -We have no way from Steam's configuration files to know if a game that ever had a Windows version installed now has its Linux version installed. - -I looked everywhere I could for an alternative configuration file (or a file that could be useful through another method), but came empty-handed. - -### Workaround - -We check for Linux executables or shell scripts in every Windows game's root directory. - -We previously used in a loop - -```lua -os.execute("file "..location.."/"..file.." | grep -e 'Linux' -e 'shell' &> /dev/null") -``` - -to detect those. - -However, ironically, this method led us into another problem later on, which required us to scrap the os.execute approach. - -## *libraryfolders.vdf* doesn't get immediately updated upon game installation/uninstallation. - -### Conclusion - -This problem effectively makes it completely unreliable (and thus useless) to gather the game IDs stored inside it. - -### Workaround - -As a workaround, we look in the library folders for *appmanifest_ID.acf* files, and use them to guess the installed game IDs and gather the data. - -## Steam can get stuck trying to start a game when using *os.execute* many times. - -### Workaround - -Use os.execute as little as possible if launching a game. From d20af8e6ef814cae10d6e9f4622f8129d92b7baa Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Wed, 4 Sep 2024 22:59:57 +0200 Subject: [PATCH 15/20] chore: Minor tweaks --- src/Classes/SteamApp.luau | 2 +- src/Steam/Configuration.luau | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Classes/SteamApp.luau b/src/Classes/SteamApp.luau index f3d3a05..d501a68 100644 --- a/src/Classes/SteamApp.luau +++ b/src/Classes/SteamApp.luau @@ -20,7 +20,7 @@ function SteamApp.Interface.new( ): SteamApp -- Is the app configured to use STweaks ? local tweaksEnabled = false - if launchArguments and launchArguments:find(Metadata.executable) then + if launchArguments and launchArguments:find(Metadata.executable .. " ") then tweaksEnabled = true end diff --git a/src/Steam/Configuration.luau b/src/Steam/Configuration.luau index c823efb..a2a0abd 100644 --- a/src/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -245,11 +245,10 @@ function Configuration.Public.getSteamConfiguration(): string? end end) - Logging.separator() - print(steamApps) Logging.write("info", "Loaded " .. steamAppCount .. " Steam apps.") + Logging.separator() return end From f9a157fd8b4f27b538fadce1bd7546e0f67e1d2c Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Thu, 5 Sep 2024 17:02:15 +0200 Subject: [PATCH 16/20] feat: Implement game detection --- .darklua.json5 => .darklua.json | 0 Makefile | 2 +- src/Classes/SteamApp.luau | 12 ++---- src/Steam/Configuration.luau | 17 ++++---- src/Steam/Utilities.luau | 28 ++++++------- src/Steam/VDFParser.luau | 72 +++++++++++++++++---------------- src/Steam/init.luau | 1 + src/Utilities/Filesystem.luau | 6 +-- src/Utilities/Logging.luau | 33 ++++++--------- src/init.luau | 35 ++++++++++++---- 10 files changed, 107 insertions(+), 99 deletions(-) rename .darklua.json5 => .darklua.json (100%) diff --git a/.darklua.json5 b/.darklua.json similarity index 100% rename from .darklua.json5 rename to .darklua.json diff --git a/Makefile b/Makefile index 85b59a7..20c2f6b 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ BUILD_FOLDER := dist/ .PHONY: build run check style clean # -------------- Packaging -------------- -$(BUILD_FOLDER)stweaks.luau: +$(BUILD_FOLDER)stweaks.luau: clean @echo "Using DarkLua to bundle Luau code..." darklua process init.luau $(BUILD_FOLDER)stweaks.luau -v diff --git a/src/Classes/SteamApp.luau b/src/Classes/SteamApp.luau index d501a68..6d107c2 100644 --- a/src/Classes/SteamApp.luau +++ b/src/Classes/SteamApp.luau @@ -49,13 +49,10 @@ function SteamApp.Interface.new( name = name, library = library, location = location, - size = nil, protonDBData = nil, - type = type, osPlatform = osPlatform, - protonConfig = nil, tweaksEnabled = tweaksEnabled, } @@ -64,17 +61,14 @@ end export type SteamApp = { appID: number, name: string, + tweaksEnabled: boolean?, library: string, location: string, - - size: number?, -- Slow, done in UI (Currently unused) - protonDBData: { any }?, -- Slow, done in UI (Currently unused) - type: "Game" | "Other" | "Proton", osPlatform: ("Windows" | "Linux")?, - + size: number?, -- Slow, done in UI (Currently unused) + protonDBData: { any }?, -- Slow, done in UI (Currently unused) protonConfig: ProtonConfig?, -- (Currently unused) - tweaksEnabled: boolean?, } type ProtonConfig = { diff --git a/src/Steam/Configuration.luau b/src/Steam/Configuration.luau index a2a0abd..3606b55 100644 --- a/src/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -146,7 +146,7 @@ Configuration.Public = {} -- Public -function Configuration.Public.getSteamConfiguration(): string? +function Configuration.Public.getSteamConfiguration() --[[ Chapter 1 : We recover the Steam user config so we can get the last active user. And also the SteamID3 to access their settings folder. @@ -206,7 +206,7 @@ function Configuration.Public.getSteamConfiguration(): string? local appManifestPath: string = library.path .. "/steamapps/" .. appManifestFilename local appManifest: appmanifest_vdf = Configuration.Private.VDFHandler(appManifestPath, "Failed to parse " .. appManifestPath .. ".", false) - Logging.write("info", "Found " .. appManifest.AppState.appid .. " : " .. appManifest.AppState.name) + Logging.write("info", 'Found "' .. appManifest.AppState.name .. '" (' .. appManifest.AppState.appid .. ")") local location = library.path .. "/steamapps/common/" .. appManifest.AppState.installdir @@ -228,7 +228,7 @@ function Configuration.Public.getSteamConfiguration(): string? -- Gah ! We still don't have the platform... time to check manually. Logging.write( "warn", - "Platform not found for " .. appManifest.AppState.appid .. " : " .. appManifest.AppState.name .. ". Using manual check..." + 'Platform not found for "' .. appManifest.AppState.name .. '" (' .. appManifest.AppState.appid .. "). Using manual check..." ) if not Filesystem.directoryContainsLinuxData(location) then osPlatform = "windows" @@ -245,12 +245,10 @@ function Configuration.Public.getSteamConfiguration(): string? end end) - print(steamApps) - - Logging.write("info", "Loaded " .. steamAppCount .. " Steam apps.") + Logging.write("info", "Found " .. steamAppCount .. " Steam apps.") Logging.separator() - return + return steamApps end -- Private @@ -280,13 +278,12 @@ end -- loginuser.vdf function Configuration.Private.getMostRecentUserID(userData: loginusers_vdf): number - local activeUserID for id, data in pairs(userData.users) do if data.MostRecent == 1 then - activeUserID = id + return id end end - return activeUserID + error("No most recent user found in loginusers.vdf. What ?!") end return Configuration.Public diff --git a/src/Steam/Utilities.luau b/src/Steam/Utilities.luau index cbcb29b..88d25c3 100644 --- a/src/Steam/Utilities.luau +++ b/src/Steam/Utilities.luau @@ -11,22 +11,22 @@ local Utilities = {} Checks if the arguments are from Steam or not. Non-Steam game support later on will probably necessitate changes. - @return boolean -- Returns true if the arguments are from Steam, aka Steam launched the application. + @return number -- Returns the launched AppID if the arguments are from Steam, otherwise nil. ]=] -function Utilities.isSteamLaunch(): boolean - local arguments = process.args - - if - --arguments[1] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/reaper" and - arguments[2] == "SteamLaunch" - and arguments[3]:match("AppId=%d+") - and arguments[4] == "--" - --arguments[5] == process.env.HOME.."/.local/share/Steam/ubuntu12_32/steam-launch-wrapper" and - and arguments[6] == "--" - then - return true +function Utilities.isSteamLaunch(): number? + local appIDArgumentIndex + for index, argument in ipairs(process.args) do + -- Locate the SteamLaunch argument, our AppID will be the next argument. + if argument == "SteamLaunch" then + appIDArgumentIndex = index + 1 + break + end + end + + if appIDArgumentIndex then + return tonumber(process.args[appIDArgumentIndex]:match("AppId=(%d+)")) else - return false + return nil end end diff --git a/src/Steam/VDFParser.luau b/src/Steam/VDFParser.luau index b56560a..e792604 100644 --- a/src/Steam/VDFParser.luau +++ b/src/Steam/VDFParser.luau @@ -9,11 +9,11 @@ local VDFParser = {} VDFParser.Private = {} VDFParser.Public = {} --- Public +-- ---------------------------------- Public --[=[ Parses a VDF file into a table. - + @param path string -- The path to the file. @return The parsed file if successful. ]=] @@ -23,7 +23,7 @@ end --[=[ Parses a VDF string into a table. - + @param input string -- The VDF string to parse. @return The parsed table if successful. ]=] @@ -31,13 +31,14 @@ function VDFParser.Public.parseString(input: string) return VDFParser.Private.sanitize(VDFParser.Private.parse(input)) end --- Private +-- ---------------------------------- Private + type VDFTable = { [string]: VDFValue } type VDFValue = string | VDFTable --[=[ Parses a VDF string into a table. Private side of the parser. - + @param input The VDF string to parse. @return The parsed table if successful. ]=] @@ -143,43 +144,46 @@ end --[=[ Sanitizes a VDF table by converting string values to their proper types. - - @param input The VDF table to sanitize. + + @param input -- The VDF table to sanitize. @return The sanitized table. ]=] function VDFParser.Private.sanitize(input: VDFTable) - local function convert(value: any): any - if type(value) == "string" then - -- Check for number values (integers or floats) - local numberValue = tonumber(value) - if numberValue ~= nil then - return numberValue - end - - -- Check for empty strings - if value == "" then - return nil - end - - -- If it's neither, return the original string - return value - elseif type(value) == "table" then - -- Recursively sanitize nested tables - return VDFParser.Private.sanitize(value) - else - -- Return the value as-is for unsupported types (shouldn't happen in a VDF) - return value - end - end - - local result: { any: any } = {} + local result = {} for key, value in pairs(input) do - -- Convert both the key and the value - result[convert(key)] = convert(value) + result[VDFParser.Private.convertValue(key)] = VDFParser.Private.convertValue(value) end return result end +--[=[ + Converts a VDF value to its proper type. + + @param value -- The value to convert. + @return The converted value. +]=] +function VDFParser.Private.convertValue(value: any): any + if type(value) == "string" then + -- Check for number values (integers or floats) + local numberValue = tonumber(value) + if numberValue ~= nil then + return numberValue + end + -- Check for empty strings + if value == "" then + return nil + end + -- If it's neither, return the original string + return value + elseif type(value) == "table" then + -- Recursively sanitize nested tables + return VDFParser.Private.sanitize(value) + else + -- Return the value as-is for unsupported types (shouldn't happen in a VDF) + return value + end +end + return VDFParser.Public diff --git a/src/Steam/init.luau b/src/Steam/init.luau index 8c4a6c2..ecfe316 100644 --- a/src/Steam/init.luau +++ b/src/Steam/init.luau @@ -1,3 +1,4 @@ return { Configuration = require("./Configuration"), + Utilities = require("./Utilities"), } diff --git a/src/Utilities/Filesystem.luau b/src/Utilities/Filesystem.luau index 3bd4eb6..041acc9 100644 --- a/src/Utilities/Filesystem.luau +++ b/src/Utilities/Filesystem.luau @@ -50,7 +50,7 @@ end --[=[ Converts a size in bytes to a human-readable size. - + @param size number -- The size to convert. @return string -- The human-readable size. ]=] @@ -72,7 +72,7 @@ end --[=[ Returns a table containing every filename matching a pattern in a directory. - + @param directory string -- The directory to search in. @param pattern string -- The pattern to search for. @return {string} -- A table containing every filename matching the pattern. @@ -92,7 +92,7 @@ end function Filesystem.directoryContainsLinuxData(path: string): boolean local files = fs.readDir(path) for _, file in ipairs(files) do - if file:find(".sh") or not file:find(".") and not fs.isDir(path) then + if not fs.isDir(path) and (file:find(".sh") or not file:find(".")) then file = path .. "/" .. file Logging.write("data", "Checking file " .. file) diff --git a/src/Utilities/Logging.luau b/src/Utilities/Logging.luau index ffb3962..a44730c 100644 --- a/src/Utilities/Logging.luau +++ b/src/Utilities/Logging.luau @@ -1,5 +1,7 @@ -type LogColor = "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "grey" | "orange" | "reset" -type LogType = "info" | "warn" | "error" | "debug" | "data" | "speed" | "special" +local stdio = require("@lune/stdio") + +type LogColor = "black" | "blue" | "cyan" | "green" | "purple" | "red" | "reset" | "white" | "yellow" +type LogType = "info" | "warn" | "error" | "debug" | "data" | "speed" | "special" | "success" --[=[ @class Utilities.Logging @@ -34,17 +36,20 @@ function Logging.Public.write(type: LogType, message: string | number) print(time .. " - " .. color("red", "[Error] : " .. text)) end, debug = function(text) - print(time .. " - [" .. color("grey", "Debug") .. "] : " .. color("grey", text)) + print(time .. " - [" .. color("white", "Debug") .. "] : " .. color("white", text)) end, data = function(text) - print(time .. " - [" .. color("magenta", "Data") .. "] : " .. text) + print(time .. " - [" .. color("purple", "Data") .. "] : " .. text) end, speed = function(startTime) - print(time .. " - [" .. color("grey", "Speed") .. "] : " .. "Done in " .. os.clock() - startTime .. " seconds.") + print(time .. " - [" .. color("white", "Speed") .. "] : " .. "Done in " .. os.clock() - startTime .. " seconds.") + end, + success = function(text) + print(time .. " - [" .. color("green", "Success") .. "] : " .. text) end, -- Might be used for an easter egg feature in the future... special = function(text) - print(time .. " - [" .. color("orange", "!!!!") .. "] : " .. text) + print(time .. " - [" .. color("red", "!!!!") .. "] : " .. text) end, } @@ -64,20 +69,8 @@ end @param text string -- The text to color. @return string -- The colored text. ]=] -function Logging.Private.colorText(colorName: string, text: string): string - local colorList = { - red = "\27[31m", - green = "\27[32m", - yellow = "\27[33m", - blue = "\27[34m", - magenta = "\27[35m", - cyan = "\27[36m", - white = "\27[37m", - grey = "\27[90m", - orange = "\27[91m", - reset = "\27[0m", - } - return colorList[colorName] .. text .. colorList["reset"] +function Logging.Private.colorText(colorName: LogColor, text: string): string + return stdio.color(colorName) .. text .. stdio.color("reset") end return Logging.Public diff --git a/src/init.luau b/src/init.luau index 09c24f3..3b2df23 100644 --- a/src/init.luau +++ b/src/init.luau @@ -9,10 +9,7 @@ local Logging = require("./Utilities").Logging local Steam = require("./Steam") function Application.start() - -- Startup time - local totalStartupTimeVar = os.clock() - - --[[ + --[[ Chapter 0 : Preparing the environment We need to create the config folder if it doesn't exist. ]] @@ -28,17 +25,39 @@ function Application.start() -- Development version detection if metadata.version:find("dev") then Logging.write("warn", "This is a development version of " .. metadata.name .. " !") - Logging.separator() -- Put the arguments inside the cache folder for testing purposes fs.writeFile(metadata.folders.cache .. "/arguments.txt", table.concat(process.args, "\n")) end --[[ Chapter 1 : Game management - What's the Steam config ? Is this being started through Steam or alone ? What to do ?! + Is this being started through Steam or alone ? + What's the Steam config then ? ]] - local steamConfig = Steam.Configuration.getSteamConfiguration() - Logging.write("speed", totalStartupTimeVar) + local launchedAppID = Steam.Utilities.isSteamLaunch() + if launchedAppID then + Logging.write("info", "Launched through Steam (AppID " .. launchedAppID .. ").") + Logging.separator() + + -- Load the Steam config + local ok, steamConfig = pcall(Steam.Configuration.getSteamConfiguration) + if not ok then + Logging.write("error", "Failed to load Steam games.") + process.exit(1) + end + + -- Load the game's data + local gameData = steamConfig[launchedAppID] + if not gameData then + Logging.write("error", "No data found for game with AppID " .. launchedAppID .. ".") + process.exit(1) + end + + Logging.write("success", 'Detected "' .. gameData.name .. '" (' .. gameData.appID .. ") !") + else + Logging.write("info", "Launched without Steam.") + error("No graphical interface implemented yet.") + end end return Application From 210e7bb80e55efdd4768c55b9ed48d8fe6dc0a06 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Fri, 6 Sep 2024 20:09:37 +0200 Subject: [PATCH 17/20] feat: Re-add system notification support --- src/Utilities/System.luau | 43 +++++++++++++++++++++++++++++++++++++++ src/Utilities/init.luau | 1 + src/init.luau | 10 +++++++-- 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/Utilities/System.luau diff --git a/src/Utilities/System.luau b/src/Utilities/System.luau new file mode 100644 index 0000000..30fb4cd --- /dev/null +++ b/src/Utilities/System.luau @@ -0,0 +1,43 @@ +local process = require("@lune/process") + +local Logging = require("Logging") + +local System = {} + +--[=[ + Sends a notification using notify-send. + Currently uses notify-send (again) due to limitations with Lune that should be lifted with FFI support. + + @param title string -- The notification's title. + @param message string -- The notification's message. + @param urgency string -- The notification's urgency. Default : nil + @param transient boolean -- Whether the notification should be transient. Default : false + @param time number -- The notification's time. Default : nil + @return nil +]=] +function System.sendNotification(title: string, message: string, urgency: ("normal" | "critical")?, transient: boolean?, time: number?) + local arguments = { + title, + message, + } + if transient then + table.insert(arguments, "-e") + end + + if urgency then + table.insert(arguments, "-u") + table.insert(arguments, urgency) + end + if time then + table.insert(arguments, "-t") + table.insert(arguments, tostring(time)) + end + + local execution = process.spawn("notify-send", arguments) + + if not execution.ok then + Logging.write("error", "Unable to send notification : " .. execution.stderr) + end +end + +return System diff --git a/src/Utilities/init.luau b/src/Utilities/init.luau index 59023f3..c2269c9 100644 --- a/src/Utilities/init.luau +++ b/src/Utilities/init.luau @@ -2,4 +2,5 @@ return { Logging = require("./Logging"), Filesystem = require("./Filesystem"), Async = require("./Async"), + System = require("./System"), } diff --git a/src/init.luau b/src/init.luau index 3b2df23..fb887aa 100644 --- a/src/init.luau +++ b/src/init.luau @@ -3,9 +3,11 @@ local Application = {} local fs = require("@lune/fs") local process = require("@lune/process") +local Utilities = require("./Utilities") local metadata = require("./Metadata") -local Filesystem = require("./Utilities").Filesystem -local Logging = require("./Utilities").Logging +local Filesystem = Utilities.Filesystem +local Logging = Utilities.Logging +local System = Utilities.System local Steam = require("./Steam") function Application.start() @@ -43,6 +45,7 @@ function Application.start() local ok, steamConfig = pcall(Steam.Configuration.getSteamConfiguration) if not ok then Logging.write("error", "Failed to load Steam games.") + System.sendNotification(metadata.name, "Failed to load Steam games.", "critical", true) process.exit(1) end @@ -50,12 +53,15 @@ function Application.start() local gameData = steamConfig[launchedAppID] if not gameData then Logging.write("error", "No data found for game with AppID " .. launchedAppID .. ".") + System.sendNotification(metadata.name, "No data found for game with AppID " .. launchedAppID .. ".", "critical", true) process.exit(1) end Logging.write("success", 'Detected "' .. gameData.name .. '" (' .. gameData.appID .. ") !") + System.sendNotification(metadata.name, "Detected " .. gameData.name .. ".", "normal", true) else Logging.write("info", "Launched without Steam.") + System.sendNotification(metadata.name, "No graphical interface implemented yet.", "critical", true) error("No graphical interface implemented yet.") end end From 186da17e9a1ef4e6fa64fa97ef2e2324f53624ef Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Fri, 6 Sep 2024 21:06:32 +0200 Subject: [PATCH 18/20] feat: Config read & default --- src/Configuration/Games/Default.luau | 99 ++++++++++++++++++++++++++++ src/Configuration/Games/init.luau | 40 +++++++++++ src/Configuration/init.luau | 3 + src/Launcher/init.luau | 17 +++++ src/Metadata/init.luau | 2 +- src/Steam/Configuration.luau | 4 -- src/init.luau | 18 ++--- 7 files changed, 169 insertions(+), 14 deletions(-) create mode 100644 src/Configuration/Games/Default.luau create mode 100644 src/Configuration/Games/init.luau create mode 100644 src/Configuration/init.luau create mode 100644 src/Launcher/init.luau diff --git a/src/Configuration/Games/Default.luau b/src/Configuration/Games/Default.luau new file mode 100644 index 0000000..c87bbbc --- /dev/null +++ b/src/Configuration/Games/Default.luau @@ -0,0 +1,99 @@ +local SteamApp = require("../../Classes/SteamApp") + +export type GameConfiguration = { + appID : number, + version : number, + + settings : { + dgpu : boolean, + zink : boolean, + sdl_wayland : boolean + }, + + utilities : { + gamemode : boolean, + mangohud : { + enabled : boolean, + }, + gamescope : { + enabled : boolean, + general : { + resolution : { + enabled : boolean; + internal : { + width : number, + height : number, + }, + external : { + width : number, + height : number, + }, + }, + frame_limit : { + enabled : boolean, + normal : number, + unfocused : number, + }, + fullscreen : boolean, + borderless : boolean + }, + filtering : { + enabled : boolean, + filter : "Linear" | "Nearest" | "FSR" | "NIS" | "Pixel", + sharpness : number, + } + }, + } +} + +local Default = {} + +function Default.getDefaultGameConfiguration(appData : SteamApp.SteamApp) : GameConfiguration + return { + appID = appData.appID, + version = 1, + + settings = { + dgpu = true, + zink = false, + sdl_wayland = true + }, + + utilities = { + gamemode = true, + mangohud = { + enabled = true, + }, + gamescope = { + enabled = false, + general = { + resolution = { + enabled = false, + internal = { + width = 1280, + height = 720, + }, + external = { + width = 1920, + height = 1080, + }, + }, + frame_limit = { + enabled = false, + normal = 60, + unfocused = 5, + }, + fullscreen = false, + borderless = false + }, + filtering = { + enabled = false, + filter = "FSR", + sharpness = 5, + } + }, + } + } +end + +return Default diff --git a/src/Configuration/Games/init.luau b/src/Configuration/Games/init.luau new file mode 100644 index 0000000..0fa569d --- /dev/null +++ b/src/Configuration/Games/init.luau @@ -0,0 +1,40 @@ +local fs = require("@lune/fs") +local serde = require("@lune/serde") + +local SteamApp = require("../../Classes/SteamApp") +local Default = require("./Default") +local Metadata = require("../../Metadata") +local Logging = require("../../Utilities/Logging") + +local function createGameConfiguration(appData : SteamApp.SteamApp) : Default.GameConfiguration + local newConfig = Default.getDefaultGameConfiguration(appData) + + Logging.write("info", "Creating default configuration for game " .. appData.name .. " (" .. appData.appID .. ")...") + local configString = serde.encode("toml", newConfig, true) + fs.writeFile(string.format( + "%s/%s.toml", + Metadata.folders.gamesConfig, + tostring(appData.appID) + ), configString) + + return newConfig +end + +local GameConfigurations = {} + +function GameConfigurations.getGameConfiguration(appData : SteamApp.SteamApp) : Default.GameConfiguration + local configPath = string.format( + "%s/%s.toml", + Metadata.folders.gamesConfig, + tostring(appData.appID) + ) + + if fs.metadata(configPath).exists then + local configString = fs.readFile(configPath) + return serde.decode("toml", configString) + else + return createGameConfiguration(appData) + end +end + +return GameConfigurations \ No newline at end of file diff --git a/src/Configuration/init.luau b/src/Configuration/init.luau new file mode 100644 index 0000000..3501f33 --- /dev/null +++ b/src/Configuration/init.luau @@ -0,0 +1,3 @@ +return { + Games = require("./Games") +} \ No newline at end of file diff --git a/src/Launcher/init.luau b/src/Launcher/init.luau new file mode 100644 index 0000000..fa2e788 --- /dev/null +++ b/src/Launcher/init.luau @@ -0,0 +1,17 @@ +local SteamApp = require("../Classes/SteamApp") + +local GameConfiguration = require("../Configuration").Games + +local Launcher = {} + +function Launcher.prepareLaunchCommand(appData : SteamApp.SteamApp) : {string} + -- First and foremost, we recover the configuration of the game. + local ok, appConfig = pcall(GameConfiguration.getGameConfiguration, appData) + if not ok then + error("Failed to get game configuration for " .. appData.name .. " (" .. appData.appID .. ").") + end + + error("Not implemented.") +end + +return Launcher \ No newline at end of file diff --git a/src/Metadata/init.luau b/src/Metadata/init.luau index 941ff02..c7380fc 100644 --- a/src/Metadata/init.luau +++ b/src/Metadata/init.luau @@ -11,7 +11,7 @@ local Metadata = { executable = "stweaks", folders = { config = process.env.HOME .. "/.config/Stweaks", - gamesConfig = process.env.HOME .. "/.config/Stweaks/games", + gamesConfig = process.env.HOME .. "/.config/Stweaks/Games", storage = process.env.HOME .. "/.local/share/Stweaks", cache = process.env.HOME .. "/.cache/Stweaks", }, diff --git a/src/Steam/Configuration.luau b/src/Steam/Configuration.luau index 3606b55..0b0ecdb 100644 --- a/src/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -133,10 +133,6 @@ type compat_vdf = { }, } --- STweaker - --- TODO - -- --------------------------- Script ----------------------------- local Configuration = {} diff --git a/src/init.luau b/src/init.luau index fb887aa..1d9e032 100644 --- a/src/init.luau +++ b/src/init.luau @@ -9,12 +9,9 @@ local Filesystem = Utilities.Filesystem local Logging = Utilities.Logging local System = Utilities.System local Steam = require("./Steam") +local Launcher = require("./Launcher") function Application.start() - --[[ - Chapter 0 : Preparing the environment - We need to create the config folder if it doesn't exist. - ]] -- Prepare folders if necessary for _, folder in ipairs({ metadata.folders.config, @@ -31,11 +28,7 @@ function Application.start() fs.writeFile(metadata.folders.cache .. "/arguments.txt", table.concat(process.args, "\n")) end - --[[ - Chapter 1 : Game management - Is this being started through Steam or alone ? - What's the Steam config then ? - ]] + -- Check if we're launched through Steam, start the game with its settings if so local launchedAppID = Steam.Utilities.isSteamLaunch() if launchedAppID then Logging.write("info", "Launched through Steam (AppID " .. launchedAppID .. ").") @@ -57,10 +50,17 @@ function Application.start() process.exit(1) end + -- Tell the user we found the game Logging.write("success", 'Detected "' .. gameData.name .. '" (' .. gameData.appID .. ") !") System.sendNotification(metadata.name, "Detected " .. gameData.name .. ".", "normal", true) + + -- Go into the Game Launcher module. + local command: {string} = Launcher.prepareLaunchCommand(gameData) + print(command) else Logging.write("info", "Launched without Steam.") + + -- :( - Lune FFI is not implemented yet, so no interface. System.sendNotification(metadata.name, "No graphical interface implemented yet.", "critical", true) error("No graphical interface implemented yet.") end From 8bab3761f044002a4eaea649096c9b8bdc390068 Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Sat, 7 Sep 2024 09:36:47 +0200 Subject: [PATCH 19/20] refactor: Reorganize code (& temporarily remove comments) --- src/Classes/SteamApp.luau | 6 +- .../Games/{init.luau => Functions.luau} | 0 src/Configuration/init.luau | 2 +- src/Metadata/init.luau | 8 +- src/Steam/Configuration.luau | 88 +++++++------- src/Steam/Utilities.luau | 17 --- src/Steam/VDFParser.luau | 109 ++++++------------ src/Utilities/Async.luau | 11 -- src/Utilities/Filesystem.luau | 31 ----- src/Utilities/Logging.luau | 38 +----- src/Utilities/System.luau | 11 -- src/init.luau | 4 +- 12 files changed, 85 insertions(+), 240 deletions(-) rename src/Configuration/Games/{init.luau => Functions.luau} (100%) diff --git a/src/Classes/SteamApp.luau b/src/Classes/SteamApp.luau index 6d107c2..7abb05d 100644 --- a/src/Classes/SteamApp.luau +++ b/src/Classes/SteamApp.luau @@ -3,12 +3,10 @@ local process = require("@lune/process") local Metadata = require("../Metadata") --- Constants -local steamImageLocation = process.env.HOME .. "/.local/share/Steam/appcache/librarycache/" - local SteamApp = {} SteamApp.Interface = {} +SteamApp.Prototype = {} function SteamApp.Interface.new( appID: number, @@ -36,7 +34,7 @@ function SteamApp.Interface.new( -- What type is the app ? -- Current way of detecting if an app is a game or a tool... not the greatest. local type: "Game" | "Other" | "Proton" = "Game" - if not fs.metadata(steamImageLocation .. appID .. "_library_600x900.jpg").exists then + if not fs.metadata(process.env.HOME .. "/.local/share/Steam/appcache/librarycache/" .. appID .. "_library_600x900.jpg").exists then type = "Other" if name:find("Proton") then type = "Proton" diff --git a/src/Configuration/Games/init.luau b/src/Configuration/Games/Functions.luau similarity index 100% rename from src/Configuration/Games/init.luau rename to src/Configuration/Games/Functions.luau diff --git a/src/Configuration/init.luau b/src/Configuration/init.luau index 3501f33..4060c2e 100644 --- a/src/Configuration/init.luau +++ b/src/Configuration/init.luau @@ -1,3 +1,3 @@ return { - Games = require("./Games") + Games = require("./Games/Functions") } \ No newline at end of file diff --git a/src/Metadata/init.luau b/src/Metadata/init.luau index c7380fc..eec65ec 100644 --- a/src/Metadata/init.luau +++ b/src/Metadata/init.luau @@ -1,10 +1,6 @@ local process = require("@lune/process") ---[=[ - @class Metadata - Application constants used throughout the program. -]=] -local Metadata = { +return { name = "STweaks", description = "A work-in-progress fast, simple and modern Libadwaita alternative to SteamTinkerLaunch.", version = "indev", @@ -16,5 +12,3 @@ local Metadata = { cache = process.env.HOME .. "/.cache/Stweaks", }, } - -return Metadata diff --git a/src/Steam/Configuration.luau b/src/Steam/Configuration.luau index 0b0ecdb..5594926 100644 --- a/src/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -9,9 +9,39 @@ local SteamUtilities = require("./Utilities") local VDFParser = require("./VDFParser") local SteamApp = require("../Classes").SteamApp +local function VDFHandler(filePath: string, errorMessage: string, logging: boolean?): any + if logging == nil then + logging = true + end + + local timeStart + if logging then + timeStart = os.clock() + Logging.write("data", "Parsing VDF file : " .. filePath) + end + + local result, parsedData = pcall(VDFParser.parseFile, filePath) + if not result then + error(errorMessage) + else + if logging then + Logging.write("speed", timeStart) + end + return parsedData + end +end + +local function getMostRecentUserID(userData: loginusers_vdf): number + for id, data in pairs(userData.users) do + if data.MostRecent == 1 then + return id + end + end + error("No most recent user found in loginusers.vdf. What ?!") +end + -- --------------------------- Definitions ----------------------------- --- Steam files -- Note : Most of the entries are unused and simply for informative purposes. type loginusers_vdf = { @@ -137,19 +167,14 @@ type compat_vdf = { local Configuration = {} -Configuration.Private = {} -Configuration.Public = {} - --- Public - -function Configuration.Public.getSteamConfiguration() +function Configuration.getSteamConfiguration() --[[ Chapter 1 : We recover the Steam user config so we can get the last active user. And also the SteamID3 to access their settings folder. ]] local userConfiguration: loginusers_vdf = - Configuration.Private.VDFHandler(process.env.HOME .. "/.local/share/Steam/config/loginusers.vdf", "Failed to parse loginusers.vdf file.") - local activeUserSteamID3 = SteamUtilities.convertToSteamID3(Configuration.Private.getMostRecentUserID(userConfiguration)) + VDFHandler(process.env.HOME .. "/.local/share/Steam/config/loginusers.vdf", "Failed to parse loginusers.vdf file.") + local activeUserSteamID3 = SteamUtilities.convertToSteamID3(getMostRecentUserID(userConfiguration)) Logging.write("info", "Active user SteamID3 : " .. activeUserSteamID3) Logging.separator() @@ -158,7 +183,7 @@ function Configuration.Public.getSteamConfiguration() Note : Error handling should be added for the scenario where the configuration can't be loaded. ]] - local localconfig_vdf: localconfig_vdf = Configuration.Private.VDFHandler( + local localconfig_vdf: localconfig_vdf = VDFHandler( process.env.HOME .. "/.local/share/Steam/userdata/" .. activeUserSteamID3 .. "/config/localconfig.vdf", "Failed to parse active user localconfig.vdf file with SteamID3: " .. activeUserSteamID3 ) @@ -171,7 +196,7 @@ function Configuration.Public.getSteamConfiguration() We can't use it directly to get the platform details, as games that have previously used Proton will still be set to "windows" here. Logically, a game completely absent from this list is a native Linux game. ]] - local compat_vdf: compat_vdf = Configuration.Private.VDFHandler( + local compat_vdf: compat_vdf = VDFHandler( process.env.HOME .. "/.local/share/Steam/userdata/" .. activeUserSteamID3 .. "/config/compat.vdf", "Failed to parse compat.vdf file." ) @@ -183,7 +208,7 @@ function Configuration.Public.getSteamConfiguration() We can't use just libraryfolders.vdf to get the game IDs, as Steam seems to not always update it immediately. ]] local libraries: libraryfolders_vdf = - Configuration.Private.VDFHandler(process.env.HOME .. "/.local/share/Steam/config/libraryfolders.vdf", "Failed to parse libraryfolders.vdf file.") + VDFHandler(process.env.HOME .. "/.local/share/Steam/config/libraryfolders.vdf", "Failed to parse libraryfolders.vdf file.") Logging.write("info", "Steam libraries loaded.") Logging.separator() @@ -200,7 +225,7 @@ function Configuration.Public.getSteamConfiguration() Async.asyncForEach(appManifestFilenames, function(_, appManifestFilename) local appManifestPath: string = library.path .. "/steamapps/" .. appManifestFilename - local appManifest: appmanifest_vdf = Configuration.Private.VDFHandler(appManifestPath, "Failed to parse " .. appManifestPath .. ".", false) + local appManifest: appmanifest_vdf = VDFHandler(appManifestPath, "Failed to parse " .. appManifestPath .. ".", false) Logging.write("info", 'Found "' .. appManifest.AppState.name .. '" (' .. appManifest.AppState.appid .. ")") @@ -247,39 +272,4 @@ function Configuration.Public.getSteamConfiguration() return steamApps end --- Private - -function Configuration.Private.VDFHandler(filePath: string, errorMessage: string, logging: boolean?): any - if logging == nil then - logging = true - end - - local timeStart - if logging then - timeStart = os.clock() - Logging.write("data", "Parsing VDF file : " .. filePath) - end - - local result, parsedData = pcall(VDFParser.parseFile, filePath) - if not result then - error(errorMessage) - else - if logging then - Logging.write("speed", timeStart) - end - return parsedData - end -end - --- loginuser.vdf - -function Configuration.Private.getMostRecentUserID(userData: loginusers_vdf): number - for id, data in pairs(userData.users) do - if data.MostRecent == 1 then - return id - end - end - error("No most recent user found in loginusers.vdf. What ?!") -end - -return Configuration.Public +return Configuration diff --git a/src/Steam/Utilities.luau b/src/Steam/Utilities.luau index 88d25c3..1b40e30 100644 --- a/src/Steam/Utilities.luau +++ b/src/Steam/Utilities.luau @@ -1,18 +1,7 @@ local process = require("@lune/process") ---[=[ - @class Utilities - - Minor Steam-related helper functions. -]=] local Utilities = {} ---[=[ - Checks if the arguments are from Steam or not. - Non-Steam game support later on will probably necessitate changes. - - @return number -- Returns the launched AppID if the arguments are from Steam, otherwise nil. -]=] function Utilities.isSteamLaunch(): number? local appIDArgumentIndex for index, argument in ipairs(process.args) do @@ -30,12 +19,6 @@ function Utilities.isSteamLaunch(): number? end end ---[=[ - Converts SteamID64 to SteamID3. - - @param steamID64 number -- The SteamID64 to convert. - @return number -- Returns the corresponding SteamID3. -]=] function Utilities.convertToSteamID3(steamID64: number): number local offset_id = steamID64 - 76561197960265728 local account_type = offset_id % 2 diff --git a/src/Steam/VDFParser.luau b/src/Steam/VDFParser.luau index e792604..16a9734 100644 --- a/src/Steam/VDFParser.luau +++ b/src/Steam/VDFParser.luau @@ -1,48 +1,9 @@ local fs = require("@lune/fs") ---[=[ - Contains functions for parsing VDF files and strings. - Lune does not support VDF files natively. -]=] -local VDFParser = {} - -VDFParser.Private = {} -VDFParser.Public = {} - --- ---------------------------------- Public - ---[=[ - Parses a VDF file into a table. - - @param path string -- The path to the file. - @return The parsed file if successful. -]=] -function VDFParser.Public.parseFile(path: string) - return VDFParser.Public.parseString(fs.readFile(path)) -end - ---[=[ - Parses a VDF string into a table. - - @param input string -- The VDF string to parse. - @return The parsed table if successful. -]=] -function VDFParser.Public.parseString(input: string) - return VDFParser.Private.sanitize(VDFParser.Private.parse(input)) -end - --- ---------------------------------- Private - type VDFTable = { [string]: VDFValue } type VDFValue = string | VDFTable ---[=[ - Parses a VDF string into a table. Private side of the parser. - - @param input The VDF string to parse. - @return The parsed table if successful. -]=] -function VDFParser.Private.parse(input: string): VDFTable +local function parseVDFData(input: string): VDFTable -- Trim function to remove whitespace local function trim(s: string): string? return s:match("^%s*(.-)%s*$") @@ -142,48 +103,46 @@ function VDFParser.Private.parse(input: string): VDFTable return currentTable end ---[=[ - Sanitizes a VDF table by converting string values to their proper types. +local function sanitizeVDFTable(input: VDFTable) + local function convertValue(value: any): any + if type(value) == "string" then + -- Check for number values (integers or floats) + local numberValue = tonumber(value) + if numberValue ~= nil then + return numberValue + end + -- Check for empty strings + if value == "" then + return nil + end + -- If it's neither, return the original string + return value + elseif type(value) == "table" then + -- Recursively sanitize nested tables + return sanitizeVDFTable(value) + else + -- Return the value as-is for unsupported types (shouldn't happen in a VDF) + return value + end + end - @param input -- The VDF table to sanitize. - @return The sanitized table. -]=] -function VDFParser.Private.sanitize(input: VDFTable) local result = {} - for key, value in pairs(input) do - result[VDFParser.Private.convertValue(key)] = VDFParser.Private.convertValue(value) + result[convertValue(key)] = convertValue(value) end return result end ---[=[ - Converts a VDF value to its proper type. - - @param value -- The value to convert. - @return The converted value. -]=] -function VDFParser.Private.convertValue(value: any): any - if type(value) == "string" then - -- Check for number values (integers or floats) - local numberValue = tonumber(value) - if numberValue ~= nil then - return numberValue - end - -- Check for empty strings - if value == "" then - return nil - end - -- If it's neither, return the original string - return value - elseif type(value) == "table" then - -- Recursively sanitize nested tables - return VDFParser.Private.sanitize(value) - else - -- Return the value as-is for unsupported types (shouldn't happen in a VDF) - return value - end + +local VDFParser = {} + +function VDFParser.parseFile(path: string) + return VDFParser.parseString(fs.readFile(path)) +end + +function VDFParser.parseString(input: string) + return sanitizeVDFTable(parseVDFData(input)) end -return VDFParser.Public +return VDFParser diff --git a/src/Utilities/Async.luau b/src/Utilities/Async.luau index 69fdde6..2ea81ff 100644 --- a/src/Utilities/Async.luau +++ b/src/Utilities/Async.luau @@ -1,18 +1,7 @@ local task = require("@lune/task") ---[=[ - @class Utilities.Async -]=] local Async = {} ---[=[ - Executes a function in parallel over all elements in a table. - It's similar to Rust's rayon. - Pretty big upgrade compared to the previous implementation. - - @param tbl The table to iterate over. - @param func The function to execute in parallel for each element. -]=] function Async.asyncForEach(tbl: { any }, func: (any, any) -> ()) local total = 0 local completed = 0 diff --git a/src/Utilities/Filesystem.luau b/src/Utilities/Filesystem.luau index 041acc9..f5d5e34 100644 --- a/src/Utilities/Filesystem.luau +++ b/src/Utilities/Filesystem.luau @@ -3,19 +3,8 @@ local process = require("@lune/process") local Logging = require("./Logging") ---[=[ - @class Utilities.Filesystem - - Utilities for filesystem operations. Mostly a remnant from SimpleSteamTinker. -]=] local Filesystem = {} ---[=[ - Creates a directory if it doesn't exist, or uses it if it does. - - @param path string -- The path to create or use. - @return string -- The path to the created or used directory. -]=] function Filesystem.createOrUseDirectory(path: string): string if not fs.isDir(path) then Logging.write("debug", "Directory " .. path .. " not found. Creating it...") @@ -24,13 +13,6 @@ function Filesystem.createOrUseDirectory(path: string): string return path end ---[=[ - Gets the size of a file or directory. - If Lune gets a function for size, it'll become used here in the future. - - @param path string -- The path to get the size of. - @return number -- The size of the file or directory. -]=] function Filesystem.getSize(path: string): number path = path:gsub("'", "'\\''") @@ -48,12 +30,6 @@ function Filesystem.getSize(path: string): number end end ---[=[ - Converts a size in bytes to a human-readable size. - - @param size number -- The size to convert. - @return string -- The human-readable size. -]=] function Filesystem.sizeToUnit(size: number): string local units = { "B", "KB", "MB", "GB", "TB" } local unit = units[1] -- Default to "B" (bytes) @@ -70,13 +46,6 @@ function Filesystem.sizeToUnit(size: number): string return string.format("%.2f", size) .. " " .. unit end ---[=[ - Returns a table containing every filename matching a pattern in a directory. - - @param directory string -- The directory to search in. - @param pattern string -- The pattern to search for. - @return {string} -- A table containing every filename matching the pattern. -]=] function Filesystem.getFilenamePatternInDirectory(directory: string, pattern: string): { string } local result = {} diff --git a/src/Utilities/Logging.luau b/src/Utilities/Logging.luau index a44730c..4cf9aab 100644 --- a/src/Utilities/Logging.luau +++ b/src/Utilities/Logging.luau @@ -3,26 +3,13 @@ local stdio = require("@lune/stdio") type LogColor = "black" | "blue" | "cyan" | "green" | "purple" | "red" | "reset" | "white" | "yellow" type LogType = "info" | "warn" | "error" | "debug" | "data" | "speed" | "special" | "success" ---[=[ - @class Utilities.Logging +local function color(colorName: LogColor, text: string): string + return stdio.color(colorName) .. text .. stdio.color("reset") +end - Contains functions for logging to the console. -]=] local Logging = {} -Logging.Private = {} -Logging.Public = {} - --- Public ---[=[ - Writes a message in the logs. - - @param type string -- The log type. - @param message string -- The message to log. - @return nil -]=] -function Logging.Public.write(type: LogType, message: string | number) - local color = Logging.Private.colorText +function Logging.write(type: LogType, message: string | number) local time = os.date("%H:%M:%S") local logFunctions = { @@ -56,21 +43,8 @@ function Logging.Public.write(type: LogType, message: string | number) logFunctions[type](message) end -function Logging.Public.separator() +function Logging.separator() print("---------------------------------------------------------------------------------------------") end --- Private - ---[=[ - Colors a text. - - @param colorName string -- The color's name. - @param text string -- The text to color. - @return string -- The colored text. -]=] -function Logging.Private.colorText(colorName: LogColor, text: string): string - return stdio.color(colorName) .. text .. stdio.color("reset") -end - -return Logging.Public +return Logging diff --git a/src/Utilities/System.luau b/src/Utilities/System.luau index 30fb4cd..4ee508a 100644 --- a/src/Utilities/System.luau +++ b/src/Utilities/System.luau @@ -4,17 +4,6 @@ local Logging = require("Logging") local System = {} ---[=[ - Sends a notification using notify-send. - Currently uses notify-send (again) due to limitations with Lune that should be lifted with FFI support. - - @param title string -- The notification's title. - @param message string -- The notification's message. - @param urgency string -- The notification's urgency. Default : nil - @param transient boolean -- Whether the notification should be transient. Default : false - @param time number -- The notification's time. Default : nil - @return nil -]=] function System.sendNotification(title: string, message: string, urgency: ("normal" | "critical")?, transient: boolean?, time: number?) local arguments = { title, diff --git a/src/init.luau b/src/init.luau index 1d9e032..ea9f2b5 100644 --- a/src/init.luau +++ b/src/init.luau @@ -1,5 +1,3 @@ -local Application = {} - local fs = require("@lune/fs") local process = require("@lune/process") @@ -11,6 +9,8 @@ local System = Utilities.System local Steam = require("./Steam") local Launcher = require("./Launcher") +local Application = {} + function Application.start() -- Prepare folders if necessary for _, folder in ipairs({ From 97a8a098b73efab3db9d47b4c8e74280be40dbac Mon Sep 17 00:00:00 2001 From: JordanViknar <74505993+JordanViknar@users.noreply.github.com> Date: Sat, 7 Sep 2024 10:27:11 +0200 Subject: [PATCH 20/20] refactor: Use aliases --- .darklua.json | 12 ++++++- .luaurc | 11 +++++-- .vscode/settings.json | 8 ++++- src/Classes/SteamApp.luau | 2 +- src/Classes/init.luau | 3 -- src/Configuration/Games/Default.luau | 2 +- src/Configuration/Games/Functions.luau | 7 ++-- src/Configuration/init.luau | 4 ++- src/Launcher/{init.luau => Functions.luau} | 6 ++-- src/{Metadata/init.luau => Metadata.luau} | 0 src/Steam/Configuration.luau | 12 ++++--- src/Steam/init.luau | 4 --- src/Utilities/System.luau | 2 +- src/Utilities/init.luau | 6 ---- src/init.luau | 38 ++++++++++++---------- 15 files changed, 66 insertions(+), 51 deletions(-) delete mode 100644 src/Classes/init.luau rename src/Launcher/{init.luau => Functions.luau} (69%) rename src/{Metadata/init.luau => Metadata.luau} (100%) delete mode 100644 src/Steam/init.luau delete mode 100644 src/Utilities/init.luau diff --git a/.darklua.json b/.darklua.json index e052af2..5cd0537 100644 --- a/.darklua.json +++ b/.darklua.json @@ -1,7 +1,17 @@ { "generator": { "name": "dense", "column_span": 175}, "bundle": { - "require_mode": "path", + "require_mode": { + "name" : "path", + "sources": { + "@Classes": "./src/Classes", + "@Configuration": "./src/Configuration", + "@Launcher" : "./src/Launcher", + "@Steam": "./src/Steam", + "@Utilities": "./src/Utilities", + "@Metadata": "./src/Metadata" + } + }, "excludes": ["@lune/**"] }, "rules": [ diff --git a/.luaurc b/.luaurc index 093fe80..dfc464c 100644 --- a/.luaurc +++ b/.luaurc @@ -3,7 +3,12 @@ "lint": { "*": false }, - "globals": [ - "warn" - ] + "aliases": { + "Classes": "./src/Classes", + "Configuration": "./src/Configuration", + "Launcher" : "./src/Launcher", + "Steam": "./src/Steam", + "Utilities": "./src/Utilities", + "Metadata": "./src/Metadata" + } } diff --git a/.vscode/settings.json b/.vscode/settings.json index 90e05db..b486f95 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,13 @@ { "luau-lsp.require.mode": "relativeToFile", "luau-lsp.require.directoryAliases": { - "@lune/": "~/.lune/.typedefs/0.8.8/" + "@lune/": "~/.lune/.typedefs/0.8.8/", + "@Classes": "src/Classes", + "@Configuration": "src/Configuration", + "@Launcher" : "src/Launcher", + "@Steam": "src/Steam", + "@Utilities": "src/Utilities", + "@Metadata": "src/Metadata" }, "luau-lsp.sourcemap.enabled": false } \ No newline at end of file diff --git a/src/Classes/SteamApp.luau b/src/Classes/SteamApp.luau index 7abb05d..2559cd0 100644 --- a/src/Classes/SteamApp.luau +++ b/src/Classes/SteamApp.luau @@ -1,7 +1,7 @@ local fs = require("@lune/fs") local process = require("@lune/process") -local Metadata = require("../Metadata") +local Metadata = require("@Metadata/") local SteamApp = {} diff --git a/src/Classes/init.luau b/src/Classes/init.luau deleted file mode 100644 index 689f870..0000000 --- a/src/Classes/init.luau +++ /dev/null @@ -1,3 +0,0 @@ -return { - SteamApp = require("./SteamApp"), -} diff --git a/src/Configuration/Games/Default.luau b/src/Configuration/Games/Default.luau index c87bbbc..f0b6cea 100644 --- a/src/Configuration/Games/Default.luau +++ b/src/Configuration/Games/Default.luau @@ -1,4 +1,4 @@ -local SteamApp = require("../../Classes/SteamApp") +local SteamApp = require("@Classes/SteamApp") export type GameConfiguration = { appID : number, diff --git a/src/Configuration/Games/Functions.luau b/src/Configuration/Games/Functions.luau index 0fa569d..049bb5b 100644 --- a/src/Configuration/Games/Functions.luau +++ b/src/Configuration/Games/Functions.luau @@ -1,10 +1,11 @@ local fs = require("@lune/fs") local serde = require("@lune/serde") -local SteamApp = require("../../Classes/SteamApp") +local SteamApp = require("@Classes/SteamApp") +local Metadata = require("@Metadata/") +local Logging = require("@Utilities/Logging") + local Default = require("./Default") -local Metadata = require("../../Metadata") -local Logging = require("../../Utilities/Logging") local function createGameConfiguration(appData : SteamApp.SteamApp) : Default.GameConfiguration local newConfig = Default.getDefaultGameConfiguration(appData) diff --git a/src/Configuration/init.luau b/src/Configuration/init.luau index 4060c2e..61a264c 100644 --- a/src/Configuration/init.luau +++ b/src/Configuration/init.luau @@ -1,3 +1,5 @@ return { - Games = require("./Games/Functions") + Games = { + Functions = require("./Games/Functions") + } } \ No newline at end of file diff --git a/src/Launcher/init.luau b/src/Launcher/Functions.luau similarity index 69% rename from src/Launcher/init.luau rename to src/Launcher/Functions.luau index fa2e788..f9a13aa 100644 --- a/src/Launcher/init.luau +++ b/src/Launcher/Functions.luau @@ -1,10 +1,10 @@ local SteamApp = require("../Classes/SteamApp") -local GameConfiguration = require("../Configuration").Games +local GameConfiguration = require("@Configuration/").Games.Functions local Launcher = {} -function Launcher.prepareLaunchCommand(appData : SteamApp.SteamApp) : {string} +function Launcher.prepareLaunchCommand(appData: SteamApp.SteamApp): { string } -- First and foremost, we recover the configuration of the game. local ok, appConfig = pcall(GameConfiguration.getGameConfiguration, appData) if not ok then @@ -14,4 +14,4 @@ function Launcher.prepareLaunchCommand(appData : SteamApp.SteamApp) : {string} error("Not implemented.") end -return Launcher \ No newline at end of file +return Launcher diff --git a/src/Metadata/init.luau b/src/Metadata.luau similarity index 100% rename from src/Metadata/init.luau rename to src/Metadata.luau diff --git a/src/Steam/Configuration.luau b/src/Steam/Configuration.luau index 5594926..210405a 100644 --- a/src/Steam/Configuration.luau +++ b/src/Steam/Configuration.luau @@ -1,13 +1,12 @@ local fs = require("@lune/fs") local process = require("@lune/process") -local Utilities = require("../Utilities") -local Logging = Utilities.Logging -local Async = Utilities.Async -local Filesystem = Utilities.Filesystem +local Logging = require("@Utilities/Logging") +local Async = require("@Utilities/Async") +local Filesystem = require("@Utilities/Filesystem") local SteamUtilities = require("./Utilities") local VDFParser = require("./VDFParser") -local SteamApp = require("../Classes").SteamApp +local SteamApp = require("@Classes/SteamApp") local function VDFHandler(filePath: string, errorMessage: string, logging: boolean?): any if logging == nil then @@ -168,6 +167,8 @@ type compat_vdf = { local Configuration = {} function Configuration.getSteamConfiguration() + local timeStart = os.clock() + --[[ Chapter 1 : We recover the Steam user config so we can get the last active user. And also the SteamID3 to access their settings folder. @@ -267,6 +268,7 @@ function Configuration.getSteamConfiguration() end) Logging.write("info", "Found " .. steamAppCount .. " Steam apps.") + Logging.write("speed", timeStart) Logging.separator() return steamApps diff --git a/src/Steam/init.luau b/src/Steam/init.luau deleted file mode 100644 index ecfe316..0000000 --- a/src/Steam/init.luau +++ /dev/null @@ -1,4 +0,0 @@ -return { - Configuration = require("./Configuration"), - Utilities = require("./Utilities"), -} diff --git a/src/Utilities/System.luau b/src/Utilities/System.luau index 4ee508a..47c6946 100644 --- a/src/Utilities/System.luau +++ b/src/Utilities/System.luau @@ -1,6 +1,6 @@ local process = require("@lune/process") -local Logging = require("Logging") +local Logging = require("./Logging") local System = {} diff --git a/src/Utilities/init.luau b/src/Utilities/init.luau deleted file mode 100644 index c2269c9..0000000 --- a/src/Utilities/init.luau +++ /dev/null @@ -1,6 +0,0 @@ -return { - Logging = require("./Logging"), - Filesystem = require("./Filesystem"), - Async = require("./Async"), - System = require("./System"), -} diff --git a/src/init.luau b/src/init.luau index ea9f2b5..fc0bd39 100644 --- a/src/init.luau +++ b/src/init.luau @@ -1,31 +1,33 @@ local fs = require("@lune/fs") local process = require("@lune/process") -local Utilities = require("./Utilities") -local metadata = require("./Metadata") -local Filesystem = Utilities.Filesystem -local Logging = Utilities.Logging -local System = Utilities.System -local Steam = require("./Steam") -local Launcher = require("./Launcher") +local Filesystem = require("@Utilities/Filesystem") +local Launcher = require("@Launcher/Functions") +local Logging = require("@Utilities/Logging") +local Metadata = require("./Metadata") +local Steam = { + Configuration = require("@Steam/Configuration"), + Utilities = require("@Steam/Utilities"), +} +local System = require("@Utilities/System") local Application = {} function Application.start() -- Prepare folders if necessary for _, folder in ipairs({ - metadata.folders.config, - metadata.folders.gamesConfig, - metadata.folders.cache, + Metadata.folders.config, + Metadata.folders.gamesConfig, + Metadata.folders.cache, }) do Filesystem.createOrUseDirectory(folder) end -- Development version detection - if metadata.version:find("dev") then - Logging.write("warn", "This is a development version of " .. metadata.name .. " !") + if Metadata.version:find("dev") then + Logging.write("warn", "This is a development version of " .. Metadata.name .. " !") -- Put the arguments inside the cache folder for testing purposes - fs.writeFile(metadata.folders.cache .. "/arguments.txt", table.concat(process.args, "\n")) + fs.writeFile(Metadata.folders.cache .. "/arguments.txt", table.concat(process.args, "\n")) end -- Check if we're launched through Steam, start the game with its settings if so @@ -38,7 +40,7 @@ function Application.start() local ok, steamConfig = pcall(Steam.Configuration.getSteamConfiguration) if not ok then Logging.write("error", "Failed to load Steam games.") - System.sendNotification(metadata.name, "Failed to load Steam games.", "critical", true) + System.sendNotification(Metadata.name, "Failed to load Steam games.", "critical", true) process.exit(1) end @@ -46,22 +48,22 @@ function Application.start() local gameData = steamConfig[launchedAppID] if not gameData then Logging.write("error", "No data found for game with AppID " .. launchedAppID .. ".") - System.sendNotification(metadata.name, "No data found for game with AppID " .. launchedAppID .. ".", "critical", true) + System.sendNotification(Metadata.name, "No data found for game with AppID " .. launchedAppID .. ".", "critical", true) process.exit(1) end -- Tell the user we found the game Logging.write("success", 'Detected "' .. gameData.name .. '" (' .. gameData.appID .. ") !") - System.sendNotification(metadata.name, "Detected " .. gameData.name .. ".", "normal", true) + System.sendNotification(Metadata.name, "Detected " .. gameData.name .. ".", "normal", true) -- Go into the Game Launcher module. - local command: {string} = Launcher.prepareLaunchCommand(gameData) + local command: { string } = Launcher.Functions.prepareLaunchCommand(gameData) print(command) else Logging.write("info", "Launched without Steam.") -- :( - Lune FFI is not implemented yet, so no interface. - System.sendNotification(metadata.name, "No graphical interface implemented yet.", "critical", true) + System.sendNotification(Metadata.name, "No graphical interface implemented yet.", "critical", true) error("No graphical interface implemented yet.") end end