initial commit

This commit is contained in:
zenobit 2023-03-10 06:47:49 +01:00
parent 25069872e5
commit b8464964ce
54 changed files with 7530 additions and 891 deletions

20
.gitignore vendored Normal file
View File

@ -0,0 +1,20 @@
config/vms_ready/
config/vms_supported/
#*.chunklist
*.conf
*.dmg
*.fd
*.img
*.iso
*.lock
*.log
*.msi
*.part
*.permall
*.pid
*.ports
*.qcow2
#*.sh
*.sock
*.xml
*.zs-old

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 Wimpy's World
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

52
README.md Normal file
View File

@ -0,0 +1,52 @@
Welcome to
### [yadEmu](https://github.com/oSoWoSo/yadEmu)
### Still Testing version!
![yadEmu](yadEmu.png)
quickly create and run VMs
Using excellent [quickemu](https://github.com/quickemu-project/quickemu) as base
I added:
### quickgui
using yad
It will simple generate .desktop files for every supported VM in quickemu.
So you can copy it anywhere...
And I mean every supported distro.
you can download new distro with few clicks of a mouse
You need to run quickgui just for update.
See it in action on youtube...
[![quickgui](https://img.youtube.com/vi/JtjIseqZMkQ/0.jpg)](https://www.youtube.com/watch?v=JtjIseqZMkQ)
or command line?...
### quicktui
using fzf
[![quicktui](https://img.youtube.com/vi/gJ5hqYEskOw/0.jpg)](https://www.youtube.com/watch?v=gJ5hqYEskOw)
### Testing version!
# Without these amazing projects it wouldn't be posible:
[QEMU](https://www.qemu.org/)
[bash](https://www.gnu.org/software/bash/)
[quickemu](https://github.com/quickemu-project/quickemu)
GUI depends on
[yad](https://github.com/v1cont/yad)
TUI depends on
[fzf](https://github.com/junegunn/fzf)

44
addnewtoquickgui.sh Executable file
View File

@ -0,0 +1,44 @@
#!/bin/bash
yad --form --field="Name" "" --field="Releases" "" --field="Editions" "" --field="URL" "" --field="ISO" ""
# little script for adding distros to quickemu
# This version use desktop files and notebook
#TODO ADD_PRETTY_NAME_${DISTRO}
${DISTRO}) PRETTY_NAME="VX Linux";;
#TODO ADD_NAME_${DISTRO}
${DISTRO} \
#TODO ADD_releases_${DISTRO} function
function releases_${DISTRO}() {
echo 6.1 5.0 4.2 4.1 4.0
}
#TODO ADD_editions_${DISTRO} function
function editions_${DISTRO}() {
echo
}
#TODO ADD_get_${DISTRO} function
function get_${DISTRO}() {
local HASH=""
local ISO=""
local URL="https://github.com/dessington/${DISTRO}/releases/download/${RELEASE}"
if [ "$RELEASE" == "4.0" ]; then
ISO="vx-linux-4.0-qt.iso"
else
ISO="vx-linux-${RELEASE}.iso"
fi
echo "${URL}/${ISO} ${HASH}"
}
function get_voidpup() {
local HASH=""
local URL=""
local TMPURL=""
TMPURL=$(wget -q -S -O- --max-redirect=0 "https://sourceforge.net/projects/vpup/files/latest/download" 2>&1 | grep -i Location | cut -d' ' -f4)
URL=${TMPURL%\?*}
echo "${URL} ${HASH}"
}

View File

@ -1,6 +1,6 @@
[Desktop Entry]
Type=Application
Name=About
Name=About yad
Exec=yad --about
Icon=/home/zen/.config/quickemu/vms-icons/cereus.svg
Icon=/home/zen/.config/quickemu/vms_icons/cereus.svg
Categories=System;Virtualization;Settings;

6
config/add_distro.desktop Normal file → Executable file
View File

@ -1,6 +1,6 @@
[Desktop Entry]
Type=Application
Name=About
Exec=yad --about
Icon=/home/zen/.config/quickemu/vms-icons/cereus.svg
Name=Add new distro
Exec=sakura -h -e /home/zen/.config/quickemu/add_distro.sh
Icon=/home/zen/.config/quickemu/vms_icons/cereus.svg
Categories=System;Virtualization;Settings;

4
config/add_distro.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/bash
yad --form --field="Pretty name" "" --field="Name" "" --field="Releases" "" --field="Editions" "" --field="URL" "" --field="ISO" ""

19
config/check.sh Executable file
View File

@ -0,0 +1,19 @@
#!/bin/bash
# DEBUG mod
#bash -x quickyad 2>&1 | tee output.log
# YAD gui script for excellent quickemu
#TODO Download Icons
#TODO Add homepages to right click
echo "Running..."
# dependencies checks
if ! command -v yad >/dev/null 2>&1; then
echo "You are missing yad..." >&2
exit 1
fi
if ! command -v quickemu >/dev/null 2>&1; then
echo "You are missing quickemu..." >&2
exit 1
fi

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=Renew supported VMs
Exec=renew.sh
Icon=/home/zen/.config/quickemu/vms-icons/tux.svg
Categories=System;Virtualization;Settings;

View File

View File

@ -0,0 +1,6 @@
[Desktop Entry]
Type=Application
Name=Renew ready VMs
Exec=reload_ready.sh
Icon=/home/zen/.config/quickemu/vms_icons/tux.svg
Categories=System;Virtualization;Settings;

40
config/reload_ready.sh Executable file
View File

@ -0,0 +1,40 @@
#!/bin/bash
echo "Updating VMs..."
QUICKEMU_VMS_DIR="$HOME/.local/share/quickemu"
CONFIG_DIR="$HOME/.config/quickemu"
ICON_DIR="$CONFIG_DIR/vms_icons"
export "QUICKEMU_VMS_DIR" "CONFIG_DIR" "ICON_DIR"
# create default dirs if they are not present
mkdir -p "$CONFIG_DIR" "$CONFIG_DIR/vms_ready" "$CONFIG_DIR/vms_supported"
# remove desktop files (ready to run VMs)
rm "$CONFIG_DIR"/vms_ready/*
# Enter quickemu VMs dir
cd "$QUICKEMU_VMS_DIR" || exit
# check for VMs .conf files (ready to run VMs)
for vm_config_file in *.conf; do
vm_desktop_file=$(basename "$QUICKEMU_VMS_DIR/$vm_config_file" .conf)
# Use fuzzy matching to find the best matching icon file (ready to run VMs)
icon_name=$(basename "$QUICKEMU_VMS_DIR/$vm_config_file" .conf | cut -d'-' -f -2)
icon_file=$(find "$ICON_DIR" -type f -iname "${icon_name// /}.*")
# If no icon was found, try shorter name (ready to run VMs)
if [ -z "$icon_file" ]; then
icon_name=$(basename "$QUICKEMU_VMS_DIR/$vm_config_file" .conf | cut -d'-' -f1)
icon_file=$(find "$ICON_DIR" -type f -iname "${icon_name// /}.*")
fi
# If no icon was found, use a default icon (ready to run VMs)
if [ -z "$icon_file" ]; then
icon_file="$ICON_DIR/tux.svg"
fi
# content of desktop files (ready to run VMs)
desktop_file_content="[Desktop Entry]
Type=Application
Name=$vm_desktop_file
Exec=quickemu -vm \"$vm_config_file\"
Icon=$icon_file
Categories=System;Virtualization;"
# create desktop files (ready to run VMs)
echo "$desktop_file_content" > "$CONFIG_DIR"/vms_ready/"$vm_desktop_file".desktop
done
echo "Done"
exit 0

View File

@ -2,5 +2,5 @@
Type=Application
Name=Set working dir
Exec=set_dir.sh
Icon=/home/zen/.config/quickemu/vms-icons/cereus.svg
Icon=/home/zen/.config/quickemu/vms_icons/cereus.svg
Categories=System;Virtualization;Settings;

1
config/set_dir.sh Normal file → Executable file
View File

@ -0,0 +1 @@
#!/bin/bash

View File

@ -1,4 +0,0 @@
# distro-svg
Collection of distro icons in svg format, if your favorite distro is missing open a issue, PR are welcomed . \
note that these are not mine, I just collected theme from various places .

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -2,789 +2,188 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="78.316666mm"
height="78.316666mm"
viewBox="0 0 78.316666 78.316666"
version="1.1"
id="svg5"
id="svg2"
width="118"
height="128"
viewBox="0 0 118 128"
sodipodi:docname="vxlogin.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="vxlogo-master.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs6" />
<sodipodi:namedview
id="namedview7"
id="namedview4"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.74029882"
inkscape:cx="-4.7278206"
inkscape:cy="234.36482"
inkscape:window-width="1338"
inkscape:window-height="713"
inkscape:window-x="496"
inkscape:window-y="214"
inkscape:window-maximized="0"
inkscape:current-layer="layer1"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<defs
id="defs2" />
fit-margin-bottom="0"
inkscape:zoom="6.4921875"
inkscape:cx="57.684717"
inkscape:cy="64"
inkscape:window-width="1920"
inkscape:window-height="1057"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g8" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0.20165412,-86.646721)">
inkscape:label="Image"
id="g8">
<image
width="78.316666"
height="78.316666"
width="118"
height="128"
preserveAspectRatio="none"
style="image-rendering:optimizeQuality"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASgAAAEoCAYAAADrB2wZAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA
B3RJTUUH5gwXBSAp1QquPQAAAAFvck5UAc+id5oAAIAASURBVHja7P1XkCRHmiYI/qpqzLmHB+ck
Oc8E5wVSVUChqrqqu6e7p2dvZuTk5ER2H+7hnu713m4f7lZOZkd2Z+/kZqZ3p6d7p3uqq7sIUEAB
VUABiUwkQSKRPCMzOA/3cO5uRPW/hwiPtLAwcx4kkf6JmLi5u7mbqpraZz9XAi08LiB73YBvGXCv
G9BCZbQm/f5H6xrtPFpktU/Rmvz7E63rsndokdU+QutG2D9oXYv9hRZR7QO0boq9x368BnvZpv1I
DPuxTU8E9uPN8aRgL8f+cb3ue00Ue33+Jw6P60R9nLHbY17P+Xa7jY3e+LtNHC2i2iW0CGp3sFvj
XO15SIO/r+b4em9irPKzWv9jJ9Aiqh1Gi6B2Hjs5xtX8N6nhN7UeW4mgKt3A6PiPSr/BCu+r/V2z
0SKqHUKLoHYOOzW21RJMLVISqeK3tZAXQHXkVOnzRvYbaVu9aBFVk9EiqOZjJ8a0WrIp974cCXn9
rhxRebUJXY6vVvKpRDyVXiv9TzXtbQZaRNUktAiquWjmeFZDSuX2nUTidmwtxzjb4PY5uvze7btK
xIJV/gZhq1pYyznc0GxiaRFVg2gRVHPQrHGsRbVye62WeEiDv6+333bSqJZ83Pbtn3n9ptzvwGXf
q63NQIuo6kSLoBpHo2NYiZQqST7Offvx1OV4WsXvqyEqr/a5SVHVqmhuEpHX+0rHlft/5z6AN4k0
i1xaJFUHWgTVGBoZv0r2Iud+6dVOOm4EUzrG7TsK24nI7RiAykRVIqNqx8BNghGO75u9QR37zjZC
FZ/XghZR1YAWQdWPZgVAVrL/eBFJuY1W+Tmt4r8AtktdXu0uEVY1RutqyEW4fC5qfF+txFVOnXSi
RVS7hBZB1YdGAxqrUdvcJBgvgnH73O27csd7ERZ1nH9bu2VFJpIkAaV0k5445yiEACEEAgIiIuGC
I+CWm99OJgDuRCNcjhV1HOP23wDlCQxgZ8mqRVIV0CKo2lHLmFXjvq+kcrlJO3ZCcSOj0isr854C
ANkApYwSSZKYrMhEURVJURWmqApTlPVNVmQmyRKTJIlQSimhBGCdnKjP75NUTWWSLFHGGAEAQEAk
SECAEJZpiUwyY+WyOTOfy5u5dM7MpDJmLpfjkrxObCgQLcsSlmUJy7S44EIIFAIFOsnGjZScG3q8
9yKxWsiqRVS7iBZB1YZ6U0kq2XLc7Epu0lDpfYlonIRT1UYppYwxShmlkizRaCyqdPV2aZ3dnb62
9rZAKBoKBkIBv9/v96ma6lc11a+oik+SJU2SJEWSJYVSKlNGGQFCcB2wISoRAoQAAEFAIEAQBQoA
MAUKnVs8r+t6Ti/qeUM3dL2g64VCQdcLerFYLBZymVwxl80VU2spfW11TU8mkkYmlTEKhQLnJudC
CIGIdgLi4E5SXpuT6NzeV2uUd0MzU3yeeLQIqno0klZSTn0rp1Y5JSRme89cPit9TgkhrEREvoBP
CkfDalt7m9bZ0+nr7OsMRNuigVAkFApFQuFgKBjVfFpUUZSIJElByqifUKJRQhVCiEIoUQgQCQhI
hBC5tAEC29DYnGpbaSv1mRJCGCAQBBSAYCBiUaAoosCiEKIouNA550XOedE0zaxpmOliobiWy+YS
yXgysbywnFqYXcjMz8znVpdW9VwmZ5qmyYUQAnAbUTlJq1oSq0aycqqH9lc7WkTVBLQIqjrUSk5e
ElMl47UXGW0hH7fXDTJiml+Tw9Gw0tHdoXV0dfg7ejqC3T3dsUgs0h6KhDoCwUC7oiptiqLEmMQi
jLEAocRHCNEopXID/a8XmwZxRLQTAwEALoTIcc6Tlmmt6kV9KZ/Nr6RT6dXESiKxsrSSjC/H0/Hl
eC6+HC8mE0kjn8ubpmFyIQRHRAu2k5TztZKkVavH0Kt/9YzJE48WQZVHvVJTNcTkJiVVIiP7Rgkh
jDEmqZoqhaIhube/NzA4NhgdPjjc0dXb1R2OhruDwWCvoiidTGJtlNEAIcRHCFEJIZJLO/ctNsjL
RMSC4CLHOU+bppnUC/pqPpdfSSVTS6vLq0vLc8uJ+Zn51Pz0fG51eVUvFooWtzgXQpTIits24bJf
SbqqlqSqDQgt2+29Hve9xr6fmHuISmNTiZiqkZTs0pJTfXPbJEIIYxJjgWBAHhgZ8B8+cbht6MBQ
V29/b38kFhnx+/2Dsir3McbaKaWao13fFiAA4AZpWYhoCCEKlmUljKKxkMvkpuMr8anZydm5ifsT
8YnxiczK/EpRL+qWZVkWItpJigOAF3k1IlkBbCeYljRVI75tE7dZqJec6lXfWJlNopQyRVXkju4O
36ETh8Jjh8c6+of6+2MdsaFAKDCgamqPLMsRSmloQ12T4dtJTJWAsK4WFoUQKdMwF/LZ/GRiNfFw
4v7ExO2vby+N3x7PJFYTumVZFgq0bGqgBY/Iyk2qKr26eQh3mqieWJJ60iZwNSA1fFdNoKSX+mZX
3STbZxKs25Qkza/Jvf29vtEjo5HB0cHO/qH+/s6ezqFQJDSkqmofk1gnpTToUNdaWAcCAhcoioKL
tGmay4VcYTa5lpycn56fnLg/sTh+azwxOzWby6azuhDCLk05iaqSZFUuYPRRe1pEVTNak3orqiWn
cl64cralbdKR/ZVQIqmqKrd1tGn9Q/3BkYMjsQPHDvT3D/UfjLRFjqmaeoBSGm0RUs1AWDfCG0KI
nGmYy4V8YSaZSD5YmF14+ODug/m739yNL80tFbLprGFZlgmNkVU5b6D91blfbV+eGLQm+SPUSk7l
Iri9jN2S2yuTmKz5NSUUDqlDo0Oh5157buDg0YOnorHoaVVThyijIUKI1iKmpqFEWLphGLO5bG58
dWn1zuT45Pjta7fnH9x5kF6LrxX1om5uqIBOonIjrHLBpM02pD8xJNWa7PURkxs5uYUFOFW3TWIi
hEiEEFmSJWlwdDD48ndf7jt66ujx9s72Y/6Af0iW5W7KaJgQokDrOu0kBCIanPOUoRvT6VT61uT4
5Dc3v7o5ffPqzURiJVHM5/KGg6icElY5L2AlompJU2XwpE/8RqQmpyrn9MLZpST7JlNKWSQW0Z56
4am2M8+dOdA/1H+0rb3toObXRiRJ6iKEaNC6NrsNREQTBeZMw5zP5XLj89PzX1/78tqdq+evriRW
E/oGUZmwTkwWPCIqN6mqHElVCvZsSVMbeJJvglrIySvxtpwXToZHJCUDgCwrstwz0ON79uVne46e
OjrWO9h7ONIWOa6q6iHKaAC2JuO2sFdYN67rlmUtF/KFh6uLq9/cu3nv1se//nhyaX4pX8gXTECw
E5WbGuhlp3KTqAAak6a+tST1pBJUteRULkHXLYBym7QEAJLm05Thg8PBM8+d6Tl09NDo0NjQ6XA0
/IwkS/2wVTprYf+BW5a1WiwUJxIriW8e3nt48+InFyduX7+dzGVyOjySpOyvbiRlJ6tysVQA9RHV
t5KknsSbohpy8krYdSMmN1VOgRIxHRgOHj97vOvU06fGRg6NvOrz+Y4zxqKEEnXjdy3sfyAAoBAi
rxf1iWQ8eW1yfPL65fOXx29du7W2urRagOqJyhlTVa4EjP38tbT1W4MnjaBqJady8UsSuEtMsi/g
U/sG+wKDo4OR177/2onhA8Ovb9iXOimlfnjyxv3bAgQEFEJkuMmX4qvxCw/uPrh2+fPLD25fv51M
rCSKNhuVlwroJKpKhfa2nr/adn5L8KTdKKTC514F39xil0o2pk1ikhVZ6ejq8A2MDgR+8Cc/eHpg
ZOCFQDBwUJblfkKJb68730LTgADAOedJUzfnV5dWL9y6duvK1QtXZ+/evJvKZXIlY3otql818VPO
/UptfOzxJKkYtZKT3Ru3hYg2NgUAVABQGWNqIBjwHT11NPqn//pPn3r9B6//qG+w741AKHBGkqTu
jdSTFr49ILBeV8vHJNYeCAWGe4d6B0cOjqi+gC/HOReZVAaFEG5OlXJpUQDb56Pbuatt42OPJ4Wg
Kql25VQ6OzkpG68qAKiEEJVSqh06fij8J//yT4699aO3vjtyaOTtcCT8vCRLvS1i+taDbNTdCsqK
3BOOhMeGxob6BkcHCSLmMukM14s6QcTSfALwzkgAl+89z1tt+/Z6gBrFk0BQ1ZKTXZ1z2pi2ERMA
aN393cEf//Mfj77907dfPnLqyLuxjthbsiz3bQRXtvAEgRDCKKMhVVMH2jraxsYOj7V39XYVc5lc
IZlICkQkgJ6BvgDVkVUlcnNt2l6PTSN4rBvfYP+8PHV2W5MMLmqdP+hXX37r5e5zL5w7evDowRcj
0cgrG1UEWlHfLQCsB30axULx7sriyhdXvrhy4b3/+t5Eei1tcM4NADBg3S5lt1FVG5YAUJ+X77G0
SX2bJahqPHZusU1Octq0NQGAdvzc8ei7/+zdw6+89corY4fH/pk/4D++kZLSypNroQRCCJEkSWoP
R8PHB4YHOg+fOEwpo/mJ+xM6VF6fcNv/lfmu3Oe1HrPv8CQTlJvNyWkM3ySmUCTkf+tHb/W/+e6b
p849d+7PorHoy5Is9VBKffCYXvwWdhaEEEoIkRVV6Y11xg6MHBwJDY4O6mvxtXw6lRYo0E3l2/w5
1DavvpUk9W0lqGqlJzfJyW5vUiRZ0o6dOdb25rtvjrz5wzd/ODA68K7m045SRqOEkFZqSguVQAgh
EqU05A/4B3sGevqHx4a5oiqFpbkl3TAMr0qs9vfVqmffOpL6NhJUNdUw3WKc7J46BQDUcDTsf+61
57p++Gc/fOb0s6f/JBKLvCrL8kDLO9dCrSCEUEqpT1bkrmgs2j88Nhzs6O4oLM4tZrOZbGmRCK+0
p3ILckCZY6GBY/YFvm0EVQ05OT1228hJkiWtd7A3+NYP3xr4wZ/84Cd9g31v+4P+pymlgSrO0UIL
ntiwTcU0n9bb3dfd2T/crxfyhUw6lRamYQJ4x0QBbE8mJ2X2ay1bvS/xbSKoap8cznCCLQQVCAW0
vsG+4L/87/7lc0+9+NRPYx2x78mKPNIygrfQRBDKaEDV1N62jrbewZFBpJSmUsmUlc/mS9KUM26q
kvEcobzkBWV+v2/xbSGoWsjJXlxu0yhOKFHaYm3+5197vuMv/89/+c7wgeEfh8Kh1wklQWiVQWmh
+SCEEFlW5O5wJDzYP9wfCIaCa6m1VDGXzgkhxOZxUH31jW8dSX0bCKqWqFpX25MkSWogGFD/5X/3
L4+89v3XftTV1/VniqIc24hrapFTZSAAEPLoUpRuFLcbpoWtIIyxsD/oH+kd6O3qHegtLi8sJ7KZ
rLAsq5y6t+U/Kp2jwe/3DI87QdVCTm4BmZIkSfLg6KDvv/2//bfPHz9z/E8jbZEfM8Z6bUs3PekQ
sE4+JgGCjDITEIoUaB4FZiihBRCQoUBzQog0IGQEFxlGmQ4IRRSYAwALEIqUUAoIBgAgEKDwyDv1
pI8zIYQoiqr0xLpiQyOHRnB+en6+kC8IQzfs41NPWky1x+7La7AvG7UDbXezPckAoJw8ezL4r/8v
//q1vuG+/6MkSScope2P+bjUinXphxCBiIISKgQXGUKIxC0+RylV9KI+Swml3OSrxWLRMA0zY5qm
YJSJYrFoAgAUioUCo0xSVIXIkqwU9aLJZKZQQlkgEAgiIJNlWUOCiizJfiaxMKGEKarShYCMEioB
gSCs12unCAiI+CRdh/WLgWgILlILswu/eP/n77//5adfLq2trhVgPfrcvtnLuLjVQ/cq21IpZGFf
RZw/rhOgnidHyfZkL8mr/vf/83//1OjR0f87oeQIISS81x3bBZTUMR0QCpRSyk2+AAAin83f1wt6
1iga07Ozs/lcJre2Fl8rKrIi7t66m/L5fSS5ljQM3RCqqsLczFyxvbNdTq2lrPbOdtnQDY6AxDAM
AQgQDAaZoilMCAGSJLFcLmeNHhwNcZOL9o52n6zJfkVW6MDQQKc/6Pd3dHYEdKH3UEYDkXDkIGEk
CgR8iEgRUH1iCAvBEkJk46vx31345MIvf/33v36wurhaIikdtqfKlKuF/liT1ON4wWttc+l4p9dO
GRkb8f0P/5//4V+jiv9XgSK21x3bCRAgiICEACkIIQpCiBw3+BwBomeT2bv5bD574+qN67lCjsSX
46mPfvNRqqe3h64sr5iCC65qKhQLRUEoQUAQnHNkjCEXHFEgMMawZNBFRCSE2Mcc1j8ihFIKnHNC
CCGISCRJIkIIgoDU5/OxYqEIB44c8EXbovLhY4fbOjo6fO097T2qT436Q/5Of9Dfo6hKjyRLbZRS
jVIaALL5sHkc53ElCMFFNpPOXLp+5fovf/G//+LGxN2JDGwlKack9a0jKWmvG1Aj6p2IzhgRBgAs
1h5TZVU+YoAR2OuONRsESBEFWkKIuK7rS0SQ5Pzc/G2hi+SFTy/cVFRFvvj5xaXpqWkz4A+IbDa7
ObHnZuY2J7eVtdYTVfmjSW5ZFpT2OeelUyIAACJubQYAQUTYOI5sfE83DMAUAGg+lycAQB7cfZAH
AHLlwpXVQCggaz7tfiQaUaLtUe3AkQPtvf297W0dbR1t7W19gVCgR9XUXlmRewglmm0lnG8LWVHK
aDgUCb1w7rlzmt/v973/s/evXfvy2pptbO2vXiiRVOm4WqLS95ykHieCaoScXI3k3OIMEVWgQPf+
UjQ6OEQgIEWBi8IS2WK+OJHL5BYSy4nJ+3fuT6XWUrkLn15YAQCRXEsauq5vPm2z2ayzsmOlwv5e
lR7LRTd71XvfvC62Am80k8rQTCpD48txRghh927cWwUCrK29Te3s7vSPHBqJDY0Odbd3tndH26OD
wXBwWJbldiaz2EZZZXsNpscWlNJAIBR4+sjpI7KkSoov6Lv6xcdfrDjG1n4N3EoFA2w4O2CrY6LS
rN9zknpcCKpRycm1Wubxk8cjlNL2jTo9jyUooQYAENMw7xfzxYW1lbVby4vLixN3J2bu3LiTWF5a
zi3OLxoAwIUQ5Up6OFfGBai8PJI9nAAcn3ldB/v1KO17rp6zQVosnUpTAGCZdIbNTMwk79y4sxII
Bh62d7Rrp86eig2NDMWGDwwfau9uP6b61TFBRFSACCPiY5+WRAjRAoHAU4ePHVZUWVV8Pt/lj3/1
8aLHOJc2y3E9KDyGJLXfCaoR4vC6KUoqnrS6siosYTEk+Dg9aREAgFs8rioqW1tdu8wtvnTnmztf
ryyuxD/7+LPZXCZnriXWdMMw3GwTXquLOBeWBKhOanJO3mpKKzuvB8AjacdrYVQKABQFMgRk2XSW
ZdNZtjS/lL11/VaSEDLV2d15e2h06KO+wb7gc688d7J/uP9cMBI8CQTCQMAP+3++e4IQIvn8vjMj
h0bk70rfZbIiX/r4lx/Pm6bpPNR+Pbhtv0ROzuP2XEoqh/18wZop1bimuJw8c7KLMRa1uPU4EBQn
QAjnfNnQjXkzb07enbz7zezk7Nz9O/dXLp+/nOCCm4V8wenZKbmhyy3NXWl5boD6jKzVSFKlV1e1
D7ZLv84VnBkAMESUlheX9ZWlldzVi1cTVy9cXT1x5sTXx04f6zl0/NDJts62M4qmnAQCJW/g4yg1
E82nHR8aG5K+8853KCJe/PQ3ny4WC8Va/sP5ACqNf7nruWcktl8JaicmzxaSopRKiqb4EdGH+/cB
AgDAEdEEDquWaU3NTM98E5+L37lx/cbC5Phk8vaN2xlKqWWtW67dVg6pdnXbSuQELvtun5EqPice
n1XaqMu2ZUVnRJQQUZqdntWXl5az5z85vzgwNHD/9bdf/+rQiUNHO3s6T6s+9QBhpAMAtL2+uHWA
qJp6eGhs6Kev/+B1ahrmZxc/ubiSz+XdjnW7pgIeqXsA+5yk9iNBNVtyKr3an8hM0zQpEAwEgEJg
81LtL3BA0HVdX0AD7ycTyYcfv//xpXwmn/78958vW5Zl6UXdQERLCFENMSFsXYfNza5UzVJH9U7S
SikalWoibbuGUJ6sJEM3mGEY8p2bdwrzc/PZsUNjkwePHvzy5LmTh/uG+84Ew8GTkiINwPp98DhI
0ZtjpSrqgeGx4T/5/k+/T03T/N3VL67G89lNkqq0rHq96t6uk9R+S3XZKbXOPnkVWF8qSvvBT39w
PNoVfVOg8O91x20QBEiem3x5cW7xo/Ry+ovLn1/+7Jc/++VX5393fn5ifGKtWCgWLcsqwno8jD0m
xi2Az05eXpKUV8xMpYUk7ahG5fN6oju/L7dOnFNd5WU+2yRrvaibq8ur+vzMfGb8zvh8YjnxwOfz
LamKmlVVVQMCbCOu6vEgKgKESSwcCocGuvu6i8sLy3OpRIqbpunlTW0WueyqarxfCGonbAJuycGl
sipqV3dX4LvvfvdEoC3wHYFiP6zCgpTQIgGSXl1a/eSbq9/8/N71e19/9KuPbnz6u0/n56bm0pZl
FYQQbsTktkgkh+qIqZKXzm1123IqYS0EV05ac/tvN+Kyb06y2mKHE0JYhXzBTK4lzamHU9mbX9+c
y6azk4SQWVVV80xilFIqPUaLX1BKqT8UDY30DfYVxu+MT+VzebQsq9z1K31OXD6D/dbv/UBQOzUg
bhLUZq3xjq6O4Pd+9L3nZZ/8AsLeevEIkCIjLJteS3955/qdn1387OL5f/rrf7o9OT65On5vPGXo
RgERC7CVmLxWrvUyhpczgjeygm0lVKpo4PZkr0SYbpubwd+VvBCRW6bFs+ms+eDug8zc1NxyIVOY
VmRlSfNpBmWUEkrUxyFhfGNdPi3SFhkbGhvK3b5+e7pYKArOeTlbYaUl1fdNYvFeE9ROklPp1Z6D
J8HGunZt7W3Bd/7ondepQo8h4N6MA4JJCMnpef3W9Pj0L658ceX3v/i7X3zz1YWvllLJVD6bzeYB
oLixOaWl0lJFdimpEjEBbH+qNqK21QonGdVy/StJWeXIyUs15EIIEV+N6/fv3M9Mjk8uZVKZGQJk
QdM0U5ZlmTHmh72/T8oPKiGMUCJHIpGekYMj+cnxycVMMsOFEF4Pn2rjnxr5vinYy4HfyQ46gwCd
ZX21U2dPtb30+kvfQ4ajsPt2B4ECi5ZpTazMr3xw/dL133zywSdfv//z9yfjq/GcoRsFWCclLzWu
JCmVCyFwIyIBlSfmfnFpus0PL5Kyf+YlcbkR1+bYcc55YjWhT4xPpJbml1Ysw5rTFC2h+TQiSZIf
CGiwj6WpjYUZ/MFwMNrd152eeji1mkqkSnFQXmqzc/yquQa1fN8w9oqgdrpj9uC/zcBMeCRBaafO
nmp76sWn3hZE9O9Ce+zgpmEuJePJT+9ev/uLy+cvf/W3/+Fv701PTK+ZpqkjYjkbkz2uqVxSKEB1
k3C/kFE5lLs25W62ckZ3L6ISlmnx5cVl/d7te8nFhcVFQzemQqFQVtVUiTLqBwLqXg+I50ARIkuS
1BaKhHzRtujqzOTMWiaVsXtuAbznyL7EXhBUrUXmavmN87d2G1RpSSmVMaa99uZrfUdOHfmRANG2
az1HKKTWUhenxqd+fePqjQsf/tOHd7/87MslwzDKGb/dgi69DN8A5Sffvp+QVaCauVDJ0C7K7AsA
EKZpioXZheLk+GQysZqYVzRlJRAMcEmWfJRQFci+DNEBQoikqEpPuC0sIeDszMRMRi/otT68alHD
d/ThvtsEVU1nnR69akqelvsf55p3KiJq7/7k3QO9w73fFSCCO91pRDSJIHNL80sfXr96/aMvP/3y
xns/e29qdWU1a1lWSZ1zCxXwimuqJqASynz2bYNbwqyz/27hDW6S1JbPCvkCn3owlXt45+Gy3+df
iUQiRV/AFyWElEhqv6l9hBBCFVXp7OrtUjnncw/vPswKLsqNjXO/3PjW833d2E2CqqWTlfK5qjmX
M4Bvk6BUTfX90Z/80bFod/Q7AsWORRMTICi4WEMLx1cXVn/30fsfffLz//Tz2xP3JtYMw8gjolsc
k1fQpT1vrt6J9m1HJXWwBK9cQ0+pKpPOmF99+VVi4t7EVP9AfzraFg3JityFiBT2IUlRSlVFVcJd
PV3ILb704M6DrGMcqn3AVX3OnejIfiCochKTW1RxNYPhVPFK4QXrC3KGw74f/skPn/NFfC8h7owH
jxCCBEgil81dW5xc/PSv/pe/+vj8x+fnisVinlvcHjJgwlZ1zqvwGEB5+8GTTExucIuUruR6L+cR
REQU8ZW4cfPazTnLtO5193TrPp+vjZB9ufIPYYyFVFUNhqPhRDFfXJudnC169LPS2DjHc9ewWwRV
jURULger1gHaVrlgY1MBQPX7/f6f/sVPX2EKO42wI2VkkREWn56Y/vWdr+787j/8T//h4sT4xNpG
PFPJ1lQiJqfUVE3s0pZz7UD7v23wCkp0vndKWdsSqhERs5mstTS/lFdldTXWESsEgoEOQklgz8JV
yvSbMRYNBANhRVMWl+aXEqm1lIWPqgpWSompNI61fl8zdmNAq1XXKiWKlo6p5ob0iiBXAEAdGR0J
v/OTd94VTIxCkwcVEXNGwbg5dX/qH9//2fsff/mHL6dmpmbS3OJOI7gzbKBaOxN4vN9tuEm+1WxQ
Zn8n2+oGL69fxYDQXDbHr391PX3p80v3Dxw+kAxFQkFZkft26IFXf8cJIUxikWgsGpAVefH217cT
pmk6E8adY+H2vtGxrgs7TVC1SE720hql9/Zj65GgtqW4AIB2/NTx6Auvv/COIKKviX0VKDCeTqS/
WJxc/O3P/8vPL43fHl+ZnprObEhNbsGWTqnJbdLsNjFVStZ1uzbO95X+32t/t8mqkhroNKrbC/kJ
RETDMHBhZmG5I9axGI1FBZNYZKP21H4hKkIIkSVZCoYjYVOSpeX7N+9nbCuD1jrnvjW5ePWQE4Xt
RFXPeb2ShBVCiPbUM091nH3x7I8ENG2hBCRIUoVM4dKdb+58/Ouf/fr6l59/uZxJZ7wiwd1W4qhG
3N4pcvIaby+iAthOTtTluGqkqUrt2Y0bopLq7JkTyDnH1ZVV68qFK/FoNBrv7O5UfAHfIALuqzQZ
Sqmmamp7IBhYSyVTi0vzS7ot0txpc3P2321elEPT+r1TBFUrOTmrKHpNzmpuULeyHJsePEKI9oMf
/2B49OjoTznyZnjwhLDEQnw5/rtPfvPJL//xb//x1p2bd5KwTkr29cwqqXMA22v0VNvnelCOAKqp
y1QLEVWSysClLdV4dZs9FgDl7VOuEeqICIZhiMX5xQwRZL6rsyul+tQIoSQC+8d4TiilaigS6gmG
gsu3v769UMgVSkGcjaz+Um5MG8ZOEFSlJ2Pp1TnR3UjKC+USUN0kqC1Bmj/8kx8ebe9rf7PRetUE
iMFN/nBhauH99//r+7/+zS9+M5mIJ/Ibib1uUpOTnLw8KvZ+NvvalLMdUfAmoXLfuT1s3I4DKE9M
tI7fNAvV5CSWjbFKp9L87q272XQqvdg/2I+hSKiXEBKw9WlPQQiRCCFyIBhg/pB/cfrBdHqDpLzy
NctJlrvSn90kqErkZN/KPd2r8TTYya7kwVMAQPMH/NpP/uwnZ4JtwZcQse5oYAKEg4CFpZmlX3/0
64/+8OlHn87nc/m8LSLcLUWl9MQql34A0Dxi8pJGyxFOueviLLnrfO/1oHF+X0lirkWyarYqWM2c
85Q2LMvClcUVnRt8NRqJLgXDwQCVaDus20D3HBtLrHcEg8H84tziRHwlbpiGWSktyGtcdlzVazZB
VUNOAO4TvzTZvaSocqzuPFdp27KKMABofp/f98f/4o9flTTpqQY8LjrX+f356flff/iLDz/77OPP
5lPJVM5hDHfLn6snEryea1CrlFSp9rfz4eG8Vm7Xj4E7eblJZtVIXc7XcqppM8bQ63q4XbMt19Iw
DJyZminevn57cXB4sNgWa4vJsty+EYaw15IUIUAkza/FOro6Mg/vP5xfW10zwJ2cvMagnrGsC80k
qHrIyeuGcE7QauM0ALZO9C0GcgBQI5GI78d//uPvgQSH6xk8AkQXhrgzfX/6l3/7H/72k08+/GSh
UCi4VR+w1wgvV7GyhGaRk9tYeDki3EjHvlGXfcnlOObxW7dyvNUSYDm7l7NvXnOgmWNZukYEvB8s
m/ZEy7IwmUyKQq6Q7u7uzvqCPllW5Bjsh2Rjsl7oTtVUlCRpdnFuMZ1JZSwo/+D0Mj/sKOE2i6Bq
tTuVm7wMtpNTpWBF5/ns59lSZuXYiWPR1995/V0kWHMVA0IIIsfZuQdz//APf/0Pn129dDXOOS9J
TXa1zmlvcorQpX6By349Y19OhbPf+E6px3WFFHAnIsm2Ob+3f+4kMud35dRFtwdUNR7A3SIqOznZ
r53nw2Ztdc1IJVJJVVUTHV0dUUVV+ve6QCIAACGESrIUDUVC1uzk7IOVpRXdMi2vRTW29Alqn691
X4NmZGTXQk5uJLVNFfCFAlDI5JzpHQIqd9TLnrH5XVtHm0ooidah3hX1vH5zYWrhd7/9xW8vX7t6
bc0wjHJVLktVB8pd7GaLz+U8ZW7XAGDrA8FL7as0ruXglUoCsF2qrGbFmXLfldrnHF83YqkWzhuz
1F/nNbUvlLl5/nw+j1cvXV2ZmZ4pBoIB37EzxzRJk44j4F7HShHGWKQt1nb27Z++/TCdTH924+oN
CxGdxQ9L/bGTajPHtywalaCqJScAd5Vu2xNb1hTpwJlj2ur8Et/ociXpw3lOp4q3JcTgqeee6jj1
7KkfChCRmnrK4cHDWw//7q//v3/92eeffL5smqZTrXNKTl43WwmNuG+9JCbniif2/UrSTWmcSjY7
yfHq3KQqj7Ef6yaFeamMXmqfl5TlHCOA7WO0E2qf8+bcJmFxziGbyfJsJpuOtEVS0Wg0KMnSflD3
CGMsrGoqLRQKE7OTs+lCvlB6uHo9ELz6uSMG80YkqFpO6KXebSEnQin1d0SkwZMHeh58dWtKL+r2
p2I9E2wLYRFC6OjB0RgA1LKKi2Hq5sTq7Op7P/vrn12+9c2tJLhXu6yWnBpV55z75SQkL6+Z05jt
toqv8zhCKaWEEOCcb14LQghhjBHGGCGUACICCgQuOHLOkQBBQggAAJYA22+ActUuS15P5+fU8TsC
7lJVCU6bST3XwWmDAvCW7Le0ARHh+pXrcc75Nb2gW6eePSVrQe1Z2OM4KUKI4g/6Dz/36nOvLMws
JH//3u91zrlbEHFp3O3zq5oKrVtOV+PxdRNUtWzppdq52TaYFvRJB188Ndgz1H+Icz4Ljyai25Ow
GlvUljYIIUi0LRpBgr5qhokQAtzgE/dv3f/78789/9XtG7eTtvpNToN4uVy6nSCnSqRUTZiAp9Ga
UEKDwaCkKArLZrPY1tZGA6GA1NvTqwwMDQRkVVYKeoHouo66rqNhGMI0TQQEgYiCEoqAgJlMRhQL
RW4YhrBMi1uWJSzTEqZpcsu0uGmawjItzjl3W6GFu3wmymzl1ECn6lcvUbmRFIB7xYktKrFhGHDn
xh0oForXVb8aPHb2WFBRlYMIuKeSlMSkrmgs+vTZ58/evnvz7trsxKxbqZ/S3HAKDfZFQJuu6tVD
UPWIauVISgIAmUqM9RwbjsRGel9W/b7OaHvst6uLyxygZgnK01iqKAoJhUOhjTSE8n9CiECO8aXZ
pff/47/5j59MPJjIwnpkuJOcKoURNEpOXi52L3JittdyhvDN95RSJoSgiqLQ9s52JdYeU8ORsDo0
OhQ+dORQDBkqmk9TO9s7o5pfi1jCUrjgEke+LvkywiQmSRKTZEoptbhlWZZlCiE4Iloo0CRITBRY
RI5FbvGCoRu5bDqbScaTmfnZ+fTM5Ex+anKqsDC/YECFNe7Am8DsT/lqK0HUQ1R2krLbZ9wWxNwi
uRXyBXL/zn346FcfXY5Go/6eoR5T0ZSjQPZwlWMCVFXVoaOnjr72yluvLP3X//W/3jMN06vsj12K
Ko1BLcRUE4ntRNlStxvJy+60aZ/whf1Kz7HRMeaT30AKXPP7FFi/8euJwnW9mX0+HwtFQu3V1ICi
SFcX5hZ+8d4/vPfZ7MxsDirn1Dmf4ADeN0YtfbDvU5f9clKSZxgAIUSSZInJsiwdOnIo4Av4pMHh
wcCZp8+MyZocbe9o71Z8SrskS+2KpnRRSoOcc0mgYAjICBAGBCRCSOn/7Itebo4DAYJA1gmFAOGA
YCBiQQiRE1xkuMXXTN1cLeaKK5lUZnlpYWllYnxi9ZuvvknMTM4UTNPknHO+Yby1B7y6FfNzk7ic
18QNjah7AO6qj9t1BAAAy7TIxT9cXA5Hwhe+++53sX+s3yepUl1hL80CZTToD/pPHD97/Pr1S9cX
73xzp7RitbQxjgy2znGvUKCmSlG1ElQtql3p1e1G2mKoZbIkD5w93BPqib0FlJ42uHknGAkpsE4I
1aS+VNMegohE0ZToRhVELyAgZAu5wuf/8Nf/8P75T84vmoarQdwZhLkT5FSNF9TNpucWLiARQlgw
FJTzuTw9eOSg79DRQ9EDhw609430DbS1t/UFQoF+RVWGmMQ6LWExQohCKVURkXHkBChQCrSaa7HZ
TgTcHAUEBAIEgQIwypBJzJIUyZA1OaeFtGy0O5oZPDiYOvH0ifnX33l9Pr4UX5h8MLnw1ZdfLa8l
1oqpZMrIZXOGZVl2oipHWKWbxblfuj7O8XZ+XgluN2XJLFE6l2U7ZnNsOOfky8++XIxEIleZwsJ9
o30xSmk77J1NisqS3Dk0OvTqa2+/Nvfg7oNrhm5YtgeDnfydqt6OSVG1EFQjBmov1U4CADnS2x7o
PNh/lCrScwgY4UIEEbcZcKvxoJQ7P4m1x2TVp8YECPT4P6BAC5lU5vNr56+9/8mHnyyZpulVx2kn
JKdyRnAvoi8Xw7TpNevr79Oisah8+tzpDkVT2LMvP3s2EAoM+IK+EUmR+hDQJzEpIkCoHDkjdN2y
LVBUbHQtQECyzllIoFRhgpIAo6wTACxA0ANy4Kgv6Eu397THR46MzJ978dzU4uzi1I2vbkw/uPsg
lYgnivHVuL6hhjg3p92kJEmVrov9+njZqGrv1naSsqNkqthyXRPxBPnte7+dMy3z05/885/0+iP+
l4FABPaIpAglPs2vHTtw5MDxc8+fm77yxRVzY4xLc6k0lqVxdTO9VDuWVY13M1W8ckZcZ7TyJjlR
RpXe46N9/vbIG0BhFACYAAwOHByO3b12I+cYgFokKaehkoYiISbJUsxEE9BtbBDyiHj/4qcXf/Xe
f31vfIOc7JJTaRXf3SAnuypXLkSjFIy6hZAIIRIASMOjw/6xQ2Ohk+dOdh84dGDIH/GPtre3HxJE
9CHBAKEkiIgKAcI48qoaugMo9VcBAgohJMQo62YyG5VVOesP+RNdvV2Lh44fmlxeXB6/+83d8Stf
XFmIr8aLi/OLRc65G1HZJazSuJWIwl7bySllPZoNtcFpz3KqeXZJanNLJpL0s48/m2/rbPvguz/4
blTxK6cFiPBeXQdKaaC7r/vZl958aeLal9fWLGLZpajSnPOSopqOagmq1pCC0muluCc5NtwTah/r
O00V6RwCBAAALMGDTGIKIYTaitLXE9Zg3yeKolAEDLgFaRIggpv83sTdiV/++3/772/qRb1kd3IL
wnTz1gHUR06VQgfc1Di3KO7NTZZleXh0OHDo2KHw6adPD48dGTseCodG1YB6FgAkJBgGAAUQEHF/
VYB0QAICUcJIVGLSWFgLn422R9eOHj+69Mbbb9ycGJ+4duHTC3dnpmZyd2/dzQkuzA2yMjfGpkRO
lm087Y4Xu5vcTQoAqF/lK723E5XT6UM553Qtvkbf+/v3bvcP9H88cmQEw9Hw8wio7MWAE0IUza+d
GB4bPvnsK8+OX/rs0mKxUHTaokpSlFuAbC0qX8VjmiVBuQXKuaklW8gJAOSeYyMDWjT4MhLo3DgG
BAoia4qPEMIavIG2PK1C4RBzq2BAgAjBxXJiMfG79//x/at6UXeLEHerG15rGk65cfMidrtHzhnY
uDmOlFJZVmSps7NTO3byWPTZV54dGzk0circFj5OJTrCJNYhUChQMgW5X7d9DQT0ceAaJ7xLi2h9
h88cPjV4cPD+3OTcla/Of3X7zs076Vs3buU2xqX0QCmNo1OSckpTdrVl/XT1NnM7nNLZFpIyTZMu
LS7RLz/98np3d3e7oijtql89Anu3bqXc1tl26qU3X7pz98bdpF7UjY3SRHZJys2jtydhBvVILhXD
CgBAah/pDbWP9J6lMjuD8MjNKhAVze8LbOQslQsxwApt2YKu7i6FEKI5f4WIycRy4tOP3vvo4u8/
+P0yuC+gWSnOqVFy8goZ8Ir+LkV+Sz6fT9F8mnzwyMHwuz9991j/aP+JUDR0nClslFDSCQBMoHgs
ScllzAisx2l1SorUFmTB3rFjY8O9g70PTk+evn7n+p2HFz+7uDQ3PZczDKM0Ts76715EBeCd2lKP
JGWHXX/edq055/SDX32wEAgHvnj3p+9GVU3tBQph2AOSIoQwVVMPDYwMnDlw9MDtdCpdLOaLJVuU
Xc1z8+o1VYqqRFD1xB1VMupu2p96jo30q5HAc0ggBDbDoEBUFVUOE0KIg6TqHnMAgN6B3hBQ8G2Z
KghZo2jcvXbx2ief/e6zJXBPX3Hz1u0kOXk5FOzpJQohROrq6fIfPXk08uxLz46cOnvqtOJXjjGF
jRBGejeOfZwJqRzWwxsY6VKYElVU5aA/6D/QN9h3d+TgyJU739yZ/uzjz5Yy6Yyu63ppHEvqnwlb
JVYLthKRXS1rRCLwCua0q3qb94kQgv7+g9/PMYn99p0/fqc90h4prdu429eQUEoDkbbIkVe/9+rR
hdmF7NT4lImITicEg632u6ZLUZXYuRaCqnSDlSoKKEBADcTCgbFXTr+qRvzvwrrtafNclABoJv3k
1hfXJhHRzfbjRQr2NthvbAUAlDe+90Zf/1j/9wUK//rBBC3Duv/g9oP3/up/+qvLy0vLWXhEUKWl
oThUVu1quvgu7S1tzhix0mtp7Ep1rVRCiDpyYCT0+vdfH3j97defPnbq2PeVoPICU9ghoBCDbzc5
OcdTAgI+WZZ7AsHAaHdfd+fA8ECgq6PLsCzLyufzqBd1t/F2e7h6eXjreUgSj/deD3VSyBcAAVH1
qZmu/q5BRVaisDPxihXbzijTFFUpzk3Njc/PzOdtKTDOoGQAb8mznnHaBKvnRx7HeBl0t9hKAEAh
jKpDzxwd7Dg88EMisYPOdlBKRUDI529dvPaAc+6UZGohqNINrlBKlXd/+u6Bjv6OdzZsMYAcFxLL
iU8+/KcPP7v59c24EKJETHavXbX1nGq9EG4qsFOds5OTAgCqoihqOBL2vfHOG70/+mc/Onv2+bPf
7Rns+VMq0zEkGIF1AnsSiGkbEJAioEYZ7Q+EAgcOHT00NjI2wsPhcHF5adnIZrJeuZ3liAOq+Kwc
vEjQed7NbWVpRWiqZvQO9MrBSHCAMRaq47wNg1CiUEY5CpxYnFtcW4uvlaL83XJNvRL5G2p3swjK
S0XZfqOtS0/+Ay+ffkmLBr8HhISd56KEYIhp1679/uJNFJsSVEma8SIoN/vNJkEhovLuT989EO2K
fn8jklzPZ/KXLn9++cOf/+3PH7qEFFRjd6rpenuMlWv4BdgkPyiRk6po/oDf9+Y7bw5878ffe7V/
tP+NQDjwIgCEN7w+e15naJ+AIqAPCXYGI8HBweHB9v6+/mQqmSrm83m0TIvYnC+VXr0COmtBtcS3
uRm6gcgxeeDIgT5JkWKU0loS3JsFQill/oBfX11anZoan8puLFfllhAP4C5N1TtGANB80dGtdOuW
0ALKmBwb6Ir42kJnYN2Au61hHAVDCkFJkii3uNuTrhxcB0eSJJBlmSAgIUCEaZjjU+NTf/jiky8m
9aJuX+3XLYXFXtepngtQyU7nljy9qdYRQpRINOJ75oVn2t/6wVuHe4d7X/aFfGepRIf34Wq2+wVE
oFCAwoAv7AucfO5kW7Qz+tml85du/PbXv51LJpJOT6nzAWK3VDrVmVoN526GY3scljNeiy7OL+Ym
7k/EJ+9Nnj/59MlBpBgihOx66AGlNBqOhk8dOn7oy5tf3VydnZw1YX1+2o3mbh49t77XDC+Cqke9
Kxe7s37DEZD80ZA2cPbQCUmTj3qeHwGA0RBlrJIXr1LbHtm1GAW/3y9vRGhmU/HUhcvnL9+8882d
JFRe6beRpF8vtc6p3m2TngghCiLK7Z3t/te+91rfm2+/eS7aGX1J0ZTDhJEu2Bs39OMEAgAaUOhV
A2pw+PBwNNwW7unt7730wS8/eHj35t00bJ+75sZvy4UL1BN97nZ8qZSM895hAKDf+PpGqq297Xr/
cP/B9q72CDDo3/UBXM/Z7Dxw5MDxY6ePzcxNz+VQoAyP7pFSe50evXqlqC2/Y2UOrObPSq9epLTF
OE4lpnWM9kX7Th/8PlPlc0BA8frjiBqYun3+2nljXbqxq1xOsRIc7SAubVAkWZL/9C//9JTkl17g
Jr9x9Yur//TbX/12KrWWchrF7RUxG1Xr3MbJPgndyKlkCFcIIerw2HDo3T9999D3f/j9d9p729+R
FOkQUGiDFjnVCpUy2hUIBUZ6envUrq6ugqEb+fhKnFuWBeAtpaPLe7f4tWpQzqbllOIoIhIUCKFg
KD96aPQgZbQN9mB1GEKIpGiKnM/lH967eW9FL+gmeJe6Acdr021QzTKOb/GgAYDij4UDI88fPxLq
ib2DlHjWBCdAICBrC/fOX/t9sVC0E5STOJxtciMBGQBkSZKkn/zZT44xlR1OLCd+87P/9LOLkw8m
M0IIe6yTAdtLpzjVuloSIsvZ6Jwq3aatCQDUWHvMf+LkifCbP3zz8AuvvfBuuD38zsZKyD5o2Zrq
BSWEaFSm/V09XV1+v3/eMixjdWXVtJGUmzfK67N6Yssq/WaLmSSVTAEAWCNjI3IkGuknjLTVeL6G
QQhhG0njM6tLq/NzU3N52F5BolLViGrbvNUe3WjbYeuN5xVmwAilcqSnPRjuaz8NlPRVarAADG0s
H98MwyQyxoSqqIpRNK5d+fzKF9MT0xnTNN1Kp7gNeiPqnZsx3M3etClpdnZ1+o8eP9r25o/ePPbU
i0/9KNwWfh0RAxvfP5EeumYBARmhJCwp0vFTz5z6P7z9x2+fO3ryaJuqqj6wPSBge2lj+5xuJC7P
mVBsv7FL1Q9M26tx4+sbqff+4b3PjYJxnyBJkr1w6FEa6OzuPHr87PEeWZadZZztY1KvWcYVTgmq
VpZzGhqdK6mUbjpVC/l9w88cGwv3d7xLGB2BCuSoMWU1Pj73UXI1kYOtKl659ePdwgwkAJAoo+wn
f/6T4/F4fOKX/+WXN6YmpnIbMVZehecaybGrRXLaHCMAUIPhoP+111/r+st/9ZcnOoc73wlHw88j
wZhtjFtoHAQIaLIid7R3tPceO3lMs0xrZerBVHGjnLFXbaNy86BeO6l9300LIJZlEcoo7e7ttnr7
ekcII50NrOlY74ARxpjMOZ97cOfBbCaVMRwLLNhJ1j5eXn2uamzqISgv47iXwVcFAkrbQFdk6Kkj
z0sB7RVYjxwvey5NUvKrd2feX11czsIj+5AzmhvKtGVLpj8i0rd+8Fbf1QtXvzn/yflEsVC0Vydw
y7Ort85IuXAC17gwWA+8VBhj6mtvvdb1J3/5J99R29Q3/UH/GUJJrM52tFAeBAFlQklnKBzqHjs4
pvT29mbv3bmX3gjqBHC3P5VDPQ8x+3vPB1tiNSGEEMUjx490+AK+LqBbg5t3frSAUkp9iLiSTqWn
Ju5OZDYK2jlJyiv0oC40QlCVIsc37SqSIvuGzh3u7zjY/0Nk5DBUEd6gSnIxNbX8m8XpuRR4ExSW
adeW2kiKqrCzz5zVzn9yfmFifKKwIT05CcotOrZetc4tQpyCS4wTIUQFAO35157v+It/9RdvdA10
vUUlepRQEm3k4rZQFQgAhIPh4Eh7R7vR3d2dm5uey2QymXK1Z5qRykEq7G8hKUIIzWVz4A/5cweO
HDhCGe3edSmKEEYJzQsh5r668NW8ZVr2B3q5UJy6x8tOUM00jm+Jfg7EIsHhZ46d1mLBtxCgKiOf
RCWenV755fzETBK2RnaXk6BK2FYzSWISCwaDxpWLVzKFQsFJTG5R6rXanojH5jY29vHRVFVVDh49
GPoX/6d/8Z2hA0M/5oQfJoTs9bppTxQECtUf8PdGohGDUba6OLdY1HUdhRBeN5pzfjgN59WgYsAm
2O4vvagDkxgOjAz4wtFwH2V0tyPMCaGEAsLKvZv3xtNraUMI4Zb6UkkVrnps6iUor5gnV+9d96HB
9t4TY68zTXoaAaoKNpMps/hK/teTdx/EYasEZRclvdq2zUjPOSeUUD4/O29u6M4lYnKLUK+H/d0k
S2cQ5ha1DgAUv9/vO3XuVNtP/5ufPnPw6MEfEJmchicnj26/gAAAQUTV5/d19PT1kGuXro0XCgVu
GqbYWCqrBC93uvP/ajn3Zhsc+1vuM0Rkq0urXNO03MHjB48oirLrsXCEEJUAyWQymfHZydlMsVC0
3z/OJaoalqJKnavHOF5JvZNhPfZEHX3uxIFwX8f3gcIAVOk5pJQKn8U+uXP1xgJslaBqJajNNhqG
IYrFoj0b257O4qY7N0pO23ICwbaQqCRL2rlnz0Xf+MEbh46eOvpHWkA7h4hPbC7dHoMAAEOCAUVV
AueePedPr6XnHo4/LG4QVLVSdTPSPOxktcUBxRiTBgYHtGh7lIRj4WGJSZFdHSRCKKzfi7MP7z5c
SMaTzlV4mlXxAwCA1EJQXuqd/UbcFpzpbwsFRp479rQaCbyBpHrDHiUU/Jb02Y0LX03Bo9VUysVB
ldrlpXqCruvONdecuXZQ52CWi6R3CyVQAUA9euJo9Cd/8ZOTR88e/ROf33diI9m3hb0FAwqdTGZ0
ZHQEJSqtTU9NF0zTdJsf5SSERh8yrhkHnHOysrTCzz51NhBtj/bLitxJCNnN4E1CCEFGWXLqwdT4
4txiuSoHjap5NUlQtUSOl+oVqV2HBjt6j49+h6jSU1BD3BUhAH6Qv7rx+ZU7sJWgvCQoZ9ucryV4
ERRAY+RU2i+n8pbGRTty/Ej4j//5H58489yZP6YyPUoY6ajlwrWws5BkqZPJjAVCgQRBkpt6OFXc
SJStxQRQq6rnFqrgzG+lpmnSfCFvnTl7JqYFtCFCSWg3x4YQQgkh+lp87d7s5OxaPpt3q9PfFDWv
0diacgZhRhmVYsM93UyTRzYKz1UNgUgVTY3C+rrZzgtXjTHSLlq6SU7lDHv1xD05A9Q862GFwiH1
9bdfHzt+9vgrIMHTlNFSnFML+wSIyDS/duzAsQM/Hjow1Hn05NGwoihuAZz2IM5GAxTd1CL7nLUA
wBJCmFMPplL3796/LyyxAAiF3RwbQoiqKEr/0IGh/u6+7gA4TCmOraGHbr03RTmpYfPGlFRFCne1
DRBGe2tuKCKARGOyLLtlnFf9L7CVoNyW0XbWtal3HOzvXUscA4AcDAV97/703YGzz5190R/xvwYE
fLAH+VUtVARBwJCkSIde++5rPzp66miXoikqpVSFR7ZE5+o6TrMHQPVz1vlw9HqwWgBgxlfihV//
7Ne3VpdWrzPKdns5HspkFu3u7R4dGBkIM8bsEeVOonYz/lc9LtUSVE3uUNhYuTbUFfVr0eAYEojW
OgIIAFRmnUxibh2u5uf2fTdiKlcRsBZUm2cnK4qiHj15NPLMy8+cbetoe1qA6IBW0u9+BkXAmBpQ
n/nej773xpmnz0QQUQGyxeHhJKmab0Ib3LyF9nlr9zyb3OL6/PT8g2wme48AMWs8V0MghKjhaHhs
cGSwPRQJlaq/uhH15k/qugC1tgvcGXHbYpJMkaSO0f6YpCnDsG4UrhmcYExR1ZII7cbC5eD2JHKT
nurNtys3Dts8moQQJRAKaK+8+cpQ33DfK5IqjcLelHJtoTZQQklfqC307F/8q7949djJY2HATXui
XdWz35xu90ktcM7FbSSFiOb05HT2zo07D9DCJYHCqvEcDYEQIimqMtDT39Pb1dtVSmB3W2y3IdW3
HhWPlNk2G6n4NLl9uGeQSLQP67wRTRSdiqo00sFyJNWI+9M5HvZxcQu3kNo727W3f/T2wOlnT78t
a/JxWF9BtoXHAAgoyap8PNYbe/mP/uKPjhw/dTwEsIWkyql6jZCU3fxgTya2AMAqForGzWs3EzNT
M9eBwwJsLbK302BMYh1tnW0DQ2NDYdhqi/MaA4Aax6Qagqqk3m2zPxFKWaQ75g+0Rw4BIbFqGuIG
g5u+YDRcKmVby4V26vNu5OQVqlAN3J6QbguUri/tHo1or77+atcL33nhGV/QdxoIRPf5gpktOICA
qi/ge+7Q8UMvP/fKc32hUKhEUM61Ct2kqFqudSVbVMlwbgGAtZZYK6zMrcyahhkn6w6lXQOl1B8M
BfsGxwbbFVWx19L3EmBqP0cNx3qpd9tuTiYzKTrQ1SZpykFYr19UFwxuat2DfSFwv+iVAuWc6lu5
KgW1prQ4x9AtYFUGAJkxpgyPDgfPPXdutKu/61kms15o2Z0eSyCiEolFnj/77Nmzo4dGgz6/z4uk
vG7MWg3m9v3S3C2ZJywAsOIr8eKHv/5wIrmavI4cE9C4RlALqObTerr7urtCkZACZEsRRq9SyrWd
oM6GOSWHLZKUomlytLejm0h0EAHr9lBxIaRYd0fUcY5a4Sym1QzVrmx4BWy1PclPPf9U58HjB1+Q
NfkZQsjuZqG30DQgIAUC3cMHht947uXn+jq7Ov2UUjc7lJc3C6A+aUrYXu3LoFlCCNPQDX1xYXHW
sqy1Gv+/YciyHIt1xHo6ujs0Sui27A1okKTqNZLb97fcoIQQKdgR8QXaw8NIoAMbGDCBgka6Yj2O
zgJU/k+vuKZmxDu5jYdbaIEEANIb33+j49zz585KmnRqw/vTIqfHFwQJ+iy0Op9/9fmXT545GRVC
yBuR3G52qHrtTwDehnJ72IEFANbczFz+5lc37xdzxQe7HRNFGQ0Fw8G+4QPDYcqoFznVbYeqRFCk
zOeucVCUURbujoVkvzoiEDVoAAKQaGF/H1RvdHRL4iy3geO4auAkJacEtSk99fX3+U6ePdnX2dN5
hklsGFpeu28DCBJsD0QCp5575bnRrp4uDRHtHj23oMVGgjcB3M0VmyRVyBfMqYdTqbX42qTgIr2r
g0GIT/Np3YOjg+2qpjqDVsvFRFWFWm1QpVen5FTyXlEmS1Kosy1GJDaAgA3dkIhIQGGDTJLcnkoV
f257rYakqu2//X1Z4/iJkyeCh08dPqP4lKMChK+Gtrewf0EIIQFJkQ70DPWcffOdN3t8Pl8pJsot
5MBNkqplDrs5fLaQFCHETKwmCktzSw+FEAnYRW8eASIrstLR09fTGY1FFUJIpXCLHSEot4F1y3lj
qt8n+dqCnUihq9bGuEEw6JdkqZZUAjfJqBwp1UpSlexPDACkWEdMe/715w+F28JHN5aIaqWyfHtA
CCORYCR48viZ44c6ujq0DTXP6c1zzpN64WYo39wQkc9MzuQe3H2wlMvkJhFRr/dEtY8EUCaxaLQ9
2tPR3eGTZMnZfzehompeaFSC2hZmoEUCmhr09SBAUxIYdWHGOro7NfBW8aohq0YN416hFm7GcVlW
ZDkUDmkHDh84p6jKEYGibk9mC/sWmuJTDnX3dx994bUXejbCDspFljfibrfPXde4KM45X15YThtF
Y4kC3dWgTcqoLxQJ9Xb3dgcURfGyQ5WLLPcck0YiyV2lCH9byC9pSheQ6grTVYLOrUh7T6c9UrVa
42O5UIJ6VbxK9icGAFI0GlX/6M//6KAv5DtCGGklAn9LQQgJhtpCZ06eO3mgvatdg+q8eZs/r/I0
5cJm7PXArVvXbyUnxyfvGYYxD/XX1K9nHFSfz9fdM9AT1fyaPfOjkprXUKBmucF0l6AIof62UIgq
Ugc0ySBsCe7rHRvsBPcYk0rwUvcahSc5ybIst3e2a8dOHjvMFDYGAA05ClrY15BkRT7YO9R7/Nyz
5zqDoaDdFuVmi2k0u9/TDoWIPBFP6GvxtYSwRBp2MR6KEMIkWWrv6OqIRdoipaXRmpHy03CYwZYA
RUop9UdCEbJePqQpwYhccLmjr6vHFgRWq6G8UbtTqa/OMXALzmSKqkhvvP3GYDgWPkooaUPAVlDm
txkEtHA0fO7EUydGorGoCu5R5c7S2vWmvdjfO7MjLCYx/uDOg5VsOjuOAjO7OAqMMRaOxCIdbbE2
30bVzUYdBABQW6qLVwzU5g0rKbKkRQIxQmm0kfgnOwQK4msLHbZ5B6o1lKPHZ/WSU0X1jjEmDQwN
+McOjw0qmnKkkSDVFh4bMFmV+waGBsYOHz8c0Xyal7G84ZsV3B0+m6qeaZjWnZt3UulkelliUlNM
LNWCEOIPhUPtsc6Yn1Lq7LeTZ6om6XqThZ0nWjeQh/yKGvS3A4FgtQ2oBAQA0OTDG8Y356qu1ap5
zRR3ncS8uf4eZVT6zne/09/R03GESnQQWnFPTwQQMNre1f7S8ePHI4hYKXG4GeQEsD1w0wIAQYBY
ydXkXCFfuE+A7F64ASWqz++LdXR3+CVZciviV8mb5zoetYQZuBHT5okJISTYHtYUn9oJhDTVa5W3
9MFIe5sK7obyalHPai1uTzy3yHEGAKyzq1MdOzzW7wv6jkEr3+6JASJyU5i+Q6cOnT5+8niQUupW
wK0ZFTcB3CscbJLU8tKy8fD+wyXBRQZ21zkjK6rS1tbeFtJ8Wrl0n5qcBV4dqBRBvq16IKGUBTvb
gkyRuhGwrvpPXihyo6NroCcAj0ihlnioZsQ+efV9SwT5yXMnox3dHcOyIh+otcRxC481mCzLXVpQ
64q0RVQhhFfaS61hMl7wSoLnpmFaxUJRN4vmPOLu2aEIIVSSpXAwEgz7/L7Sw7lcykvTVLxydqfN
m5bJjAbaoyHCaBdgc5lbtwzlwOljAwB1GcqbCc8AzXAkLI8cGGnzh/wjUMXS7i18q0CAQCgcCZ88
9+K5gc6uTgW8c/Ma8mrB1gevWxFGfun8pZVMKrMEu+jJAwCQJCkUCAXCtlCDUh93zItXLkSd2P6D
KD5N9kcD7UigrdlLMnMhaNdw7xHwrjfjBazys0pj4NSj7SoeBQDWP9Tv7x3obZdUabAlPT15QERC
JRrrH+o/0DvYq20YisvVh6rXm1d69axbnlpL8Ww6GwcBSdi9eChCGfUHg8FoIBQo1XBruKJBcypq
EqBa0K9oQV87Egw3u+cICJZCz0iS5NTra/+r2vrp1e8t6p2syFLvQG+gs6dzlEmst1WM7okEIZTE
Oro6DnT3dgcZY+WM5Vt+B/XPZWdcFAcAIYSwrl68es80zTgBsmsPS0KIqvm1aFusrRQLtUWIcfSz
qn43Iw6KEEKIGvarTFHaN1bGbTqKaB7WAj6vJX5qDdqspp/l+r2FpHw+H+vt6w0Fw8EhAAjsRP9b
2PcghJCArMpDz7zwzEgkGpFt8UDOh6p9PtUq0XslEG+qePl83kJAgoil9SR3BZRQRVGUSDga1iRJ
cuYglrNrg9cxtSYL299vNoAQSrVQQAVGorhDWm/eKLYff+ZMKQC0FjtUozl4Xh68zcnn8/mk/qH+
DkVT+hut4NDCYw1JkqVYOBZuD0fDKiK6udrL5aTVAq96+xwA+PL8ciqTyIwj4K6lvAABWZGVcCgc
8mk+TYLtAkS5MANX1Fvyd8tGGaFqQNOAkuD6gnbNhym4PHrqyEHYG0O5l6OAAQDz+X2su6+7n8ms
u9kOghYeKxAgEIx1xPoHhwd9sFXFK9lOAcrbdKuB/R5zDTm48uWVjGEYOUDYtcoGhBCZyjQYjUVD
voCv2jCDsn1vig2KSZLEVEmjjAV3ym0gUDCtI3yOSczNUN5MeA2eZ5iBz++Twm3hPspoe7MdBC08
XmCMRcPR8MHDJw53hMIhGbardo1W2iyhXPKw8Pl9mEvmJgUXqV3sPqWEqoFwIBgIBmSydVVwt4d8
5T90+cwrIBPA/SSUMEZ9Ab9fgFA29O6mAwHBkvCUPxgolVdtVuBbOVQK1KQAQE+eO9nh9/t7Yd3L
2CKoJxkEFKDQ2T/c3xsIBirVKG9G0CaAi4qXTqathcWF/IY3cVcrG/j9/oA/6LcTFNTb11rjoNw+
I4QRwmTJxxhTYQc9WAVhHBg+PBaC7ZUNnO1rBsrZ3TYJihDCeod62yVF6oJW9PgTD0Qksiy3y4oc
1nya3VBeLpq8njlcNi/Psiy+urSaMHVzusb/bQiEEFn1qQF/wC8D2dlFE4jHZ2RjMDZPRiklKBGF
EKI2K0nYDbpl+I88d/oAuMeX7CTcJCcCAOTg4YO+voG+XiaxdqhPZW7hWwaBQu7q7uo/fPRwWJKk
WlYkqsdCIlw2zhjjX3z6xargohQftSvYWHE44PP7SuTcdBWv0gBuO5ngAmRV1TZSXHaMLLgQLNLf
+eyGHWo3CKps9DwhhA6NDgVi7bFeQkm4jvFs4VsIQojqD/r7QrGQf8Ob5bWIQiOGcgD3qHIOAIJz
zg8cPqBtFK/bvYhyAkxRFJ/P75M8bFA1oZ44qNLr5iY4B0mW1GYnCTuBgGDK+NqGHcpeuc/etp3E
lsAzJjHW2d0Z8Af8XUDAvwvnb+ExwIY3q31kdCSazWQBqieleojEruLZF/XkUw+ncpZp6QTIbqa8
MEmWfKqmOo3kzr56Dp/9TaNxUAAARPP7JGBEoYTueO3ttJ4fGj120G214WoHoFp4OQs2RXbGGA23
hf2KqrRvRI+3DOQtAAJSWZKjTGayoijljOONSlCPTukSsKkXdYsRlkHEXVsrjxBCJUlSFVWRPAiq
JntUvXFQW977wgGZybIfoTl1yMtBNw3t2bdfewrcl1feCbh58tYlKMaoP+j3UUrDrfCCFmygQMAX
CoXUaCxa6UHaqDfPK6qcy7LMk2vJFGNs1wonEiCMSUyVFbkaj3bFvje6FA4BACL7VMWnaWGBYse9
WAgIJKz+lDJqz8srdbbZ8DLsEVhfpJRqfk0D2lLvWtgCIkDI3V3dHYFgwM0W02yJ36nmcQDgqyur
OiW0iBzXdq/nIDHKVGl9LctSH3fNBrW1KQAAhBCQqEwoCe7WGCT17FO9g/0qNJY4XLlv7p8/ClBl
jMqKrCFBbQfa0MLjC4ICmaIpkd6+XtWm/u9kWIwzaZj7Aj5cnFuMy7IchN0zlDMmMY0xRjeIeXNM
PPbLopFUl/U/oASYJjPdNNlu3aJ5U/e//S9+ehp2T80r9X/LK6WUMJmpsAuqbQuPGQhIHLjW09vj
h/KxT83CtvIrRtEwNZ8GpmHO78D53LtNiEQZlRlj1EHMdaFeCWrzpIQQEggFZUtwioi7Em/BBWeR
vo63HTV3doqkvOwFhBBCJElSAKG1OEILW0AIkSxuSVSiMrjbbpsp0bjaoQr5grkwt5CglKqE7Kon
jwBZV64cbazZMdBo3A4BAJBlWZJliQHuTkAYASLW9MzxI6eOlVYc3ulwA+L6CQHKGFNaS0u14AQh
RBIomGEaxMWbBdD8B6o97YUDAI91xDAQCUiWaa0C7mI0ORCUZVmSZMmtqmZNqDbVxY3xSak1Qggi
UcbILg0BIYA5o9j2wnde7oadD9h0laAIIQAIQCXKNkL6W2hhEwQIk2XZV9SLyBhrKB+tBmyRoJJr
SQMEFBFQArJ70eQICJIiUZ/PR9ZlqZoWKNmCxiUoQtAwDRSISAndpRuVUCFEXo2FhjcqF+4EQZX+
Cx3vycanJBQJSRsreLQIqoUtQEAaDATDelEvEVQ1LvfGT2sjKEqp8Af81BLWbq7wggBAJElisirT
jSDRHbFBVWXgIpQS07KEaZl8tyQJAiAQkRhohWVZ9soUbxRlWR8RSaQtIlNC2W6Kzy08NiABX6CN
W1wQum167IRNatuy6Jl0xhRcFCmhEiBYu9FpXAcwxqgkSXbb2I6HGTgHEQEAGKVAKCWWZZm7VYtb
ADKZSSSZThk9A30aNNdQXo2nhQAAhMKh9RiXFj214AK/zx/z+/wEa6vh2ExJik89nFqllHIgu7OI
LAEiEBGBrHu5G/2/enPxSvsIhIDKZCCUgtglgqKECgAgMpNkWDdQN7PCZtWLewYCAUYpJbu7uE8L
jwmQEEJDoRCgcJ0gOzVrtgRsXvr8UhwAdEQ0d6XTgOt2H4EghKilj67H1quSbdplkAughKAqK3S3
blREQSUmMSEEFRRKVQubXcDO6z82exkMBtnGU6JFUS04gRa3CtFolAohALbXxt+Jh/m2VV6mJqaK
el6/TgjZvVr5GyEGlmVhFdJj2QNovT8sfc85B2FyIUsSJbvkxiOEokBBAz6/VsjkAdxVvEYaUw3p
oN/nJ4yy0li0SKoFO4Su68mAP8DKSBLoeG0WNgM2DcPgU/emLgDCrkhQAEAAN2xR3gLUjkSSu4Kb
FhpF3aKUllyKOw4hBJEYky3B5VA0rBJC7AGbNQ2AB8oZ9TbJiADh8noe5u6tnNHCYwFExFwht2ZZ
lnAJktyNB1pJzbP+8b/84zgjbGk3+k0IoUAAUKDgnDsDSGtGoyoeAgAiFxaB3YqCAiCEoMUt5td8
SjqeFBvL+9irXTYDTlvUlkGWJAkePniYZYwBIaRFUC04IbK5bDKfz1sbBFVOWtrRtJerl67m0MJL
u9RvAgDcMA1zg6DK3UcViavSzez2B9sCNlEgiHUj3K4EgwkUhFImmdzSOno6fQ4Jqhk2qHKDVlL/
cH52XidALEIIh5aK14INBIjI5XLZVDJl2sIM3BwwzZamtqW9cM6t8VvjvyKwKw9SRECrkC8YlmlV
2y/P46qtk7xNgrB/JgRH5NwgQHZFzyWEgG7psl/TqGGa1BYs6bV6a82ncPTRvi8AADjnmM/nRSqT
SlNCdyXGpIXHB4QQYVpmMRFPmICuCxzsJLaVX/l3/+9/d51RltuNvgsh9EKuoBuGUSJEN+6oCvXU
JN/2meBCcMsyAHYtGAwIoVAUZtinarIQwr60TzNCDrDMZ+tqLSJqmkYz6UyGAClCS4JqwQYChHOT
F1fjqyVXViVy2gmD+aaaN/VwqggWfLXT/UZEi5u8mMvk9A0Jyk2oqbqftRAUurwiAIDgQlgm1wns
mqcAdMsIUEKpLxxUHVUNml0fqtRPu2dvk6S4xYu6oSd3q98tPBZAQohpGVYhEU9YiFhy+wPsnsfX
LvFbnHNrbnLun3b8pIgmt3gxn8+bYiO+wqNtVaERI/nmgAvOheC8sFvh9AAAMpWERbGtmMmJDRuU
fXnpnUjKLE2yzTiTXC7Hs2vZtGEYyd3qdwuPCRB0UzfzuWyOe0hQO01U2+pD/f1/+vurjLDiDvfb
tCyryC0uUFQlOZZFtQRVTixFYXEuLF6AXVLxAAAKlqEJFLR9oDvsouLZFzdoZCmfzT469hEARDqV
tu7eupsAAbui27fweIAAEYCQ0wt63jKtEkGViAJg5+1RrvWhvr76dYYAmdnJviOgZZpmUQiBLsRc
jS1qy2f1SFDOlUyRW5yjJQqEgLFbhbEYpSIcDh3UTYMqqmJfgmon6pS7EpRpmNwwDW4ZVqplKG9h
EwSEZVqJfCaf2yAou/S92yreZjxUJp0xs8nsH3bynIhoWaZVtEyLU0Yb7m8zjOSCmxYXJs8T3B0v
HgCAyS2azGXNWCymGYZRkqBKKl6zww22ZImX9pnERC6TK+Sz+TgA5GB3Jl4L+xwEiKUX9ZVkIpmz
LGtzvmx87SWZ7wS2qHiWZZn3b96/RIDsWDgQInLLtIrFQpFvxG031MdalmN2kyIQAJCblmUZZo4Q
ou9Ux93aJSvykC8a6KSUllQ7eyxUo7l5XuLnpgQluMCZqZl8Np2d5yZf3uUFElvYn0ACxMjn8kvL
C8tZznlpnTqnFLV5vMd+09pjOz//+P2PHzDC8jvWeYGWoRsFvag7bW919a/aXDwvAx8CAJqGya2C
nidIdm2BQEQk6ULW9Gk+EY21KfCInNzqQzXllM4NEfnq0qo5Oz27aBjGCgK21LwWhOAinUqlFh8+
eJgFF+cK7I6a57xfBQBYN6/fzHCLP9yhcxIUqOtFPV/MF80yNqiq46LcCKqqJGHbSYSpG1Yhk8sC
7N4KpgAAhJBoqKvtWGI1jrA1BsrpzWtEinLbSk8koagKGLphWKa1VsXYtfAtBwFicc6Ta6try3dv
3c2Dba6A+4Pe/tpsbJGeAIBn0hkzn85/s1P9F0IU8+uwELBcn6vqd702qC0n5aYlUqtrGWFZyZ3q
uBvypk6LliEfOXXcB9uDNBuJhyrntdwy6JlMxlxZWMlahrUGCGloJQ4/6TCKheLc3PTcCmwlJy9b
VK2odeGFLcZyy7KsmYcz13bIDoVCiGwmlcnpBd3aiKB3tsGtfZ6oJxfPyYpCcCEy8WQhl8vHYReD
NRGQKn7tRGd/TxS2R5I3KybK7Qmw+UTiFueXv7icyKVy0xsruO5acfoW9h8QsZDNZOduX7+9CrZV
fqG8F6+emmK1zGm7JGVd+MOFcUKa79BCRNM0zUwqkcoVi8VSn+2kXGpL1SpuvXFQW3VqRCym8sVi
vrAmuNg1NU8IISXzGcEADM2nOaPJS/1rpEaUW7+3PRVz+ZyVWkslACEFLTXvSYZAjum11bW52clZ
p3rnFmpQrzRVzzzeVPU++/1ncYo00ezOI2LR0I21tfha3jRMrz5XaucW1EJQXlGwAgGFWdQtYogM
IOaraEhzQIigMhvtPjx80tCNcl48gMbIyfkk2EJUidWEeemLSxMSkRIbBexaeAJBgBimYS4vzCzM
FYtFC9Ylp23hKdAYOdUCN8lfZLNZy9TNe80+Fwos5HP5RGIlUeAW9yKnmvrblEBNQEDkglOOOUbo
rkVVIyLNGzpIPsXnC/hLwZr2eKhGiMq57JS975slVQGAy7Is7ty4k1mYW7hOga7t8iquLewf5DPp
zMNbX99a0It6iaAqhRnUAq85XK0dSgAANw3TSsVTXze57yiEyGUymbXEakKvEEXedBXP2VH7PsJ6
zRk0C3qGAUlTQnftBkUCgVAscubI6eNReERObuEGALXr7dv6adsvTTxuWZYlMclamFtYNE2zZHto
4QkDAZKNL8cfrMXXCrqu2yUoL8mpFqnCjZSqmc9utlPr/u37d5taaBEBLcvKphPpZDqVNjai5ysR
c0Wi8iKoSi7BbTctcsETK/EMN3mCErJr8UAGN7V4Pq0JLhAeEZQzL69ZhnKArYMuAIAjIn9w/0Fh
8u7khFk0ZwiQ1kKeTxgIEG6Z1uL4nfEH8ZV4cSNAs9kSlPupt766wWk75Rc/vzjLCDOa1QgEtCzT
Sq8l1tKFXMGrzzVLUfVKUNvigQAAC2vZfKGQX0bEnc2Y3tIBIiRVHhs+c/hQKBK2r/DiRlDNIKkt
6h2UylkIbsXjcSOxkriFHBd2q/8t7A8QQox0Mn334d2HqytLK0VwJ6dm2KDcFv2sBPu5OACIyQeT
ORCw2qz+I6Jl6EYymUhmPQzkAHUQdC0VNZ3vt0kVPK8XUecJwXm2WR2vBI6CFkxdC8bCvcV8gQKA
BN7F62olKvR4v0WCAgDBLW5d+fLKWnw5Pm1Z1hK01LwnCUiB5ucm524tzC3ki8WiCeuVPdzUHID6
ycmOahaY3dJGsM3Z5cVlHS1sWmUDRDSKheJaMp7Mb9SB8up7ufZtQz0F6+yd3eK+zKdzRbDEGt1F
QzkAgAAMRNqiB159+41OW31yJ0k1onbZ++70ymyK8qm1lHH/9v35YrZ4eyNos4VvPxAQ8oV84cad
b+5MzkzOFGBr/FMzKxkQj9fKbXQQlK7rViaVaZonDwXquVwuvra6piOil/cSoMb+10pQbuLaJlMW
0lkjm0gtM0KTu7kauM7NQFxPd6JMA4hYyQ7VaNoLwNanwyZJGYZhvffz9+bXVtbugwWLsItBqy3s
GQQAZJbnly9MPZxKFgtbpCe7iteIFOUmLdVqNLermEIIwRfnFu81KcEdOefZdDIdTyaSOmxXbUvn
r1nVa7Si5haW5KZlZRPppF4oLsAuutopIUgVuW9gdLC/u6/HnjjsZYsCqE/Nc7PBlZ6UFiJa+Xze
vHnt5n2jaNyhQJtmhGxhnwJB5yafvf317etfXfoqiYgWrBPUThjH3UwVtZosNglz6uHUYjMWOkFE
YVlWPBlPruUyORO23yduxFRVTl411QzQ47NtJCWEEEYmn+W6uUx2MSeNC0EKpt6OIeWQPxz0w7od
ymmLciOnRsIOtklQAGAVi0Xz/V+8P5tYSdwWlpglsHsezRZ2HYgC13Kp3Nf3b99f03W9JD05DeSN
qHluc9aNnGrJyRMAwG/fuL1KoCkVSAy9qC+vLq2mCoWC2aR+A0DtkeTOjm4NNRAoMvFUwcwVFxlh
hXoaVC84CklS5b4Tp0/EZFkukZM9FsoevAlQPznZx2AbQSGitbqyqn/15Ve3TN2836QJ0ML+hGkZ
1tzy3PLNC59dSKJAL4KqWmLwgBchVStBuWZAzE7PFjbSsxoBCiHy2Ux2cWl+KWPqptP2Vq2R3BXN
CtTc7LieyevpleQycr5Id3HFXYObviw3RuSO0FC4LaLCOiHZiQqgsdQXrz5zx2ZZpmV+/JuP5xdn
Fi+BgOXdWi+whd0FClxOJpJfX7l4ZdIyN5ddc1PxqilW5wbi8ZkXWbk20+VVAACfm5krosBGc/KQ
c762tro2vzS/lLcsq5Lk2PQwA6/OukoReq5gFOLpuOBiARF3zQZDgAAnIqQEfF3BUEiGdXKyR5Q7
8/QAGltUwVmIjMP6xDQ55+bK4kp+/M74dC6du0ZJyxb1bQMBYppFc2JheuH2h7/6cNEwjErSUyOh
BQTKq3bVxkVtuW9Nw+R6QZ9rZBwQ0TR0Y3lpfml5Lb6ml4kg3xEJqpIFfltmv2WYVnJ+JQmmmN5N
9QbXrZU9IiCdGD5xqF/z+0ok1ayocq+x2BZugIimYRjm5QuX51cXV28ILpbJLkbXt7DjQAJkJbGS
uPrlZ1/eL+QLBqx7bKuxP23+R43ndMstrdfpIwBAmKbJ85n8TB1tefRniHohX1iYnZyNZzNZE7zV
u7qIupFFE1ylKBTIs4l0IZ/KToLATL0drweEEJRVuc/XFmwHgXaCcnr1AGoPdLP3v5yaZwGAZZqm
ce/2vfS1y9fuZJKZywTJjtWBbmF3QYAYhVzh1uT9ybu3v7m9ZhiGU72zhxjUKz2UM4pXqthRjRRV
qsQx30iogRAim1pLzc88nEkZuuEMTvXqf9VE3Ug1A/v+ZocRUej5opGPp+dBQGI3FxKwBKcFNA8P
Hh45e+D00RhjrERSdkmqWau+eKq5sDFRk2vJ4ldffrU8/XD6smVYD6BVbfOxBwEiKKH5xZnFL37/
m98/mJ6cLq0Habc9uQVoAtSu5pUzitejEWyT/GcnZxeh/nmJlmklVhZX5pYWlgqCCy/11rkeYNWo
l6DsJ9sWtMhNS6zNLq0Ky1qghOy2/UWsGbmekUNjXZxzCQDc7FHNCtp0VjcokROHdZHfvHv7bub8
787fSa+lLyLHeWiR1OMMAQDpQqbw8aXPL92YmphKw8Z1hq3SU7PrPpXmKIXK8X1ecNN+xOz0bLLe
UBhEtPSivjQ3PbeUSWXs6l25wFSAGsak1mWn3AzE9ht1/SZFtJJzKyleMGcAGnZj1oS8UVRDkdDT
Snug/8iJY0F4JD2VIymA2p9CJbjGQ21spqEbxheffrFy4dMLF/S8/jXi7qq9LTQPhBBTmGJqenz6
4tdXvl5ei6/psJ2c7KVu6yEqUmbzIijn773+d5vU/3D8YYYQUldyPwos5jK5+cn7k3Fb/aumJQoD
NCZB2U9qvzAcEa30SjJfSGWnCZKVejrfCJbTazzS1X7S3xVpUzVNhkdSlARbL3S9JGXve2nfTlJ2
kd/IZrL6h7/48OGDuw8+F6Z4CAC7uX5gC00AIURQQeP5TP7Sr//h1zce3nuY5Zy7Gcfd0jxKqNcW
5VwMxD53a1X1tpBUYjVh1OnMQs55MrGamJ1+OJ3dyL9renmZRlNdnNtm4yzdsDLLawtcN2Z2u8Kk
INiRNPOjR48f66WMOu1QJUmqEW+IvT92/dpJUiYAmEIIY3F+sXjn2p27q4urv0WOS9DK03usgAJX
C9nC5c9/+/lHFz6/kLAZxr28dwCN36BO6alcCldN3SltxWJRCEvULEQgIjcMY2Fpfmk+sZIwwF29
27VIcq9OArjYoACACyF4cn4lbuT1aUrorksMKJG+NaYfOfns2U5JkpwevWYtkW4fg9Kr06NnAoBp
mqZ+/g/nVz7/8POL3OD3UOAaadqaoi3sMAyjYNx9eO/hZ5/97rNFbvGSalciqdK1dlteqoRakoIr
qXb1zuFtUn8+n7eEJWoO1kREI5/NT08/nF7Z8N6Vq+AAZV7LotZVXSpGkoPtJl2bXc7oqewsQVgm
sHtR5YhILORdnX3dp7kEYUJJSc2TYWvgppfkVKsUBeBdhsUCABMRzfmZ+eyF8xfid27c+VCm8hIC
cmhA/G1h50GAcBAwk1hMXPri91/cmngwkRNClAzjlYzjzZCenKTkVuusVul/857lFhfFQrFWCUpw
zhPx1fjE9MPplE29a3ZxPqB1DmC5eKjNG7OQyhazy2tzxBLjALirKg0XAvJcHzn2wtnn+w4MtVG6
RdWzq3mNBHCWU3W3efQsyzKnHk5lPvjFB9/c/ub2PyLHiTrHv4XdgQkAhZX5lY+++OSLi7/74Hcr
xWKxCFvJqVLeHUBt17ii5EQp9UqCrxabc1XXdaEX9ZokKEQ0TcOcX5hZmFmaX8rDVunJy0GwK7l4
bp0E8FDzuMWt5Hx8Vc/kbxOoz1NQf+OQ5s1ihxYOHDp85kSf4tM0eGQsdyYSNxK8aR8LN49eaSKb
AKALLsxLn11a/d37v7s8MzHzK8HF3G5Kly1UDY4c47zA37928doX7//i/ZlisWjAulrnNI67qXa1
3pTlPHd26YlJsizZSKqWMAPieI8AgLlsbq2WOYgCC9lM9sHDOw8X08m0Xc2ttvbVjuTi1Zr2whGR
J+dXsunFxEMKpKZBaAYQQJrPrB4YODx6bPTgWAgAFChPUo3k5rnFhzltURYA6Ba3jA9/8eHiB//0
wSfL88sfWqY1s/FdC/sEgos4N/jdj9776Dfv/9P7E4nVRBERS7anSoZxO2qxPdnfOyWnTUdPIBSU
FU21z123/3DDtvtWCIGZVCYBpOr4PGFa5srS/NL9qYdTKUM3SvFPm6scwXYVr9px2AbawI/dVJtt
9pdcMlNMzq0sEAsfEAK7WnoEARmRaPdMdnlg4OjoQGdPtw+2hhw4SarRxRW8xmMzLgoATEAwKKP6
73/z+8VPP/j0o9Ra6kvLtBagRVL7AgRItpgrfvPN5W/+9oNffPBgdmo2C9slp2bbnrxUO7v0JEmS
JJ94/mw7JaSS9FSuusGWOZpOprNQ5dxDREMv6DOT9yenl+aWChsF+sqRUyN2OGx0eSSvmKhHap5p
manFeMrIFK6DgGSD56ujgahqkcALWdnqkhhTYbsU5QzeBGgshcBL1XtEUACG4MIwdbP41cWvFj75
zSf/ZBSMe9zicWhFmu8pCCG8mC9em7w7+dFf///++t7czFxGCFGER+Rkl56c9pZ6wwvcyKlUw8wu
PUmxrg61/+BQHxfca93HWh6uAgDEwtxC1dHknPP0Wnzt3p1v7iynk+lSed9q1NxdsUHVouaVMvt5
ZjWZW52cv004Lu22micQGaE0FultfzZ8qHcgGApp8Iik7GkwXvaoRkoDlyMqQwhhTI5Ppu98c2fp
y8++/PtsKnupFWm+d2CECbDg1tT41Ed/97/+3ZdTD6fSpmHq4G53cnOpA9QnOTnfu5GTTAiRTr34
VHekva0TsOFFaTfbm0qmSnakir8zDXNxdnL2/uzkbJZzXk14AZTZr9TGLQTVqJrnXIrpURncbF6f
vzUxLwz+YDeXRi/BFJbPHw293HdgcFQKaQHGmF2KckpSjRS1cyNuLynKBADDsiz9+uXra5c+u/Tw
1te3Pkgn0p8JLlbqvB4t1AlKqC4R6d7MxMyvfvV3v7p48/rNNFnPI3WzOzklqHrVO6fk42V3kgBA
auvq8PUfGz0u+9QeRM9UFzegx2cIAMLQDQsQKlbbQEQjl809vHL+ykR8OV60qXfNKm+8/bo08mOX
zrt58yxucTO9nMjrqewtFNhQgay6GohITW4FQj3tLx985sQQMKLAVlWvXP1ygAbcuODt2SsF+umW
ZRUvfX4p/uu///U3D24/+CiXzl3iFp+H1tp6uwIKNEcFfTA/Nf+Ln//Nzz+7+NnFOCKWjOJutqdK
tZ6qgZs5wWl3KiW7y4QQ+cgzJ3t8baEXkEDAMs1y6lyl/LwtD9HUWkoHhEpedrRMa2VlceXe5Phk
2lGgz7mCTTkJqsZr497wsg21d25j31laYesNiWiZuqEv3Z+5J3RrghK66zeeISyN+eSnOoZ7jw+d
ONhJGXWSlFcAXL2qnmd8GGwlKRMADETUx++MZ/+3//l/uzz7YPYDs2jeEFwsAkKrGudOAiGJFt7O
J/J/97P//LNPr1y4sso5L9mcnMRUKc+sXsmptO8mPckAoPQO9Qf7j44ezwn9pF/RZCZJTmm/fC/L
fJfP5S0UWFazQUShF/Wp+7fvj68srhRQYDn1zqu8Sk3qHUBzJSivG5IDALcMy5y7+XDZzBXuM6CJ
GhrbLBCdmz456nt54PDoIGVMBQLOROJya+kB1GePKsEtmbgkRRmwoe4tLy0X/s3/499c/eLjL/5G
peo4ISQHrby9nYBAxDVhiBvxufj7/+P/63+8cPni5dVsJluAdbXOy+7UqPRUTnJylZ4AQD7z6rPD
/o7wi3mz2MsItRij9SYJO9/j7MysXqFuPqLATGI1cfP6pevzttVr7KTtFjXesBTVSLKwV+edJGUB
gIVCmJl4spBdSt5Di9+BPfBWcRSakOgRX2/kqaMvnR1g6149GR5JUuXCDmohqdIxdhsFwFZR2ElS
OgAUDcMoplPpwnv/8N7kz//25/9+dWH17xhl+l6M17cVBIhFgBTMvPnlzPjMe//xf/mPn96+cXst
sZrIw3ZyKm32B4xbzFM9N6AbSW1KTaXtyJkTbX1HRs4V0DptcitULBaLQggvta0WIAAgkxgKLsqt
hM1N01ycmZi5e/fG3ZRj7b9yFQzqUX23HC95HFCv50ps/NbN7sIFF9b87YdT4b7220pb4HkLebVG
vqaBo/DRoPZCuL/jTltfVzwxu2QJIUpEKrsMrFviZ7XjQhzvN5sBWwl9CwzDwIkHE4J9xKYoofzp
l5/mbV1tL8mKfBQIKLs9Zt8mEEIMQFhbW137ePre9MWf/83Pb9y4fiNpC8K0G8WrLcJWb8wTgLda
JwOAoqiK+vQbLxwVPvZasZDtRSCUEYrgbietayk1zrlAgRmP5HUUXGRSa6mvbn19a1ov6Aagqy2u
KeVVnJAa/4vNztolJydJrXcI0Vx6MJsaOH3oXkc0eJ8AOYyAcrM6U11DUWYKG/X3RF/sPT4SX1tY
yYEQlZYJcqYIlIp/VTMubseWnsBOqWyLFDp+bxxXllce5vN546U3Xsp29nZmmcIOEUpi0Lxr96QA
ASHNTf5wdnL2o3vf3Pvm/O/OT3/z9TcpQsgWVRvcAzHdYnzsr9XAK53FTa1TGGPqodPHO6JD3a8v
66mDJrc0WZJN0zCKKLDRarCb+4ZucMMw0qqmuh3PLdNamZueu3n769vxKqQnt/PU0rYtkMocWG1u
j/3YclHlHAAso6Ab8Yn5qUhf+0USUAYQIFLHIDcERFAC0fArfYeGJ9YWVhPzNx/OCYtXElW9+l7v
4DvVBFenQyqZEj/7zz+bXl5Yzn3nne8kBkcHnwtGgk8TRnpgfSK3pKkKIEAQERNm0byxML3w6cfv
fXzlxlc34tOT01lYrzThVOmqlRDqtT2VXp02pxJBqQCghMIh7bm3X33FYOLlgqmHS5Mun88bAoXb
/9c6HxEA0LIstEwrrRENELf+hRAim0lnrt/++vaD+en5PGy1PVWr2tUtUTXzKVyN98oCRGv+9sRq
x1jfnbaD/StIRBARWX2nrA8CBTHRamvv6/7uc6+/tPbeg/m1Yj7PUaBbyYiSna7keayVnOzqXiVJ
yk29FIZhiE8//pRPTUxdePWtV+dfeeuV1VAs9CphpJcQEoRHC5O24AABYgguptOJ9MXrl65//Ff/
7q/uc871bCZbqkrgRkz2zPzSayPqi5Oc3AziEtjsTm3tMd+L33t1SGkPvLWSS8es9chxIISgZXHk
Fgdwf7jVOjeFZVqcWzy70Vf7XELLtJbnpueu3bp2a4Vz7hVa0KjdCbx+U2liV2sQLmdQ3uapMA2T
+ENB0jnUExWMDCKgVkeHGgIiEhOtcE9Hl9zf35+cvvtwxTSMSsXeS31y2piqRS2GzS1PICGEyKQy
1uTDycz4rfEHHR0dc8FQUFJVtQ0BfXW251sJAgQJIQAARa7zr2cnZj+4cv7KH/7m3//NuGEYeiFf
KIURlAzibkGYDa/pttmcR692lc5pd1JgXXLSKGO+s6881zPy3PE/SqP+Zs4sSiXJxqdoRTljfXD9
wtUZ2KqSVir54maMlwBAVlVVefPtNweCbcHXweY4E0JkMsnMF+d/d/4Plz+/vGJZVi2hFw2luJTQ
LIJy+8xtiZz1C4NILd3ggVjE8rWFDgOB9irP1VQIRKlo6izWFhM+piyuLa3mdF2vdbBraXe1AXSl
/S2bEAL0os5XllaM1Fpqzaf5lv0+/2owGPQDAUaA+PZiHPcRcGOZsxw3+b1CpvCHq19c/eVvfv6b
y7/62a/m9aJetCyrXIxTuSDMZpGTU3IqeZBVANAkSdJOnDvdcfqN518squJHWbMQ4TaPnU9WM3w5
++sbl79eAneC8pJg3IJBN1c9euOdNwajndHvga2AgGmYkxN3J3758a8/Hl9ZXMl5jFm5FJeqr5vX
F5VUvFo8evbjvSKprY1zWtl4urAyPjsTG+q5TTXWx5Hvui0KAMAE3rdipI5HD/bM9s8MJY17D6xi
oVDO9lByArj1uZrxAccYlSaN/X+dN8ZmW4QQXAghrl2+xtPJ9J0TZ06svPDqC9M9gz1PBcKB05TR
fgQMYuOJ4I8bBEGSI4SsFjKFW4tzi1cvn79889L5S4uTDyaziOilztnJya7S1b2W2wYqle91k57U
WEe7/9ybLzwFYfntdG6t38Kt4QSUUCysr6BSLuaoEuy/EwAgTNMsUkItjlwCAEDEQjaTvX79yvXx
2cnZ3Mb4uUlNjUqaZY9phg3KaSx3evLIRoco2PLRuGUZ8enFRHpm+ZPQWPcBwshpRNwLKYqpmu8I
YXKh7XDfbDabNWceTFYy/pUIpapBLjNmpf3SOLl682CrTWw98NWyrHt37lmL84uFqxevrvz4n/14
8eDRg/c7+zufVjX1AKGkBwj4EZDBt1uqQgDIgYA1y7DGZx7OXLhy4crVb65+k5iZmsllMhkdxRZy
cpKSV7la+/jbr0ktcNMi7OrVZswTIUQNhIL+F7/zSrfSGXo7YWQPO8kJAEAipJBeXSvFLDXi0t/s
FyKKfDafBgQdADRYJ6yp6YfT5699eW1FL+p2Ka1ccnDTg6+rIahmSVF2YzkDACu9upafvHZ38kRf
7DYNKCMcMFzjuZqCrF5Qwr7A6eNPn04WVlIr6VTKSK2ulSu+VSJcpyulnqeYk5RKhnm3CbAtviyd
TlvpdNr4t//Pf3vrxOkTs6++8erto6ePHu/q73pOVuWRDaIKINTtlt6vQAKkiAJX9YJ+Px1PX//y
D19evfnNzYXJ8clcIpHQubVlWSinncm5RHm5m62eOKfSq1s4gV29UwBAUzVVe+HNVwa7z469HTdz
T+fNour+x7S4Fk8YLm0q18ZytaEEAIhcNpcjQEqLmxjZTPbql3/48u7S/FJhowZ7JbWu6dITQHPj
oJxSlFtcVImcOACY3LSk1FI8k5tPXAiNdo8Bg+ea1J4aG48kXcxpBjWePf368/Nt4ehHv/vFBw8R
sZz42gyS8vpNacxKROVJULD+BOYAwG/fvM3v3bmXOX7q+OLA8MClV777ylMDIwPPqpo6QhjpBgJR
aKwg356DEiqEEDpBslwsFO/Fl+JfzzyYufeHj/8w8821b5L5XN5LjXMzgtsfQl43Wb2OEOfadSXD
uNNjpwKA2tHTHTjx4rlXlzD7Wt4oqsJFmyCEgMwkns/m7B7laiQXr1Cgkm2TF3KFPBAQgGCapnl/
+uH0+a8ufBUvForVxIXtiPQEUD1B1XOhvOwolu2Cmbm1dP7mx5duP/vPv3uDRXyHOIpoHedqGIhI
isKMEQYvhEe7F55/6xX90u/Oz3DO3VapANhKvm59r2WcANzVu9LndtXSLc5MAgBLcGEKLuTrV69b
kw8mcysLK38YHhv++qXXXzo5MDxwXNbkMUFErwDRiYhqNY3baxBCEDYilymhVrFQvA0cVuem565M
3p98cOPajaUvPv1izbRMcyOB1YuY3AILy6l0zutTVXNtr14VCjYDMQFAlSTJd+Kp0x1DTx05m2bG
68lcdsjL1EEA0CerWcu0qsl9qwYI6zmJ3DRNgwDJIKI/m8le+OzDz25mUhl9IzDTXtbXLj014kio
qq3NjoNyGovdpCh7jp7JLS4VMrliamblUkdg6KBg5MXdji7fbCwi6MIajfXG3ulBMKI37ybTq2to
mqbbxQB4FBvllidXz2Sxw27Dcz79hMdWKhJopZIp88svvtRv3biV+vyTzxdHDo5cfOXNV8YGRwfH
Im2RMUVTBpnEeimj7QCgIiDZCxugxzgIALAIEE6BFgUXc7lsbq6QKdxYWVxZvHX91tSD+w+Sl7+4
nEJEyxbd7GVfciOmSoGX9ah1XvWdSonoJXJSNzYtGA76Tr/89HGzXf1hopgZqnQNGJK1fC5fkmSc
8U/1jrW4+fXN+Lt//m6SWzwx/XD680ufXVrbqDdeIqdy9rp6jfQVUQtB1SJFlfPmlVSjkrpnFnOF
4p1Pr44/1d12xdcZOcaRd2zYTHYdHIWWNvMHtc7A91/5yfcKX/zjR5dWl5eF4MJtUJ1BlW7f1wLn
DVKa6CXvkn2ZMLttjzleS95Sls1kzVw2J62urOrXL19PDQwP3H36xac7Rw6MdHf1dvUEw8Eh1af2
M5l1M4m1E0oisDW7HmCHJdqNKqscEU1CCKLABLf4kjDFSjqZvnv7m9sPCtlC4vcf/H4OCODUw6m8
YRiWI+3CKwWj2nrZzTCGl/bt6p1bGotKCFFjXR3BZ9546YDcHX4zaaafNjmv9GAmlmHFM8mU6dKH
Wtu9xfFCKEFu8fl0Mn3n0998elsv6IZNenLz3Lml/dQ7fp5odj6XU9ctvbqR1CZBoRBSNpEqrN6f
/Wog7D8ICn0DAIJNblvVMIUVZhJ9SuoMJA49c2LFd9s3PTU+UWki1Pp5teNpl6LsKqXdY+pGVKXx
lRCRGbrBTMOU7t+5X3xw70G6q6dr9vCxw6Gh0aFIT19PtLO7szscCw9ofq1XVuRuKtEYoSRCKAnA
+tO+HtuV28TdfKWEAgFS4BaPW6a1ZJlWvFgsxs28uTj9cHpycmJy9Ys/fLFazBeNXCanZ7NZixDC
bZUc3aQkp33J7YZyq5tda6pI6RqUXp1R4iVy2uKtg3UvmRYMhwLPvPHige4Tw+8mef5pk3O50kOZ
USbAEknSWGyWvc+b82dlaUU3DGPy4b2H5y9/fjnJObc7taqpWlDPnKiIWgmqVinKbTA4PHrKbJKU
ZVnGgy+/mQ33tV8KD3edEQC+DRf5rkMgQsEyNFWVXxo+dySjSPKHqWSKJ1cTlSaFVyG+eiUpr5tG
QHmnRImk7GPMEJFxzinnXJqbmdPnZuZymqatBEIBqS3WpsTaY2pnV6d29pmz/f2D/f3+kL9L1uR2
ymiEMBIihASAgA8I2BefYGR9hZH1m/JRqxDWPW2CUio2SpzouqGvWaaVAg4ZXdfXstlsAk1cm5ue
m5mfnU/mMjlj/M546u6du3lKqNB1vURKmzXuYXu6hdM24qWGlMbOPs713uTVxDnZJadNtU6SZe3w
6eNdvcdGXsky/uZ6nl1ljUGijBv5Ylwv6tWoqNXMw805k06lzckHkx/+8r/88mEhVyiVl3GSVKPe
zpof1juREV/WYwAeUhQgsNxaprB4e+pmIBb5LQkpPwaAzh1oX3WdQASdm22Syl4deuooIMAHn//y
o/um6VrXy/4ELfXPbVzqGUuvcbU/se2SVukG4bD1ZnF9LRaLrFgs0vhKfLMW1q9+/qslQsjXowdH
/QMjA/6Oro5AuC3s8wf9Ps2n+VRNVWVFVmVZVpnEZCYxRimVGGWMMkokJhFGGZGYBDKT0bIsPZ6I
r+Vz+QIFauUyuezU5FRyYWYhY1kWTyaSxcX5RT0RT1iyLAvTNLeoZxuk5EZG9s/sc8sZOwaO/Uau
Sel62697JYN4idC1QCgYOP7s6b6x506+rivwRt4sRkSVtj9GqWnkixnTNMvZfaohiW33Y3wlbv32
F7+9f+f6nSKu59XY79E9ISeA+giqnrgo+xPfaeS1e/XYzPX7K239nVe7T4ycsRiEEHc/T2+z4Yik
KIw+JrO3e0+NWU9n8rkbX361kMtk0Zn1bUM5w3lpPGpuimPfLj2VJNLSDVIaX7sdyU5eztLGzmqO
FAAoItKH9x8WJsYn1pjEGGOMbmyEMkoppWQDFBAgHA1LkVhECofDcigUYn6fn1imZU1OTObj8bhh
GqbI5/KCMkpkSYZisWjlsjlu85JyWA8QdLr/nXYkJxl5GWwr2Wh2gpzcQgk201j8Ab//yLmTPT2n
DrzAg9LbWTPfz7cXnvOETOVCMZNIE0oQBTZqg7L/jpumCVcvXs07vNZeHs9aDeN1mznqlaAqkZTb
095OUvZJWLq4JgAwPV8oLtyaeBjuir2ndoXbOMFR2GEjbTlYnNOsyMeCPt93jr58thDw+3937YvL
c/GVVfthXvmITpXPzUZXC7DCd3bDeomknFHM9jF3bs7PCSJSy7SIZVrO/yr1kVBKIRFPEBxH1zZR
SgE3ANuf3m5kA+BulK2GkJwhA/VIGV4oF4DpTMLdEuckSZJvYGw4duyFM0+LNvWHaTM/agle07yW
CM3Pzy/FAT3VV3u/q8EWG2cykTQdn1fj+aw0ng0ZzRux8dSbSOz83nkDkexaSvgCfqutt6OdyKzH
lq2/J0BAMAUPMFXuGBgYoJqiJCfvPczYXMJek6Jc/3eKdN0mq9Pz5yQFN4+X5fLqtpm2PC3TZbM2
vi93jOnx327eObfobye51ap+VINyib/O5NtNYgIATdW0wOGnTvQeee3cqzwsf7+I1kFTWDUJB4QQ
iPqCi9Nf3//N/NRsCgDsi4lWShS2txvAfcFPt/nh5vl0I0QvNDzujRqhqyEgt0EquyEiMfJF0xf0
r/li4UGgpAeas8BD3UBAaiEP65QPBSNhXRF0PpNIGRsxUm4eLqeBm7gc1wySKpfGUHott4kqNi9v
WTkSK5diUm6zVxVwc287bxo3j5zbODQyvs4b20013lINE9a9db5wNBI88eyZ3sMvnXlZ6Qz9OMv1
Y5aoGE6wDZRQjPlCD+59cf2j+NJKFh6VJnazEZWbJ16lkezj56XW1RPz1BB2mqCcA+M1WKX9TdVC
zxWQMMpjvZ0g+9QBQTBS5fl2DAKRmoL7fX5/tG+w/ZbmhQAAIedJREFUH9pCkWRiNa4X8gXnRatU
VqXWMawGlVTu0ms9hOVGEk67ULnobftSW17Huv2vl0pXTTJvs6Ump4rrWqYX1olJBQBfIBgIjBwe
ax999sSzrD3wTlEYh0xh1XXPEUKgTQ5+ffG9339azBdKK8/YAykr2aKc96FTivJSvd1U6WrGuCkk
1gw3fq1SVOmzcjcxBQCaW8tYgJBu6++MSYo0ItYjzPc62pkY3AyBwobauzuVkD+YmLg9ntkwmtdC
TKXva3U6VGxfhe/LkZWXTciLnOzqoNPL5iQuLwJyhgV42TtqSato5OZwShZexvCy5EQZ85177bmh
gy+eek1ElLeLaB4yuaXU2yiJMYyxwBdXPj7/lWkY9qWxqqkFVeqHW/9Kn3nZ8urJt2uahNWsOKNa
SKpqtQ+FoFbR4KFwaM3XFuoAiQ40sc11AwGpzs0gp9DujwQtUhRTRrEoDN2ADbuUm9Ro76vb2Hj9
pl6QKvbXu7P9tdLT1EuyqvS5139xl8/cbB7lbpJmSkylfWfCr+fqK7ARgAkAWnt3Z/jF7792sO/0
wdcgov4ox/WDAkVD6VuqpBhBQ/rtV3+4eNcyLaf9qRoJqtQnuwTlHL9KknU10lNT1b/dIii3Y0iZ
182BNPJF0HNFvWuojyoBrQ8Bwk1sd0PggAGqyEMHjx/u6ezsyqzMLWYKuXzpyeP2FK5mPKodz1qA
FfZrsVdVUg297BhY5Xuv9u2ECldu/O3Xzm4IdxrDH5XqpdTX2dcdPnD22OCRF85+31TgtYxV7Bco
Gp6vmqQYuFZ4/6vPv5xCRDtB2fPyRJm/KNc/r5CFPSUngObe6PUYzL0GbMum54rczBXj7QPdKtPk
Iwi4L9aGQ0BiCstvoNXH/ArRZGUhs5rMm4ZJykhSbiK2c0yaLU25neNRN7yJoBJxlb5z2oTcXP1e
KpvzXF7vvT5rxnjUEtvkjG9SAUCVFcUfiARDz7/1ysHe0wfeyUDxxbzQ+7loTHIqIeIL5ItzyX+8
eeXrJVj34Nm9n3YJtJq+1iJR7xk5ATRfEqmWpMqpH9smCwpBCpkc9wcDmWB7VAGZDSHsn3IhCCir
Pm3k8LGjp4YPjubT8bX42krCHkBZ7ibwGrdy0lcz4fbfXqEKbiTiRmJuv6v0P97Du3P99god8Fp1
ZcvKK7Bhb1I2yOmVn37vGXWw7QeGCq8XudklmrhaUUQNzM18de8XMw8nk7B9sYdqvWvVPAC9rme5
a7FjXr29Iqhy37lOHG5xEp9ZzHcN9/JANNSFFDpwnyxeieuGcylt5MKKX40NDg8XzXRhJbWWFBtL
VHupe+WkLLfx2Q2psRojez2Tt+QMqGYy76Qbu6y0Do9ISoKtktOW5chhg5wkSfI99foLQ8PPH39+
+PjBP8+icVq3zGAzq3EQQiCiBCcnr9z+7eLsfBq2L/pQbQiAlzDgNvZ7Tk4AO2PLqder59wvTZQt
n+fiqWRbX6elBv3DSCACexwfZQeiYBaILn9b6NzYsUP+WHt7ZuLW/YxN3fOKQSn3HQBUlLZ2CrsR
TLqbfSkX6uI0grsVmNu0NwGALxSLhn7wz//oeGik+9muod4fLOWSQybyQLNLBTFKscsfvXv991/+
LplYy8GjIM2Sh7RaL1u1khPAPiAngJ0zNtei6nmpMq4BnHq+gMBFqq27g1NV6kcC4SrOt2vgKIhu
6pJFsTPaGVOHR0dyaHA9nUwLwfm2NBGXvjrHiML2/pWzY7XwCOXI3k2ds0tM26pfwiNy8nePDcS+
+9MfHFf7217PS9aLOWEc5Mg12IFrwgjDGPOfv/ibTy7pRb0AtS035TYmpddq7Hx78TB51Pcd+t96
vHrlvtscVBRI1hZWDX8okIv1dPqAkS7cw9pRbhCI1BI8xCmOapFgdygWNrPx1Fo+k+VCCLe8N7u0
WKu01CIrd7jNIbfcRGeqilvKSim+yR/tiIV6jwx3nnz1mTPBoc4/Son880hJP2+Cp84LqiRbPpN9
+s3nV27oul6E7VHktcQpVTNP9loN38ROuusbDeD0VH8IISQxu5wLREOZcEdbJ1DavmE03zc3KQIA
RyETRnvaOmPHxk4cisQ62ours4tZo6gDbCenWtRApyQGLsc8iag0Jl5GcLfCcnaJSaOU+oaPjMW6
xga6B5458mb7cM+fZqzCEY4iIHBn1yAMKFpWzeMHVz698IBzrsNWgqqU4uI1Rk7UEjD82KS61DsY
Xt9X8m5tvkchSGphJR2MRdZ8sXA3obQLAfeF0dwOS3BqcMsHEuvtGujpGzk0Rvx+v55cSRimYTpv
GLfgwHrtUk8KUVVD5G65c5XIaTMqvLu/JzR6/FDH6HMnnooe7vtxIBZ+vciN7o3I8B23gQYUX8pc
yfzm2vnLs+C+XHsj+XHVOi5K2FWVb68Jyn5MzSqfqRtgZgvZWGd7Sgn7upBCF+wjo3kJAgXVuek3
hNUmB7S+zr6eQGdPl0BLGIVcXlim5XYTuakjpb6XM/i6jd23jajKEbbbuHnZmbbUCQeH5KSoSuDg
ySOxQ0+fHBt55vg7LOb7PmdwxEAe40JIuzGuBAhEteDy2oOFX4/fvLtqC9IsJWJXE6TZLOy6PWo3
IrIbCT2wH1Ni+i03Yy6VEUaumI71dOhKQOtEgLZd6lfN4CgUA60OLkGvLxLs6ujrlvyaT0cuRDFf
wA37VGklYLebrZI6COB+80KZ4x8HlGt3NRKTV0yTXWLa4qHrHR1sO3jiSPvpN59/vfPgwE8yoJ8u
cGNQAAZ2c+woIRhRAg9nvr7/wczDqSRslaCqqWLQLOyJsXy3buRG7FHlJiUAAMknM5aZ1xNtvR0o
+9VeBAjsYt9qAgIQDhgQjPT7woGRzoHuzo7uTktVFcvUDTR0naBAO1E5JSov4irnQi+nMu9Hwiqn
1tq/93I2lMbOK9ByW0E5ANAIIb5ANBw6eOpo5+nvPHv26Atn/tjUyEvxYvqALqz2vaiRzxgTMSV0
d+KrO59sxECVq2KwUySyZ5683RzwZkhSpeO2HIuIkEtlLT2dX2jr66KSTxnF9Um3L0kKYF3tM7kV
Nin2K5HAYM9Qf2x4eBhD4RBYhiWK+QLYPH5em5cBGBzfQ5lXt7GtJG01k8yqif9y66cbQW3WVYft
eXMMXFJUAECTFcVHCPH1HxvtOPr8mbETrz79brin/btxI3MsbeR7uRAK7tE9KjOJx+TA5asfffF5
OpXKw3b7007XaPpWhhm4oVZ7VLn4qG2DJjjHYjbPi/H0VPtgN5M0+dCG0Xzf2aRKQACCKBQLeCdI
dFAO+wY7+rojHd1dVNVUYRkm6vkiwfWUCftWjrDciKmSZ9Tts3K/gSp+W+1mhxsJVZKW3BaGsMcx
lZOYtFA4HBg6eqCr40Bf96nXn3ur/8jYT4vUOr2mZ0YMbvqqXdBgpyAzCcNE+/2tL7++nkmm8/BI
gnKuZLMT2FNyAth9CaMZUpTTHbo50blpoambSHU+G+mKIVXlUXi0ptu+BQIQC7lmIO8ChQ6GO2Nj
I4fGOgZHh9RIOIyFbJ5zy6IbEpWXjcVLuvKSuJzjXS05NUOa8pKIKtnenGvOOT1xbpUGtqyqQgjR
CCFaIBIKHDx+pPPsd547qAxGzxx8+sSf0YDybMrIHdS5EbQEJ3t+dwKAX9Hyfot98M35q3fz2Vyp
DpSzBPJOYD90f09UoGaqets+M3UDs+mMRQTMhzqjgirSAAL4avjfPQMCUlNYfl2YMZOKIS0SOBDr
62rrGx1UVUnRkQsABMY5ZxtSlT0lw7mkVNnFEMCbHNwkJDcPYjO2cnY1t2BK51LiJSnJ6ZFzpqao
AKAxxnx9w4MRxa+GvvfnP3pq4NTBc/kQvBXujL1aQPOgzs0oF4LutdRkR0DxZWjO+vDSx5/f5xYv
Gcid0lMzyWRfEFMJe2WjaRZJuR5r6SZmkxlDImw51BaxmCL1AiHBGv93zyAQmcm5VuBmm0nFITmk
DXUM9XT2jwzK4WCIS4xRXdeJZZpuwYZOdaeSWlgurKGS17CSmkcrfO4VSiE52l8uR84rkXeTmKKx
tqAvFAw+/52X+/wjHYdf/dF3X+dh6TspKD5PZXbQFLxdoGD7iZhKAxrxhRKwVvzljUtfz1qW5VaH
vJkEta/ICWBvjcj1evbs+27qBgIAWLqB2Xiq6Nd8iWBbmIPMOvdb3l6l/uN6yoxsoNVJFHYg1B45
OnRoZGzo4Eiws7uT5NI5w9ANAgCSEMJN3amXqGolq1qN+HY1jXq00c0D55SSnFHfj6QlWdKiHW2h
3r6+8PDZI4MvfP/Vp3mH9kLHcM8bBWa9nDEKvUigHRHlvTKAV4OIFlwoLiffu37h6iIiepVYaUYH
9uUg7GXkdaXQevv39uJZpcUp3ZYZ32I7yaezcPPTy9NA4fd9pw4QorG3OMEheHxIar3ziJA3ippu
mUMplhtUfcoLHadGv373yOh1Yzl9a/z2/aX7N++sLS0s5gGxFMBnX6zArY6410qxlWp/l8tstzsw
CLjErdn2K9m53AzjbgGXW0i5rSOmBSIhX7g9Gjz+wrkjBTDbhkaGXplKLPolTTtUQJOZ+kZt8H15
S9oGiRBQmJQvcMwJIdykpkq12avFvh2JfZca4oAbiZWMghSqMBDq+SJ8/eGFSdM0Pxo5d9QEH/su
J3hgrztWD7jgpCA4KZi6P0PZs6okn9D6fam+9mPXI0d6ry3dnb6VWFrNxueXcul4srixZLgbSTkJ
y632eLkKmlBm30lSYNuvJoTATWJzW7qdUUolIQTTfD5p8MBw2BcO+ntH+7uktsBYd3/vwaSRHYv6
oj0T6aU2KlOiW+Z+n+9bwAgVKDA5dW9iyeOaNUos+5aYStjrC1ZNgqLbk7lazwUCAHLTwm8+vDhp
6oY59uxxnQWU7wkKh3Efx0lVAhdcKpgiXDSNsMyknuhw1wsjRw+kZEEmrKx+u7CaHl+aW0xM3B1P
pNaShWwma+QyWVMIwTnnbuvNea3YW26JJ6+bxCk9AZSXlNzUQDcVkAKA5PP7JMqYHIyE5cNnj/cE
28LRYE/bCChsiGjSsEXEwKqVCRlgBXN5AwGActz39+L2QSREaIrMg9EwBe/CdPV27LEYkL0mKID6
sqhLN4CocOyWJ/mdT7+aNYvm7w48f7IotfnfFhSO7qfSwbUCEQEBQbcM2eRmLFnItDHCuiRCj7AY
XZP9HZNjfcHpfCq7sLawspiYXY5nEslCLpUtAgA3i7qFArkQghNCBCJWWtTAjZicFTOd1wls+9VI
TFvIiRDCGGNMlmU6fHA0oAX9vt6h/jaIqP3haKRLifiP5LkeA4kN5k3dD2j4LM4lx3kfSxAgKDjO
jN+6mwR3o3i9JPVYkBPA/iAogPrsUSVUI01tXtQHX95YtHTj04MvnsmrnaF3BSMnEdC/1wPQKAQi
EYjEAhE01lN9+ohEDtCIUtRCbUt9vdGlvtMHlpgJyxKHBBashJHKx5cXl3LZVKaYSqwZq8urBrcs
zgUXKNBLoqpG5bNLUOXCFrbZmCilVAhBguGQPDg2HDCLBn/pe98Zy4PR1tPT07msp0eJTNtApgd0
02AFLLSbaAEaICHgY3TrVQQSQtZy+dzDhdk5Z97dluNq/d+97lgt2C8EBbCzJLXlyT/19b3V3Frm
86OvP50ND3UWUCJPbSSB7tuo81qAG2SAgH4E8FNGokRmh2TKdJlJpsrkXFDxpS3DmussDi/qucLK
6vzSg7XVRG5leiGZz+SM+OxSMRKL0kwybQpEoaoK6kVdEEpRCI4Sk4BzjgIRKSUACCAQkVFKhBDI
GKNCCKSMEsu0gEkSkSRGTcMEze9jiEgIEBKMhuS11YSIxNrkkWMH2tqCYdE+2j9mAvePjg4fXsol
Y0xiMcb1vhkzSYhKukyuW1wXCj6GaluV4ACQF6b1/uKDqd8UsvlS1QIvA3m1eOwGbD+Kv7WEH5Rz
Yzvd7k63tBKMRXxHv3PuYMeRoR9Tn/y6QBF8nO1S1YIAAUIAGWU6ARASZYYqKdmArK0IS+QYkgWz
qKfagxEiitby4spyjiIUCulsNm/oNLWSSApAikJw0zBRogy5ZXFZlolAJBQIFgydmEXDCkZCqp7J
G7GerqBpGKKtPaYxTfYriozgk7pMy8JwR3RAEPD7/P6hrJH3S7Icy5nFCCFADW4FEFFwIaT9HA7Q
RFiAsGQV9feSU8t/M/H7r8cTiyulHDyn7bAWknosB28/ElQ17aqFpNzWNNvcfOGANnT6UPfI88d/
KIV9P+aIoY11954oULI+fGRdtRASYTolxJIliQqOK0IIiwHJo8C8RJkQnOdUWWHcsrKEECAABiIS
07SKjDKFEiI0TdM45+jz+cO6aYhQKBhLZlPIJCmc1QsKoUQtmHqEEiIMYfkpEM5RSBt3EvkWS0hu
QACwkIs7Rk7/7dTFm/97amY5npheyoD7Ci5250U1//1YYr8SVDVtq5ak3DLbt6RDqAHN19bXFTz1
zovfV2KBdwWBYQGo7fUA7BcQIAgECCWk9PRmlFAdACglxEJESggRBIhgjDFA5JRQlQthEUoUIYQQ
KCQuxIZHTQAgkCdEIqoOCGlhWteLqdx701fvfLp8e3qxkMzak4PrlZ4e60He7+pMs5KL7a/bPuOm
JfRcwcosJKajsbYl2a8qhNEYPgaJxrsEAgCAiBQRGSISgULeIB1FoJAtIRSOQjUsUza5pRrcZKaw
ZJNb1BKccSGIQCzlubXG9BEQBc4Lw7yyNrX4n2eu3L08/83DZSNXdBJTPaV9H2tyAtj/BAVQH0mh
43tPcoKNp5HgHAvZHE8uxlcUJk/4QgGDyiwKj1d6TAuPF3S0+AMzX/x46fbUP01duHlrdXwuKR4l
BbuVVXkiJKcSvg0E5XaMnZQqSVCbFxwFrpPUUjwnCtZ0MBxakzUlQCiJbKxi3CKqFpoBDogp5P//
9s79uW3jiOO7d3gQJEXqactKHNtppmmcpL+0M53+1f0tnWkyk2SS6SPtpHUjN85DD8uRSFEUKZIA
iMfdbX+gmUAwQIIUJVMkvjMaAEcIJI7Ah7uLvVv1nX3a/tPJkx8/3//b7p57/vN8T/FJ6ZJKS72O
cvE3rtsAKICrQyqqUUM1CAAo9ALVa7Y9v+3UiyulU7NsceSsTABFWJBUhFyvTR4paoWO91n7+elH
P37x5G+1b/YbMhDDendXhdNC6bYACmDyeaJoxP8ngim6LYVU3fN20HpePzMN47hSrXaZxi1ArOTW
VK4pJAEgUKF46ja7fz599vzT7z/5567b7jkk1SzhtFDwuk2AGmoaayqqUfGoV0b0B56vmkf1TuB6
NcuyambRMpCzMgyeAN7G/st1sxpcU0T1wPY+7xw3P977/N9f1HcP68IL+qTGwmmS2NNCwQng9t5g
V4VUXKOGcZASktonZ17r6PRM1/Wj0krJ1Uy9DL9Uj8mtqVxJIiTqykD8x2v1Pq19s/eXvS//+619
1umJIBxO3xut0pKUTgCQDVALByeA2wsogNlBKsndi67//CsW9D1R//7owre9F2ah8JNhFRTTtS34
Jc8qV66BCFyS6jBw/H+0D+sfHfz96Venz47qftd11asuXbSMVNqcT0sHJ4Dbf1NNCylK2E4FU7yt
d9b2at8d1lDBgVWy6rqha8jZGuSxqVwAASmqKT98ajfaHx3/54fPj5/8uH/xU+NC+GEUTFGXLl4E
YZJkzIWFE8DtBxTA5JCaNIck6ZdMKSHp/HnNbh3WnnNkP1rlUpcbugmIJRhkqeegWi4JUtQCoQ68
tv3J6XdHH5/8d+/b2tODmtexXSKKgilqOQ0BNW6m0yQtNJwAFgNQAFerBBMXjVhGpx9RAKCCvi8v
Tppd5+xi3yyYh0bBdLmmmYBowQBUuRZbAghcIDoOus6nrcPTj+u7B18f/evZYbd+3iUpo3GmuOWU
NB3zVWcsWCgt0q/8NJCKz1eUVoctqQbbcFzfcACyXlpdsdbeuFN++PvH75e31/6AJv+QGOzQLSl7
lWsiEQCEIOnId/pPnGbnm9ZB7fv604Oa0+65QBQPfKfNFZ80o+lSx52iWhQLaqhZWlIA6bGpeIxK
AYAK/UA4bTvoNVpnoh/sFaxC3SyYBMg0QByWYs9BdbtFCOCRVAfC9b6yG+3P6v87/PLwr7u7p8+O
zoQXuDCovhIPggtIjzeNKlaR+BledyfclBbxZpm2pt64ubKTSiRFq9lGLSpdLxhG5e566d5vHm5v
Ptp5XNys/hE0fJsQ7hCRtgzzTi2YFBA4JOWx8MMD78LZbfxw9E1t9+DE77p9KURAioZzNiUFv+Nx
prQ8pxxOES0ioCY9r6wT+4+r5ZZUv03TC4ZZubtReuO9h/fWH9x7t7C+8jtmaI8JaYuAdMqHzsy7
QiDqkVRn0hf7TqvzdePbo932i9OW2+65geN5NHDn0sCUFmeKWk4AOZwStaiAmvT8ksbxxefQjltT
8XJIo2JUOuNcr95dK957/Pa9jYfb71jrld9yU3+POL71snBDDqr5kQIAgUQuKaqH/eCp3Wg/aR3W
9y+Oz1p2o93z7L4Pl8EUzWMaWkvxCeaSilIs3QDgSbTogJr0HNOsqeEyqdJu2sR48UnyNADQkTFN
Lxjmmx/8amvrnTcfrdxde18rmr9BjT8gpGo+B9XrFQIKIGqpUO75PeeZfdb5vlNrvmi/aJx3661e
2Pf9l8VRRwW+o25cUvA7rVJOmpYSTgDLcyNMC6nhdprrl1bym8Noq4ozxnSua0Z1e6O488Hbb649
2H7PrBQfc0P/FTHYAoASAeWJnzcjgQQ9JVVNeuGh33P3nfPOfuuo/qJ91Gjb5xeuCmX8adwQSPGg
d1LKwCTFUONaWjgBLNfFP+m54oj1eFwqDVZDOEXLdEeXOnKmabpmlDdXra1HO+ubj3YeFLdWP9Qs
49fA8T4gVAigAJdBmetqIgAQQOSQorYKZV14/qHXcfe6J83D5v5J7eLkrBe4ng90KaaUxVoiuDwL
QdaSXWmfc6m1jBf8LEAVt6iSQDVcT4JUHFgaMtS4ruvFaqmwdv/u6vpbd+9WttffMSuld3lBf5cQ
NgGglE/1MrUGECEIgMBVUtakHz73uu4Pvdr5/vnByU/tF42Ob7s+EQlSFIdRUuBbwatwSnLnAC4H
w6PLNC09nACW90K/CqSi21lKeMef/nFIdwE5ImqMc023DKOyvVFee2NrrbKzsVNarz7Si4VHzNAe
IMNNYDisPsNgeb/HLFI4GB93QZLqwg+O/K6zZzc7R52T81q3dt7pd+x+2Pd8GYiQfokvRQPecUsp
yVoa5cblVtOUWuYLe5pzz+L2jSvpHS2HxWPr0eA6BwCNaVwzy5ZZ3lwrVbfXV6v3NreLG5X7Rqlw
n5v6G8jZHWS4CohFANAJaJmBNQAFgQdEjlLqgoQ8C73gOHSC436nd+w0L856jXbbPuvYXtfxhBeE
RDQE0bj0gLillJb9nZbTlMNpQi3rhRzVrEA1zqqKQiopnyoJXBpE6/ohcs65ZlXLZvXexsrqW3e2
Vu6s71jV0n29aN5nGt9BhpuEWAUAYwlgNQRSSEQeEDhKyiaFoiH8sObb/ZP+hV13zjrNXqPVts87
jt9zfRGEMhJbGoJnnKU0SeB71Dz4o84lV0yLfPFOoqtCKrqd1f0bFVhPgtWlP0Tk3NA1q1I0y5ur
xcr2+mr5ztpWcXVlxyxbb3JD30GNbQHiKiAUCUAHvGSx3ba8KwIAQEQJRIFS1EcCGwE6YRA0hB+e
Bo530j/v1vttu9k5PW/bzY7tdZ1QBmFIiuLZ3NH1JCspCUijkiunBVPWfZZSOaAu66ZBlRSrSgNW
kks4gBVDznVNM8tFo7haLpTWK6XierVirZbXzbK1oReNLW7oG1zT1lBjVWS4goyVAcAChAIA6DRf
TwkHA3EJAiIKiKhPSrmMsEdSdnwvaEo/OFe+aLkdu+G0Oq3+hd1zmh3X77p+6AWBFFIQKQX0SvJk
GpQoYT1pzGXa+EyAV0GTw+mKmpcLcp40bZ9gSltWUI0CFof0GNYleCEiR86YZmiaXjB1o1gwzBXL
tKrlolUplc2VYsUoW1XNMleNgrGhmfo60/kGIKsCQhERC4qID6qZY9Ri0wCIR4bmRItTUOyc0/pG
ApGgIRwIJMHAssGXMSBGLGCInpSyFwbhRRgEbeEHbQhUR3hB1+nYHa9r90Lbc/sd2+13nb7wAiGC
UCohZcxSSrKKZMJrURCluW5pcAKYDkyT7Le0ygGVrlmDKrqMxqIAsrmBoxJD4xZXHGQMADgyxriu
Md0ytEK5aFhrZcuqlkvmSrFslq2ybhXK3OQlTddXGOdFYGAyzguM8wIwMJAxk3NuIWOWUkonImSM
IQAgESlFSgGAQkBgDAFx8CIRgSQllFS+UsonqTwllUdK9ZWQLknlklR9EsqhQDqB53fdi17X7dqu
33P7wvUDEQgReL4QXiAGIFJDGMVdsCQXLc1CSht2EreM0oakTAumSfddWuWAGq2r9E8WUMWhlNSW
NsRmGnhd2hcRGdM447rGuKlzvWDoRsHUNVPXmaFpuqlrTNM4csY1XdN0Q9eZpumgockNwzAKhs45
14QSTCkiQECGCBw5IIBSUgoRCCGCMBRSKqWkVFJJJaRQQgoZikAFMpShECoIQ+GLMPT8IHC8MPR8
KUIhSKrEiQIhPUaUJX6UNbs7zYW7Cpim2X9plQMqm2YNqmh7GqDir40CVlo2e1ryaOoxEJEBAkNE
BEAEIFRSETJEZMheWmHIdR0Z5wwZMWQcmMYY4xwZMiRFJEWohB9S6AVSCqEAkF7elwQERESDG3+w
QkBAACRftowau5aWrZ32hG3UOsBoty1pPappQJPDaQLlgMquWfRVVqtquMxiXaVlswMkQ4jBaOBB
wvsmuaSvnscgcEU03KaXQPpFo4LLiQUqErbH7ZclL2lcLGlc/lIOphtSDqjJdV2girYnwQAztI+C
F0A6oJL+xr3nuL5ASHeN0tyoUe1R+ADMHkRZkiqnhUwOpymVA2o6zarfxt3g8eU4aMXbxllfw3Y2
wftBwutREVyGE0CyBUIp25NCC2A8jMYBMu1zprVNohxOV1AOqKtplv03KayGyywQGQWxUcdJs5Sy
WFBRpblIaaBKe13BaNhE94OM+6YBZBZgyeF0ReWAmo1m3Y9ZYDVcz2LdjPufLC7cOChF86KSNM46
yZKNnfW1cSC6Tihdx7GWVjmgZqvr6M+ssBpuj2sbBZ+kdRpx3LgoYZ+sAeasVs4oOKW1ZXnfWSkH
0wyVA2r2us4+HXfsrK7YOAvrps4pq4WTBTqTPGm7LojkcJqxckBdn667b7Mef5L40VXaJlVablGW
faZ57H+d8MjBdE3KAXX9uqk+nuR9JoFOkps2Lg6VpFlBZd7GueVwukblgLo53XRfT/t+k7qR0yqL
9TTL481aOZhuQDmgbl6vs89vOogf1aI8IcvBdIPKAfX6NC99Py+fI0nzBIN5+ixLo3m+OJdF8/4d
XPfnm/cbf94/30Jr3m+OZVL+XcyXcjDNgfKbYv6UfyevTzmU5kz5zTDfyr+fm1EOpjnV/wGjqHcX
GqM4ZwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0xMi0yM1QwNTozMjo0MSswMDowMGzutpEAAAAl
dEVYdGRhdGU6bW9kaWZ5ADIwMjItMTItMjNUMDU6MzI6NDErMDA6MDAdsw4tAAAAAElFTkSuQmCC
xlink:href="data:image/png;base64,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
"
id="image63"
x="-0.20165412"
y="86.646721" />
id="image10" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
xml:space="preserve"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
sodipodi:docname="xero_blackPurp.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#505050"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.61112514"
inkscape:cx="291.26604"
inkscape:cy="561.25984"
inkscape:window-width="1600"
inkscape:window-height="868"
inkscape:window-x="0"
inkscape:window-y="32"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs2"><linearGradient
x1="112.49854"
y1="6.1372099"
x2="112.49853"
y2="129.3468"
id="path1082_2_"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(287,-83)"><stop
id="stop193"
style="stop-color:#ffffff;stop-opacity:0"
offset="0" /><stop
id="stop195"
style="stop-color:#ffffff;stop-opacity:0.27450982"
offset="1" /><midPointStop
offset="0"
style="stop-color:#FFFFFF"
id="midPointStop197" /><midPointStop
offset="0.5"
style="stop-color:#FFFFFF"
id="midPointStop199" /><midPointStop
offset="1"
style="stop-color:#000000"
id="midPointStop201" /></linearGradient><linearGradient
x1="541.33502"
y1="104.50665"
x2="606.91248"
y2="303.14029"
id="linearGradient2544"
xlink:href="#path1082_2_"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.3937741,0,0,0.393752,357.51969,122.00151)" /><linearGradient
id="linearGradient3388"><stop
id="stop3390"
style="stop-color:#000000;stop-opacity:0"
offset="0" /><stop
id="stop3392"
style="stop-color:#000000;stop-opacity:0.37113401"
offset="1" /></linearGradient><linearGradient
x1="490.72305"
y1="237.72447"
x2="490.72305"
y2="183.9644"
id="linearGradient4416"
xlink:href="#linearGradient3388"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.749107,0,0,0.749107,-35.459862,91.44108)" /></defs><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"><path
style="fill:#000000;stroke-width:1.1668"
d="M 125.73012,104.84668 105.00471,56.809113 84.269865,104.90472 105.04887,126.97555 Z"
id="path1993"
sodipodi:nodetypes="ccccc" /><path
id="path1987"
style="fill:#35244f;fill-opacity:1;stroke-width:1.167;stroke-dasharray:none"
d="m 72.759075,103.62003 -18.66915,0.81959 -18.66863,0.8201 10.98176,1.67587 10.98176,1.67587 36.82359,38.94181 -22.39243,22.28598 -22.39295,22.28597 -10.99881,1.84589 c -6.04915,1.01511 -12.61208,1.92869 -14.58464,2.03036 -6.28112,0.3238 16.93093,1.89737 29.66744,2.01125 l 12.25093,0.10955 19.57142,-19.43705 19.670625,-19.04018 19.67063,19.04018 19.57142,19.43705 12.25093,-0.10955 c 12.7365,-0.11388 35.94856,-1.68745 29.66744,-2.01125 -1.97256,-0.10167 -8.53549,-1.01525 -14.58464,-2.03036 l -10.99881,-1.84589 -22.39295,-22.28597 -22.39243,-22.28598 36.82359,-38.94181 10.98176,-1.67587 10.98175,-1.67587 -18.66862,-0.8201 -18.66915,-0.81959 -32.24092,33.31786 z" /><g
id="g2119"
transform="translate(-0.482115)"><path
style="fill:#000000;stroke-width:1.1668"
d="M 166.49077,186.24026 138.93826,132.6285 125.70524,147.39459 Z"
id="path1989-3-8"
sodipodi:nodetypes="cccc" /><path
style="fill:#000000;stroke-width:1.1668"
d="m 44.473449,186.24026 27.55251,-53.61176 13.23302,14.76609 z"
id="path1989-3-8-7"
sodipodi:nodetypes="cccc" /></g><g
id="g2174"
transform="translate(-0.256755)"><path
style="font-variation-settings:normal;vector-effect:none;fill:#000000;fill-opacity:1;stroke-width:1.1668;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 34.621605,203.98442 h 34.89753 l 16.20326,-16.0891 -0.88962,9.9247 c -0.49483,5.52052 0.89795,11.8414 1.25416,12.76961 -27.34428,4.44336 -53.4284,21.2228 -71.13238,30.14181 z"
id="path641-3-61"
sodipodi:nodetypes="cccsccc" /><path
style="font-variation-settings:normal;vector-effect:none;fill:#000000;fill-opacity:1;stroke-width:1.1668;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
d="m 175.8919,203.98442 h -34.89753 l -16.20325,-16.0891 0.88961,9.9247 c 0.49484,5.52052 -0.89795,11.8414 -1.25416,12.76961 27.34428,4.44336 53.4284,21.2228 71.13238,30.14181 z"
id="path641-3-61-9"
sodipodi:nodetypes="cccsccc" /></g></g></svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=agarimos-20230305
Exec=quickemu -vm "agarimos-20230305.conf"
Icon=/home/zen/.config/quickemu/vms_icons/agarimos.png
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=agarimos
Exec=quickemu -vm "agarimos.conf"
Icon=/home/zen/.config/quickemu/vms_icons/agarimos.png
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=alpine-3.15
Exec=quickemu -vm "alpine-3.15.conf"
Icon=/home/zen/.config/quickemu/vms_icons/alpine.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=alpine-latest
Exec=quickemu -vm "alpine-latest.conf"
Icon=/home/zen/.config/quickemu/vms_icons/alpine.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=archcraft-latest
Exec=quickemu -vm "archcraft-latest.conf"
Icon=/home/zen/.config/quickemu/vms_icons/archcraft.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=cereus
Exec=quickemu -vm "cereus.conf"
Icon=/home/zen/.config/quickemu/vms_icons/cereus.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=fvoid
Exec=quickemu -vm "fvoid.conf"
Icon=/home/zen/.config/quickemu/vms_icons/tux.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=gabeeos
Exec=quickemu -vm "gabeeos.conf"
Icon=/home/zen/.config/quickemu/vms_icons/gabeeos.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=haiku-r1beta4-x86_64
Exec=quickemu -vm "haiku-r1beta4-x86_64.conf"
Icon=/home/zen/.config/quickemu/vms_icons/haiku.png
Categories=System;Virtualization;

View File

@ -0,0 +1,6 @@
[Desktop Entry]
Type=Application
Name=netboot-latest
Exec=quickemu -vm "netboot-latest.conf"
Icon=/home/zen/.config/quickemu/vms_icons/netboot.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=slitaz-core-5in1
Exec=quickemu -vm "slitaz-core-5in1.conf"
Icon=/home/zen/.config/quickemu/vms_icons/slitaz.png
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=slitaz-core
Exec=quickemu -vm "slitaz-core.conf"
Icon=/home/zen/.config/quickemu/vms_icons/slitaz.png
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=slitaz-preferred
Exec=quickemu -vm "slitaz-preferred.conf"
Icon=/home/zen/.config/quickemu/vms_icons/slitaz.png
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=ubuntu-unity-daily-live
Exec=quickemu -vm "ubuntu-unity-daily-live.conf"
Icon=/home/zen/.config/quickemu/vms_icons/ubuntu-unity.png
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=ubuntustudio-dvd
Exec=quickemu -vm "ubuntustudio-dvd.conf"
Icon=/home/zen/.config/quickemu/vms_icons/ubuntustudio.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=void-current-glibc
Exec=quickemu -vm "void-current-glibc.conf"
Icon=/home/zen/.config/quickemu/vms_icons/void.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=void-current-xfce-glibc
Exec=quickemu -vm "void-current-xfce-glibc.conf"
Icon=/home/zen/.config/quickemu/vms_icons/void.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=voidpup
Exec=quickemu -vm "voidpup.conf"
Icon=/home/zen/.config/quickemu/vms_icons/voidpup.png
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=vxlinux-6.1
Exec=quickemu -vm "vxlinux-6.1.conf"
Icon=/home/zen/.config/quickemu/vms_icons/vxlinux.svg
Categories=System;Virtualization;

View File

@ -1,6 +0,0 @@
[Desktop Entry]
Type=Application
Name=xerolinux-kde
Exec=quickemu -vm "xerolinux-kde.conf"
Icon=/home/zen/.config/quickemu/vms_icons/xerolinux.png
Categories=System;Virtualization;

View File

@ -4,5 +4,5 @@ Name=xerolinux
releases=kde
replace='"!"'
Exec=sh -c 'cd /home/zen/.local/share/quickemu && yad --form --separator=" " --field="Release:CB" "kde" | xargs -I{} sakura -e "quickget xerolinux {}"'
Icon=/home/zen/.config/quickemu/vms_icons/xerolinux.png
Icon=/home/zen/.config/quickemu/vms_icons/xerolinux.svg
Categories=System;Virtualization;

42
docs/Makefile Normal file
View File

@ -0,0 +1,42 @@
include pandoc-man.mk
ifeq ($(PREFIX),)
PREFIX := /usr/local
endif
datarootdir := $(PREFIX)/share
datadir := $(datarootdir)
mandir := $(datarootdir)/man
bindir := $(PREFIX)/bin
all: quickget.1 quickemu.1 quickemu_conf.1
clean:
rm *.1
install_docs: all
install -d $(DESTDIR)$(mandir)/man1
install -m 644 quickget.1 $(DESTDIR)$(mandir)/man1
install -m 644 quickemu.1 $(DESTDIR)$(mandir)/man1
install -m 644 quickemu_conf.1 $(DESTDIR)$(mandir)/man1
# install -m 644 quickgui.1 $(DESTDIR)$(mandir)/man1
install_bins:
install -d $(DESTDIR)$(bindir)
install -m 755 ../quickget $(DESTDIR)$(bindir)
install -m 755 ../quickemu $(DESTDIR)$(bindir)
install -m 755 ../macrecovery $(DESTDIR)$(bindir)
install: install_bins install_docs
uninstall::
rm -f $(DESTDIR)$(mandir)/man1/quickget.1
rm -f $(DESTDIR)$(mandir)/man1/quickemu.1
rm -f $(DESTDIR)$(mandir)/man1/quickemu_conf.1
rm -f $(DESTDIR)$(bindir)/quickget
rm -f $(DESTDIR)$(bindir)/quickemu
rm -f $(DESTDIR)$(bindir)/macrecovery
.PHONY: all

8
docs/pandoc-man.mk Normal file
View File

@ -0,0 +1,8 @@
PANDOC ?= pandoc
MANSECTION ?= 1
MANPAGE.md = $(PANDOC) --standalone $(PANDOCFLAGS) --to man
%.$(MANSECTION): %.$(MANSECTION).md
$(MANPAGE.md) $< -o $@

932
docs/quickemu.1 Normal file
View File

@ -0,0 +1,932 @@
.\" Automatically generated by Pandoc 2.19.2
.\"
.\" Define V font for inline verbatim, using C font in formats
.\" that render this, and otherwise B font.
.ie "\f[CB]x\f[]"x" \{\
. ftr V B
. ftr VI BI
. ftr VB B
. ftr VBI BI
.\}
.el \{\
. ftr V CR
. ftr VI CI
. ftr VB CB
. ftr VBI CBI
.\}
.TH "QUICKEMU" "1" "February 4, 2023" "quickemu" "Quickemu User Manual"
.hy
.SH NAME
.PP
quickemu - A quick VM builder and manager
.SH SYNOPSIS
.PP
\f[B]quickemu\f[R] [\f[I]OPTION\f[R]]\&...
.SH DESCRIPTION
.PP
\f[B]quickemu\f[R] will create and run highly optimised desktop virtual
machines for Linux, macOS and Windows
.SH OPTIONS
.TP
\f[B]\[en]vm\f[R]
vm configuration file
.PP
You can also pass optional parameters
.TP
\f[B]\[en]braille\f[R]
Enable braille support.
Requires SDL.
.TP
\f[B]\[en]delete\f[R]
Delete the disk image.
.TP
\f[B]\[en]display\f[R]
Select display backend.
`sdl' (default), `gtk', `none' or `spice'
.TP
\f[B]\[en]fullscreen\f[R]
Starts VM in full screen mode (Ctl+Alt+f to exit)
.TP
\f[B]\[en]ignore-msrs-always\f[R]
Configure KVM to always ignore unhandled machine-specific registers
.TP
\f[B]\[en]screen <screen>\f[R]
Use specified screen to determine the window size.
.TP
\f[B]\[en]shortcut\f[R]
Create a desktop shortcut
.TP
\f[B]\[en]snapshot apply <tag>\f[R]
Apply/restore a snapshot.
.TP
\f[B]\[en]snapshot create <tag>\f[R]
Create a snapshot.
.TP
\f[B]\[en]snapshot delete <tag>\f[R]
Delete a snapshot.
.TP
\f[B]\[en]snapshot info\f[R]
Show disk/snapshot info.
.TP
\f[B]\[en]status-quo\f[R]
Do not commit any changes to disk/snapshot.
.TP
\f[B]\[en]version\f[R]
Print version
.SH EXAMPLES
.TP
\f[B]quickemu \[en]vm ubuntu-mate-22.04.conf\f[R]
Launches the VM specified in the file \f[I]ubuntu-mate-22.04.conf\f[R]
.SS Introduction
.PP
Quickly create and run highly optimised desktop virtual machines for
Linux, macOS and Windows; with just two commands.
You decide what operating system you want to run and Quickemu will
figure out the best way to do it for you.
For example:
.IP
.nf
\f[C]
quickget ubuntu-mate 22.04
quickemu --vm ubuntu-mate-22.04.conf
\f[R]
.fi
.PP
The original objective of the project was to enable quick testing of
Linux distributions where the virtual machine configurations can be
stored anywhere, such as external USB storage or your home directory,
and no elevated permissions are required to run the virtual machines.
\f[B]Quickemu now also includes comprehensive support for macOS and
Windows\f[R].
.SS Features
.IP \[bu] 2
\f[B]macOS\f[R] Monterey, Big Sur, Catalina, Mojave & High Sierra
.IP \[bu] 2
\f[B]Windows\f[R] 8.1, 10 and 11 including TPM 2.0
.IP \[bu] 2
Ubuntu (https://ubuntu.com/desktop) and all the \f[B]official Ubuntu
flavours (https://ubuntu.com/download/flavours)\f[R]
.IP \[bu] 2
\f[B]Over 360 operating system editions are supported!\f[R]
.IP \[bu] 2
Full SPICE support including host/guest clipboard sharing
.IP \[bu] 2
VirtIO-webdavd file sharing for Linux and Windows guests
.IP \[bu] 2
VirtIO-9p file sharing for Linux and macOS guests
.IP \[bu] 2
QEMU Guest Agent support (https://wiki.qemu.org/Features/GuestAgent);
provides access to a system-level agent via standard QMP commands
.IP \[bu] 2
Samba file sharing for Linux, macOS and Windows guests (\f[I]if
\f[VI]smbd\f[I] is installed on the host\f[R])
.IP \[bu] 2
VirGL acceleration
.IP \[bu] 2
USB device pass-through
.IP \[bu] 2
Smartcard pass-through
.IP \[bu] 2
Automatic SSH port forwarding to guests
.IP \[bu] 2
Network port forwarding
.IP \[bu] 2
Full duplex audio
.IP \[bu] 2
Braille support
.IP \[bu] 2
EFI (with or without SecureBoot) and Legacy BIOS boot
.IP \[bu] 2
Graphical user interfaces available
.PP
Quickemu is a wrapper for the excellent QEMU (https://www.qemu.org/)
that attempts to automatically \f[I]\[lq]do the right thing\[rq]\f[R],
rather than expose exhaustive configuration options.
.PP
We have a Discord for this project:
[IMAGE: Discord (https://img.shields.io/discord/712850672223125565?color=0C306A&label=WimpysWorld%20Discord&logo=Discord&logoColor=ffffff&style=flat-square)] (https://discord.gg/sNmz3uw)
.PP
See this (old) video where I explain some of my motivations for creating
Quickemu.
.PP
[IMAGE: Replace VirtualBox with Bash &
QEMU (https://img.youtube.com/vi/AOTYWEgw0hI/0.jpg)] (https://www.youtube.com/watch?v=AOTYWEgw0hI)
.SS Requirements
.IP \[bu] 2
QEMU (https://www.qemu.org/) (\f[I]6.0.0 or newer\f[R]) \f[B]with GTK,
SDL, SPICE & VirtFS support\f[R]
.IP \[bu] 2
bash (https://www.gnu.org/software/bash/) (\f[I]4.0 or newer\f[R])
.IP \[bu] 2
Coreutils (https://www.gnu.org/software/coreutils/)
.IP \[bu] 2
EDK II (https://github.com/tianocore/edk2)
.IP \[bu] 2
grep (https://www.gnu.org/software/grep/)
.IP \[bu] 2
jq (https://stedolan.github.io/jq/)
.IP \[bu] 2
LSB (https://wiki.linuxfoundation.org/lsb/start)
.IP \[bu] 2
procps (https://gitlab.com/procps-ng/procps)
.IP \[bu] 2
python3 (https://www.python.org/)
.IP \[bu] 2
macrecovery (https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery)
.IP \[bu] 2
mkisofs (http://cdrtools.sourceforge.net/private/cdrecord.html)
.IP \[bu] 2
usbutils (https://github.com/gregkh/usbutils)
.IP \[bu] 2
util-linux (https://github.com/karelzak/util-linux)
.IP \[bu] 2
sed (https://www.gnu.org/software/sed/)
.IP \[bu] 2
socat (http://www.dest-unreach.org/socat/)
.IP \[bu] 2
spicy (https://gitlab.freedesktop.org/spice/spice-gtk)
.IP \[bu] 2
swtpm (https://github.com/stefanberger/swtpm)
.IP \[bu] 2
Wget (https://www.gnu.org/software/wget/)
.IP \[bu] 2
xdg-user-dirs (https://www.freedesktop.org/wiki/Software/xdg-user-dirs/)
.IP \[bu] 2
xrandr (https://gitlab.freedesktop.org/xorg/app/xrandr)
.IP \[bu] 2
zsync (http://zsync.moria.org.uk/)
.IP \[bu] 2
unzip (http://www.info-zip.org/UnZip.html)
.SS Installing Requirements
.PP
For Ubuntu, Arch and nixos systems the
ppa (https://launchpad.net/~flexiondotorg/+archive/ubuntu/quickemu),
AUR (https://aur.archlinux.org/packages/quickemu) or
nix (https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/quickemu)
packaging will take care of the dependencies.
For other host distributions or operating systems it will be necessary
to install the above requirements or their equivalents.
.PP
These examples may save a little typing
.PP
Debian:
.IP
.nf
\f[C]
sudo apt install qemu bash coreutils ovmf grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-client-gtk swtpm wget xdg-user-dirs zsync unzip
\f[R]
.fi
.PP
Fedora:
.IP
.nf
\f[C]
sudo dnf install qemu bash coreutils edk2-tools grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-gtk-tools swtpm wget xdg-user-dirs xrandr unzip
\f[R]
.fi
.PP
MacOS:
.PP
This is a work in progress (see issue
248 (https://github.com/quickemu-project/quickemu/issues/248) for other
steps and changes that may enable running on MacOS)
.IP
.nf
\f[C]
brew install qemu bash coreutils grep jq python\[at]3.10 cdrtools gnu-sed spice-gtk wget zsync
\f[R]
.fi
.SH Usage
.SS Graphical User Interfaces
.PP
While \f[V]quickemu\f[R] and \f[V]quickget\f[R] are designed for the
terminal, a graphical user interface is also available:
.IP \[bu] 2
\f[B]Quickgui (https://github.com/quickgui/quickgui)\f[R] by Mark
Johnson (https://github.com/marxjohnson) and Yannick
Mauray (https://github.com/ymauray).
.PP
Many thanks to Luke Wesley-Holley (https://github.com/Lukewh) and
Philipp Kiemle (https://github.com/daPhipz) for creating the
\f[B]Quickemu icons (https://github.com/Lukewh/quickemu-icons)\f[R]
\[u1F3A8]
.SS Quickgui for Ubuntu
.IP
.nf
\f[C]
sudo add-apt-repository ppa:yannick-mauray/quickgui
sudo apt update
sudo apt install quickgui
\f[R]
.fi
.SS Ubuntu Guest
.PP
\f[V]quickget\f[R] will automatically download an Ubuntu release and
create the virtual machine configuration.
.IP
.nf
\f[C]
quickget ubuntu 22.04
quickemu --vm ubuntu-22.04.conf
\f[R]
.fi
.IP \[bu] 2
Complete the installation as normal.
.IP \[bu] 2
Post-install:
.RS 2
.IP \[bu] 2
Install the SPICE agent (\f[V]spice-vdagent\f[R]) in the guest to enable
copy/paste and USB redirection
.RS 2
.IP \[bu] 2
\f[V]sudo apt install spice-vdagent\f[R]
.RE
.IP \[bu] 2
Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) in the guest to
enable file sharing.
.RS 2
.IP \[bu] 2
\f[V]sudo apt install spice-webdavd\f[R]
.RE
.RE
.SS Ubuntu devel (daily-live) images
.PP
\f[V]quickget\f[R] can also download/refresh devel images via
\f[V]zsync\f[R] for Ubuntu developers and testers.
.IP
.nf
\f[C]
quickget ubuntu devel
quickemu --vm ubuntu-devel.conf
\f[R]
.fi
.PP
You can run \f[V]quickget ubuntu devel\f[R] to refresh your daily
development image as often as you like, it will even automatically
switch to a new series.
.SS Ubuntu Flavours
.PP
All the official Ubuntu flavours are supported, just replace
\f[V]ubuntu\f[R] with your preferred flavour.
.IP \[bu] 2
\f[V]kubuntu\f[R] (Kubuntu)
.IP \[bu] 2
\f[V]lubuntu\f[R] (Lubuntu)
.IP \[bu] 2
\f[V]ubuntu-budgie\f[R] (Ubuntu Budgie)
.IP \[bu] 2
\f[V]ubuntukylin\f[R] (Ubuntu Kylin)
.IP \[bu] 2
\f[V]ubuntu-mate\f[R] (Ubuntu MATE)
.IP \[bu] 2
\f[V]ubuntustudio\f[R] (Ubuntu Studio)
.IP \[bu] 2
\f[V]ubuntu\f[R] (Ubuntu)
.IP \[bu] 2
\f[V]ubuntu-unity\f[R] (Ubuntu Unity)
.IP \[bu] 2
\f[V]xubuntu\f[R] (Xubuntu)
.SS Other Operating Systems
.PP
\f[V]quickget\f[R] also supports:
.IP \[bu] 2
\f[V]alma\f[R] (Alma Linux)
.IP \[bu] 2
\f[V]alpine\f[R] (Alpine Linux)
.IP \[bu] 2
\f[V]android\f[R] (Android x86)
.IP \[bu] 2
\f[V]archcraft\f[R] (Archcraft)
.IP \[bu] 2
\f[V]archlinux\f[R] (Arch Linux)
.IP \[bu] 2
\f[V]arcolinux\f[R] (Arco Linux)
.IP \[bu] 2
\f[V]batocera\f[R] (Batocera)
.IP \[bu] 2
\f[V]cachyos\f[R] (CachyOS)
.IP \[bu] 2
\f[V]centos-stream\f[R] (CentOS Stream)
.IP \[bu] 2
\f[V]debian\f[R] (Debian)
.IP \[bu] 2
\f[V]deepin\f[R] (Deepin)
.IP \[bu] 2
\f[V]devuan\f[R] (Devuan)
.IP \[bu] 2
\f[V]dragonflybsd\f[R] (DragonFlyBSD)
.IP \[bu] 2
\f[V]elementary\f[R] (elementary OS)
.IP \[bu] 2
\f[V]endeavouros\f[R] (EndeavourOS)
.IP \[bu] 2
\f[V]fedora\f[R] (Fedora)
.IP \[bu] 2
\f[V]freebsd\f[R] (FreeBSD)
.IP \[bu] 2
\f[V]freedos\f[R] (FreeDOS)
.IP \[bu] 2
\f[V]garuda\f[R] (Garuda Linux)
.IP \[bu] 2
\f[V]gentoo\f[R] (Gentoo)
.IP \[bu] 2
\f[V]ghostbsd\f[R] (GhostBSD)
.IP \[bu] 2
\f[V]haiku\f[R] (Haiku)
.IP \[bu] 2
\f[V]kali\f[R] (Kali)
.IP \[bu] 2
\f[V]kdeneon\f[R] (KDE Neon)
.IP \[bu] 2
\f[V]kolibrios\f[R] (KolibriOS)
.IP \[bu] 2
\f[V]linuxmint\f[R] (Linux Mint)
.IP \[bu] 2
\f[V]lmde\f[R] (Linux Mint Debian Edition)
.IP \[bu] 2
\f[V]mageia\f[R] (Mageia)
.IP \[bu] 2
\f[V]manjaro\f[R] (Manjaro)
.IP \[bu] 2
\f[V]mxlinux\f[R] (MX Linux)
.IP \[bu] 2
\f[V]netboot\f[R] (netboot.xyz)
.IP \[bu] 2
\f[V]netbsd\f[R] (NetBSD)
.IP \[bu] 2
\f[V]nixos\f[R] (NixOS)
.IP \[bu] 2
\f[V]openbsd\f[R] (OpenBSD)
.IP \[bu] 2
\f[V]opensuse\f[R] (openSUSE)
.IP \[bu] 2
\f[V]oraclelinux\f[R] (Oracle Linux)
.IP \[bu] 2
\f[V]popos\f[R] (Pop!_OS)
.IP \[bu] 2
\f[V]reactos\f[R] (ReactOS)
.IP \[bu] 2
\f[V]rebornos\f[R] (RebornOS)
.IP \[bu] 2
\f[V]rockylinux\f[R] (Rocky Linux)
.IP \[bu] 2
\f[V]slackware\f[R] (Slackware)
.IP \[bu] 2
\f[V]solus\f[R] (Solus)
.IP \[bu] 2
\f[V]tails\f[R] (Tails)
.IP \[bu] 2
\f[V]truenas-core\f[R] (TrueNAS Core)
.IP \[bu] 2
\f[V]truenas-scale\f[R] (TrueNAS Scale)
.IP \[bu] 2
\f[V]void\f[R] (Void Linux)
.IP \[bu] 2
\f[V]zorin\f[R] (Zorin OS)
.PP
Or you can download a Linux image and manually create a VM
configuration.
.IP \[bu] 2
Download a .iso image of a Linux distribution
.IP \[bu] 2
Create a VM configuration file; for example
\f[V]debian-bullseye.conf\f[R]
.IP
.nf
\f[C]
guest_os=\[dq]linux\[dq]
disk_img=\[dq]debian-bullseye/disk.qcow2\[dq]
iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
\f[R]
.fi
.IP \[bu] 2
Use \f[V]quickemu\f[R] to start the virtual machine:
.IP
.nf
\f[C]
quickemu --vm debian-bullseye.conf
\f[R]
.fi
.IP \[bu] 2
Complete the installation as normal.
.IP \[bu] 2
Post-install:
.RS 2
.IP \[bu] 2
Install the SPICE agent (\f[V]spice-vdagent\f[R]) in the guest to enable
copy/paste and USB redirection.
.IP \[bu] 2
Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) in the guest to
enable file sharing.
.RE
.SS macOS Guest
.PP
\f[V]quickget\f[R] automatically downloads a macOS recovery image and
creates a virtual machine configuration.
.IP
.nf
\f[C]
quickget macos catalina
quickemu --vm macos-catalina.conf
\f[R]
.fi
.PP
macOS \f[V]high-sierra\f[R], \f[V]mojave\f[R], \f[V]catalina\f[R],
\f[V]big-sur\f[R] and \f[V]monterey\f[R] are supported.
.IP \[bu] 2
Use cursor keys and enter key to select the \f[B]macOS Base System\f[R]
.IP \[bu] 2
From \f[B]macOS Utilities\f[R]
.RS 2
.IP \[bu] 2
Click \f[B]Disk Utility\f[R] and \f[B]Continue\f[R]
.RS 2
.IP \[bu] 2
Select \f[V]QEMU HARDDISK Media\f[R] (\[ti]103.08GB) from the list and
click \f[B]Erase\f[R].
.IP \[bu] 2
Enter a \f[V]Name:\f[R] for the disk
.IP \[bu] 2
If you are installing macOS Mojave or later (Catalina, Big Sur, and
Monterey), choose any of the APFS options as the filesystem.
MacOS Extended may not work.
.RE
.IP \[bu] 2
Click \f[B]Erase\f[R].
.IP \[bu] 2
Click \f[B]Done\f[R].
.IP \[bu] 2
Close Disk Utility
.RE
.IP \[bu] 2
From \f[B]macOS Utilities\f[R]
.RS 2
.IP \[bu] 2
Click \f[B]Reinstall macOS\f[R] and \f[B]Continue\f[R]
.RE
.IP \[bu] 2
Complete the installation as you normally would.
.RS 2
.IP \[bu] 2
On the first reboot use cursor keys and enter key to select \f[B]macOS
Installer\f[R]
.IP \[bu] 2
On the subsequent reboots use cursor keys and enter key to select the
disk you named
.RE
.IP \[bu] 2
Once you have finished installing macOS you will be presented with an
the out-of-the-box first-start wizard to configure various options and
set up your username and password
.IP \[bu] 2
OPTIONAL: After you have concluded the out-of-the-box wizard, you may
want to enable the TRIM feature that the computer industry created for
SSD disks.
This feature in our macOS installation will allow QuickEmu to compact
(shrink) your macOS disk image whenever you delete files inside the
Virtual Machine.
Without this step your macOS disk image will only ever get larger and
will not shrink even when you delete lots of data inside macOS.
.RS 2
.IP \[bu] 2
To enable TRIM, open the Terminal application and type the following
command followed by pressing enter to tell macos to use the TRIM command
on the hard disk when files are deleted:
.RE
.IP
.nf
\f[C]
sudo trimforce enable
\f[R]
.fi
.PP
You will be prompted to enter your account\[cq]s password to gain the
privilege needed.
Once you\[cq]ve entered your password and pressed enter the command will
request confirmation in the form of two questions that require you to
type y (for a \[lq]yes\[rq] response) followed by enter to confirm.
If you press enter without first typing y the system will consider that
a negative response as though you said \[lq]no\[rq]:
.IP
.nf
\f[C]
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an \[dq]as is\[dq] basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
Are you sure you with to proceed (y/N)?
\f[R]
.fi
.PP
And a second confirmation once you\[cq]ve confirmed the previous one:
.IP
.nf
\f[C]
Your system will immediately reboot when this is complete.
Is this OK (y/N)?
\f[R]
.fi
.PP
As the last message states, your system will automatically reboot as
soon as the command completes.
.PP
The default macOS configuration looks like this:
.IP
.nf
\f[C]
guest_os=\[dq]macos\[dq]
img=\[dq]macos-catalina/RecoveryImage.img\[dq]
disk_img=\[dq]macos-catalina/disk.qcow2\[dq]
macos_release=\[dq]catalina\[dq]
\f[R]
.fi
.IP \[bu] 2
\f[V]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
macOS.
.IP \[bu] 2
\f[V]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
optimise for a particular macOS release.
.RS 2
.IP \[bu] 2
For example VirtIO Network and Memory Ballooning are available in Big
Sur and newer, but not previous releases.
.IP \[bu] 2
And VirtIO Block Media (disks) are supported/stable in Catalina and
newer.
.RE
.SS macOS compatibility
.PP
There are some considerations when running macOS via Quickemu.
.IP \[bu] 2
Supported macOS releases:
.RS 2
.IP \[bu] 2
High Sierra
.IP \[bu] 2
Mojave
.IP \[bu] 2
Catalina \f[B](Recommended)\f[R]
.IP \[bu] 2
Big Sur
.IP \[bu] 2
Monterey
.RE
.IP \[bu] 2
\f[V]quickemu\f[R] will automatically download the required
OpenCore (https://github.com/acidanthera/OpenCorePkg) bootloader and
OVMF firmware from OSX-KVM (https://github.com/kholia/OSX-KVM).
.IP \[bu] 2
Optimised by default, but no GPU acceleration is available.
.RS 2
.IP \[bu] 2
Host CPU vendor is detected and guest CPU is optimised accordingly.
.IP \[bu] 2
VirtIO Block
Media (https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is used
for the system disk where supported.
.IP \[bu] 2
VirtIO \f[V]usb-tablet\f[R] (http://philjordan.eu/osx-virt/) is used for
the mouse.
.IP \[bu] 2
VirtIO Network (\f[V]virtio-net\f[R]) is supported and enabled on macOS
Big Sur and newer but previous releases use \f[V]vmxnet3\f[R].
.IP \[bu] 2
VirtIO Memory Ballooning is supported and enabled on macOS Big Sur and
newer but disabled for other support macOS releases.
.RE
.IP \[bu] 2
USB host and SPICE pass-through is:
.RS 2
.IP \[bu] 2
UHCI (USB 2.0) on macOS Catalina and earlier.
.IP \[bu] 2
XHCI (USB 3.0) on macOS Big Sur and newer.
.RE
.IP \[bu] 2
Display resolution can only be changed via macOS System Preferences.
.IP \[bu] 2
\f[B]Full Duplex audio requires VoodooHDA
OC (https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
audio-device to the macOS guest VM\f[R].
.IP \[bu] 2
NOTE!
Gatekeeper (https://disable-gatekeeper.github.io/) and System Integrity
Protection
(SIP) (https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
need to be disabled to install VoodooHDA OC
.IP \[bu] 2
File sharing between guest and host is available via
virtio-9p (https://wiki.qemu.org/Documentation/9psetup) and SPICE
webdavd (https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
.IP \[bu] 2
Copy/paste via SPICE agent is \f[B]not available on macOS\f[R].
.SS macOS App Store
.PP
If you see \f[I]\[lq]Your device or computer could not be
verified\[rq]\f[R] when you try to login to the App Store, make sure
that your wired ethernet device is \f[V]en0\f[R].
Use \f[V]ifconfig\f[R] in a terminal to verify this.
.PP
If the wired ethernet device is not \f[V]en0\f[R], then then go to
\f[I]System Preferences\f[R] -> \f[I]Network\f[R], delete all the
network devices and apply the changes.
Next, open a terminal and run the following:
.IP
.nf
\f[C]
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
\f[R]
.fi
.PP
Now reboot, and the App Store should work.
.SS Windows 10 & 11 Guests
.PP
\f[V]quickget\f[R] can not download
Windows10 (https://www.microsoft.com/software-download/windows10) and
Windows 11 (https://www.microsoft.com/software-download/windows11)
automatically, but does automatically create an optimised virtual
machine configuration that you can just add an Windows .iso image to.
This configuration also includes the VirtIO drivers for
Windows (https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
\f[V]quickget\f[R] can automatically download Windows 8.1, Windows
10 (https://www.microsoft.com/en-gb/software-download/windows10ISO) and
Windows 11 (https://www.microsoft.com/en-gb/software-download/windows11)
along with the VirtIO drivers for
Windows (https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)
and creates a virtual machine configuration.
.IP
.nf
\f[C]
quickget windows 11
quickemu --vm windows-11.conf
\f[R]
.fi
.IP \[bu] 2
Complete the installation as you normally would.
.IP \[bu] 2
All relevant drivers and services should be installed automatically.
.IP \[bu] 2
A local adminstrator user account is automatically created, with these
credentials:
.RS 2
.IP \[bu] 2
Username: \f[V]Quickemu\f[R]
.IP \[bu] 2
Password: \f[V]quickemu\f[R]
.RE
.PP
The default Windows 11 configuration looks like this:
.IP
.nf
\f[C]
guest_os=\[dq]windows\[dq]
disk_img=\[dq]windows-11/disk.qcow2\[dq]
iso=\[dq]windows-11/windows-11.iso\[dq]
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
tpm=\[dq]on\[dq]
secureboot=\[dq]on\[dq]
\f[R]
.fi
.IP \[bu] 2
\f[V]guest_os=\[dq]windows\[dq]\f[R] instructs \f[V]quickemu\f[R] to
optimise for Windows.
.IP \[bu] 2
\f[V]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
drivers.
.IP \[bu] 2
\f[V]tpm=\[dq]on\[dq]\f[R] instructs \f[V]quickemu\f[R] to create a
software emulated TPM device using \f[V]swtpm\f[R].
.SH All the options
.PP
Here are the usage instructions:
.IP
.nf
\f[C]
Usage
quickemu --vm ubuntu.conf
You can also pass optional parameters
--braille : Enable braille support. Requires SDL.
--delete-disk : Delete the disk image and EFI variables
--delete-vm : Delete the entire VM and it\[aq]s configuration
--display : Select display backend. \[aq]sdl\[aq] (default), \[aq]gtk\[aq], \[aq]none\[aq], \[aq]spice\[aq] or \[aq]spice-app\[aq]
--fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)
--ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers
--screen <screen> : Use specified screen to determine the window size.
--shortcut : Create a desktop shortcut
--snapshot apply <tag> : Apply/restore a snapshot.
--snapshot create <tag> : Create a snapshot.
--snapshot delete <tag> : Delete a snapshot.
--snapshot info : Show disk/snapshot info.
--status-quo : Do not commit any changes to disk/snapshot.
--viewer <viewer> : Choose an alternative viewer. \[at]Options: \[aq]spicy\[aq] (default), \[aq]remote-viewer\[aq], \[aq]none\[aq]
--ssh-port <port> : Set ssh-port manually
--spice-port <port> : Set spice-port manually
--public-dir <path> : expose share directory. \[at]Options: \[aq]\[aq] (default: xdg-user-dir PUBLICSHARE), \[aq]<directory>\[aq], \[aq]none\[aq]
--monitor <type> : Set monitor connection type. \[at]Options: \[aq]socket\[aq] (default), \[aq]telnet\[aq], \[aq]none\[aq]
--monitor-telnet-host <ip/host> : Set telnet host for monitor. (default: \[aq]localhost\[aq])
--monitor-telnet-port <port> : Set telnet port for monitor. (default: \[aq]4440\[aq])
--monitor-cmd <cmd> : Send command to monitor if available. (Example: system_powerdown)
--serial <type> : Set serial connection type. \[at]Options: \[aq]socket\[aq] (default), \[aq]telnet\[aq], \[aq]none\[aq]
--serial-telnet-host <ip/host> : Set telnet host for serial. (default: \[aq]localhost\[aq])
--serial-telnet-port <port> : Set telnet port for serial. (default: \[aq]6660\[aq])
--keyboard <type> : Set keyboard. \[at]Options: \[aq]usb\[aq] (default), \[aq]ps2\[aq], \[aq]virtio\[aq]
--keyboard_layout <layout> : Set keyboard layout.
--mouse <type> : Set mouse. \[at]Options: \[aq]tablet\[aq] (default), \[aq]ps2\[aq], \[aq]usb\[aq], \[aq]virtio\[aq]
--usb-controller <type> : Set usb-controller. \[at]Options: \[aq]ehci\[aq] (default), \[aq]xhci\[aq], \[aq]none\[aq]
--extra_args <arguments> : Pass additional arguments to qemu
--version : Print version
\f[R]
.fi
.SS Desktop shortcuts
.PP
Desktop shortcuts can be created for a VM, the shortcuts are saved in
\f[V]\[ti]/.local/share/applications\f[R].
Here is an example of how to create a shortcut.
.IP
.nf
\f[C]
quickemu --vm ubuntu-22.04-desktop.conf --shortcut
\f[R]
.fi
.SS Screen and window size (Linux guests only)
.PP
\f[V]qemu\f[R] will always default to the primary monitor to display the
VM\[cq]s window.
.PP
Without the \f[V]--screen\f[R] option, \f[V]quickemu\f[R] will look for
the size of the smallest monitor, and use a size that fits on said
monitor.
.PP
The \f[V]--screen\f[R] option forces \f[V]quickemu\f[R] to use the size
of the given monitor to compute the size of the window.
\f[B]It won\[cq]t use that monitor to display the VM\[cq]s window if
it\[cq]s not the primary monitor\f[R].
This is useful if the primary monitor if not the smallest one, and if
the VM\[cq]s window doesn\[cq]t need to be moved around.
.PP
The \f[V]--screen\f[R] option is also useful with the
\f[V]--fullscreen\f[R] option, again because \f[V]qemu\f[R] will always
use the primary monitor.
In order for the fullscreen mode to work properly, the resolution of the
VM\[cq]s window must match the resolution of the screen.
.PP
To know which screen to use, type:
.IP
.nf
\f[C]
xrandr --listmonitors | grep -v Monitors
\f[R]
.fi
.PP
The command will output something like this:
.IP
.nf
\f[C]
0: +*HDMI-0 2560/597x1440/336+1920+0 HDMI-0
1: +DVI-D-0 1920/527x1080/296+0+0 DVI-D-0
\f[R]
.fi
.PP
The first number is what needs to be passed to the \f[V]--screen\f[R]
option.
.PP
For example:
.IP
.nf
\f[C]
quickemu --vm vm.conf --screen 0
\f[R]
.fi
.PP
The above uses the 2560x1440 screen to compute the size of the window,
which Quickemu sizes to 2048x1152.
Without the \f[V]--screen\f[R] option, Quickemu would have used the
1920x1080 monitor which results in a window size of 1664x936.
.SH References
.PP
Useful reference that assisted the development of Quickemu.
.IP \[bu] 2
General
.RS 2
.IP \[bu] 2
QEMU\[cq]s documentation! (https://qemu.readthedocs.io/en/latest/)
.IP \[bu] 2
<https://pve.proxmox.com/wiki/Qemu/KVM_Virtual_Machines>
.IP \[bu] 2
<https://www.kraxel.org/blog/2020/01/qemu-sound-audiodev/>
.RE
.IP \[bu] 2
macOS
.RS 2
.IP \[bu] 2
<https://www.nicksherlock.com/2020/06/installing-macos-big-sur-on-proxmox/>
.IP \[bu] 2
<https://passthroughpo.st/mac-os-adds-early-support-for-virtio-qemu/>
.IP \[bu] 2
<https://github.com/kholia/OSX-KVM>
.IP \[bu] 2
<https://github.com/thenickdude/KVM-Opencore>
.IP \[bu] 2
<https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery>
.IP \[bu] 2
<https://www.kraxel.org/blog/2017/09/running-macos-as-guest-in-kvm/>
.IP \[bu] 2
<https://www.nicksherlock.com/2017/10/passthrough-of-advanced-cpu-features-for-macos-high-sierra-guests/>
.IP \[bu] 2
<http://philjordan.eu/osx-virt/>
.IP \[bu] 2
<https://github.com/Dids/clover-builder>
.IP \[bu] 2
OpenCore Configurator (https://mackie100projects.altervista.org)
.RE
.IP \[bu] 2
Windows
.RS 2
.IP \[bu] 2
<https://www.heiko-sieger.info/running-windows-10-on-linux-using-kvm-with-vga-passthrough/>
.IP \[bu] 2
<https://leduccc.medium.com/improving-the-performance-of-a-windows-10-guest-on-qemu-a5b3f54d9cf5>
.IP \[bu] 2
<https://frontpagelinux.com/tutorials/how-to-use-linux-kvm-to-optimize-your-windows-10-virtual-machine/>
.IP \[bu] 2
<https://turlucode.com/qemu-command-line-args/>
.IP \[bu] 2
<https://github.com/pbatard/Fido>
.IP \[bu] 2
<https://www.catapultsystems.com/blogs/create-zero-touch-windows-10-iso/>
.RE
.IP \[bu] 2
TPM
.RS 2
.IP \[bu] 2
<https://qemu-project.gitlab.io/qemu/specs/tpm.html>
.IP \[bu] 2
<https://www.tecklyfe.com/how-to-create-a-windows-11-virtual-machine-in-qemu/>
.RE
.IP \[bu] 2
9p & virtiofs
.RS 2
.IP \[bu] 2
<https://wiki.qemu.org/Documentation/9p>
.IP \[bu] 2
<https://wiki.qemu.org/Documentation/9psetup>
.IP \[bu] 2
<https://www.kraxel.org/blog/2019/06/macos-qemu-guest/>
.IP \[bu] 2
<https://superuser.com/questions/628169/how-to-share-a-directory-with-the-host-without-networking-in-qemu>
.IP \[bu] 2
<https://virtio-fs.gitlab.io/>
.RE
.SH AUTHORS
.PP
Written by Martin Wimpress.
.SH BUGS
.PP
Submit bug reports online at:
<https://github.com/quickemu-project/quickemu/issues>
.SH SEE ALSO
.PP
Full sources at: <https://github.com/quickemu-project/quickemu>
.PP
quickemu_conf(1), quickget(1), quickgui(1)
.SH AUTHORS
Martin Wimpress.

673
docs/quickemu.1.md Normal file
View File

@ -0,0 +1,673 @@
---
author: Martin Wimpress
date: February 4, 2023
footer: quickemu
header: Quickemu User Manual
section: 1
title: QUICKEMU
---
# NAME
quickemu - A quick VM builder and manager
# SYNOPSIS
**quickemu** \[*OPTION*\]...
# DESCRIPTION
**quickemu** will create and run highly optimised desktop virtual
machines for Linux, macOS and Windows
# OPTIONS
**--vm**
: vm configuration file
You can also pass optional parameters
**--braille**
: Enable braille support. Requires SDL.
**--delete**
: Delete the disk image.
**--display**
: Select display backend. 'sdl' (default), 'gtk', 'none' or 'spice'
**--fullscreen**
: Starts VM in full screen mode (Ctl+Alt+f to exit)
**--ignore-msrs-always**
: Configure KVM to always ignore unhandled machine-specific registers
**--screen \<screen\>**
: Use specified screen to determine the window size.
**--shortcut**
: Create a desktop shortcut
**--snapshot apply \<tag\>**
: Apply/restore a snapshot.
**--snapshot create \<tag\>**
: Create a snapshot.
**--snapshot delete \<tag\>**
: Delete a snapshot.
**--snapshot info**
: Show disk/snapshot info.
**--status-quo**
: Do not commit any changes to disk/snapshot.
**--version**
: Print version
# EXAMPLES
**quickemu --vm ubuntu-mate-22.04.conf**
: Launches the VM specified in the file *ubuntu-mate-22.04.conf*
## Introduction
Quickly create and run highly optimised desktop virtual machines for
Linux, macOS and Windows; with just two commands. You decide what
operating system you want to run and Quickemu will figure out the best
way to do it for you. For example:
``` bash
quickget ubuntu-mate 22.04
quickemu --vm ubuntu-mate-22.04.conf
```
The original objective of the project was to enable quick testing of
Linux distributions where the virtual machine configurations can be
stored anywhere, such as external USB storage or your home directory,
and no elevated permissions are required to run the virtual machines.
**Quickemu now also includes comprehensive support for macOS and
Windows**.
## Features
- **macOS** Monterey, Big Sur, Catalina, Mojave & High Sierra
- **Windows** 8.1, 10 and 11 including TPM 2.0
- [Ubuntu](https://ubuntu.com/desktop) and all the **[official Ubuntu
flavours](https://ubuntu.com/download/flavours)**
- **Over 360 operating system editions are supported!**
- Full SPICE support including host/guest clipboard sharing
- VirtIO-webdavd file sharing for Linux and Windows guests
- VirtIO-9p file sharing for Linux and macOS guests
- [QEMU Guest Agent
support](https://wiki.qemu.org/Features/GuestAgent); provides access
to a system-level agent via standard QMP commands
- Samba file sharing for Linux, macOS and Windows guests (*if `smbd`
is installed on the host*)
- VirGL acceleration
- USB device pass-through
- Smartcard pass-through
- Automatic SSH port forwarding to guests
- Network port forwarding
- Full duplex audio
- Braille support
- EFI (with or without SecureBoot) and Legacy BIOS boot
- Graphical user interfaces available
Quickemu is a wrapper for the excellent [QEMU](https://www.qemu.org/)
that attempts to automatically *"do the right thing"*, rather than
expose exhaustive configuration options.
We have a Discord for this project:
[![Discord](https://img.shields.io/discord/712850672223125565?color=0C306A&label=WimpysWorld%20Discord&logo=Discord&logoColor=ffffff&style=flat-square)](https://discord.gg/sNmz3uw)
See this (old) video where I explain some of my motivations for creating
Quickemu.
[![Replace VirtualBox with Bash &
QEMU](https://img.youtube.com/vi/AOTYWEgw0hI/0.jpg)](https://www.youtube.com/watch?v=AOTYWEgw0hI)
## Requirements
- [QEMU](https://www.qemu.org/) (*6.0.0 or newer*) **with GTK, SDL,
SPICE & VirtFS support**
- [bash](https://www.gnu.org/software/bash/) (*4.0 or newer*)
- [Coreutils](https://www.gnu.org/software/coreutils/)
- [EDK II](https://github.com/tianocore/edk2)
- [grep](https://www.gnu.org/software/grep/)
- [jq](https://stedolan.github.io/jq/)
- [LSB](https://wiki.linuxfoundation.org/lsb/start)
- [procps](https://gitlab.com/procps-ng/procps)
- [python3](https://www.python.org/)
- [macrecovery](https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery)
- [mkisofs](http://cdrtools.sourceforge.net/private/cdrecord.html)
- [usbutils](https://github.com/gregkh/usbutils)
- [util-linux](https://github.com/karelzak/util-linux)
- [sed](https://www.gnu.org/software/sed/)
- [socat](http://www.dest-unreach.org/socat/)
- [spicy](https://gitlab.freedesktop.org/spice/spice-gtk)
- [swtpm](https://github.com/stefanberger/swtpm)
- [Wget](https://www.gnu.org/software/wget/)
- [xdg-user-dirs](https://www.freedesktop.org/wiki/Software/xdg-user-dirs/)
- [xrandr](https://gitlab.freedesktop.org/xorg/app/xrandr)
- [zsync](http://zsync.moria.org.uk/)
- [unzip](http://www.info-zip.org/UnZip.html)
### Installing Requirements
For Ubuntu, Arch and nixos systems the
[ppa](https://launchpad.net/~flexiondotorg/+archive/ubuntu/quickemu),
[AUR](https://aur.archlinux.org/packages/quickemu) or
[nix](https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/quickemu)
packaging will take care of the dependencies. For other host
distributions or operating systems it will be necessary to install the
above requirements or their equivalents.
These examples may save a little typing
Debian:
sudo apt install qemu bash coreutils ovmf grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-client-gtk swtpm wget xdg-user-dirs zsync unzip
Fedora:
sudo dnf install qemu bash coreutils edk2-tools grep jq lsb procps python3 genisoimage usbutils util-linux sed spice-gtk-tools swtpm wget xdg-user-dirs xrandr unzip
MacOS:
This is a work in progress (see [issue
248](https://github.com/quickemu-project/quickemu/issues/248) for other
steps and changes that may enable running on MacOS)
brew install qemu bash coreutils grep jq python@3.10 cdrtools gnu-sed spice-gtk wget zsync
# Usage
## Graphical User Interfaces
While `quickemu` and `quickget` are designed for the terminal, a
graphical user interface is also available:
- **[Quickgui](https://github.com/quickgui/quickgui)** by [Mark
Johnson](https://github.com/marxjohnson) and [Yannick
Mauray](https://github.com/ymauray).
Many thanks to [Luke Wesley-Holley](https://github.com/Lukewh) and
[Philipp Kiemle](https://github.com/daPhipz) for creating the
**[Quickemu icons](https://github.com/Lukewh/quickemu-icons)** 🎨
### Quickgui for Ubuntu
``` bash
sudo add-apt-repository ppa:yannick-mauray/quickgui
sudo apt update
sudo apt install quickgui
```
## Ubuntu Guest
`quickget` will automatically download an Ubuntu release and create the
virtual machine configuration.
``` bash
quickget ubuntu 22.04
quickemu --vm ubuntu-22.04.conf
```
- Complete the installation as normal.
- Post-install:
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
copy/paste and USB redirection
- `sudo apt install spice-vdagent`
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
enable file sharing.
- `sudo apt install spice-webdavd`
### Ubuntu devel (daily-live) images
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
developers and testers.
``` bash
quickget ubuntu devel
quickemu --vm ubuntu-devel.conf
```
You can run `quickget ubuntu devel` to refresh your daily development
image as often as you like, it will even automatically switch to a new
series.
### Ubuntu Flavours
All the official Ubuntu flavours are supported, just replace `ubuntu`
with your preferred flavour.
- `kubuntu` (Kubuntu)
- `lubuntu` (Lubuntu)
- `ubuntu-budgie` (Ubuntu Budgie)
- `ubuntukylin` (Ubuntu Kylin)
- `ubuntu-mate` (Ubuntu MATE)
- `ubuntustudio` (Ubuntu Studio)
- `ubuntu` (Ubuntu)
- `ubuntu-unity` (Ubuntu Unity)
- `xubuntu` (Xubuntu)
## Other Operating Systems
`quickget` also supports:
- `alma` (Alma Linux)
- `alpine` (Alpine Linux)
- `android` (Android x86)
- `archcraft` (Archcraft)
- `archlinux` (Arch Linux)
- `arcolinux` (Arco Linux)
- `batocera` (Batocera)
- `cachyos` (CachyOS)
- `centos-stream` (CentOS Stream)
- `debian` (Debian)
- `deepin` (Deepin)
- `devuan` (Devuan)
- `dragonflybsd` (DragonFlyBSD)
- `elementary` (elementary OS)
- `endeavouros` (EndeavourOS)
- `fedora` (Fedora)
- `freebsd` (FreeBSD)
- `freedos` (FreeDOS)
- `garuda` (Garuda Linux)
- `gentoo` (Gentoo)
- `ghostbsd` (GhostBSD)
- `haiku` (Haiku)
- `kali` (Kali)
- `kdeneon` (KDE Neon)
- `kolibrios` (KolibriOS)
- `linuxmint` (Linux Mint)
- `lmde` (Linux Mint Debian Edition)
- `mageia` (Mageia)
- `manjaro` (Manjaro)
- `mxlinux` (MX Linux)
- `netboot` (netboot.xyz)
- `netbsd` (NetBSD)
- `nixos` (NixOS)
- `openbsd` (OpenBSD)
- `opensuse` (openSUSE)
- `oraclelinux` (Oracle Linux)
- `popos` (Pop!\_OS)
- `reactos` (ReactOS)
- `rebornos` (RebornOS)
- `rockylinux` (Rocky Linux)
- `slackware` (Slackware)
- `solus` (Solus)
- `tails` (Tails)
- `truenas-core` (TrueNAS Core)
- `truenas-scale` (TrueNAS Scale)
- `void` (Void Linux)
- `zorin` (Zorin OS)
Or you can download a Linux image and manually create a VM
configuration.
- Download a .iso image of a Linux distribution
- Create a VM configuration file; for example `debian-bullseye.conf`
``` bash
guest_os="linux"
disk_img="debian-bullseye/disk.qcow2"
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
```
- Use `quickemu` to start the virtual machine:
``` bash
quickemu --vm debian-bullseye.conf
```
- Complete the installation as normal.
- Post-install:
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
copy/paste and USB redirection.
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
enable file sharing.
## macOS Guest
`quickget` automatically downloads a macOS recovery image and creates a
virtual machine configuration.
``` bash
quickget macos catalina
quickemu --vm macos-catalina.conf
```
macOS `high-sierra`, `mojave`, `catalina`, `big-sur` and `monterey` are
supported.
- Use cursor keys and enter key to select the **macOS Base System**
- From **macOS Utilities**
- Click **Disk Utility** and **Continue**
- Select `QEMU HARDDISK Media` (\~103.08GB) from the list and
click **Erase**.
- Enter a `Name:` for the disk
- If you are installing macOS Mojave or later (Catalina, Big
Sur, and Monterey), choose any of the APFS options as the
filesystem. MacOS Extended may not work.
- Click **Erase**.
- Click **Done**.
- Close Disk Utility
- From **macOS Utilities**
- Click **Reinstall macOS** and **Continue**
- Complete the installation as you normally would.
- On the first reboot use cursor keys and enter key to select
**macOS Installer**
- On the subsequent reboots use cursor keys and enter key to
select the disk you named
- Once you have finished installing macOS you will be presented with
an the out-of-the-box first-start wizard to configure various
options and set up your username and password
- OPTIONAL: After you have concluded the out-of-the-box wizard, you
may want to enable the TRIM feature that the computer industry
created for SSD disks. This feature in our macOS installation will
allow QuickEmu to compact (shrink) your macOS disk image whenever
you delete files inside the Virtual Machine. Without this step your
macOS disk image will only ever get larger and will not shrink even
when you delete lots of data inside macOS.
- To enable TRIM, open the Terminal application and type the
following command followed by pressing
`<kbd>`{=html}enter`</kbd>`{=html} to tell macos to use the TRIM
command on the hard disk when files are deleted:
``` bash
sudo trimforce enable
```
You will be prompted to enter your account's password to gain the
privilege needed. Once you've entered your password and pressed
`<kbd>`{=html}enter`</kbd>`{=html} the command will request confirmation
in the form of two questions that require you to type
`<kbd>`{=html}y`</kbd>`{=html} (for a "yes" response) followed by
`<kbd>`{=html}enter`</kbd>`{=html} to confirm. If you press
`<kbd>`{=html}enter`</kbd>`{=html} without first typing
`<kbd>`{=html}y`</kbd>`{=html} the system will consider that a negative
response as though you said "no":
``` plain
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an "as is" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
Are you sure you with to proceed (y/N)?
```
And a second confirmation once you've confirmed the previous one:
``` plain
Your system will immediately reboot when this is complete.
Is this OK (y/N)?
```
As the last message states, your system will automatically reboot as
soon as the command completes.
The default macOS configuration looks like this:
``` bash
guest_os="macos"
img="macos-catalina/RecoveryImage.img"
disk_img="macos-catalina/disk.qcow2"
macos_release="catalina"
```
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
- `macos_release="catalina"` instructs Quickemu to optimise for a
particular macOS release.
- For example VirtIO Network and Memory Ballooning are available
in Big Sur and newer, but not previous releases.
- And VirtIO Block Media (disks) are supported/stable in Catalina
and newer.
### macOS compatibility
There are some considerations when running macOS via Quickemu.
- Supported macOS releases:
- High Sierra
- Mojave
- Catalina **(Recommended)**
- Big Sur
- Monterey
- `quickemu` will automatically download the required
[OpenCore](https://github.com/acidanthera/OpenCorePkg) bootloader
and OVMF firmware from [OSX-KVM](https://github.com/kholia/OSX-KVM).
- Optimised by default, but no GPU acceleration is available.
- Host CPU vendor is detected and guest CPU is optimised
accordingly.
- [VirtIO Block
Media](https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is
used for the system disk where supported.
- [VirtIO `usb-tablet`](http://philjordan.eu/osx-virt/) is used
for the mouse.
- VirtIO Network (`virtio-net`) is supported and enabled on macOS
Big Sur and newer but previous releases use `vmxnet3`.
- VirtIO Memory Ballooning is supported and enabled on macOS Big
Sur and newer but disabled for other support macOS releases.
- USB host and SPICE pass-through is:
- UHCI (USB 2.0) on macOS Catalina and earlier.
- XHCI (USB 3.0) on macOS Big Sur and newer.
- Display resolution can only be changed via macOS System Preferences.
- **Full Duplex audio requires [VoodooHDA
OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
audio-device to the macOS guest VM**.
- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
[System Integrity Protection
(SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
need to be disabled to install VoodooHDA OC
- File sharing between guest and host is available via
[virtio-9p](https://wiki.qemu.org/Documentation/9psetup) and [SPICE
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
- Copy/paste via SPICE agent is **not available on macOS**.
### macOS App Store
If you see *"Your device or computer could not be verified"* when you
try to login to the App Store, make sure that your wired ethernet device
is `en0`. Use `ifconfig` in a terminal to verify this.
If the wired ethernet device is not `en0`, then then go to *System
Preferences* -\> *Network*, delete all the network devices and apply the
changes. Next, open a terminal and run the following:
``` bash
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
```
Now reboot, and the App Store should work.
## Windows 10 & 11 Guests
`quickget` can not download
[Windows10](https://www.microsoft.com/software-download/windows10) and
[Windows 11](https://www.microsoft.com/software-download/windows11)
automatically, but does automatically create an optimised virtual
machine configuration that you can just add an Windows .iso image to.
This configuration also includes the [VirtIO drivers for
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
`quickget` can automatically download Windows 8.1, [Windows
10](https://www.microsoft.com/en-gb/software-download/windows10ISO) and
[Windows
11](https://www.microsoft.com/en-gb/software-download/windows11) along
with the [VirtIO drivers for
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)
and creates a virtual machine configuration.
``` bash
quickget windows 11
quickemu --vm windows-11.conf
```
- Complete the installation as you normally would.
- All relevant drivers and services should be installed automatically.
- A local adminstrator user account is automatically created, with
these credentials:
- Username: `Quickemu`
- Password: `quickemu`
The default Windows 11 configuration looks like this:
``` bash
guest_os="windows"
disk_img="windows-11/disk.qcow2"
iso="windows-11/windows-11.iso"
fixed_iso="windows-11/virtio-win.iso"
tpm="on"
secureboot="on"
```
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
- `fixed_iso=` specifies the ISO image that provides VirtIO drivers.
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
device using `swtpm`.
# All the options
Here are the usage instructions:
Usage
quickemu --vm ubuntu.conf
You can also pass optional parameters
--braille : Enable braille support. Requires SDL.
--delete-disk : Delete the disk image and EFI variables
--delete-vm : Delete the entire VM and it's configuration
--display : Select display backend. 'sdl' (default), 'gtk', 'none', 'spice' or 'spice-app'
--fullscreen : Starts VM in full screen mode (Ctl+Alt+f to exit)
--ignore-msrs-always : Configure KVM to always ignore unhandled machine-specific registers
--screen <screen> : Use specified screen to determine the window size.
--shortcut : Create a desktop shortcut
--snapshot apply <tag> : Apply/restore a snapshot.
--snapshot create <tag> : Create a snapshot.
--snapshot delete <tag> : Delete a snapshot.
--snapshot info : Show disk/snapshot info.
--status-quo : Do not commit any changes to disk/snapshot.
--viewer <viewer> : Choose an alternative viewer. @Options: 'spicy' (default), 'remote-viewer', 'none'
--ssh-port <port> : Set ssh-port manually
--spice-port <port> : Set spice-port manually
--public-dir <path> : expose share directory. @Options: '' (default: xdg-user-dir PUBLICSHARE), '<directory>', 'none'
--monitor <type> : Set monitor connection type. @Options: 'socket' (default), 'telnet', 'none'
--monitor-telnet-host <ip/host> : Set telnet host for monitor. (default: 'localhost')
--monitor-telnet-port <port> : Set telnet port for monitor. (default: '4440')
--monitor-cmd <cmd> : Send command to monitor if available. (Example: system_powerdown)
--serial <type> : Set serial connection type. @Options: 'socket' (default), 'telnet', 'none'
--serial-telnet-host <ip/host> : Set telnet host for serial. (default: 'localhost')
--serial-telnet-port <port> : Set telnet port for serial. (default: '6660')
--keyboard <type> : Set keyboard. @Options: 'usb' (default), 'ps2', 'virtio'
--keyboard_layout <layout> : Set keyboard layout.
--mouse <type> : Set mouse. @Options: 'tablet' (default), 'ps2', 'usb', 'virtio'
--usb-controller <type> : Set usb-controller. @Options: 'ehci' (default), 'xhci', 'none'
--extra_args <arguments> : Pass additional arguments to qemu
--version : Print version
## Desktop shortcuts
Desktop shortcuts can be created for a VM, the shortcuts are saved in
`~/.local/share/applications`. Here is an example of how to create a
shortcut.
``` bash
quickemu --vm ubuntu-22.04-desktop.conf --shortcut
```
## Screen and window size (Linux guests only)
`qemu` will always default to the primary monitor to display the VM's
window.
Without the `--screen` option, `quickemu` will look for the size of the
smallest monitor, and use a size that fits on said monitor.
The `--screen` option forces `quickemu` to use the size of the given
monitor to compute the size of the window. **It won't use that monitor
to display the VM's window if it's not the primary monitor**. This is
useful if the primary monitor if not the smallest one, and if the VM's
window doesn't need to be moved around.
The `--screen` option is also useful with the `--fullscreen` option,
again because `qemu` will always use the primary monitor. In order for
the fullscreen mode to work properly, the resolution of the VM's window
must match the resolution of the screen.
To know which screen to use, type:
``` bash
xrandr --listmonitors | grep -v Monitors
```
The command will output something like this:
``` bash
0: +*HDMI-0 2560/597x1440/336+1920+0 HDMI-0
1: +DVI-D-0 1920/527x1080/296+0+0 DVI-D-0
```
The first number is what needs to be passed to the `--screen` option.
For example:
``` bash
quickemu --vm vm.conf --screen 0
```
The above uses the 2560x1440 screen to compute the size of the window,
which Quickemu sizes to 2048x1152. Without the `--screen` option,
Quickemu would have used the 1920x1080 monitor which results in a window
size of 1664x936.
# References
Useful reference that assisted the development of Quickemu.
- General
- [QEMU's documentation!](https://qemu.readthedocs.io/en/latest/)
- <https://pve.proxmox.com/wiki/Qemu/KVM_Virtual_Machines>
- <https://www.kraxel.org/blog/2020/01/qemu-sound-audiodev/>
- macOS
- <https://www.nicksherlock.com/2020/06/installing-macos-big-sur-on-proxmox/>
- <https://passthroughpo.st/mac-os-adds-early-support-for-virtio-qemu/>
- <https://github.com/kholia/OSX-KVM>
- <https://github.com/thenickdude/KVM-Opencore>
- <https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery>
- <https://www.kraxel.org/blog/2017/09/running-macos-as-guest-in-kvm/>
- <https://www.nicksherlock.com/2017/10/passthrough-of-advanced-cpu-features-for-macos-high-sierra-guests/>
- <http://philjordan.eu/osx-virt/>
- <https://github.com/Dids/clover-builder>
- [OpenCore
Configurator](https://mackie100projects.altervista.org)
- Windows
- <https://www.heiko-sieger.info/running-windows-10-on-linux-using-kvm-with-vga-passthrough/>
- <https://leduccc.medium.com/improving-the-performance-of-a-windows-10-guest-on-qemu-a5b3f54d9cf5>
- <https://frontpagelinux.com/tutorials/how-to-use-linux-kvm-to-optimize-your-windows-10-virtual-machine/>
- <https://turlucode.com/qemu-command-line-args/>
- <https://github.com/pbatard/Fido>
- <https://www.catapultsystems.com/blogs/create-zero-touch-windows-10-iso/>
- TPM
- <https://qemu-project.gitlab.io/qemu/specs/tpm.html>
- <https://www.tecklyfe.com/how-to-create-a-windows-11-virtual-machine-in-qemu/>
- 9p & virtiofs
- <https://wiki.qemu.org/Documentation/9p>
- <https://wiki.qemu.org/Documentation/9psetup>
- <https://www.kraxel.org/blog/2019/06/macos-qemu-guest/>
- <https://superuser.com/questions/628169/how-to-share-a-directory-with-the-host-without-networking-in-qemu>
- <https://virtio-fs.gitlab.io/>
# AUTHORS
Written by Martin Wimpress.
# BUGS
Submit bug reports online at:
<https://github.com/quickemu-project/quickemu/issues>
# SEE ALSO
Full sources at: <https://github.com/quickemu-project/quickemu>
quickemu_conf(1), quickget(1), quickgui(1)

327
docs/quickemu_conf.1 Normal file
View File

@ -0,0 +1,327 @@
.\" Automatically generated by Pandoc 2.19.2
.\"
.\" Define V font for inline verbatim, using C font in formats
.\" that render this, and otherwise B font.
.ie "\f[CB]x\f[]"x" \{\
. ftr V B
. ftr VI BI
. ftr VB B
. ftr VBI BI
.\}
.el \{\
. ftr V CR
. ftr VI CI
. ftr VB CB
. ftr VBI CBI
.\}
.TH "QUICKEMU_CONF" "1" "February 4, 2023" "quickemu_conf" "Quickemu Configuration Manual"
.hy
.SH NAME
.PP
quickemu_conf - Options and parameters in the quickemu <vm>.conf
.SH DESCRIPTION
.PP
\f[B]quickemu\f[R] will create and run highly optimised desktop virtual
machines for Linux, macOS and Windows.
It uses sensible defaults, but many configuration options can be
overridden in the required configuration file, which will as a minimum
specify the path to the installation ISO and QEMU disk for the installed
VM
.SH OPTIONS
.PP
These are the options and defaults for the <vm>.conf file
.IP
.nf
\f[C]
# Lowercase variables are used in the VM config file only
boot=\[dq]efi\[dq]
cpu_cores=\[dq]\[dq]
disk_img=\[dq]\[dq]
disk_size=\[dq]\[dq]
display=\[dq]\[dq]
extra_args=\[dq]\[dq]
fixed_iso=\[dq]\[dq]
floppy=\[dq]\[dq]
guest_os=\[dq]linux\[dq]
img=\[dq]\[dq]
iso=\[dq]\[dq]
macaddr=\[dq]\[dq]
macos_release=\[dq]\[dq]
network=\[dq]\[dq]
port_forwards=()
preallocation=\[dq]off\[dq]
ram=\[dq]\[dq]
secureboot=\[dq]off\[dq]
tpm=\[dq]off\[dq]
usb_devices=()
viewer=\[dq]spicy\[dq]
ssh_port=\[dq]\[dq]
spice_port=\[dq]\[dq]
public_dir=\[dq]\[dq]
monitor=\[dq]socket\[dq]
monitor_telnet_port=\[dq]4440\[dq]
monitor_telnet_host=\[dq]localhost\[dq]
monitor_cmd=\[dq]\[dq]
serial=\[dq]socket\[dq]
serial_telnet_port=\[dq]6660\[dq]
serial_telnet_host=\[dq]localhost\[dq]
# options: ehci(USB2.0), xhci(USB3.0)
usb_controller=\[dq]ehci\[dq]
# options: ps2, usb, virtio
keyboard=\[dq]usb\[dq]
keyboard_layout=\[dq]en-us\[dq]
# options: ps2, usb, tablet, virtio
mouse=\[dq]tablet\[dq]
\f[R]
.fi
.SH EXAMPLES
.IP
.nf
\f[C]
guest_os=\[dq]linux\[dq]
disk_img=\[dq]debian-bullseye/disk.qcow2\[dq]
iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
\f[R]
.fi
.PP
The default macOS configuration looks like this:
.IP
.nf
\f[C]
guest_os=\[dq]macos\[dq]
img=\[dq]macos-catalina/RecoveryImage.img\[dq]
disk_img=\[dq]macos-catalina/disk.qcow2\[dq]
macos_release=\[dq]catalina\[dq]
\f[R]
.fi
.IP \[bu] 2
\f[V]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
macOS.
.IP \[bu] 2
\f[V]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
optimise for a particular macOS release.
.RS 2
.IP \[bu] 2
For example VirtIO Network and Memory Ballooning are available in Big
Sur and newer, but not previous releases.
.IP \[bu] 2
And VirtIO Block Media (disks) are supported/stable in Catalina and
newer.
.RE
.PP
The default Windows 11 configuration looks like this:
.IP
.nf
\f[C]
guest_os=\[dq]windows\[dq]
disk_img=\[dq]windows-11/disk.qcow2\[dq]
iso=\[dq]windows-11/Win11_EnglishInternational_x64.iso\[dq]
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
tpm=\[dq]on\[dq]
secureboot=\[dq]on\[dq]
\f[R]
.fi
.IP \[bu] 2
\f[V]guest_os=\[dq]windows\[dq]\f[R] instructs \f[V]quickemu\f[R] to
optimise for Windows.
.IP \[bu] 2
\f[V]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
drivers.
.IP \[bu] 2
\f[V]tpm=\[dq]on\[dq]\f[R] instructs \f[V]quickemu\f[R] to create a
software emulated TPM device using \f[V]swtpm\f[R].
.SH BIOS and EFI
.PP
Since Quickemu 2.1.0 \f[V]efi\f[R] is the default boot option.
If you want to override this behaviour then add the following line to
you VM configuration to enable legacy BIOS.
.IP \[bu] 2
\f[V]boot=\[dq]legacy\[dq]\f[R] - Enable Legacy BIOS boot
.SH Tuning CPU cores, RAM & disks
.PP
By default, Quickemu will calculate the number of CPUs cores and RAM to
allocate to a VM based on the specifications of your host computer.
You can override this default behaviour and tune the VM configuration to
your liking.
.PP
Add additional lines to your virtual machine configuration:
.IP \[bu] 2
\f[V]cpu_cores=\[dq]4\[dq]\f[R] - Specify the number of CPU cores
allocated to the VM
.IP \[bu] 2
\f[V]ram=\[dq]4G\[dq]\f[R] - Specify the amount of RAM to allocate to
the VM
.IP \[bu] 2
\f[V]disk_size=\[dq]16G\[dq]\f[R] - Specify the size of the virtual disk
allocated to the VM
.SS Disk preallocation
.PP
Preallocation mode (allowed values: \f[V]off\f[R] (default),
\f[V]metadata\f[R], \f[V]falloc\f[R], \f[V]full\f[R]).
An image with preallocated metadata is initially larger but can improve
performance when the image needs to grow.
.PP
Specify what disk preallocation should be used, if any, when creating
the system disk image by adding a line like this to your VM
configuration.
.IP \[bu] 2
\f[V]preallocation=\[dq]metadata\[dq]\f[R]
.SS CD-ROM disks
.PP
If you want to expose an ISO image from the host to guest add the
following line to the VM configuration:
.IP \[bu] 2
\f[V]fixed_iso=\[dq]/path/to/image.iso\[dq]\f[R]
.SS Floppy disks
.PP
If you\[cq]re like Alan Pope (https://popey.com) you\[cq]ll probably
want to mount a floppy disk image in the guest.
To do so add the following line to the VM configuration:
.IP \[bu] 2
\f[V]floppy=\[dq]/path/to/floppy.img\[dq]\f[R]
.SH File Sharing
.PP
All File Sharing options will only expose \f[V]\[ti]/Public\f[R] (or
localised variations) for the current user to the guest VMs.
.SS Samba \[u1F427] \[u1F34F] \[u1FA9F]
.PP
If \f[V]smbd\f[R] is available on the host, Quickemu will automatically
enable the built-in QEMU support for exposing a Samba share from the
host to the guest.
.PP
You can install the minimal Samba components on Ubuntu using:
.IP
.nf
\f[C]
sudo apt install --no-install-recommends samba
\f[R]
.fi
.PP
If everything is set up correctly, the \f[V]smbd\f[R] address will be
printed when the virtual machine is started.
For example:
.IP
.nf
\f[C]
- smbd: On guest: smb://10.0.2.4/qemu
\f[R]
.fi
.PP
If using a Windows guest, right-click on \[lq]This PC\[rq], click
\[lq]Add a network location\[rq], and paste this address, removing
\f[V]smb:\f[R] and replacing forward slashes with backslashes (in this
example \f[V]\[rs]\[rs]10.0.2.4\[rs]qemu\f[R]).
.SS SPICE WebDAV \[u1F427] \[u1FA9F]
.IP \[bu] 2
TBD
.SS VirtIO-9P \[u1F427] \[u1F34F]
.IP \[bu] 2
TBD
.SH Network port forwarding
.PP
Add an additional line to your virtual machine configuration.
For example:
.IP \[bu] 2
\f[V]port_forwards=(\[dq]8123:8123\[dq] \[dq]8888:80\[dq])\f[R]
.PP
In the example above:
.IP \[bu] 2
Port 8123 on the host is forwarded to port 8123 on the guest.
.IP \[bu] 2
Port 8888 on the host is forwarded to port 80 on the guest.
.SH Disable networking
.PP
To completely disable all network interfaces in a guest VM add this
additional line to your virtual machine configuration:
.IP \[bu] 2
\f[V]network=\[dq]none\[dq]\f[R]
.SH Restricted networking
.PP
You can isolate the guest from the host (and broader network) using the
restrict option, which will restrict networking to just the guest and
any virtual devices.
.PP
This can be used to prevent software running inside the guest from
phoning home while still providing a network inside the guest.
Add this additional line to your virtual machine configuration:
.IP \[bu] 2
\f[V]network=\[dq]restrict\[dq]\f[R]
.SH Bridged networking
.PP
Connect your virtual machine to a preconfigured network bridge.
Add an additional line to your virtual machine configuration:
.IP \[bu] 2
\f[V]network=\[dq]br0\[dq]\f[R]
.PP
If you want to have a persistent MAC address for your bridged network
interface in the guest VM you can add \f[V]macaddr\f[R] to the virtual
machine configuration.
QEMU requires that the MAC address is in the range:
\f[B]52:54:00:AB:00:00 - 52:54:00:AB:FF:FF\f[R]
.PP
So you can generate your own MAC addresses with:
.IP \[bu] 2
\f[V]macaddr=\[dq]52:54:00:AB:51:AE\[dq]\f[R]
.SH USB redirection
.PP
Quickemu supports USB redirection via SPICE pass-through and host
pass-through.
.SS SPICE redirection (recommended)
.PP
Using SPICE for USB pass-through is easiest as it doesn\[cq]t require
any elevated permission, start Quickemu with \f[V]--display spice\f[R]
and then select \f[V]Input\f[R] ->
\f[V]Select USB Device for redirection\f[R] from the menu to choose
which device(s) you want to attach to the guest.
.SS Host redirection \f[B]NOT Recommended\f[R]
.PP
\f[B]USB host redirection is not recommended\f[R], it is provided purely
for backwards compatibility to older versions of Quickemu.
Using SPICE is preferred, see above.
.PP
Add an additional line to your virtual machine configuration.
For example:
.IP \[bu] 2
\f[V]usb_devices=(\[dq]046d:082d\[dq] \[dq]046d:085e\[dq])\f[R]
.PP
In the example above:
.IP \[bu] 2
The USB device with vendor_id 046d and product_id 082d will be exposed
to the guest.
.IP \[bu] 2
The USB device with vendor_id 046d and product_id 085e will be exposed
to the guest.
.PP
If the USB devices are not writable, \f[V]quickemu\f[R] will display the
appropriate commands to modify the USB device(s) access permissions,
like this:
.IP
.nf
\f[C]
- USB: Host pass-through requested:
- Sennheiser Communications EPOS GTW 270 on bus 001 device 005 needs permission changes:
sudo chown -v root:user /dev/bus/usb/001/005
ERROR! USB permission changes are required \[u1F446]
\f[R]
.fi
.SH TPM
.PP
Since Quickemu 2.2.0 a software emulated TPM device can be added to
guest virtual machines.
Just add \f[V]tpm=\[dq]on\[dq]\f[R] to your VM configuration.
\f[V]quickget\f[R] will automatically add this line to Windows 11
virtual machines.
.SH AUTHORS
.PP
Written by Martin Wimpress.
.SH BUGS
.PP
Submit bug reports online at:
<https://github.com/quickemu-project/quickemu/issues>
.SH SEE ALSO
.PP
Full sources at: <https://github.com/quickemu-project/quickemu>
.PP
quickget(1), quickemu(1), quickgui(1)
.SH AUTHORS
Martin Wimpress.

299
docs/quickemu_conf.1.md Normal file
View File

@ -0,0 +1,299 @@
---
author: Martin Wimpress
date: February 4, 2023
footer: quickemu_conf
header: Quickemu Configuration Manual
section: 1
title: QUICKEMU_CONF
---
# NAME
quickemu_conf - Options and parameters in the quickemu \<vm\>.conf
# DESCRIPTION
**quickemu** will create and run highly optimised desktop virtual
machines for Linux, macOS and Windows. It uses sensible defaults, but
many configuration options can be overridden in the required
configuration file, which will as a minimum specify the path to the
installation ISO and QEMU disk for the installed VM
# OPTIONS
These are the options and defaults for the \<vm\>.conf file
``` bash
# Lowercase variables are used in the VM config file only
boot="efi"
cpu_cores=""
disk_img=""
disk_size=""
display=""
extra_args=""
fixed_iso=""
floppy=""
guest_os="linux"
img=""
iso=""
macaddr=""
macos_release=""
network=""
port_forwards=()
preallocation="off"
ram=""
secureboot="off"
tpm="off"
usb_devices=()
viewer="spicy"
ssh_port=""
spice_port=""
public_dir=""
monitor="socket"
monitor_telnet_port="4440"
monitor_telnet_host="localhost"
monitor_cmd=""
serial="socket"
serial_telnet_port="6660"
serial_telnet_host="localhost"
# options: ehci(USB2.0), xhci(USB3.0)
usb_controller="ehci"
# options: ps2, usb, virtio
keyboard="usb"
keyboard_layout="en-us"
# options: ps2, usb, tablet, virtio
mouse="tablet"
```
# EXAMPLES
``` bash
guest_os="linux"
disk_img="debian-bullseye/disk.qcow2"
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
```
The default macOS configuration looks like this:
``` bash
guest_os="macos"
img="macos-catalina/RecoveryImage.img"
disk_img="macos-catalina/disk.qcow2"
macos_release="catalina"
```
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
- `macos_release="catalina"` instructs Quickemu to optimise for a
particular macOS release.
- For example VirtIO Network and Memory Ballooning are available
in Big Sur and newer, but not previous releases.
- And VirtIO Block Media (disks) are supported/stable in Catalina
and newer.
The default Windows 11 configuration looks like this:
``` bash
guest_os="windows"
disk_img="windows-11/disk.qcow2"
iso="windows-11/Win11_EnglishInternational_x64.iso"
fixed_iso="windows-11/virtio-win.iso"
tpm="on"
secureboot="on"
```
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
- `fixed_iso=` specifies the ISO image that provides VirtIO drivers.
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
device using `swtpm`.
# BIOS and EFI
Since Quickemu 2.1.0 `efi` is the default boot option. If you want to
override this behaviour then add the following line to you VM
configuration to enable legacy BIOS.
- `boot="legacy"` - Enable Legacy BIOS boot
# Tuning CPU cores, RAM & disks
By default, Quickemu will calculate the number of CPUs cores and RAM to
allocate to a VM based on the specifications of your host computer. You
can override this default behaviour and tune the VM configuration to
your liking.
Add additional lines to your virtual machine configuration:
- `cpu_cores="4"` - Specify the number of CPU cores allocated to the
VM
- `ram="4G"` - Specify the amount of RAM to allocate to the VM
- `disk_size="16G"` - Specify the size of the virtual disk allocated
to the VM
## Disk preallocation
Preallocation mode (allowed values: `off` (default), `metadata`,
`falloc`, `full`). An image with preallocated metadata is initially
larger but can improve performance when the image needs to grow.
Specify what disk preallocation should be used, if any, when creating
the system disk image by adding a line like this to your VM
configuration.
- `preallocation="metadata"`
## CD-ROM disks
If you want to expose an ISO image from the host to guest add the
following line to the VM configuration:
- `fixed_iso="/path/to/image.iso"`
## Floppy disks
If you're like [Alan Pope](https://popey.com) you'll probably want to
mount a floppy disk image in the guest. To do so add the following line
to the VM configuration:
- `floppy="/path/to/floppy.img"`
# File Sharing
All File Sharing options will only expose `~/Public` (or localised
variations) for the current user to the guest VMs.
## Samba 🐧 🍏 🪟
If `smbd` is available on the host, Quickemu will automatically enable
the built-in QEMU support for exposing a Samba share from the host to
the guest.
You can install the minimal Samba components on Ubuntu using:
``` bash
sudo apt install --no-install-recommends samba
```
If everything is set up correctly, the `smbd` address will be printed
when the virtual machine is started. For example:
- smbd: On guest: smb://10.0.2.4/qemu
If using a Windows guest, right-click on "This PC", click "Add a network
location", and paste this address, removing `smb:` and replacing forward
slashes with backslashes (in this example `\\10.0.2.4\qemu`).
## SPICE WebDAV 🐧 🪟
- TBD
## VirtIO-9P 🐧 🍏
- TBD
# Network port forwarding
Add an additional line to your virtual machine configuration. For
example:
- `port_forwards=("8123:8123" "8888:80")`
In the example above:
- Port 8123 on the host is forwarded to port 8123 on the guest.
- Port 8888 on the host is forwarded to port 80 on the guest.
# Disable networking
To completely disable all network interfaces in a guest VM add this
additional line to your virtual machine configuration:
- `network="none"`
# Restricted networking
You can isolate the guest from the host (and broader network) using the
restrict option, which will restrict networking to just the guest and
any virtual devices.
This can be used to prevent software running inside the guest from
phoning home while still providing a network inside the guest. Add this
additional line to your virtual machine configuration:
- `network="restrict"`
# Bridged networking
Connect your virtual machine to a preconfigured network bridge. Add an
additional line to your virtual machine configuration:
- `network="br0"`
If you want to have a persistent MAC address for your bridged network
interface in the guest VM you can add `macaddr` to the virtual machine
configuration. QEMU requires that the MAC address is in the range:
**52:54:00:AB:00:00 - 52:54:00:AB:FF:FF**
So you can generate your own MAC addresses with:
- `macaddr="52:54:00:AB:51:AE"`
# USB redirection
Quickemu supports USB redirection via SPICE pass-through and host
pass-through.
## SPICE redirection (recommended)
Using SPICE for USB pass-through is easiest as it doesn't require any
elevated permission, start Quickemu with `--display spice` and then
select `Input` -\> `Select USB Device for redirection` from the menu to
choose which device(s) you want to attach to the guest.
## Host redirection **NOT Recommended**
**USB host redirection is not recommended**, it is provided purely for
backwards compatibility to older versions of Quickemu. Using SPICE is
preferred, see above.
Add an additional line to your virtual machine configuration. For
example:
- `usb_devices=("046d:082d" "046d:085e")`
In the example above:
- The USB device with vendor_id 046d and product_id 082d will be
exposed to the guest.
- The USB device with vendor_id 046d and product_id 085e will be
exposed to the guest.
If the USB devices are not writable, `quickemu` will display the
appropriate commands to modify the USB device(s) access permissions,
like this:
- USB: Host pass-through requested:
- Sennheiser Communications EPOS GTW 270 on bus 001 device 005 needs permission changes:
sudo chown -v root:user /dev/bus/usb/001/005
ERROR! USB permission changes are required 👆
# TPM
Since Quickemu 2.2.0 a software emulated TPM device can be added to
guest virtual machines. Just add `tpm="on"` to your VM configuration.
`quickget` will automatically add this line to Windows 11 virtual
machines.
# AUTHORS
Written by Martin Wimpress.
# BUGS
Submit bug reports online at:
<https://github.com/quickemu-project/quickemu/issues>
# SEE ALSO
Full sources at: <https://github.com/quickemu-project/quickemu>
quickget(1), quickemu(1), quickgui(1)

532
docs/quickget.1 Normal file
View File

@ -0,0 +1,532 @@
.\" Automatically generated by Pandoc 2.19.2
.\"
.\" Define V font for inline verbatim, using C font in formats
.\" that render this, and otherwise B font.
.ie "\f[CB]x\f[]"x" \{\
. ftr V B
. ftr VI BI
. ftr VB B
. ftr VBI BI
.\}
.el \{\
. ftr V CR
. ftr VI CI
. ftr VB CB
. ftr VBI CBI
.\}
.TH "QUICKGET" "1" "February 4, 2023" "quickget" "Quickget User Manual"
.hy
.SH NAME
.PP
quickget - download and prepare materials for building a quickemu VM
.SH SYNOPSIS
.PP
\f[B]quickget\f[R] [\f[I]os\f[R]] [\f[I]release\f[R]]
[\f[I]edition\f[R]] | [\f[I]OPTION\f[R]]*
.SH DESCRIPTION
.PP
\f[B]quickget\f[R] will download the requisite materials and prepare a
configuration for \f[V]quickemu\f[R] to use to build and run
.SH OPTIONS
.TP
\f[B]version | -version | \[en]version\f[R]
show version (from Quickemu)
.TP
\f[B]list | list_csv | list_json\f[R]
provide a csv list of all supported guest OSes, versions and variants.
.TP
\f[B][OS] [Release] [Edition]\f[R]
specify the OS and release (and optional edition) if insufficient input
is provided a list of missing options will be reported and the script
will exit.
Editions may not apply and will be defaulted if not provided.
.SH NOTES
.SS Ubuntu Guest
.PP
\f[V]quickget\f[R] will automatically download an Ubuntu release and
create the virtual machine configuration.
.IP
.nf
\f[C]
quickget ubuntu 22.04
quickemu --vm ubuntu-22.04.conf
\f[R]
.fi
.IP \[bu] 2
Complete the installation as normal.
.IP \[bu] 2
Post-install:
.RS 2
.IP \[bu] 2
Install the SPICE agent (\f[V]spice-vdagent\f[R]) in the guest to enable
copy/paste and USB redirection
.RS 2
.IP \[bu] 2
\f[V]sudo apt install spice-vdagent\f[R]
.RE
.IP \[bu] 2
Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) in the guest to
enable file sharing.
.RS 2
.IP \[bu] 2
\f[V]sudo apt install spice-webdavd\f[R]
.RE
.RE
.SS Ubuntu devel (daily-live) images
.PP
\f[V]quickget\f[R] can also download/refresh devel images via
\f[V]zsync\f[R] for Ubuntu developers and testers.
.IP
.nf
\f[C]
quickget ubuntu devel
quickemu --vm ubuntu-devel.conf
\f[R]
.fi
.PP
You can run \f[V]quickget ubuntu devel\f[R] to refresh your daily
development image as often as you like, it will even automatically
switch to a new series.
.SS Ubuntu Flavours
.PP
All the official Ubuntu flavours are supported, just replace
\f[V]ubuntu\f[R] with your preferred flavour.
.IP \[bu] 2
\f[V]kubuntu\f[R] (Kubuntu)
.IP \[bu] 2
\f[V]lubuntu\f[R] (Lubuntu)
.IP \[bu] 2
\f[V]ubuntu-budgie\f[R] (Ubuntu Budgie)
.IP \[bu] 2
\f[V]ubuntukylin\f[R] (Ubuntu Kylin)
.IP \[bu] 2
\f[V]ubuntu-mate\f[R] (Ubuntu MATE)
.IP \[bu] 2
\f[V]ubuntustudio\f[R] (Ubuntu Studio)
.IP \[bu] 2
\f[V]ubuntu\f[R] (Ubuntu)
.IP \[bu] 2
\f[V]ubuntu-unity\f[R] (Ubuntu Unity)
.IP \[bu] 2
\f[V]xubuntu\f[R] (Xubuntu)
.SS Other Operating Systems
.PP
\f[V]quickget\f[R] also supports:
.IP \[bu] 2
\f[V]alma\f[R] (Alma Linux)
.IP \[bu] 2
\f[V]alpine\f[R] (Alpine Linux)
.IP \[bu] 2
\f[V]android\f[R] (Android x86)
.IP \[bu] 2
\f[V]archcraft\f[R] (Archcraft)
.IP \[bu] 2
\f[V]archlinux\f[R] (Arch Linux)
.IP \[bu] 2
\f[V]arcolinux\f[R] (Arco Linux)
.IP \[bu] 2
\f[V]batocera\f[R] (Batocera)
.IP \[bu] 2
\f[V]cachyos\f[R] (CachyOS)
.IP \[bu] 2
\f[V]centos-stream\f[R] (CentOS Stream)
.IP \[bu] 2
\f[V]debian\f[R] (Debian)
.IP \[bu] 2
\f[V]deepin\f[R] (Deepin)
.IP \[bu] 2
\f[V]devuan\f[R] (Devuan)
.IP \[bu] 2
\f[V]dragonflybsd\f[R] (DragonFlyBSD)
.IP \[bu] 2
\f[V]elementary\f[R] (elementary OS)
.IP \[bu] 2
\f[V]endeavouros\f[R] (EndeavourOS)
.IP \[bu] 2
\f[V]fedora\f[R] (Fedora)
.IP \[bu] 2
\f[V]freebsd\f[R] (FreeBSD)
.IP \[bu] 2
\f[V]freedos\f[R] (FreeDOS)
.IP \[bu] 2
\f[V]garuda\f[R] (Garuda Linux)
.IP \[bu] 2
\f[V]gentoo\f[R] (Gentoo)
.IP \[bu] 2
\f[V]ghostbsd\f[R] (GhostBSD)
.IP \[bu] 2
\f[V]haiku\f[R] (Haiku)
.IP \[bu] 2
\f[V]kali\f[R] (Kali)
.IP \[bu] 2
\f[V]kdeneon\f[R] (KDE Neon)
.IP \[bu] 2
\f[V]kolibrios\f[R] (KolibriOS)
.IP \[bu] 2
\f[V]linuxmint\f[R] (Linux Mint)
.IP \[bu] 2
\f[V]lmde\f[R] (Linux Mint Debian Edition)
.IP \[bu] 2
\f[V]mageia\f[R] (Mageia)
.IP \[bu] 2
\f[V]manjaro\f[R] (Manjaro)
.IP \[bu] 2
\f[V]mxlinux\f[R] (MX Linux)
.IP \[bu] 2
\f[V]netboot\f[R] (netboot.xyz)
.IP \[bu] 2
\f[V]netbsd\f[R] (NetBSD)
.IP \[bu] 2
\f[V]nixos\f[R] (NixOS)
.IP \[bu] 2
\f[V]openbsd\f[R] (OpenBSD)
.IP \[bu] 2
\f[V]opensuse\f[R] (openSUSE)
.IP \[bu] 2
\f[V]oraclelinux\f[R] (Oracle Linux)
.IP \[bu] 2
\f[V]popos\f[R] (Pop!_OS)
.IP \[bu] 2
\f[V]reactos\f[R] (ReactOS)
.IP \[bu] 2
\f[V]rebornos\f[R] (RebornOS)
.IP \[bu] 2
\f[V]rockylinux\f[R] (Rocky Linux)
.IP \[bu] 2
\f[V]slackware\f[R] (Slackware)
.IP \[bu] 2
\f[V]solus\f[R] (Solus)
.IP \[bu] 2
\f[V]tails\f[R] (Tails)
.IP \[bu] 2
\f[V]truenas-core\f[R] (TrueNAS Core)
.IP \[bu] 2
\f[V]truenas-scale\f[R] (TrueNAS Scale)
.IP \[bu] 2
\f[V]void\f[R] (Void Linux)
.IP \[bu] 2
\f[V]zorin\f[R] (Zorin OS)
.PP
Or you can download a Linux image and manually create a VM
configuration.
.IP \[bu] 2
Download a .iso image of a Linux distribution
.IP \[bu] 2
Create a VM configuration file; for example
\f[V]debian-bullseye.conf\f[R]
.IP
.nf
\f[C]
guest_os=\[dq]linux\[dq]
disk_img=\[dq]debian-bullseye/disk.qcow2\[dq]
iso=\[dq]debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso\[dq]
\f[R]
.fi
.IP \[bu] 2
Use \f[V]quickemu\f[R] to start the virtual machine:
.IP
.nf
\f[C]
quickemu --vm debian-bullseye.conf
\f[R]
.fi
.IP \[bu] 2
Complete the installation as normal.
.IP \[bu] 2
Post-install:
.RS 2
.IP \[bu] 2
Install the SPICE agent (\f[V]spice-vdagent\f[R]) in the guest to enable
copy/paste and USB redirection.
.IP \[bu] 2
Install the SPICE WebDAV agent (\f[V]spice-webdavd\f[R]) in the guest to
enable file sharing.
.RE
.SS macOS Guest
.PP
\f[V]quickget\f[R] automatically downloads a macOS recovery image and
creates a virtual machine configuration.
.IP
.nf
\f[C]
quickget macos catalina
quickemu --vm macos-catalina.conf
\f[R]
.fi
.PP
macOS \f[V]high-sierra\f[R], \f[V]mojave\f[R], \f[V]catalina\f[R],
\f[V]big-sur\f[R] and \f[V]monterey\f[R] are supported.
.IP \[bu] 2
Use cursor keys and enter key to select the \f[B]macOS Base System\f[R]
.IP \[bu] 2
From \f[B]macOS Utilities\f[R]
.RS 2
.IP \[bu] 2
Click \f[B]Disk Utility\f[R] and \f[B]Continue\f[R]
.RS 2
.IP \[bu] 2
Select \f[V]QEMU HARDDISK Media\f[R] (\[ti]103.08GB) from the list and
click \f[B]Erase\f[R].
.IP \[bu] 2
Enter a \f[V]Name:\f[R] for the disk
.IP \[bu] 2
If you are installing macOS Mojave or later (Catalina, Big Sur, and
Monterey), choose any of the APFS options as the filesystem.
MacOS Extended may not work.
.RE
.IP \[bu] 2
Click \f[B]Erase\f[R].
.IP \[bu] 2
Click \f[B]Done\f[R].
.IP \[bu] 2
Close Disk Utility
.RE
.IP \[bu] 2
From \f[B]macOS Utilities\f[R]
.RS 2
.IP \[bu] 2
Click \f[B]Reinstall macOS\f[R] and \f[B]Continue\f[R]
.RE
.IP \[bu] 2
Complete the installation as you normally would.
.RS 2
.IP \[bu] 2
On the first reboot use cursor keys and enter key to select \f[B]macOS
Installer\f[R]
.IP \[bu] 2
On the subsequent reboots use cursor keys and enter key to select the
disk you named
.RE
.IP \[bu] 2
Once you have finished installing macOS you will be presented with an
the out-of-the-box first-start wizard to configure various options and
set up your username and password
.IP \[bu] 2
OPTIONAL: After you have concluded the out-of-the-box wizard, you may
want to enable the TRIM feature that the computer industry created for
SSD disks.
This feature in our macOS installation will allow QuickEmu to compact
(shrink) your macOS disk image whenever you delete files inside the
Virtual Machine.
Without this step your macOS disk image will only ever get larger and
will not shrink even when you delete lots of data inside macOS.
.RS 2
.IP \[bu] 2
To enable TRIM, open the Terminal application and type the following
command followed by pressing enter to tell macos to use the TRIM command
on the hard disk when files are deleted:
.RE
.IP
.nf
\f[C]
sudo trimforce enable
\f[R]
.fi
.PP
You will be prompted to enter your account\[cq]s password to gain the
privilege needed.
Once you\[cq]ve entered your password and pressed enter the command will
request confirmation in the form of two questions that require you to
type y (for a \[lq]yes\[rq] response) followed by enter to confirm.
If you press enter without first typing y the system will consider that
a negative response as though you said \[lq]no\[rq]:
.IP
.nf
\f[C]
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an \[dq]as is\[dq] basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
Are you sure you with to proceed (y/N)?
\f[R]
.fi
.PP
And a second confirmation once you\[cq]ve confirmed the previous one:
.IP
.nf
\f[C]
Your system will immediately reboot when this is complete.
Is this OK (y/N)?
\f[R]
.fi
.PP
As the last message states, your system will automatically reboot as
soon as the command completes.
.PP
The default macOS configuration looks like this:
.IP
.nf
\f[C]
guest_os=\[dq]macos\[dq]
img=\[dq]macos-catalina/RecoveryImage.img\[dq]
disk_img=\[dq]macos-catalina/disk.qcow2\[dq]
macos_release=\[dq]catalina\[dq]
\f[R]
.fi
.IP \[bu] 2
\f[V]guest_os=\[dq]macos\[dq]\f[R] instructs Quickemu to optimise for
macOS.
.IP \[bu] 2
\f[V]macos_release=\[dq]catalina\[dq]\f[R] instructs Quickemu to
optimise for a particular macOS release.
.RS 2
.IP \[bu] 2
For example VirtIO Network and Memory Ballooning are available in Big
Sur and newer, but not previous releases.
.IP \[bu] 2
And VirtIO Block Media (disks) are supported/stable in Catalina and
newer.
.RE
.SS macOS compatibility
.PP
There are some considerations when running macOS via Quickemu.
.IP \[bu] 2
Supported macOS releases:
.RS 2
.IP \[bu] 2
High Sierra
.IP \[bu] 2
Mojave
.IP \[bu] 2
Catalina \f[B](Recommended)\f[R]
.IP \[bu] 2
Big Sur
.IP \[bu] 2
Monterey
.RE
.IP \[bu] 2
\f[V]quickemu\f[R] will automatically download the required
OpenCore (https://github.com/acidanthera/OpenCorePkg) bootloader and
OVMF firmware from OSX-KVM (https://github.com/kholia/OSX-KVM).
.IP \[bu] 2
Optimised by default, but no GPU acceleration is available.
.RS 2
.IP \[bu] 2
Host CPU vendor is detected and guest CPU is optimised accordingly.
.IP \[bu] 2
VirtIO Block
Media (https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is used
for the system disk where supported.
.IP \[bu] 2
VirtIO \f[V]usb-tablet\f[R] (http://philjordan.eu/osx-virt/) is used for
the mouse.
.IP \[bu] 2
VirtIO Network (\f[V]virtio-net\f[R]) is supported and enabled on macOS
Big Sur and newer but previous releases use \f[V]vmxnet3\f[R].
.IP \[bu] 2
VirtIO Memory Ballooning is supported and enabled on macOS Big Sur and
newer but disabled for other support macOS releases.
.RE
.IP \[bu] 2
USB host and SPICE pass-through is:
.RS 2
.IP \[bu] 2
UHCI (USB 2.0) on macOS Catalina and earlier.
.IP \[bu] 2
XHCI (USB 3.0) on macOS Big Sur and newer.
.RE
.IP \[bu] 2
Display resolution can only be changed via macOS System Preferences.
.IP \[bu] 2
\f[B]Full Duplex audio requires VoodooHDA
OC (https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
audio-device to the macOS guest VM\f[R].
.IP \[bu] 2
NOTE!
Gatekeeper (https://disable-gatekeeper.github.io/) and System Integrity
Protection
(SIP) (https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
need to be disabled to install VoodooHDA OC
.IP \[bu] 2
File sharing between guest and host is available via
virtio-9p (https://wiki.qemu.org/Documentation/9psetup) and SPICE
webdavd (https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
.IP \[bu] 2
Copy/paste via SPICE agent is \f[B]not available on macOS\f[R].
.SS macOS App Store
.PP
If you see \f[I]\[lq]Your device or computer could not be
verified\[rq]\f[R] when you try to login to the App Store, make sure
that your wired ethernet device is \f[V]en0\f[R].
Use \f[V]ifconfig\f[R] in a terminal to verify this.
.PP
If the wired ethernet device is not \f[V]en0\f[R], then then go to
\f[I]System Preferences\f[R] -> \f[I]Network\f[R], delete all the
network devices and apply the changes.
Next, open a terminal and run the following:
.IP
.nf
\f[C]
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
\f[R]
.fi
.PP
Now reboot, and the App Store should work.
.SS Windows 10 & 11 Guests
.PP
\f[V]quickget\f[R] can not download
Windows10 (https://www.microsoft.com/software-download/windows10) and
Windows 11 (https://www.microsoft.com/software-download/windows11)
automatically, but does automatically create an optimised virtual
machine configuration that you can just add an Windows .iso image to.
This configuration also includes the VirtIO drivers for
Windows (https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
\f[V]quickget\f[R] can automatically download Windows 8.1, Windows
10 (https://www.microsoft.com/en-gb/software-download/windows10ISO) and
Windows 11 (https://www.microsoft.com/en-gb/software-download/windows11)
along with the VirtIO drivers for
Windows (https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)
and creates a virtual machine configuration.
.IP
.nf
\f[C]
quickget windows 11
quickemu --vm windows-11.conf
\f[R]
.fi
.IP \[bu] 2
Complete the installation as you normally would.
.IP \[bu] 2
All relevant drivers and services should be installed automatically.
.IP \[bu] 2
A local adminstrator user account is automatically created, with these
credentials:
.RS 2
.IP \[bu] 2
Username: \f[V]Quickemu\f[R]
.IP \[bu] 2
Password: \f[V]quickemu\f[R]
.RE
.PP
The default Windows 11 configuration looks like this:
.IP
.nf
\f[C]
guest_os=\[dq]windows\[dq]
disk_img=\[dq]windows-11/disk.qcow2\[dq]
iso=\[dq]windows-11/windows-11.iso\[dq]
fixed_iso=\[dq]windows-11/virtio-win.iso\[dq]
tpm=\[dq]on\[dq]
secureboot=\[dq]on\[dq]
\f[R]
.fi
.IP \[bu] 2
\f[V]guest_os=\[dq]windows\[dq]\f[R] instructs \f[V]quickemu\f[R] to
optimise for Windows.
.IP \[bu] 2
\f[V]fixed_iso=\f[R] specifies the ISO image that provides VirtIO
drivers.
.IP \[bu] 2
\f[V]tpm=\[dq]on\[dq]\f[R] instructs \f[V]quickemu\f[R] to create a
software emulated TPM device using \f[V]swtpm\f[R].
.SH AUTHORS
.PP
Written by Martin Wimpress.
.SH BUGS
.PP
Submit bug reports online at:
<https://github.com/quickemu-project/quickemu/issues>
.SH SEE ALSO
.PP
Full sources at: <https://github.com/quickemu-project/quickemu>
.PP
quickemu(1), quickemu_conf(1), quickgui(1)
.SH AUTHORS
Martin Wimpress.

373
docs/quickget.1.md Normal file
View File

@ -0,0 +1,373 @@
---
author: Martin Wimpress
date: February 4, 2023
footer: quickget
header: Quickget User Manual
section: 1
title: QUICKGET
---
# NAME
quickget - download and prepare materials for building a quickemu VM
# SYNOPSIS
**quickget** \[*os*\] \[*release*\] \[*edition*\] \| \[*OPTION*\]\*
# DESCRIPTION
**quickget** will download the requisite materials and prepare a
configuration for `quickemu` to use to build and run
# OPTIONS
**version \| -version \| --version**
: show version (from Quickemu)
**list \| list_csv \| list_json**
: provide a csv list of all supported guest OSes, versions and
variants.
**\[OS\] \[Release\] \[Edition\]**
: specify the OS and release (and optional edition) if insufficient
input is provided a list of missing options will be reported and the
script will exit. Editions may not apply and will be defaulted if
not provided.
# NOTES
## Ubuntu Guest
`quickget` will automatically download an Ubuntu release and create the
virtual machine configuration.
``` bash
quickget ubuntu 22.04
quickemu --vm ubuntu-22.04.conf
```
- Complete the installation as normal.
- Post-install:
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
copy/paste and USB redirection
- `sudo apt install spice-vdagent`
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
enable file sharing.
- `sudo apt install spice-webdavd`
### Ubuntu devel (daily-live) images
`quickget` can also download/refresh devel images via `zsync` for Ubuntu
developers and testers.
``` bash
quickget ubuntu devel
quickemu --vm ubuntu-devel.conf
```
You can run `quickget ubuntu devel` to refresh your daily development
image as often as you like, it will even automatically switch to a new
series.
### Ubuntu Flavours
All the official Ubuntu flavours are supported, just replace `ubuntu`
with your preferred flavour.
- `kubuntu` (Kubuntu)
- `lubuntu` (Lubuntu)
- `ubuntu-budgie` (Ubuntu Budgie)
- `ubuntukylin` (Ubuntu Kylin)
- `ubuntu-mate` (Ubuntu MATE)
- `ubuntustudio` (Ubuntu Studio)
- `ubuntu` (Ubuntu)
- `ubuntu-unity` (Ubuntu Unity)
- `xubuntu` (Xubuntu)
## Other Operating Systems
`quickget` also supports:
- `alma` (Alma Linux)
- `alpine` (Alpine Linux)
- `android` (Android x86)
- `archcraft` (Archcraft)
- `archlinux` (Arch Linux)
- `arcolinux` (Arco Linux)
- `batocera` (Batocera)
- `cachyos` (CachyOS)
- `centos-stream` (CentOS Stream)
- `debian` (Debian)
- `deepin` (Deepin)
- `devuan` (Devuan)
- `dragonflybsd` (DragonFlyBSD)
- `elementary` (elementary OS)
- `endeavouros` (EndeavourOS)
- `fedora` (Fedora)
- `freebsd` (FreeBSD)
- `freedos` (FreeDOS)
- `garuda` (Garuda Linux)
- `gentoo` (Gentoo)
- `ghostbsd` (GhostBSD)
- `haiku` (Haiku)
- `kali` (Kali)
- `kdeneon` (KDE Neon)
- `kolibrios` (KolibriOS)
- `linuxmint` (Linux Mint)
- `lmde` (Linux Mint Debian Edition)
- `mageia` (Mageia)
- `manjaro` (Manjaro)
- `mxlinux` (MX Linux)
- `netboot` (netboot.xyz)
- `netbsd` (NetBSD)
- `nixos` (NixOS)
- `openbsd` (OpenBSD)
- `opensuse` (openSUSE)
- `oraclelinux` (Oracle Linux)
- `popos` (Pop!\_OS)
- `reactos` (ReactOS)
- `rebornos` (RebornOS)
- `rockylinux` (Rocky Linux)
- `slackware` (Slackware)
- `solus` (Solus)
- `tails` (Tails)
- `truenas-core` (TrueNAS Core)
- `truenas-scale` (TrueNAS Scale)
- `void` (Void Linux)
- `zorin` (Zorin OS)
Or you can download a Linux image and manually create a VM
configuration.
- Download a .iso image of a Linux distribution
- Create a VM configuration file; for example `debian-bullseye.conf`
``` bash
guest_os="linux"
disk_img="debian-bullseye/disk.qcow2"
iso="debian-bullseye/firmware-11.0.0-amd64-DVD-1.iso"
```
- Use `quickemu` to start the virtual machine:
``` bash
quickemu --vm debian-bullseye.conf
```
- Complete the installation as normal.
- Post-install:
- Install the SPICE agent (`spice-vdagent`) in the guest to enable
copy/paste and USB redirection.
- Install the SPICE WebDAV agent (`spice-webdavd`) in the guest to
enable file sharing.
## macOS Guest
`quickget` automatically downloads a macOS recovery image and creates a
virtual machine configuration.
``` bash
quickget macos catalina
quickemu --vm macos-catalina.conf
```
macOS `high-sierra`, `mojave`, `catalina`, `big-sur` and `monterey` are
supported.
- Use cursor keys and enter key to select the **macOS Base System**
- From **macOS Utilities**
- Click **Disk Utility** and **Continue**
- Select `QEMU HARDDISK Media` (\~103.08GB) from the list and
click **Erase**.
- Enter a `Name:` for the disk
- If you are installing macOS Mojave or later (Catalina, Big
Sur, and Monterey), choose any of the APFS options as the
filesystem. MacOS Extended may not work.
- Click **Erase**.
- Click **Done**.
- Close Disk Utility
- From **macOS Utilities**
- Click **Reinstall macOS** and **Continue**
- Complete the installation as you normally would.
- On the first reboot use cursor keys and enter key to select
**macOS Installer**
- On the subsequent reboots use cursor keys and enter key to
select the disk you named
- Once you have finished installing macOS you will be presented with
an the out-of-the-box first-start wizard to configure various
options and set up your username and password
- OPTIONAL: After you have concluded the out-of-the-box wizard, you
may want to enable the TRIM feature that the computer industry
created for SSD disks. This feature in our macOS installation will
allow QuickEmu to compact (shrink) your macOS disk image whenever
you delete files inside the Virtual Machine. Without this step your
macOS disk image will only ever get larger and will not shrink even
when you delete lots of data inside macOS.
- To enable TRIM, open the Terminal application and type the
following command followed by pressing
`<kbd>`{=html}enter`</kbd>`{=html} to tell macos to use the TRIM
command on the hard disk when files are deleted:
``` bash
sudo trimforce enable
```
You will be prompted to enter your account's password to gain the
privilege needed. Once you've entered your password and pressed
`<kbd>`{=html}enter`</kbd>`{=html} the command will request confirmation
in the form of two questions that require you to type
`<kbd>`{=html}y`</kbd>`{=html} (for a "yes" response) followed by
`<kbd>`{=html}enter`</kbd>`{=html} to confirm. If you press
`<kbd>`{=html}enter`</kbd>`{=html} without first typing
`<kbd>`{=html}y`</kbd>`{=html} the system will consider that a negative
response as though you said "no":
``` plain
IMPORTANT NOTICE: This tool force-enables TRIM for all relevant attached devices, even though such devices may not have been validated for data integrity while using TRIM. Use of this tool to enable TRIM may result in unintended data loss or data corruption. It should not be used in a commercial operating environment or with important data. Before using this tool, you should back up all of your data and regularly back up data while TRIM is enabled. This tool is provided on an "as is" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THIS TOOL OR ITS USE ALONE OR IN COMBINATION WITH YOUR DEVICES, SYSTEMS, OR SERVICES. BY USING THIS TOOL TO ENABLE TRIM, YOU AGREE THAT, TO THE EXTENT PERMITTED BY APPLICABLE LAW, USE OF THE TOOL IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU.
Are you sure you with to proceed (y/N)?
```
And a second confirmation once you've confirmed the previous one:
``` plain
Your system will immediately reboot when this is complete.
Is this OK (y/N)?
```
As the last message states, your system will automatically reboot as
soon as the command completes.
The default macOS configuration looks like this:
``` bash
guest_os="macos"
img="macos-catalina/RecoveryImage.img"
disk_img="macos-catalina/disk.qcow2"
macos_release="catalina"
```
- `guest_os="macos"` instructs Quickemu to optimise for macOS.
- `macos_release="catalina"` instructs Quickemu to optimise for a
particular macOS release.
- For example VirtIO Network and Memory Ballooning are available
in Big Sur and newer, but not previous releases.
- And VirtIO Block Media (disks) are supported/stable in Catalina
and newer.
### macOS compatibility
There are some considerations when running macOS via Quickemu.
- Supported macOS releases:
- High Sierra
- Mojave
- Catalina **(Recommended)**
- Big Sur
- Monterey
- `quickemu` will automatically download the required
[OpenCore](https://github.com/acidanthera/OpenCorePkg) bootloader
and OVMF firmware from [OSX-KVM](https://github.com/kholia/OSX-KVM).
- Optimised by default, but no GPU acceleration is available.
- Host CPU vendor is detected and guest CPU is optimised
accordingly.
- [VirtIO Block
Media](https://www.kraxel.org/blog/2019/06/macos-qemu-guest/) is
used for the system disk where supported.
- [VirtIO `usb-tablet`](http://philjordan.eu/osx-virt/) is used
for the mouse.
- VirtIO Network (`virtio-net`) is supported and enabled on macOS
Big Sur and newer but previous releases use `vmxnet3`.
- VirtIO Memory Ballooning is supported and enabled on macOS Big
Sur and newer but disabled for other support macOS releases.
- USB host and SPICE pass-through is:
- UHCI (USB 2.0) on macOS Catalina and earlier.
- XHCI (USB 3.0) on macOS Big Sur and newer.
- Display resolution can only be changed via macOS System Preferences.
- **Full Duplex audio requires [VoodooHDA
OC](https://github.com/chris1111/VoodooHDA-OC) or pass-through a USB
audio-device to the macOS guest VM**.
- NOTE! [Gatekeeper](https://disable-gatekeeper.github.io/) and
[System Integrity Protection
(SIP)](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)
need to be disabled to install VoodooHDA OC
- File sharing between guest and host is available via
[virtio-9p](https://wiki.qemu.org/Documentation/9psetup) and [SPICE
webdavd](https://gitlab.gnome.org/GNOME/phodav/-/merge_requests/24).
- Copy/paste via SPICE agent is **not available on macOS**.
### macOS App Store
If you see *"Your device or computer could not be verified"* when you
try to login to the App Store, make sure that your wired ethernet device
is `en0`. Use `ifconfig` in a terminal to verify this.
If the wired ethernet device is not `en0`, then then go to *System
Preferences* -\> *Network*, delete all the network devices and apply the
changes. Next, open a terminal and run the following:
``` bash
sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
```
Now reboot, and the App Store should work.
## Windows 10 & 11 Guests
`quickget` can not download
[Windows10](https://www.microsoft.com/software-download/windows10) and
[Windows 11](https://www.microsoft.com/software-download/windows11)
automatically, but does automatically create an optimised virtual
machine configuration that you can just add an Windows .iso image to.
This configuration also includes the [VirtIO drivers for
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
`quickget` can automatically download Windows 8.1, [Windows
10](https://www.microsoft.com/en-gb/software-download/windows10ISO) and
[Windows
11](https://www.microsoft.com/en-gb/software-download/windows11) along
with the [VirtIO drivers for
Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/)
and creates a virtual machine configuration.
``` bash
quickget windows 11
quickemu --vm windows-11.conf
```
- Complete the installation as you normally would.
- All relevant drivers and services should be installed automatically.
- A local adminstrator user account is automatically created, with
these credentials:
- Username: `Quickemu`
- Password: `quickemu`
The default Windows 11 configuration looks like this:
``` bash
guest_os="windows"
disk_img="windows-11/disk.qcow2"
iso="windows-11/windows-11.iso"
fixed_iso="windows-11/virtio-win.iso"
tpm="on"
secureboot="on"
```
- `guest_os="windows"` instructs `quickemu` to optimise for Windows.
- `fixed_iso=` specifies the ISO image that provides VirtIO drivers.
- `tpm="on"` instructs `quickemu` to create a software emulated TPM
device using `swtpm`.
# AUTHORS
Written by Martin Wimpress.
# BUGS
Submit bug reports online at:
<https://github.com/quickemu-project/quickemu/issues>
# SEE ALSO
Full sources at: <https://github.com/quickemu-project/quickemu>
quickemu(1), quickemu_conf(1), quickgui(1)

1817
quickemu Executable file

File diff suppressed because it is too large Load Diff

1810
quickget Executable file

File diff suppressed because it is too large Load Diff

112
quickgui Executable file
View File

@ -0,0 +1,112 @@
#!/bin/bash
# DEBUG mod
#bash -x quickyad 2>&1 | tee output.log
# YAD gui script for excellent quickemu
#TODO Download Icons
#TODO Add homepages to right click
echo "Running..."
# dependencies checks
if ! command -v yad >/dev/null 2>&1; then
echo "You are missing yad..." >&2
exit 1
fi
if ! command -v quickemu >/dev/null 2>&1; then
echo "You are missing quickemu..." >&2
exit 1
fi
# generate random key for yad (for connecting tabs in notebook together)
key=$((RANDOM % 9000 + 1000))
# set current dir as QUICKEMU_VMS_DIR
#QUICKEMU_VMS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
# set default directories
QUICKEMU_VMS_DIR="$HOME/.local/share/quickemu"
CONFIG_DIR="$HOME/.config/quickemu"
ICON_DIR="$CONFIG_DIR/vms_icons"
TERMINAL=sakura
replace='"!"'
export "QUICKEMU_VMS_DIR" "CONFIG_DIR" "ICON_DIR"
# create default dirs if they are not present
mkdir -p "$CONFIG_DIR" "$CONFIG_DIR/vms_ready" "$CONFIG_DIR/vms_supported"
# remove desktop files (ready to run VMs)
rm "$CONFIG_DIR"/vms_ready/*
# Enter quickemu VMs dir
cd "$QUICKEMU_VMS_DIR" || exit
# check for VMs .conf files (ready to run VMs)
for vm_config_file in *.conf; do
vm_desktop_file=$(basename "$QUICKEMU_VMS_DIR/$vm_config_file" .conf)
# Use fuzzy matching to find the best matching icon file (ready to run VMs)
icon_name=$(basename "$QUICKEMU_VMS_DIR/$vm_config_file" .conf | cut -d'-' -f -2)
icon_file=$(find "$ICON_DIR" -type f -iname "${icon_name// /}.*")
# If no icon was found, try shorter name (ready to run VMs)
if [ -z "$icon_file" ]; then
icon_name=$(basename "$QUICKEMU_VMS_DIR/$vm_config_file" .conf | cut -d'-' -f1)
icon_file=$(find "$ICON_DIR" -type f -iname "${icon_name// /}.*")
fi
# If no icon was found, use a default icon (ready to run VMs)
if [ -z "$icon_file" ]; then
icon_file="$ICON_DIR/tux.svg"
fi
# content of desktop files (ready to run VMs)
desktop_file_content="[Desktop Entry]
Type=Application
Name=$vm_desktop_file
Exec=quickemu -vm \"$vm_config_file\"
Icon=$icon_file
Categories=System;Virtualization;"
# create desktop files (ready to run VMs)
echo "$desktop_file_content" > "$CONFIG_DIR"/vms_ready/"$vm_desktop_file".desktop
done
# remove desktop files (supported VMs)
rm "$CONFIG_DIR"/vms_supported/*
# get supported VMs
quickget | sed 1d | cut -d':' -f2 | grep -o '[^ ]*' > "$CONFIG_DIR/supported.txt"
while read -r get_name; do
vm_desktop_file=$(echo "$get_name" | tr ' ' '_')
releases=$(quickget "$vm_desktop_file" | grep 'Releases' | cut -d':' -f2 | sed 's/^ //')
editions=$(quickget "$vm_desktop_file" | grep 'Editions' | cut -d':' -f2 | sed 's/^ //')
icon_name="$ICON_DIR/$get_name"
if [ -f "$icon_name.svg" ]; then
icon_file="$icon_name.svg"
elif [ -f "$icon_name.png" ]; then
icon_file="$icon_name.png"
else
icon_file="$ICON_DIR/tux.svg"
fi
# Check if there are editions
if [ -z "$editions" ]; then
# Create desktop file for VMs without editions
desktop_file_content="[Desktop Entry]
Type=Application
Name=$get_name
releases=$releases
replace='\"!\"'
Exec=sh -c 'cd $QUICKEMU_VMS_DIR && yad --form --separator=\" \" --field=\"Release:CB\" \"${releases// /$replace}\" | xargs -I{} $TERMINAL -e \"quickget $get_name {}\"'
Icon=$icon_file
Categories=System;Virtualization;"
echo "$desktop_file_content" > "$CONFIG_DIR"/vms_supported/"$vm_desktop_file".desktop
else
# Create desktop file for VMs with editions
desktop_file_content="[Desktop Entry]
Type=Application
Name=$get_name
releases=$releases
editions=$editions
replace=$replace
Exec=sh -c 'cd $QUICKEMU_VMS_DIR && yad --form --separator=\" \" --field=\"Release:CB\" \"${releases// /$replace}\" --field=\"Edition:CB\" \"${editions// /$replace}\" | xargs -I{} $TERMINAL -e \"quickget $get_name {}\"'
Icon=$icon_file
Categories=System;Virtualization;"
echo "$desktop_file_content" > "$CONFIG_DIR"/vms_supported/"$vm_desktop_file".desktop
fi
done < "$CONFIG_DIR"/supported.txt
# show YAD notebook
yad --plug="$key" --tabnum=1 --icons --listen --read-dir="$CONFIG_DIR"/vms_ready --sort-by-name --no-buttons --borders=0 --icon-size=48 --item-width=76 &
yad --plug="$key" --tabnum=2 --icons --listen --read-dir="$CONFIG_DIR"/vms_supported --sort-by-name --no-buttons --borders=0 --icon-size=48 --item-width=76 &
yad --plug="$key" --tabnum=3 --icons --listen --read-dir="$CONFIG_DIR" --sort-by-name --no-buttons --borders=0 --icon-size=48 --item-width=76 &
yad --dynamic --notebook --key="$key" --width=900 --height=800 --title="GUI for Quickemu" --listen --no-buttons --tab="run VM" --tab="download and run VM" --tab="settings"
# exit peacfully
exit 0

96
quicktui Executable file
View File

@ -0,0 +1,96 @@
#!/usr/bin/bash
# Author: zenobit
# Description: Uses fzf to provide a simple GUI for quickemu and quickget
# script must be in same directory as quickget and quickemu!
# License MIT
# Define variables
progname="${progname:="${0##*/}"}"
version="0.21"
vms=(*.conf)
# Set traps to catch the signals and exit gracefully
trap "exit" INT
trap "exit" EXIT
# Dependency check: check if fzf is installed and can be executed
if ! command -v fzf >/dev/null 2>&1; then
echo "You are missing fzf..." && exit 255
fi
# Dispaly version and prepared VMs
#printf " $progname: $version\n quickemu: $(quickemu --version)\n\n Prepared VMs:\n-------------\n"
printf '%s: v.%s\nquickemu: v.%s\n\n Work dir.: %s\n\n Prepared VMs:\n-------------\n' "$progname" "$version" "$(quickemu --version)" "$(pwd)"
# Check if there are any VMs
if [ ${#vms[@]} -eq 0 ]; then
echo "No VMs found."
exit 1
fi
# Print the names of the available VMs
printf "%s\n" "${vms[@]%.*}"
echo "-------------"
# Action prompt
printf " Do you want to create a new VM? (c)
or run an existing one? (press anything)\n"
read -rn 1 -s start
case $start in
c )
todo="create"
;;
esac
# If the user chose to create a new VM
if [ "$todo" = "create" ]; then
os=$(quickget | sed 1d | cut -d':' -f2 | grep -o '[^ ]*' | fzf --cycle --header='Choose OS to download
or CTRL-c or ESC to quit')
# If the OS is Windows
if [ "$os" = windows ]; then
answer=$(echo "Default English
Choose other language" | fzf --cycle)
# If the user wants another windows language
if [ "$answer" = "Choose other language" ]; then
wrelease=$(echo "8
10
11" | fzf --cycle)
# get window language list
wlend=$(($(cat quickget | sed '/Arabic/,$!d' | grep -n '}' | cut -d':' -f1 | head -n 1) - 1))
# get windows language
wlang=$(cat quickget | sed '/Arabic/,$!d' | head -n $wlend | cut -d'=' -f2 | tail -c +2 | head -c -2 | sed 's/^[ \t]*//' | fzf --cycle --header='Choose Language
or CTRL-c or ESC to quit')
# downloading windows
printf '\n Trying to download Windows %s %s...\n\n' "$wrelease" "$wlang"
quickget "windows" "$wrelease" "$wlang"
fi
fi
# Get the release and edition to download, if necessary
choices=$(quickget "$os" | sed 1d)
if [ "$(echo "$choices" | wc -l)" = 1 ]; then
# get release
release=$(echo "$choices" | grep 'Releases' | cut -d':' -f2 | grep -o '[^ ]*' | fzf --cycle --header='Choose Release
or CTRL-c or ESC to quit')
# downloading
printf '\n Trying to download %s %s...\n\n' "$os" "$release"
quickget "$os" "$release"
else
# get release
release=$(echo "$choices" | grep 'Releases' | cut -d':' -f2 | grep -o '[^ ]*' | fzf --cycle --header='Choose Release
or CTRL-c or ESC to quit')
# get edition
edition=$(echo "$choices" | grep 'Editions' | cut -d':' -f2 | grep -o '[^ ]*' | fzf --cycle --header='Choose Edition
or CTRL-c or ESC to quit')
# downloading
printf '\n Trying to download %s %s %s...\n\n' "$os" "$release" "$edition"
quickget "$os" "$release" "$edition"
fi
fi
# choose VM to run
choosed=$(echo "$(ls *.conf 2>/dev/null | sed 's/\.conf$//')" | fzf --cycle --header='Choose VM to run
or CTRL-c or ESC to quit')
# Run choosed VM
printf '\n Starting %s...\n\n' "$choosed"
quickemu -vm "$choosed.conf"
exit 0

18
untitled Normal file
View File

@ -0,0 +1,18 @@
#!/bin/bash
# YAD gui script for creating YAD graphical user interfaces
# This version use desktop files and notebook
# set app name
#
# create tab
# create desktop file
# create notebook logic
# test script
exit 0

BIN
yadEmu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB