From bc2e002a4972b005b7dcdaf8620d02cf620fe0d4 Mon Sep 17 00:00:00 2001
From: Divarion-D
- This API provides authentication and playlist generation features for XC_VM. - Clients can authenticate using a username/password or token, after which a personalized playlist is generated. -
- - - ---- - -## 📚 Navigation - -* [📂 File Location](#file-location) -* [🔑 Authentication](#authentication) -* [🚀 Endpoints](#endpoints) -* [❌ Error Codes](#error-codes) -* [🧾 Notes](#notes) - ---- - -## 📂 File Location - -The main API file is located at: - -```bash -/home/xc_vm/wwwdir/playlist.php -``` - ---- - -## 🔑 Authentication - -The API requires authentication either via username and password or via token. -This ensures secure access to the content. - -### Base URL - -```http -http://- This API provides various system functionalities, including log viewing, video-on-demand (VOD) and stream management, statistics retrieval, background command execution, and more. -
- - - ---- - -## File Location - -``` -/home/xc_vm/wwwdir/api.php -``` - -## API Architecture Overview - -**Base URI:** `http://- The API provides access to IPTV streams (Live TV, Radio), VOD (Movies), Series, and EPG (TV guide) for applications compatible with XtreamCodes. - It is a core component for integration with XC_VM. -
- - - ---- - -## 📚 Navigation - -* [📂 File Location](#file-location) -* [📑 Overview](#overview) -* [🔑 Authorization](#authorization) -* [📺 Live TV (TV & Radio)](#live-tv-tv--radio) -* [🎬 VOD (Movies)](#vod-movies) -* [📽 Series](#series) -* [🎞 Media Access](#media-access) -* [🧾 Notes](#notes) - ---- - -## 📂 File Location - -The main API file is located at: - -``` -/home/xc_vm/wwwdir/player_api.php -``` - ---- - -## 📑 Overview - -The API is divided into key sections for easier integration. -Each endpoint includes example requests and responses. - ---- - -## 🔑 Authorization - -Authorization is the first step to access content. -It validates user credentials and returns server information. - -### Request - -```http -GET /player_api?username={username}&password={password} -``` - -### Example Response - -```json -{ - "user_info": { - "username": "testxc", - "password": "testxc", - "message": "Welcome to XC_VM", - "auth": 1, - "status": "Active", - "exp_date": null, - "is_trial": 0, - "created_at": 1757353729, - "max_connections": 1, - "allowed_output_formats": [ - "m3u8", - "ts", - "rtmp" - ] - }, - "server_info": { - "xui": true, - "version": "1.1.0", - "url": "176.124.192.118", - "port": "80", - "https_port": "443", - "server_protocol": "http", - "rtmp_port": "8880", - "timestamp_now": 1757442189, - "time_now": "2025-09-09 19:23:09", - "timezone": "Europe/London" - } -} -``` - -> 💡 **Tip:** Use the obtained data for subsequent requests to avoid repeated authentication. - ---- - -## 📺 Live TV (TV & Radio) - -Endpoints for working with live streams, including categories, streams, and EPG. - -### Get All Live Categories - -```http -GET /player_api?username={username}&password={password}&action=get_live_categories -``` - -**Example Response** - -```json -[ - { - "category_id": "1", - "category_name": "News", - "parent_id": 0 - }, - { - "category_id": "2", - "category_name": "Sports", - "parent_id": 0 - } -] -``` - -### Get All Live Streams - -```http -GET /player_api?username={username}&password={password}&action=get_live_streams -``` - -**Example Response** - -```json -[ - { - "num": 1, - "name": "BBC News", - "stream_type": "live", - "stream_id": 101, - "stream_icon": "http://176.124.192.118/images/bbc.png", - "epg_channel_id": "bbc.news.uk", - "added": "1660568200", - "category_id": "1", - "custom_sid": "", - "tv_archive": 0, - "direct_source": "", - "tv_archive_duration": 0 - } -] -``` - -### Get Streams by Category - -```http -GET /player_api?username={username}&password={password}&action=get_live_streams&category_id={id} -``` - -### Get Channel Short EPG - -```http -GET /player_api?username={username}&password={password}&action=get_short_epg&stream_id={id}&limit={N} -``` - -**Example Response** - -```json -{ - "epg_listings": [ - { - "id": 1, - "title": "Morning News", - "start": "2022-08-15 07:00:00", - "end": "2022-08-15 08:00:00", - "description": "Daily morning news update." - } - ] -} -``` - -### Get Full Channel Schedule - -```http -GET /player_api?username={username}&password={password}&action=get_simple_data_table&stream_id={id} -``` - -### Get EPG for All Channels (XMLTV) - -```http -GET /xmltv.php?username={username}&password={password} -``` - -**Example Response (XMLTV)** - -```xml -- This guide explains how to build binary files for XC_VM. - It is intended for developers and system administrators who want to customize the system. -
- - - ---- - -## 📚 Navigation - -* [🔧 Prerequisites](#prerequisites) -* [🌐 Building NGINX](#building-nginx) -* [📺 Building NGINX with RTMP](#building-nginx-with-rtmp) -* [🐘 Building PHP-FPM](#building-php-fpm) -* [📦 Installing PHP Extensions](#installing-php-extensions) -* [⚙️ Building the `network` Binary](#building-the-network-binary) -* [✅ Conclusion](#conclusion) - ---- - -## 🔧 Prerequisites - -> ⚠️ **Warning:** All steps should be performed **on the server** where `xc_vm` is installed. - -### 1. Install Dependencies - -Install the necessary packages for building. This ensures all required tools and libraries are available. - -```bash -sudo apt-get install -y \ - build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev \ - libssl-dev libgd-dev libxml2 libxml2-dev uuid-dev libxslt1-dev \ - unzip wget curl git -``` - ---- - -## 🌐 Building NGINX - -### 1. Download Source Files - -#### OpenSSL - -```bash -wget https://github.com/openssl/openssl/releases/download/openssl-3.5.1/openssl-3.5.1.tar.gz -tar -xzvf openssl-3.5.1.tar.gz -``` - -#### Zlib - -```bash -wget https://zlib.net/zlib-1.3.1.tar.gz -tar -xzvf zlib-1.3.1.tar.gz -``` - -#### PCRE - -```bash -wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz -tar -xzvf pcre-8.45.tar.gz -``` - -#### FLV Module - -```bash -wget https://github.com/winshining/nginx-http-flv-module/archive/refs/tags/v1.2.12.zip -unzip v1.2.12.zip -``` - -#### Nginx - -```bash -wget https://nginx.org/download/nginx-1.28.0.tar.gz -tar -zxvf nginx-1.28.0.tar.gz -cd nginx-1.28.0 -``` - -### 2. Configure Build - -Configure a static build with required modules: - -```bash -./configure \ - --prefix=/home/xc_vm/bin/nginx \ - --with-compat \ - --with-http_auth_request_module \ - --with-file-aio \ - --with-threads \ - --with-http_gzip_static_module \ - --with-http_realip_module \ - --with-http_flv_module \ - --with-http_mp4_module \ - --with-http_secure_link_module \ - --with-http_slice_module \ - --with-http_ssl_module \ - --with-http_stub_status_module \ - --with-http_sub_module \ - --with-http_v2_module \ - --with-cc-opt='-static -static-libgcc -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' \ - --with-ld-opt='-static -Wl,-z,relro -Wl,-z,now -pie' \ - --with-pcre=../pcre-8.45 \ - --with-pcre-jit \ - --with-zlib=../zlib-1.3.1 \ - --with-openssl=../openssl-3.5.1 \ - --with-openssl-opt=no-nextprotoneg -``` - -### 3. Build and Install - -```bash -make -make install -``` - ---- - -## 📺 Building NGINX with RTMP - -### 1. Download RTMP Module - -```bash -wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.2.tar.gz -tar -xzvf v1.2.2.tar.gz -``` - -### 2. Configure Build - -```bash -cd nginx-1.28.0 -./configure \ - --prefix=/home/xc_vm/bin/nginx_rtmp \ - --add-module=../nginx-http-flv-module-1.2.12 \ - --with-compat \ - --with-http_auth_request_module \ - --with-file-aio \ - --with-threads \ - --with-http_gzip_static_module \ - --with-http_realip_module \ - --with-http_flv_module \ - --with-http_mp4_module \ - --with-http_secure_link_module \ - --with-http_slice_module \ - --with-http_ssl_module \ - --with-http_stub_status_module \ - --with-http_sub_module \ - --with-http_v2_module \ - --with-cc-opt='-static -static-libgcc -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' \ - --with-ld-opt='-static -Wl,-z,relro -Wl,-z,now -pie' -``` - -### 3. Build and Install - -```bash -make -make install -``` - -### 4. Rename Executable - -```bash -mv /home/xc_vm/bin/nginx_rtmp/sbin/nginx /home/xc_vm/bin/nginx_rtmp/sbin/nginx_rtmp -``` - ---- - -## 🐘 Building PHP-FPM - -### 1. Install Dependencies - -```bash -sudo apt-get install -y \ - libcurl4-gnutls-dev libbz2-dev libzip-dev autoconf automake \ - libtool m4 gcc make pkg-config libmaxminddb-dev libssh2-1-dev -``` - -### 2. Download PHP Source - -```bash -wget -O php-8.1.33.tar.gz http://php.net/get/php-8.1.33.tar.gz/from/this/mirror -tar -xzvf php-8.1.33.tar.gz -cd php-8.1.33 -``` - -### 3. Configure Build - -```bash -./configure \ - --prefix=/home/xc_vm/bin/php \ - --with-fpm-user=xc_vm \ - --with-fpm-group=xc_vm \ - --enable-gd \ - --with-jpeg \ - --with-freetype \ - --enable-static \ - --disable-shared \ - --enable-opcache \ - --enable-fpm \ - --without-sqlite3 \ - --without-pdo-sqlite \ - --enable-mysqlnd \ - --with-mysqli \ - --with-curl \ - --disable-cgi \ - --with-zlib \ - --enable-sockets \ - --with-openssl \ - --enable-shmop \ - --enable-sysvsem \ - --enable-sysvshm \ - --enable-sysvmsg \ - --enable-calendar \ - --disable-rpath \ - --enable-inline-optimization \ - --enable-pcntl \ - --enable-mbregex \ - --enable-exif \ - --enable-bcmath \ - --with-mhash \ - --with-gettext \ - --with-xmlrpc \ - --with-xsl \ - --with-libxml \ - --with-pdo-mysql \ - --disable-mbregex \ - --with-pear -``` - -### 4. Build and Install - -```bash -make -make install -``` - ---- - -## 📦 Installing PHP Extensions - -Use the built-in `pecl` to install extensions: - -```bash -/home/xc_vm/bin/php/bin/pecl install maxminddb -/home/xc_vm/bin/php/bin/pecl install ssh2 -/home/xc_vm/bin/php/bin/pecl install igbinary -/home/xc_vm/bin/php/bin/pecl install redis -``` - -### Configuring Redis Extension - -During PECL installation, you will be prompted: - -``` -enable igbinary serializer support? [no] : yes -enable lzf compression support? [no] : -enable zstd compression support? [no] : -enable msgpack serializer support? [no] : -enable lz4 compression? [no] : -use system liblz4? [yes] : -``` - -Recommended answers: `yes` for igbinary, others optional. - ---- - -## ⚙️ Building the `network` Binary - -### 1. Install `PyInstaller` (one-time) - -```bash -pip install -U pyinstaller -``` - -### 2. Build Binary - -```bash -cd /home/xc_vm/bin -pyinstaller --onefile network.py -``` - -The executable will be located in: - -```bash -/home/xc_vm/bin/dist/network -``` - -### 3. Move Binary to Final Location - -```bash -mv /home/xc_vm/bin/dist/network /home/xc_vm/bin/network -``` - -### 4. Clean Temporary Directories - -```bash -rm -rf build dist network.spec __pycache__ -``` - ---- - -## ✅ Conclusion - -After completing all steps, you will have your own statically built binaries: - -* `nginx` -* `nginx_rtmp` -* `php-fpm` -* `pecl` extensions -* `network` (Python script binary) - -> 💡 **Tip:** If issues occur, check build logs or open an [issue](https://github.com/Vateron-Media/XC_VM/issues). - - - ---- \ No newline at end of file diff --git a/docs/en/builds/build_ffmpeg.md b/docs/en/builds/build_ffmpeg.md deleted file mode 100644 index 53e0fafc1..000000000 --- a/docs/en/builds/build_ffmpeg.md +++ /dev/null @@ -1,320 +0,0 @@ -Вот английский перевод руководства по сборке FFmpeg для XC_VM: - ---- - -- This guide explains how to build FFmpeg with NVIDIA hardware acceleration (NVENC/CUVID) and statically link libraries for full portability within the XC_VM project. -
- - - ---- - -## 📚 Navigation - -* [📋 Requirements](#requirements) -* [🔧 Configuration](#configuration) -* [🛠 Install Build Tools](#install-build-tools) -* [🎶 Compile and Include Codecs](#compile-and-include-codecs) -* [🖥 NVIDIA & CUDA Installation](#nvidia--cuda-installation) -* [🔨 FFmpeg Build](#ffmpeg-build) -* [📦 Installation](#installation) -* [✅ Verification](#verification) -* [🧾 Notes](#notes) -* [🔄 Version Compatibility](#version-compatibility) - ---- - -## 📋 Requirements - -* **Ubuntu 22.04 or newer** — recommended OS for a stable build. -* NVIDIA GPU with **NVENC support** (optional but recommended for hardware acceleration). -* ~15 GB of free disk space for sources and temporary files. -* Stable internet connection to download dependencies. - -> 💡 **Tip:** Ensure your system is updated before starting to avoid package conflicts. - ---- - -## 🔧 Configuration - -Set environment variables to customize the build, allowing easy adjustments to versions and paths: - -```bash -# FFmpeg version to build -export FFMPEG_VERSION="8.0" - -# Installation directory -export INSTALL_DIR="/home/xc_vm/bin/ffmpeg_bin" - -# Build directory -export BUILD_DIR="$HOME/ffmpeg_sources" - -# CUDA version -export CUDA_VERSION="12-2" - -# NVIDIA driver version -export NVIDIA_DRIVER_VERSION="535" -``` - ---- - -## 🛠 Install Build Tools - -Update the system and install essential development packages: - -```bash -sudo apt-get update -qq && sudo apt-get -y install \ - autoconf automake build-essential cmake git-core \ - libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev \ - libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev \ - libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev \ - meson ninja-build pkg-config texinfo wget yasm \ - zlib1g-dev mercurial nasm libssl-dev software-properties-common -``` - ---- - -## 🎶 Compile and Include Codecs - -Build libraries from source for static integration into FFmpeg, supporting popular formats without external dependencies. - -### 2.1 Create Build Directory - -```bash -mkdir -p ${BUILD_DIR:-~/ffmpeg_sources} && cd ${BUILD_DIR:-~/ffmpeg_sources} -``` - -### 2.2 H.264 (libx264) - -```bash -git clone https://code.videolan.org/videolan/x264.git -cd x264 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared --enable-pic -make -j$(nproc) -sudo make install -cd .. -``` - -### 2.3 H.265 (libx265) - -```bash -git clone https://bitbucket.org/multicoreware/x265_git.git -cd x265_git/build -cmake ../source -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR:-$HOME/ffmpeg_build}" -DENABLE_SHARED=OFF -make -j$(nproc) -sudo make install -cd ../.. -``` - -### 2.4 VP8/VP9 (libvpx) - -```bash -git clone https://chromium.googlesource.com/webm/libvpx -cd libvpx -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared --enable-pic -make -j$(nproc) -sudo make install -cd .. -``` - -### 2.5 Opus Audio (libopus) - -```bash -wget https://downloads.xiph.org/releases/opus/opus-1.5.2.tar.gz -tar -xvzf opus-1.5.2.tar.gz -cd opus-1.5.2 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared -make -j$(nproc) -sudo make install -cd .. -``` - -### 2.6 Additional Libraries - -* **libass** (subtitles) -* **libfreetype** (fonts) -* **libvorbis** (audio) -* **libmp3lame** (MP3) -* **libtheora** (Theora) -* **librtmp** (RTMP) -* **libunistring** (required by gnutls and librtmp) -* **bzip2** - -*(Use the same build commands as in the Russian version, adjusting paths as needed.)* - ---- - -## 🖥 NVIDIA & CUDA Installation - -Install NVIDIA drivers and CUDA for hardware acceleration. - -### 3.1 NVIDIA Driver Installation - -```bash -sudo add-apt-repository ppa:graphics-drivers/ppa -sudo apt update -sudo apt install nvidia-driver-${NVIDIA_DRIVER_VERSION:-535} -``` - -> ⚠️ **Important:** Reboot after installation and verify GPU compatibility. - -### 3.2 CUDA Toolkit Installation - -```bash -wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb -sudo dpkg -i cuda-keyring_1.0-1_all.deb -sudo apt update -sudo apt install -y cuda-toolkit-${CUDA_VERSION:-12-2} -``` - -### 3.3 NVENC Headers - -```bash -cd ${BUILD_DIR:-~/ffmpeg_sources} -git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git -cd nv-codec-headers -make -sudo make PREFIX="${INSTALL_DIR:-$HOME/ffmpeg_build}" install -cd .. -``` - -### 3.4 Optional NVIDIA Tools - -```bash -sudo apt install -y nvidia-cuda-toolkit nvidia-cuda-dev -``` - ---- - -## 🔨 FFmpeg Build - -### 4.1 Download Source - -```bash -cd ${BUILD_DIR:-~/ffmpeg_sources} -wget https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION:-8.0}.tar.bz2 -tar xjvf ffmpeg-${FFMPEG_VERSION:-8.0}.tar.bz2 -cd ffmpeg-${FFMPEG_VERSION:-8.0} -``` - -### 4.2 Configuration - -```bash -export PATH="${INSTALL_DIR:-$HOME/bin}:$PATH" -export PKG_CONFIG_PATH="${INSTALL_DIR:-$HOME/ffmpeg_build}/lib/pkgconfig" - -./configure \ - --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" \ - --pkg-config-flags="--static" \ - --extra-cflags="-I${INSTALL_DIR:-$HOME/ffmpeg_build}/include -I/usr/local/cuda/include" \ - --extra-ldflags="-L${INSTALL_DIR:-$HOME/ffmpeg_build}/lib -L/usr/local/cuda/lib64 -Wl,-Bstatic -lcrypto -lssl -Wl,-Bdynamic" \ - --extra-version=XCVM \ - --extra-libs="-lsupc++ -lgmp -lz -lunistring -lpthread -lm -lrt -ldl" \ - --bindir="${INSTALL_DIR:-$HOME/bin}" \ - --enable-gpl \ - --enable-gnutls \ - --enable-libass \ - --enable-libfreetype \ - --enable-libmp3lame \ - --enable-libopus \ - --enable-libvorbis \ - --enable-libvpx \ - --enable-libx264 \ - --enable-libx265 \ - --enable-librtmp \ - --enable-libtheora \ - --enable-bzlib \ - --enable-fontconfig \ - --enable-zlib \ - --enable-nvenc \ - --enable-ffnvcodec \ - --enable-cuvid \ - --enable-version3 \ - --enable-nonfree \ - --enable-pthreads \ - --enable-runtime-cpudetect \ - --enable-gray \ - --disable-alsa \ - --disable-indev=alsa \ - --disable-outdev=alsa \ - --disable-ffplay \ - --disable-doc \ - --disable-debug \ - --disable-autodetect \ - --enable-static \ - --enable-muxer=hls \ - --enable-muxer=dash \ - --enable-demuxer=hls \ - --extra-cflags=--static \ - --target-os=linux -``` - -### 4.3 Compile - -```bash -make -j$(nproc) -``` - ---- - -## 📦 Installation - -```bash -mkdir -p ${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ -cp ffmpeg ffprobe ${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ -``` - ---- - -## ✅ Verification - -Check version and NVIDIA support: - -```bash -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffmpeg -version -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffprobe -version -``` - -Check NVENC and CUVID support: - -```bash -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffmpeg -encoders | grep nvenc -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffmpeg -decoders | grep cuvid -``` - ---- - -## 📝 Notes - -1. All libraries are statically linked into the FFmpeg binary, ensuring full portability. -2. The NVIDIA driver must be compatible with your GPU. -3. A **reboot** may be required after installing drivers. -4. Building FFmpeg is CPU- and memory-intensive. -5. The resulting binary will be large due to included dependencies. -6. Adjust environment variables to match your system. -7. Configuration flags may need adjustments for different FFmpeg versions. - ---- - -## 🔄 Version Compatibility - -| FFmpeg Version | Recommended CUDA | Notes | -|----------------|------------------|------------------| -| 8.x | 12.2+ | Latest features | -| 7.x | 12.0+ | Stable | -| 6.x | 11.8+ | Outdated | - -Check the [FFmpeg documentation](https://ffmpeg.org/) for specific version requirements. - ---- - - - ---- \ No newline at end of file diff --git a/docs/en/faq.md b/docs/en/faq.md deleted file mode 100644 index a43ed2cf8..000000000 --- a/docs/en/faq.md +++ /dev/null @@ -1,78 +0,0 @@ -- Here you’ll find answers to the most common questions and issues when working with XC_VM. -
- ---- - -## ⚙️ Stream Issues - -
- Welcome to the official XC_VM documentation!
- Here you’ll find everything you need to work with the project — from API guides to build and update instructions.
-
- Easily migrate from compatible IPTV systems using the built-in XC_VM migration tool. -
- - - ---- - -## 📚 Navigation - -* [⚙️ Before You Start](#before-you-start) -* [🚀 Migration Steps](#migration-steps) -* [🔑 Restoring Access After Migration](#restoring-access-after-migration) -* [🧩 Post-Migration](#post-migration) -* [🖥️ Load Balancer Preparation](#load-balancer-preparation) - ---- - -## ⚙️ Before You Start - -> 💡 **Recommendation:** -> It’s best to perform migration on a **fresh XC_VM installation**. - -If you decide to use an **existing installation**, note the following: - -* XC_VM **will delete all tables** in your main database that match the data found in your migration database. -* Always **create backups** before performing migration. - ---- - -## 🚀 Migration Steps - -### 1. Upload Backup - -Upload your existing database backup to the XC_VM server via **SFTP**. -In this example, it is located at: - -``` -/tmp/backup.sql -``` - -### 2. Restore Backup to Migration Database - -Use the tools script to clear the existing migration database and restore the backup: - -```bash -/home/xc_vm/tools migration "/tmp/backup.sql" -``` - -### 3. Start Migration - -If the restoration completed without errors, you can start the migration using one of two methods: - -#### 🧩 Option 1 — Command Line (Recommended) - -Run the migration manually: - -```bash -/home/xc_vm/bin/php/bin/php /home/xc_vm/includes/cli/migrate.php -``` - -#### 🌐 Option 2 — Web Installer - -If you prefer not to use the command line, you can return to the **web installer** via the link provided during panel setup. -Select the **“Migration”** option and follow the on-screen instructions to complete the process interactively. - -You will see real-time progress updates while XC_VM migrates your data. -Once complete, you will be able to log in to your system. - ---- - -## 🔑 Restoring Access After Migration - -If you cannot log in (e.g., due to missing username/password or invalid access code), you can use **rescue tools**: - -### Create a Rescue Access Code - -```bash -/home/xc_vm/tools access -``` - -### Create an Administrator to Restore Access - -```bash -/home/xc_vm/tools user -``` - -> ⚠️ After logging in, immediately **change the access code and administrator credentials**. - ---- - -## 🧩 Post-Migration - -* Load balancers will initially appear **disabled**. -* All streams will **automatically stop** for safety. - -### Next Steps - -1. Reinstall load balancers and **manually start streams** after confirming migration. -2. Review and update **XC_VM default settings**. -3. Check main server data — domains, SSL configuration, etc. -4. Ensure everything matches your environment and settings. - ---- - -## 🖥️ Load Balancer Preparation - -You will need to reinstall the OS on the load balancers. - ---- - - diff --git a/docs/en/update.md b/docs/en/update.md deleted file mode 100644 index 21c30f32d..000000000 --- a/docs/en/update.md +++ /dev/null @@ -1,90 +0,0 @@ -- This document describes the process of updating XC_VM via the web control panel. Follow these steps to safely update the system and avoid errors. -
- - - ---- - -## 📚 Navigation - -* [⚙️ Before You Start](#before-you-start) -* [🪜 Step-by-Step Instructions](#step-by-step-instructions) -* [🧠 Notes and Recommendations](#notes-and-recommendations) - ---- - -## ⚙️ Before You Start - -Make sure all necessary resources are ready before updating. This helps prevent issues and data loss. - -* 🔑 **Administrator access** to the control panel. -* 🌐 **Stable internet connection**. -* 💾 **Server data backup** *(strongly recommended before starting)*. - -> ⚠️ **Important:** Do not interrupt the update process to avoid system corruption. - ---- - -## 🪜 Step-by-Step Instructions - -Follow these steps to update via the panel. Each step is illustrated with a screenshot for convenience. - -### 1️⃣ Go to the **“Servers”** Section - -* Log in to the control panel. -* Select **Servers** from the main menu. - -  - -### 2️⃣ Select **“Manage Servers”** - -* In the **Servers** section, click **Manage Servers** to open the list of available servers. - -  - -### 3️⃣ Open the **“Actions”** Menu - -* Locate the server you want to update. -* Click the **Actions** button — usually a dropdown menu or an icon next to the server. - -  - -### 4️⃣ Go to **“Server Tools”** - -* In the **Actions** menu, select **Server Tools** to open server management utilities. - -  - -### 5️⃣ Run **“Update Server”** - -* In **Server Tools**, click **Update Server**. -* Confirm the action if prompted (password may be required). -* Wait for the update to complete — **do not interrupt the process** to avoid errors. - -  - ---- - -## 🧠 Notes and Recommendations - -> 🕒 **Update Duration** -> Depends on server size and internet speed. Usually takes from a few minutes up to an hour. - -> ✅ **Post-Update Check** -> After completion, verify server status, restart services, and ensure everything is working correctly. - -> ⚠️ **Update Errors** -> If errors occur, check server logs (e.g., in `/home/xc_vm/logs/`). If the problem persists, create an issue in the [repository](https://github.com/Vateron-Media/XC_VM/issues). - ---- - - - ---- \ No newline at end of file diff --git a/docs/en/updates_checklist.md b/docs/en/updates_checklist.md deleted file mode 100644 index 1fa1c06f1..000000000 --- a/docs/en/updates_checklist.md +++ /dev/null @@ -1,142 +0,0 @@ -- This document describes the process of creating an XC_VM release — a step-by-step guide for developers on updating the version, building archives, and publishing on GitHub. -
- - - ---- - -## 📚 Navigation - -* [🔢 1. Update Version](#1-update-version) -* [🧹 2. Deleted Files](#2-deleted-files) -* [⚙️ 3. Build Archives](#3-build-archives) -* [📝 4. Changelog](#4-changelog) -* [🚀 5. GitHub Release](#5-github-release) - ---- - -## 🔢 1. Update Version - -* Set the **new `XC_VM_VERSION` value** in the following files: - -**Files to edit:** - -``` -src/www/constants.php -src/www/stream/init.php -``` - -**Auto-update command:** - -```bash -find -type f -name "*.php" -exec sed -i \ -"s/define('XC_VM_VERSION', '[0-9]\+\.[0-9]\+\.[0-9]\+');/define('XC_VM_VERSION', 'X.Y.Z');/g" {} \; -``` - -**Commit the changes with a message:** - -```bash -git add . -git commit -m "Bump version to X.Y.Z" -git push -``` - -> 💡 **Tip:** Replace `X.Y.Z` with the actual version, e.g., `1.2.3`. - ---- - -## 🧹 2. Deleted Files - -* Generate a list of deleted files: - -```bash -make delete_files_list -``` - -* Open the file `dist/deleted_files.txt`. -* Copy the contents to `src/includes/cli/update.php` **after the comment** `// Update checkpoint` - -> ⚠️ **Important:** Ensure paths are correct to avoid deleting critical files. - ---- - -## ⚙️ 3. Build Archives - -* Run the following commands sequentially: - -```bash -make new -make lb -make main -make main_update -make lb_update -``` - -* Make sure the following files are created in `dist/`: - - * `loadbalancer.tar.gz` — LB installation archive - * `loadbalancer_update.tar.gz` — LB update archive - * `XC_VM.zip` — MAIN installation archive - * `update.tar.gz` — MAIN update archive - * `hashes.md5` — file with checksums - -> 🧰 **Check:** After building, verify archive integrity with `md5sum -c hashes.md5`. - ---- - -## 📝 4. Changelog - -Generate the changelog from git first: - -```bash -git log --pretty=format:"- %s (%h)" X.Y.Z..main > dist/changes.md -``` - -* **Then add current release changes** using this JSON: - -[https://github.com/Vateron-Media/XC_VM_Update/blob/main/changelog.json](https://github.com/Vateron-Media/XC_VM_Update/blob/main/changelog.json) - -* Add current release changes in JSON format: - -```json -[ - { - "version": "X.Y.Z", - "changes": [ - "Description of change 1", - "Description of change 2" - ] - } -] -``` - -> 💬 **Recommendation:** Keep descriptions concise and informative, focusing on key improvements and fixes. - ---- - -## 🚀 5. GitHub Release - -* Create a new release on [GitHub Releases](https://github.com/Vateron-Media/XC_VM/releases). - -* Attach the following files: - - * `dist/loadbalancer.tar.gz` - * `dist/XC_VM.zip` - * `dist/update.tar.gz` - * `dist/loadbalancer_update.tar.gz` - * `dist/hashes.md5` - -* Include the changelog in the release description. - -> ✅ **Completion:** After publishing, verify that all files are downloadable and checksums match. - ---- - - diff --git a/docs/img/update1.png b/docs/img/update1.png deleted file mode 100644 index 64693ca7decf8f9a4b5323e63c8030821d3bc9c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26074 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV7SM@#=yXElp$pf0|NtRfk$L90|Va?5N4dJ z%_q&kpuphi;uum9_vUV8O>pR~10Uljsb%iEIQ6PiWYmHj*OckLE4eK?HgWZI?X&39 zcx0h*N~y_!`5cFqR*%&Kro{@~TzLustT$P@*2FeAY36F?UQ*4SJn7kA<=l)*msm8G zp8ovxa{m___3z7eet$CW`Mu(Ip)Bm|(SlAKiY)?89a#%X^aP;n*{(tYAVCgAm#q_7 zT)+xA0&`Uup^8JKJsnygim$p2dZql&nG{Ghy|{2pv$L zW@Ga4pooYU1uuV1kFR^U@AtdM@9Y0tXJ21;G;6C-(G!nZX1S-XtPIxP^NDfW$K}Dx zd=k&kvwd@GEBD?w|M_;c7hZqOQ|<4+_JZ~j@Ev^dwh;%F{o`SDJi)n_x7}Z ze}4-L3n%YS`gp;a|Khq>>$*Q5-Ru7UEmu-j=H%quD8FERdGz;}m)kjo)j+AT?)O`B zDU%F`-DPigRD4`i96J5gr)}rXoY}L?^F_k!<)1&D*8hBnTmQrB_4^lvt$ul7A+v4O z7x3^$IZOSom+GJ~i6foDKOeTsXWZLk`S@7x;~yU%UoUwklM{YsSJ_*yq9P;Rs4Wk6 zzu&j}UF~8ex5X1dqr%JmmF+0*Os z^-t$jzgubWlR;+NR_i~1|GwSs{q^hDrRnGAfr`?3M^sc)1jNOU7oWF1{{P>1`*U-x zk55o^?_&+F|LCl%!OCw^UqQFXq9erQV=!r(3U-<(}!ex3?KqeaZOq=g*COwbp-s zeO>H7-|m~mjc10vlE!U;i`_QX{w`BeR(`8~!E5K{eo-;8B(vF)1_=yxb#*40ms)&h zn;8~9a^YcPzP&B?@spF2d8AA@wno+Z&X>G$u6A|E>1n!^Pp5{T;w@iu>dE3O_x4sx zn&n7zc6P?>3i-Eg+N1`C0GCrABPQuAe)-$MB<`PE693Wo`;!lc-fQ8lo0IL~&(HqpEK&E| zL2kaST)nA;P}zpE!};4dpTFBAGEro6*WWJ*SF}HWG)tRMP@()j_r{5TlYXkWrf>i7 zZ+~~ihl7ngb2oJyKdJEW2%p`bFWF@(;*72`x3|pFRqQwZdG`MTy;BNhuifk-lM}8u zPp;gT!O49sW+~%y^$kCpw;S47w7g(nW_W*pM^Cf;#&5q3+N{o17e%{T7x{+CPQDPn zHp;cG&d#>_+miJ2^B6=#L KS8tjlzE?%bJkYs<;hPk~vl zudU^gvzfswZDuj$_17vfornV)5)aR?sWftQbd<3yYEku`7IN$5j)I3wpP!$9zVG+D z (=Bn=2-1|Ffer~Ew`uDX+?p29t)!uoPpPw1l{i%4j?{{8J zZLO!jfBN5FUqN=p TBw~t?28~yh5&Uv|elaKT1h;i5c{+9aT z!NC_LR(^9V4&K_DJ$Lo4rQ33|!+q2)m)>vt{^aCj(3oc7<70-Yr$i1+Q~2}YFhAe? z{G1$}ZgKsz4-XEWnQJZHeDFXcGy9KMtJl9Nz4P_+d3)osHxY3a4_QHm_Q_hGICEyt zy4uA``~UsYj@@0B`svBZm^~F2A70z@ZdLAYkE$xG`!%0=mEC#@_!zg{PM*FuH7nB6 z(h@Ygaqj5USC^J{*D@95<>{R~c~U2G(~(4p_tE)#k9G(uOIQ}E{QLKBj#X*b(QfhE z`Iosr%>VzV9W*xd^78WJtx=u5y{WISt>t@PdUsdp3?H?s@9)k|P;|B^e#WypZ0)0y z>hrf;@9ge=ytv;k>CTQq9(lVtZ{FmDt%*q7|JHcN_rJ+oqd*yd$M1K$U*6wuZ(aWG zNY>U{@#Z-<4CYlnljLDz&c41**WCP|?AF}-Ot*Xamif*O)B9;r@W5fJx_pB5OVg?^ z8Q >>ryN=eOv>NIY;R8pHQ}uN z_~>Y8QDp2D8)dhigclbU=H35#dgjTLq|eXJZvEsFQyUyPsq(=A#;~ Vx zbcCagUq0@oOwXpE;NZwjDV?{=r>xezwLSm*nVH6K&oc^|`*(}!&M?guvzmKu;hzJI z%zOTRyM4W;X@S-W(FsAVnlkn>{(&j%J;%RKE{Hw6zGa7@xfN&Z6}{Kj*6z;wWRQEy zWYMCW&1;g9lPf=;HJ_W+aZ68Ew|A;`_^o_yEtVVm#QS6{4_)@Rk9{e;Vr`hVb=jK- zpvFVRgEa!@K%;1GZfyJiev?i<-p87k`-yQuvPBPX=kI@dJAeP)RQCG7 z%}0+P|9nb&y+O^70#J|ea2qctAK$VC3mSTQc=Y1-oS0`@Ei=zU&n4B%KaWYqs-&a* zUgh&?b^lKY=qR?VP`p?9d@fi1)abCZv}Lt(_OGx#)+-GvU_m46^J~A&JbbymRp3z? z7dLnEuP-lu{Q9-2{(s#xz1UaZ{v1S}I4;a@n+%yFb_!vn$9%EN)>+f$`~O<%of5O_ z$i+1}N{syc{8PMsS_wIED86ELEhyM3rZeOyNXxQqj|CB+K<+~h(1QcDi zTCKP){OXu!Uqo+P=)HS6SF%oSjndT9o8|(VGGD V1K&1z3A-$ION)pEgF# zOfcD`XDmF|D|P+`J Z$Wft@eHTw#{CC$&MX27On%Onk?~F!~Fq%iq{h7uZ=ss zO8>f*`0ms{GXnoq-qCoTq?p%nG|AC;f&8sz_P43`ZH;GIo8>Qicyo!is3=$6JhR?E z*1s2i{o=AP;KAd!&D;CU|NUdEcv ;7zEo|q`D@aey1pf1?U(BJwk4S_GfbqIn3z8De>i@AJ)@Psze&_u z6?rEPMHgKaP7m9HwVo$_7%rY+P`0Faqd=(B!hnR#w=)`kq{l2#u$W<6UoDtD^I@da z;)&MJ&O4_XExcU$==JON_3QPm^!07leJtAtT6(cUQiXA)`W;`Vlp9l5@Ey&)W%1`- z`9~$MrIXg2i?#Uq jB8dIC@_ScbY|1{{b8Kh%r %a$7sA-r#IIsVe6rZ$;V|+ss0qWy7I>L>30?=OyT^vWPAUU?;nLfWL!94cF;zl zp{bGi a>Vz8-HBC*9t%%)&&3f2-8epw9O8_A|_UfdfJGsMbL%+R?m{im8 zDl8 P8PAx-4|GY<9n%d8wZXsTx z2Ne(g`0-;=h?e0@pO}B&qz}!X&y@PCCZ(-ic>5pcrdei3*E=%r*}FH@X%{%;JeZVP zcBpc3b8Bj7DBRCj@}fwPtCeZ)Ic|M@S*c#J%{N{0^5kZ@a&yM+JM(aB`n#ReyFcGk zu&|JbkC!j8(ht#^>MRR(nNQKJ0FFZM3=^p-UaC=R*}9K5IW0VJ*txg8y}dTiy>R2y zH_w+(Dt)8TXkC6Q{`RNk@+Whz^Bqp^fBf)aqt{BO*DpIaozbmn1-Z)jq^N+ROK-~7 zD8rdPA|fIas_kYzQ omXI$dAbv|R5d=f@{cpCuX1)X>t>+ROrWxeKVs z%hI_mpsNc?*nzQ@#_4^|ceJ%9cg!?CdG3sgzCQotl@m@+*SEd`idC1hN}L@6i`;@& z=6tr^vv+U85f43^Uo)I-p4>2O64O<&wx0dx50lR_r>^d9*;nAw?b!rS>GpVKh}M=U z|C*Yb6Sb9AzpURCbZr0mEZgQ w4I%^ zH%@ISw_=Nc=@b Jpw7iwaf!p2&5 FpIqrpGV%^DVomXj5tsIH?^5CAAe(-%P&5% zA{<)wZ;gENG z8{fxo^J}}lE|))X_Uyt10gzzYJ_!^|R*q}K9>09q>0iJhK5bw7&GYBwf+N 2HvvL{r12Uz{WH%m&+cWhJ9trA}Cl-QsB=~KrX%jPwoHJ?0ta$-q|VvE2d zG0^I>z;p{Aul>*C&iT)LCBSb{+;+kIS>lD)hElzd;NQUt4t~vWwWZa8AFl5&dim}k z-^XW$)*s?_GBqDmn0%>Kz^NnJA@Pj<6vqpTu1#L}=g`cPDWF-%Iajz_`lK4q&ourv zBXnufd3&)(rSJE$u&_LO`m}ZVa`i4F=WQ)3{5HMjRGf45>Av0=#+^rl>SvsuaPaVp z?_ZuD5w~zZZLFU6WW96S#rOWkk@e@^$gC?1d(Hc2N$$g?_PmSl@74d1IcI0hAE~;Q zf@K#oE@W-3Fwb%MWc|MA=Iz^Z!4Wzou^-rW78XkMR?hHI>+0${wI{0M)zd$7%U0L5 z2t2)gbnUN|r`Oq-?T9ld`mlGU&3?tZ8zY`NPoB26Bja}8z2?Q8@2+t4Cihw`e)jG{ z=*MHLk|Y dg z&s@IJx iyvkC5$awGkslV2ON@GebVPo^Nh3E zKb~_>uJ{xmZSnfp)s9)GESuNO%ehr0YkzLe 4IwT8X!+`e7B%l>cY=l|v> z73D`Vee> z^>%QrBlEnpliYhbgQki^^c=~LJGSS0lE<%yv1z|d9{u&4`%$;|dO+yy535QNovv^! z_4EK0t^5D>t`R=Yd1vcsx%{t(`JZgdcK^1xe{s;tH(#fo`c+-$cE$br@4xkbr(0@S z)tw9#4!l@bn7pc{aS_**+bm0DrkV>Lp7)q{>cste|K={q58IG>gN6up+{Is86T3-8W5CHs8Bk|pa_XUyLHd{?|i z7Q@vZN#o}h;@4tbm%RJmDDNlrG3# s(Wo#V9=NzgzS9HLFwg9mj0@=<|2x2p#?-9{>3A-E>dY zmTSGG5j^4+)mDvvqsxoTUhuu^$!Op@;ob9a_I rE&yXq&Od;N81Q z>0OidpPjR1YNh_Zlee6odzy+ozHcF+A8hsf{G6vB*5$s@&pRJGS9)O}lbCY5-Q1&_ z-ybV5GG*^BXZUwYCg}X!=P%~z=Gb0sxVQJv$MD eRSM`^pa z@i+@jy7l&!a9?&^;|kU%Tph;q1FW`vOsw^io9X%TNmP_zif8)yYj;&5YhKu +uFD&vp5`Haw2Yj;5aHZ*4drt6Y zy>8ES$?*P9al3!N0}kz7_~O$08jEbbc$Il6f6LV+ZvEmrzFOpkWtQZrMgMJG*C*tJ z>u%FazqLQf VVLE{Gk5c>_y4}jZEm|YiJ#&Av|5Q<$_x#6 zyensTo${V(>{nnCm> NnqdhDoNuL)E`kr3LDXes5<} z_ ldNZ6vj5OD pnq-c8X0ch>p@9;I!TeJ@k5_1s4D=P#@MkKAJJKd;Zd9eG8zC~Lip zaV6`v=ZqO8c6`OAHOzZY+I(j>Jnmm)@=xSr`nkzfZt+68Z>MB)yp}!N(5v3*dHd`m z@v_Yk*E>4=-tO32Yi;%Ih4cFk1}`^*SivG`U8xN3x{XXyHPS2(xSz~AJ7Z4%nZ-MM z`*i=#J;ju9QHSA#vaxUfMW&SHlS3I;?zy=rFJCP-tIcIgCd= j?lPhVhPIH{qT{msV@z0#Ifw#nX1mfy&GIB3;{jIBnRu^rK; zb{4<-HL1N=J!0LY5Z&kJuWtoq!ow %)g7fdo-E;}5zdb+|SLn~t1+@ovDm0h+5 ztiCEDE*^a6!2B($-WPgh8lNBS{#LR4X#U3KsoFNbzHL0q9H?<23+w}_#fy@?p1$3j z(;hkN)7PEbmOP%N)m`Q0_tMg!xa_&xwj~U!0;*i6-dTHU&beu+?>E_9^a*%>anHwx z|9^bF?H{rE4X@h$Oz9@phO5^s)~4BVYD(?u{lWeD-oFXF()%7x?|pChcb{9s%;wwm z$|ozDr%RuGZke_JSI{Dd^A{~{JBu|-u|HVMl-uma@~UCY=OfFdWna&}+^N6zzRrPZ z4k>RRE =yz(x2 zo;%gM;fU@6@ItH?HntzL1dr`heIKx9Uy;{=!#QeM=W=*FJ)b;#c4G3S))k^&{i{>! zwaRi2x4bg{-WF @3eeczU_^+CzFn<{j-v7|6Z%koAXD=*#7?6oo^{-HM8m){z*QvM#C zo?SM%a_J_4tE) *x{|9MvBER`&5wgFC7G@lw%vX6?}_}I ze=H`w&Y7z&O`bA|okig9a>gwert0h#5;c2y$!Y$zJ9#$`dDs8z-7u{&L#I+@?#9v& zvw3Qp4Ci`HQukG6^Ph9#-H!6ko8ROA<= dhSriZ$nD*pum!)KbmTZ(->qOHuD ze-x|#%(xgmCwH~t*E61da{k+WgVg))&eu;(yr%Il-zB{!H+!en{SyyuEOX2^@AFLm z+>~zlV}C$RXqwS^)ya}KW^v39K63rh@^js{d{>6tk`J0;T*tK1z5hbW->T|8Cl4|| z+4Gt2*Z#d7rw%iN+R-mnKRdRp*m_DXQucV_)$fW?;r?b`JJ%?*+ s%` z{r!ZXeg+K>H8nHY3m0lml-Nc65tr-BVrj6{oyq--A+KNV?3Z#e 9zKKtwaBLxc9Qx?|8pP8Qjzm@Uq!8xDU*(c9! zD~|2eYGAC7JaI_9N_d&! !eDt~{gYf}9@e^Geyb8(Kqy i++$|ML`A%~DZF4XHc1^^?A;qRZQ5AzBwR zay&b-4ltbi`_{F6$Nit5x6Ju%#rAv27bhLD%8p)v((70Ie}=!;zG8D}yP)Yr6@`#% z298q81irR=Ej@HOxPAI`aaMnugGYb2TO67F_nY*-)6*v|y`F4xYu*$+&kljoyH~AW zPW>*QxAxTi=%e-h0#}#DsVju%&k6s(Nzmy^uAH1)MOD?K*Vh}?uyUW^ 6FmKEo(WNm$W zF5;l#oceOjw0Qe!pTw;~U;BSPk+t>$cg#6A-@Kdtm_zYZTi0*y@b`bh`@62keykRK z6t=3I)8lA7-zAGyf$%AIns+Y;cc 6(&iU6}Q H8loS@0@!PahX|>k7kHu1rB6r#t-A=T>adSp8;6$>S#{W28(@ zDBer@ZMMfQwli+My8V6!wWZvF@29?xp7Opvg!kp`j$3QasVjh7ZNBJ>=gWO{yeA@d za3pt&@qO(3|C4`ua@mC0v$Ly%c7euSLMF6?JiYGpGu89H+ZDZ1GscxWHcr ymjH)}@cW>@k;l1nP&UomJ7+?Y(nHhKrjU z)Vy5e^3%@aXI)qJ)A-=JolaN8O0^g#8Z$d}%wAd&v}^lz@l%QXlRkmQf14ja%GmQ^ zeu^}BP-zj<)5#M))lU1QwJv;}Lr2uob1Dj==I4r9oj3~bzVYnn=dY~)ZymX}+WJUz z?SI=_`ui2Et#?0BY*p)mjLf~-{Hb>Gr@zy+PaQwCKd$4}ifif$MQIKkfpcwaY%XM& zRQ&!`_;Kw~5tH0k0`IqciRCJPt0mc`3K~)o)tuilaMPis=ub2{O4}6UjiOCI;DL-eP`99z;yu~QERWMDTtZ} zD7NhQImJs=YOR>RzwWHOyB5aT+nn#bzND&@c2-4QyL-=_n987C0*i#gf9XFJ7I=BP zW7o=SstQk~)jgO+okGl)21R~aQlh_R@$rI(6ASr1wz>BS{8(R~cw(Ecm-$StRJ#s= zL!ED5wOx&hIVhk5(!M%ORpIIFMKRMvobFgH<=6c3?W1D(GasJV-Bw2qo3A;Z{MV|e zs3>RhC1223Q{bs<^*b+Z*VOw7BJaN!T$H!Ml+)v Ovt-Vg!#O|(ntR1fKO8F+Q z3vXadOwY|6CH?ar56{JO&i^5C%1HQpv9$Ta5AO29S5}GgO8r=T`Q?QSlhkPnE|Of& znF6 XljFD{yY^*;UVqUg~Lg zta_ODDbQ=ugy>U8%ZdcoF`3u%Zujc-bC8kFxO o$03&>AQb7JA2-YKXNvq^pECUw(u^Q|JvV~e)kJ}on9NXYde4B z`n`UBDNCI9{1uO1@Z+C#QBjeG&J^{f-Lnq-wBEBQ|BuoAKViq`bH! A$x5(uB z15+1V^}22@KC%9X!OopKKP@Q tIkF_-hUQlsrTU6^ze3z zx7nAruawOSVG7#kI8|HV-KrIaO1yy`vwar^EV!C=@ukhjoU5~p^Z#+L_DbysRYWG$ zYQH`|KY8}-!5p*G&RnjtMNelad2%|0s>m;u5f3Rnz1H>A8~aP!SKiI?VG7!(I8|F9 z{P7}3FK3ZORhm=1Or&(J=JNG7GFzH|Wo@r$ev%S(u3EM^&VS# }iC#CKWlo+>F1A76PK1gJPntckW=c`ahqKZC zrrI~(UE01 -0C6VI> >Z95gGdAb%_nx?Zz3nm$J+-WVH9g1sCr_X5zVM`(W-Lcw)sxk^oSkob zL;al|?3nZ_@;R@@=C@1omGd&0luo)!ikf&GZ_{j9(JR8mn$>&EOmlCnwV(bE^=n4v zpRPZ9cB$?e&zF_rCr+O}nqqWvNr~bq&H9uzmF@1gXRo~Ha-cBv>h3&qkNa*hM|Hg& zRDNm%-m=(e>XSLe>58q^RIatxK iY~Jeh*tPwv0e7P+pFOYxOfw9ulXr*BI? zE Nbz7k0lz_Qv@;IyTxY3E )UU+Y-?+%Y6Er9TuNH6=~||ECE%9LM;O8rpo26e!j}%?5o=r`)1Dm zbq^E+4qMd}`d%IEi&|EA?@PXeqRZNXr;4rfGOWv=ow-xVS2#D$fA>ve!<3X8lLcl@ z(L3^W*UV0jsd{U;?mqdhS}PsMx=NREWw`TtuUm^v{1jbWPx*PJ|0oDjvwJAOZ&%pl z#{J*3tZW;oLFg5sxlJtI( vra63wd3&7=Ztxw zg|kn;jaihVyZUO=(i<$(9DVXOP1jp_{LRL&+2)@gyV`%-)^*JJX>-s**M$L#HHx|8 z6 iC)1{@ zT-SeHEnKJ2zT=LLpY&$S@CnXdj(RhnIc@6VG7yc{D0-|WdA4NRbGe;1W+9Ju#bxf@ zR=O+xGuQXH Xf}U2(Hl?^r!mqvvPq)ayGOOHF@z*v y5^|b7FO|@Uk~d@Ng2PrsI-)QGn ;Q6XOZ52UJv zoI1QRZ9}(YU2X___-{+*YyZy%_RqCaBUXRe{rFkYpLGROTV&4eJW^My#m@6m#$-wI zmOD3Owy4ds(-7sle!R^q=DPOUJemGe1^b_gzT123RhX;!svTdy?^u`kxaxoDUbFDR zaP6HdIX!-sPS;)$dM1tg`2Q16ZphD+v7hAmkXKDMRZ~PjV9Dwi&c(NR_gu-nzK`#^ zwc&$r>mL65rM>>ex1yLU#e!@FcMVGg*|x9R@n^ACZ&d7&gS}jNIl1MB-d!nd?>^6b zXVoLK>9=>b6zi_O+I2PR$kWrUCi_a7Zrbl}Tz1CM{_yGfGt2#tzq!jZ^%D0|r{ C+STn{zd1?MEK$>}@c7HM zHk-dMz7)kElP7WR5o5jc!cWdiuPhA83eX7QD{T=7)!$Ssu)RFr<@!5b&D_0tW?!YA zd0h)MWBh6Nm*@WS`D)LCK21HOb t8nlI$u{Uz1sUYQ1adNJ%{#QkGQ+)g`4R1 ze{$DNb7I~fUU&VO*1IfKb6v)j+9!|C48Hm1ziw~s{-wKq>EuTwOz4yTxhC)1@8;K$ z;3WI|d>P3}mM20de0}n4{-k3;F$ZQe|9`sg$9&mG@$NiHvC|7HDt;^q$_munYBB$& zh*OB|R4>Qv^Lk(2TW+Wu9d2f_dfDzzwS^kibJqt8-<(p`bvo>Nv1Oi1@ZA35i>5n& zZBJ8OgCl+ZDtKCzyYA7tutl>Blb^{vKO`L*KB<4Mb -$2GNGXsVZ$ zh|?9(qer)`mI+(^`Fm0&SF2FKf&dMRdmCgQiuVgmnxERg{j`tLN%ILI`_nW; Et3uQs`CcDZEh<( f zcV_R*Wx=<6CQqwgzNPZcGGBE`FEz#fX%_q$Sx!Bj&4moJ+c$o^Jt@`G{dwvC2|c+t zZ+!B;G_h{})(GzRwJNf<=PZAhfBX0Lu47Kz2G*xV7AFc-axaA@3Ugm#PWsNUWWV{D z*S~L9e!luGQ=0d)XW*ifFE&r@sh#^X+ehA&ne)GoQ2pPP<~~0vm)*>pmDTX_eUE=I zFK4dN+u5@=U7NK`PUwb0W4`soS1#K;kC@D7SJ~ouXwgoY $d+^hC?VgSHI}frSsV{TtC`peL+m*NIwOU)^S;HR;0R %FYs|EjLs zvbJ&hZvW%qoD+?>Cow0v%f4ldt9oa0)^~C7hviMFjoRgLkDU~c$jn$)y0JX@ovln~ zVA4*7h=OG)s;&p~!g%NGjo7bq!THFg487RiM<*NuWi%%7E4c)HEouMoQz<5HV@K1W zJ3n4+DX3X7fBw9@2fh0~e+>0ZO`7<8%FDw?S5#)dytVWD;{E1l g6;4lFp{Hdsr08-u vBTY;TXtnLKKSnXsJlg= zIAPYshGdl&9#=Q4x+yVxO5LhG)0VIM^<~E|(SLgHEdO}>7z@aDrFsSJ5?ERA;VYlt z_GNaOdoNx;d|6ia<5A7)%iA7xyNJy$W=MK|uiu$n|3a;zMEsnhU3$IjiqDdA4lK-k zX}TuMOhm>)Mo&a_`u*_x#~MXvAHSNPoB!n5WBmoMH_qJX^O93g>E TW`O0n`JS+HD(Dlr3CG$G; z#gyKj(PY?|{oY+A>BG5&@21>aI-_sh@{i{@CuU7+UD(eivnwy{C{F;NJ0IWC)^}P@ z9 DNqr`%IBD(20`pzd{>)Yoy!>FPN&IW)D#s%o zmaGb8rEfCi- ?feB9 wNc!qwL&{_6Et4|qmb*AU9)Fj3H zoz+;jui}R%k8y{p=S!z0M>dvEzJG3o_vZ)92PWJx5j1|yaAe)NxpH17I~_R;O)qyn zE9_yBxtJLGF`84t*Q;D(=bjA@C(EqckrngzY&ze^i^BSgUmm_#BM^MPOEJr7$+;ho zU++B@cW$2Fy`Bi)e{ylJZN=ktTyC9O$8e-c_&7U9`x`?&E15|Pg_SnH+|{{CYQ?HX zv6I&lLpLwh;1fC8s(k$L`Sm}wt+@20!~ah`_CLk-{BDUf4Koq%NtaqZ#6nFiDs3W- z10%2S$0%gnSez?-Ve1d2iLGg(4L2%(TwN)A(n|46tVK@$ DZSG1o`j=DH=qmL(pXcD7Oom{rHX~oJ_ zmEZf;Ywy#@<$XQru~wR7!;ML-cVivTEjg&<*g0wU!9(wS4l4;61|DY1if9WxYwj9Y zpmA|wgzeGQH@E)Oe*DV&P~E viLF z53|7SPFDGZi&tmXt)AzvE-+!^B&EHXvm7nf2=l#Ou}aalTyw#L0}EZ!kNvuPY`5jE zlD|8C<*MIL`TTNMw_}IOQtpW|;#Td8|Ihq>SXZisVUE|~(DTcU1vrn3cj_1~W;il! zul#`%`@WU5K00+dUPbA!s!Nq2k8o%&o6N%vdX+MnhaMIz($EuG-X43su6ds8(#Nm% ze|T5yVq(8+X;NgBj%F-}VfE$tzpHjPH;CRX`gJz_sm}>J=hN;jxswd^#m@CG3EbX! z PEi^CzVs1bgo2f5afG(F){ShZXf51OG?_6rx)B4lDqfISIO`C(OWW? z4{UMDsAAw|mTXf!a!C4xw4{_Mx6`wu8SmL0(k%>rwfmmApRV{OYZ_w*Z=IERbN|KK zue>*kdzRcu6gw#v$a_d}Zh?n8ue4CXjUz{wl(ct$Ui$jS_SNMN%Jq{J);H9z-Yb0C zXrm7AX`_Quv5v7EhQXb4Mc5zTmhH67;d z{mk8J3)tIDxwwiScel=v4=b_d^PSx7nAX9jI4$YomOoPa0yhf!eou_D;+wPat8-fA zd(S0P4lfLdnIs->qdYCs@IwCKiwtI_`|c(tE?f|Cz~<=xWvPZKmosx~1*ZmWSKk+r z(%Hf+5WVxpZ^Jl^jPo^InG#) -!-9vxY@<3OTd?w5!czYO@?`TW|& z3j}gmIjv`Ae_&i-Au`9$wd&gBlt+h-7kApJeXDDz75^5T8oOxCv;c;r?N2_xkn_9a zKl7_=iuUC$zSWZ?S8ZxP{P2iTtcC1FX$dY%jjpE4FWnp+XTIf#Nv!T#WN_0oNF^(8 z{#;j`fAbS%j3R}PEj;tVv&BQ0lT~4x(MiTxoJxX|@5E#pbR3BY+w$D!`qJ+@)vl8- zbv|vikiEG3`NgZ3=Qb4odFIri(#d -)mA#RpL%#>Z zq@~OLUd#Quc>Cpj=O!qYZ*rBnydfa;Zrt$|0!|!y- S=1xpu|P3pf=w&A#k< z)qVAjr?Y~lg^LA+B|Lh~Rq!x{pFPgT_wUS YO$G`1&EAG=+`tSSwy`u3d&t|4ZxhNUg zt`l(bIUc%mO7ym8%nRn)96dKzJwvuDbYD@|{rp=8w(r~6^l4Ahy8We`Uw2!*h}|HO z(s)~9GSA^n*}MPDo&C>fpT^Q{vVU@GCeBD-mMUmgqGTKqbLk(q_l++MqBoU=3?=w7 zc-T#v9AlgK6 DyS5@VwvNO3(s>;#56H_%-W># zMPOyRgqmRJvg4vo9hHwu0z)2k{j1mTNKe=_FPXXCy+h$=MPYE*qeHD$h5;K}H(qQ{ zz5Os;srbb-Pmk*tm!Eh%quZNJ;oHxTx6|BR+ctEZ^H6hM*&>kCxFe<_=_C8BJ~7E~ z>13ght=)|6+W8CH5>%JZO+084{E2Jh1f8}o9+$-0_oOf+v7fY5 zWrLye!H-Wk^V0Y)zHnY=tQ6_g=61tih7Nb;LREnVmHOpEla}pPHELexdj0VP8$Lys zWgFjIIArSUlqg)#pv``L$!Qmh4^^=jZ3KCm4nDcFGuC5e21nN$K|`LVwzi3E&l^~n zCX`J3#c%L*3&&mY5}WDOni4P9i5aIw3dmejc_84lWNqU N53JY~yvf^nS4q zqv?r*^Y aSUR^2;)4|?Vcc6xKPmXzrJYf@_wczJS@&aZ0ck4I;E2EWYVU- jwes7p75moBdD?zl$Av>=?fR6@voap-T)%Vj zG)`NUGU2@zsi7Q;_&2@3B5hN#um9qDv+1j~)<2sc7QXQer}N+U1@(^$&+XPr{yi)E z=ju;McarBR-EQTXyI|eTb(uDq3`zWDzgIk;?D;)f{m0wW2VczZi}B*h{S&GuaCw7- z94Npu7jHP>+m~Ht{PjoesxLP>*DTsv{_#|!XvqCZ{n=-;_7(1*U0Z7VCF{Z3h*P|` zwKU3^9y-QV8%E`oN0#n1Vt$id*SY^aXXB%Xt1cCVJ$xJxFW>ui{by6&x^4TqQjfl_ zNN{a%Kezp}%jaU5{+!1Tr!I|@ZjqRFG(jcj_x)2QYr}T$-+M+R%kprr|JR;-x*v9F zo}3@MSZ#8|w4((MpDbLeqGD#XFFNyYUs~eC*$4k^__NRTn?cB|Z)Tqlb@}G3E_<+c z-IH~%PVMM5nN?RlXV*5K4!dKgn(`(r{HG@Omh<4EQk$BqX?ByuW#gB&o!jvF#cG?o zU-|sw<4!U!J$h%$v*a8-%OicqzFS=RC)a*z{bS`wqgQv1BpED9(z#G2voh&)ShiVw z-Pd=1-)!pIK1cDr&Wk v%EhTCdtin z;;8=kbz}K+$FjfM=3e`^QB-ZOZ~D)#-}yJa{^{5>(?It9(bM5(F~^m*eBE9wr#@Tz z+D1#U8ipOVQ){*@k}+qz_eMS?CHHsJ(bqTQW^oJ3=RWlLaY#KqN$`U5mlcjxR}^Zq zG#)qc&sf5)^0s~TlHdPymn@inUC!RoSw5yL*|a`T_`%2N2Sca0CyG63h!A_R%d^1Z z@VgRD#g-jg5*pf`&&sG+r@2q9xhMZliX%Hm-C>3~B2S(i;ay%dY4&3k@eT<=C4trD zK@%Rc@U$iMpJfpfFyyVd<*{O_tQw1glJCsKd$r#r^yiushOU3~?)LNtmN&gmwCs6g zV>7c*#xFr)8o17IN)b^%EhhS4*=*;#Z@1{i9$z)l(DIl<`>x%RhfeNt{n^vACFt ZAuT;J=*NuRhWFC?4hij%}2R*lZdc= zeP@fK`P5(b+}NOX^~9Zp$;PIx3`P$FJh)%(4Cl^%@j`Q6RawJ?!>3E*qrBgyUcAl1 zdfGc;yW8UUxi=!NGbQd~_c`EFY>}jWbea6=7LOweGM65&25q!^W3aGr^2LkpQ_@xI zcjw8<9`7r@Q{TkiKTl$9@wB4+uW5Owniu|azEl6k;(24!quxKCUwNIn^k?x#o$d(> zg)b<73{^_&Vo>4rwQw+=U-!>uf9;;hdB*Lg^KTtk``UfCtZnG&oB!rMP2SeW$@AgT z;`g8088vQfnYKIsjQ?u=sQwu&&EU$GW8&0aX@)sdba&2*&sq88<+krPE?@VQK3cOR zNB8#nh~v+0-1yY=XKKx}PXf T8wuxoYmjg8mEYVjU2dHnwI z(fD}}Dj2-h#hzZi&R=1I!Qnl-m$%w)nYANK@A >&QGQ&;}x( zDXg^$4kg!Czm?XyDHm_3w0+K7=~IurgZ+$o+e&*oG!L&zOTP6j=hw+e8YizP&6hw3~)H-HEnNCnhL9{(P{F(PLVH zg+}D&meS{J60=l}Gb>z?T@v4GAi^NaVY>aJ{KlAx+51DzZaqEey8p_yQm0ABLEbns zpXUu*pz~Xs!biDv_pEmvJ05b1YxR!uuW5FhZ!kYosJ>U*S^rV|L+2{~k6*h^YeXD4 zuf8Ii$5ZZj(*y>UT+1Cfm$Tm86p5EhZp-}f^R`Xt4ab8?>?P$N jnH+$@}N% zRBmh6Se2v&ZKXWQ+V5|J_C_VOwbi))^m}YAb15-J>t553UcE~%d0Ah4-To=T+5GtR z`=`F^ec!ZZ!HlMVe)IAw8~^T|eY5oG)HSn~U(301LGqgE7oM0O`ghM<4p*CW?!rs? z3kN6qd!933pWmey5K&ZXI)9&LW6VU!OQpe}Rtd*M)hEwx?YaE>M)9VJ&bubB)>{8~ ze%ShynHVpX4kgN(=A2md7_^aWQ_QDHvm-eb1a)23v!>p=G}CwK>L;7lERgu#>Q@yi zI<@AGL*w=-si!3SUJEWebxGoyX&bNZ>Tp?q_ibDbM U6)=m)n`wr|NE9YHYbk zor_hqGX@lI+=|yOFEDugFleW8;f)*jxQ=pit+;l@R$`LNym=}N8&^)S_c_6GV(GVc zym$7v?ekK+6lt+!^7EOu3$-TOaVWmgGT%NU)za_7lYTZ4&ca7!&x0R+2zdB4jwkMp z9>1ub`rdheSm$zj>-6l5<#j#vMC4iEi?V>C$5rp{JesN>)L|knb1mSoRhQ9j?WH yevg}z*8a)LX4#&7hG%|d=%3H++LA?2ycm+4FXe63^uMb0 z@7M9wkGfk0GIee>EAEwW>Ud+K*DzzDr~K^6)<;eDDb4j{P-+oSGJaaQVrQzUdCiI` zt3>7YWOWp;W!@8g{nWl+49b}$!KbvJ^!?vBlix%(?fE=`tMl(4i4~1~^Y5c(RP#sa z^K(}(nIfIHzv qQ>-g-S|6)zD4!6+0RM3{?6{ty`xw1 zVh?`(p10^u^^CivoNS89CcVYHZ)I{m7b{Lwos+&Qg|pl?;Ivpef9ZMorz@Wc+*`FY zXJ@LY^}jmK-*R?`xOI(hJ^mudccEy3Z2kKA3s~fnJs!KIsQ+eB0HvFzuB`B4_qA?! z*B!PgE>Vf%xcIY A{*O()GKguK%uE@gd+v*~6f}SM0AJx@Uik zUBgdreeA)nqHj&E@ISg0bozenMd#PQrBa{f*~E!QRg3Sh|Hi`Z=O+JhRm3UX?duah zPwmz`9cp>Kq;c2t=#}~1+$wYQR^>;Y77J(h|MS{Vsw!!(Y%F8cEVh@s({)3oyEUzD zHuH<0Ucav?*E}R3_Gw$4y>GqE>3!nXFL<0TnqGbrz9u}~d&hk4%5IIXyFOTjMBTSI zXsrM3f;3x9-l}cu(r)*9uUJ*GxRm!o$pe$$aqkv}cVCU)J}dXS?!u~8_OpZuKPdgZ>4Ty__(xYthZdN${AbwTBdowdy6cLTgC z4S(FKviR_)^GNl!9Hq@_k3^HEfJ4%#`?7CouI4)9T$vjCb*m3u$f#XCciQV~LD6rQ zy;Pa-JniQtf!+0Y9Gv%ezq*}$v+#S>A923VUeABDA1@Xa*<^F)i1Pm%e#=+Sh<>;B z>AJUUd+jq89^Klq``zk=%l_+B%V#btz2STI?A4lgjZR% mOAR~U)UzQeRpQnI|=K4mV&jb5^krPfBL%A z_s@$?Ij;N_iN|B*qUPHl`~S IXWdfvASzh+m-Wtv6SU1qcU{!-hbd{bxJzi$1MYN47AAJgrv%9A|%oD^FG zItzB}m>Kktfq^vxbVtAkF^dboLYpSv;k(}E{G%x# SV)(+oNuNuackpS8J~C+c&k_m~;PfnXT`# zd%g6#cG*pH-zw=_6>B414=>sNP-p$t1D{^GR& iwtqa+ zUAHG(Z)sH|XY@L4wTcC;@%t}0r~7vlx8J_8_p`zIJ+ia*u_xKxYi4|K M zWgNC#^N8Cy(vi==_fdJoQS)UNSM#p?aaP8rdrpOyO~rJPO@9yCr~iJT#_&b2=uuPm z`jxGrO{ +PC-GIQwkqZ*tA++M`x0yU_5bjM_otT9c#yw4^lW9jV#V zo=~j4Ti$r*<88fvPCt+R5oPt`?|Z+CQgV0WI415p#;VZ8v?*w>fD=cwaY&TZuM7KP zPHwHgW~#={Qm|{qttii}h9}lXhisYn?MII9!~oe>{10DqZTQaad!_s+(@Y!w(E4fo zbD4W~N6LS>d_f}V^wp_XWIpsiYhVzWvgz&VP@Vkzr=3=!@eHS?? m7i8^*(WdYIY&72VPyq>n_K!{&a$iX4@3u^nwER@&c~~~8Ta!StgD^1Adq8X z(Iw_dPW7L+?)ssm*dp-x!1aQzz0%t^)E-ysinBc3xc&DBahLRizix=}>+a85wD5FG z*AMq|;*-y{l}Y8TdHA?I?7~kM>*qfFTj#Gy{T L*7P&a+T2cSt6KzYp7@r3 zN5sD(Yu>YpG1{kZRK3>PR#9E?=q6)RbHRtNj#=B+K21)a_4DsTg>|8#HGd|Heu(2{ z_s{yU(D1yqbR#3*zIV&NecM{|CPnynUt7W2$b;X0U)%U+ubW)eqV`|c*;nrU%C$|7 z?}Jyj+r?j^Irlftx^&q6=f&TQ9IrF<^p_s>li=Lv#>0E&r|p#3%@gzQ&h %=^aH z=)lU!j7_F_GqN2tpS{`t_J3;4L;+zBa9#R2L-E!8HSVwPABer3b>q{?h(dq)()|`C zg>9=}7TG*Ia{cf<_t_kG>sY_rgg93+8d#jr_BRW@Zgw*E*FU*$?`)i2e7;)qW}a^j z^Ol1QYu#_%_*$dm&iZ0acGC2)quZj*Kl*>)x$v}q@L$7!=euLSWCiord-Zsx-wiCw z4$aw}&29guk6m1C?$`I5f6vsbk^1p!){WeCX}87KKkb{E7c*myb-|pw)k)bkbKX4I z`km|NkNbDdY+Lt2C*tw^`n>lGzrPi>3EtVbyDa9sZl!~P!(U_HE8g$h1-32VVL$ws zEw-2Mpx6G55f^J`|E;TizVA9{M$w5w@zI%mYX#pgbYI`EFLi#C-p4F26W7{VHeYY; zI{vu3#iKg-Oq1zZeLL1m`TgJ iGnJaPo3O0aRSWYR*om?#u9+Q}rS_G0DHMw;3 zKB_GBO_x$@X1=^;sbY(O($XdDE*y$SnxbN6&3V9l;9<#z9V+_!A~>qOE)^=fZ1UxB z5c#>0Td`$^x}~MCo-wyy;fYos4#i86pVspfoBihQR=PM w22WQ%mvv4FO#rHr2eAME diff --git a/docs/img/update2.png b/docs/img/update2.png deleted file mode 100644 index 57d3995e1113ccd906b5bbd56435e102eef695cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43075 zcmeAS@N?(olHy`uVBq!ia0y~yVA{dJz-Yk1#=yW3bDD{rfq{Xuz$3Dlfr0M`2s2LA z=96Y%P+;(MaSW-5dvmukCgkbA10T;fJYdq|= _GsSkY1~n_nyQzTZS~P!z53}V zW8eI1r6-NFw^n=SUKKlSa@pwYp%AUh+F9?o7c6RNI )e)j!t zww2B4%5xmgEzg(Ft9;h;uFv{ifQEC4mF&WW3oELtv%631oOrsoNBYH%Rz7_P$H0;o zC02VxSW6ZJmpItPS;>lCXq?n9&h =feZ0)Z}SS zSpV6H@ly$xm)(NX?(O1MuE%v%<>&gbTj`64XoY=0x_pv;*P;cNU*6ew_WX5u|Jm 26Jbq3-ItJ2^V)w(*8* z>k6&x?dL~t&ntX=P1p4PrGL{dJ^H5dyrHzME>(Z+?#F%BBDu#)uU}iRA~V@)Zr_3h z3R+=nR_Jcp)o++xT4Htj;EI! E6D@Jby1t+_Fd`>~#08uUEKL%eQ1FWSqBH ztGj)Q*}2U};&!gSb9deD+r{SP_V(r5(-ZEzTN}Oo#QF2#^7E|HB2! yExpi}`HIsOBbosXY1-{i?%ljU#EIU}7yL)$R z`t9N+`;<##9= F4IYJ}0hqZrk${pNp5w zYuub!@c#apxw(~1yXVihzIFQib$v^Nc?(P3cQ2}t_>~xV`Q1IMV%bk$t}R&ca?+F7 zwNYDd-a2zh&)#0XzP>(pTj;zWsrNs9Q#*ZJe7?42%%^WpZ^V|K{Ir^7*CD?Ekv8GA zD_(xuV_Kk=oB4m!AxL6Mzpcl4?oaicm9KgHx4!0aw%5wKHF53cuWxf>GtUd0c=qH; z!RKebMMXs?&YxG;*FT?C&F1RceY^S3*}KOt@Y`B7X9rx_GR<$fvW102eEenpmdK>l zvhFwT#0Rb@c+1u`UHs=%?OnCct{r$*{9yt-2;3!qEmY2QooKpa+AU+f@F|BRt+Joq z+EO^rdgt!g^6k&_-qqFhZCS3tRasg2 Q$`EE#IEK-nRPbv>luJm7$5!`~3L}_hUS@yM9W=IDeQme|>z_gxRyR zudP3Q8 Z{0xI!BGQ(fa!OSyxvr{qG*3QLZw uEp+1uRQ*mAGmAj|!=HXHA-n)@}C>)oHHJ8w;U z=%SHztDwePeTMq>qZdE&^j!XSN_XkjoT<^L^|@`n-hq2^t!?(tK8;iRw(VFP>uhiQ zCuh#JX}7(^k6(*D&U_`6edo@d8eKnq)@`#BiSyqQox5{&W?}WD;saLB_S#vyJhBUT zyJnSzCL}0?t_m?cS?s?1*qyucw7ni#PB~(D@bhuq*Kei43A62a_MEck*Mjw@$YfqW zFmcO6-K@t&kFC~ey!v--2P96{+1a~ZT)%j4>1(krrPmqVlNZX1na0L#pSI3?-Llrw z)G{{l1NZOGe|2^B>P-JX7i}*t+ideuhDY{n)GYyr2<_`-5#_nEoH1RSN|)6#r(d4; zXk~K6s@M-Px8LQ3-=1gomaBYAV(0GLrRCM{5?-{o&F{T@tH}A*2GcVar0f)yy}kZ4 z6_i#r;y&%xw{x9!Q1|89{(gSb>}xK|wQp%FMa!&x?y34w1}W~QKF@j4{_RrRw%n<^ zH ${$ePI#%?^(<)`+n{2 z^|gy~c)Molojvu1N6+Eyt*sYda{2p|f4(ArsbG=iq%e`!#uD>xO$%|q!X}k)Z{ZwY z>CMyP#VTIytcH5(`h|Jcw@cHbkKMVuZs|9kzZ+L%mgn@|Hugz*^5n^i*O^ |jeLnmtJYDsh zt*tKN%9e*erIz2_2`Z%BZ<$_r7OiDI@8{-_Jnh_Gc%f*m>GjYm>TzUL;4aBuk%5 f?6EP>RSEIU9#0*hiM zGK6y|wg@;)(H45Z1!8m*xiZCo7#xA?JQ}oHKsru|au&3L7%n@N7}tRqEgIn}2SmYU zJnb4t!=`fG;!$kTI4@WCBT-3Nd1c7TN!v~+n&;g~`26f_&G)+BNmo8u48rmZ8H00y?2ftV@>~NMov?`1HRD+bP )fh~6ARb-EerQZ49hE16Mvk1 +e^wzWq1({QiGm_50*(Pqpz%Z*k2t%(-D8WtMZ|P%HOV z*X>I?h1G+0m*uwcNFKVmIsNAL{Q29ug4KLyxh(gad*#d3)#08V9tnScedX&lUmAI| zOSJO+-tQHk&zg7k_Ffg6-tmaHU@vpVopr2=_v~1< 6rUw9<;a#)dLoEc~I^-Vt` z)GY1lTCQaJESIa5{GOG3=w5YqXti;-oJV)isiFxBHM|@dvg5 mmV}eLy*c dMnl?GvUYXTfcr=mA$%=P$Teo z^2!su-Ab!MSBn{^ok_UAuXat;)~+d2L~=#jO>%Edku*-5FmvX~eYL+k`uo*YR9f!s zt^WL|Ti+=CoXlH2*Jm$p8iHC9*K$`EKR>r6>naz6zP`R&zg+AS2Jr_E4mRi9-p1R| z(7 3r%lyFFdo%jZI-fXurmZSBBhb8S zhei3GQ)g9;KT1^pn;s%?;+?{)>GqN~l|p~zB+oSdm@0FEWxkZ|3u~20dAU&nVa%H* z3wQi1RMp 0oKM!>XIb=fvny+7cpf@9Hz#U; eUEFTC U&Se!AzjaCHtY>?E;#_=v!ND(YFSP9n-Rx KVpBKEkm!gdD`V=zGr3{w|h=jD?Bb+Zjf<7!S2@! z<$Zs@MaNaYHQoBQ>g%hI`~Uy#cWh=86c%>goOX7GMWK>y)t3jqzP^5QV`DQbx7dVf z)7TD7_P0Cv_xt_xFE1~bG)Q0&)ecj!v6)l$_LgD(J)2o3nNC$zR=dmJKU=%~o|2(q zplw)Xs`kFn!~Wi_Y}2GR2yLIW|Af)KlV242ZNEv#T9quwy1Gh5MP) Nx|R`Iw8kB)Y?w6 kIv%}}r|Epw>GRZiwA@MN7-=23jH>Y1MUhLW} z_T<^Kq8AqwCl?=%`#n`V{MqAv`(p`LSA{ave7zc;b8Cy|+5L0Byt;Z?MOH?}=k~VT zpRd>N_xUt;>dcuZ@9nL=`sL%}ZG6cZB@Wvog#F6_S`VU)t58@)}%z+l3U9~E_f zzlKj{_&wR*?qM^(UBdZ!wpsUDIE6oa`({>od`15KeI;*iP2I4;KuB2l=eynSXV}$R zB_HooRab9c=-hs3TW)mP*;z~92}? 0|7f}Ja^pvy{O8Vh%JV;d()PYl zu!~EUop)KV?%&NHR$iW%*lhKv_=onrSs#tO>-`q_%{T0+U&71SmKtrxXi~R8zchGp zMg6zaIzJ6NC)`Vx5Wgw$`1&=*w`|5c0?n-L>Sj*Af72moZk^8zqqaU)?&8|4(#M^h z$uB~c8+}iw8CTy_o0Rn>>C6#zu2(+ }5olpFdEf-Ls zkZ*rTsVeaKm#Db;e|Un$+$TN}b$epJ+;G`ue#7{4&z}C&wtRKD^Pphq$I?go_co{d z=T18nHuLw(9=S4+kl7ZQN(;9-amz1Uc%|q=Vfx{=BlB!Bzh~UMdGpHJ=;;RzI86R? zb#?gXzu)h#e))V}b>IKr`~N@w{eJ&)_kOuIcXm!rJw5H>Vt4+neqUc*l{8M{5mxhA z;5k`M#;#^Y>FaA3_t)2N <&0B^IWL=t4lX}+amw@b~!gTG`_sNTv%NE_>GOpnYY9KFIt^+w999< z8E<`ky_kO7nNLqo?|i*(_Y8x?CeLhs+b;s@{_|2!P0`ee-6djgZ!cH<#;{M;`q-6~ z!JS=QkM32!e>%}!&hX}WvFO^nVUdxbJjli;bK-XXe&6GLvRjXav9hsU+EJKnmUkyZ z=nm77 @hXuFxEk3w*?dJnwk(r^3-FQpCU7NA{zwX&t zrjO C4OgpMQ9GIPLjdv>`O>|Ko;u3gT!tiiJX?@Wnj`-;yW-|%z!T$LC9BY$k&(;nAbbaQi& z>g;dJCV4Yu+wW;R-;;SKenY?Q!Gi}|T3SB5*?j)fL3a5WQ}+J(beiGMx7+z@Ki?&* z8(k2IUiJ6c?EFthg#8y>j?~(!tE=0q=-hTAR(NaCQ!lI1S4R#uvv+oOCf?sy`{&>9 z_aLnH^;nPOVd?xm2ixWAI1X69-{ZVGY^{WGT94=5soLQ}!orJ}?f>)18&vEa?~}dy z=ilGooAd5kIqZ+q)7S4mE?*xb>odRpU*)#k+in#VJ9hD%x_*87&CThv&zv*My3)bQ zEmrX82&dm1i-R+b(^mu?{pc?rwl-?2s`oU5%1zuiXR UG z-md5A>Dln_j%nQd$o+M-pf-8G{XdVYDy!Sua+NJDXYT+1FM4gV_sKZ+F8_c4fywIr z&t6 |P7Z gg*tzeR1$y11{lI_>PNqce@u8UE(vCL}2E z+k9xa`ToW AT(U?JjqfSyc5!1}*oK?US`$wyrXM zPlaLbtu2A)ouj*|@+vJ3d|jB=zR$&EeP{ks2C415ipB349|cYJu$|#>PB}LtxO{Wn z%qD*h-FI)jk6Z0yNKt>I@~Yp$= -S$fn~HnYY(mZ|Ag!1hV}Gg&X6 zxLGg%_{P=WFU`N+-(oS>;myWonLG6ji(ek|S8Bg rTMk+6%-ksR+j{!J#L|zSJr#_9Y8cLB zY}xw8?Z{l-6_Jb85>0D9e!Tj>k7v_lVUM8jsviOZLE`(fIc02ew|x5%#dO>+Zb`VX zb6f6oy;vnHt63c#9Fr%XE(kh1-~RrNU9)d+h{|we_1>-hewUAZ`z`*NTQe>mTF5^W z)acxvA3w`9+s(y=Wo`8KXLHN%DQatXzr4JBbNTzYtZQpL|Ni 8D&9(XS;qZ|oM=tECES56MS+TG7#xh^&SJ&2_zPUNw_gkF4J?y|FR*&)4hm67ycg zmfv+PC@`2`_iJULc0-+m36H_8Vnsv4iA$EK#8o~O6%rPH4#IeralIYIG%)-(CCg zPQ=Ef)@>)A+$q>vTYc)2Wzvq^n1loc+v;yi($CN1k++-UZ}+pM{9a|d`n-y!2@?by z_J2vaxhb_r)_Pj?`@Q1&>kn;rmVN7=u#3&yz+i&kTr0!0GZK#;JvwpXgo2ID9PjCR zD-W(c`0#N1)l`PQ58uD58yH-8v#ajI1IOjeG4AILy}!M`e?HjX)-@wTBmLZ*hbJZ~ z%h*%|M4w%>XkPR@-h$e!OBP86e{YGFEV!ex=-aW0GiQ5$+sLf)gm1a;Ypa~T?!(LP zCLHU1*ZMDnN$BB?_`(#iGhVxt7UW5o)^4(#P|5p2@yWbEpXz1$rNu#=-TkIqT-+&g z30DvOJo5F0$7k!q9Q_qdb^j}x7RT>Dy4(Kf%XFX5#fFiqrn2vBi;Qmn*&rS^EnQ^V zPm>o%TQncPkeK9q>7<3wBwhF4uh DL{d_+q0TMs`MJ4j+0S`;^s}a26Z4yG*1Na*JE+aOtL*Km zBb~xGcN8wZd3)A2o4;Q!XHDS#6&ZW@cF5D2i=T@gI6K>%lZ)$8nsC%+HLC}|wr0O* zcrqpB*_pY{&(F SeCu9*#GC#=53mf9zD7;|MMpw z>%EIKbRsr1%(JZy+MXA?tNi`B7Z(>tZcJj`|L@mo&)Dp)=T-q#66|`{RMgd(1?1$; zt&81lvUFL_*7TTZ^XKP>EP8%o=d-6zk8Vsp{^Mu*?dNT)-&!wPGfz1)Gjqw(r8B== zT(Cf4neXgl=jK{hzTJAg;_1}zAHU!4|M_zH{28{@+kWL6FXMH~y}0gRZ&z2+$w{hT z-rSu0e*gb_&wehNyXE3C-MdWw*2^NT_}^@O{K7KrWd8oY$EIqB@A&<0HzzOe(&+7Z zG5cy}S{6TBk$oXo^VH6#HyO;$J7wS79Olcln=rd*0&{1x TJ!fQ|b#?_r81Y;_!-(@6TM`sfS)%Tdtf_-JKpLt6 NmO zKSW)>@%eH1n={ONm|s}@itl-SYvP6%7IPwnWG^gW?R74j5b|N6(f+93%oyeASDyG3 z6|FBcRF$6p?kp$&Ezc~+2d{)h{64eUrTi !w|FfIxB;Buy_2gWb zW9D|;aJqL|me9?qw=V3MCvP3h9j6$=ySQ@ktQqJ2-b$|lr9bPEAj@N3C!!|gF1?bt zapT5Uzg(+% fcelUUvu97l-YV18VQY;d^SL+F{w`bQJDcr5E4TQG zGiR1meSP)njJCu3dwVU*-prV_E$!~EQczF3`u*PNj?HX_g^ygezPYk8xa9S<-WM-2 zzB&c23{u@y`g&R2i8Hg}_Ev4ox~lcn^6TsC{h(5#{_pE}zq4+jl=-S%rYFB%`Abl6 z@XLF9cUN(1HlLeoJ$e58_2+6@uC3|ZK3zQf`kIU37hcXVPUpM3yIkGQZr Cev2zWt~A=dWKu>*H)E7ngi_aq&+1{aQZu9S=^vc6eFz<3r-U zACI_mx6SP7;d%7vQAbZt%K3S=YWg~d4j-OrRjO6|{G6($X6KYCB2nA(d_zK}L@f_o z?8d^%I`ixfYbWWRm>mU;&(6*+{_!EPbmb)F=WV99zR8A$ouAmu&R_I?@Ap|xUY1zx zDu3TMf4= %cQgS_cJc%gxOQ3xD*r^l;16#e$wK~s!(mcm>mn2 z6&DwCav1!w;hUi&e&W FQam8 zsVS!&%av@u<>yL!@`SH-9}At_QI*f^ZrrG4_oL$H18D&VkEskyQd<-k)!R#jx1RB0 zWC=N`xZt P{|{V?PO2)Vu@~+={^3aR^%b9TMUH3q-FI)hcvih{>VIzq>G+zO1IP7S z8W`-EoTM%rCK>EK^k+xeE-psKx+fXw3%FC}_dPs+B#xPb&1<`qa;v_Ez8I-PT7n z)IB<=**5v~hHslQbYg6JH|b2-m2zo`r_U@C&)ILye*XM< NRV0w&mYnH*Ia)-dTl@kA1wEK7V7uLnjf}#9Lc3P4e!{@SAG|nlLW?*}T!M zR|;H@*Zr+B%eeu{C=xam1}9IREYlC0Hf8I9u;0HwEV2LpXEJD Wdc{LBYY9 zmzHqaR((;hvYHjWJ&)0#;zPnLv)oglL7aWHzca3_ku-I7`oi46SNH#MIcS_~ncv(~ z+wa$jFY9oItp(^_q`@O=HN~nl%Q*Fv$mW^R&DHOAy8r!fVSfET$kpW?ov->An3} z(fiT`C7#~ikGu8v8ALMYpMQ0Ab>+*Y(`Oi^a_#^B&)Uw;ZcE0+Ccn8>8_VCvnO^wu zbb35!kR ;x>wf6&!4F5Ui9XM;qtV94*wtR&b_@&MNRF}0!L=E{Cj6WC2BLj z-HC4feJ5^h%?=c4b(gDbu_}E9YX7f(-llr<=1r4~3k}upcD8#>)tWeG&YKI|h0U8P z`u_ZQ-2dgpMd#Y>XCrQJ%l-NH`~98&|NYiw+rFTF` l;2=L97sK|Oq*cm6W+^5^${zjylQ=jS_1UJ4y< z=T|o|x$ Iq zwRrUtrkEm6tFnfcJr7G>-=D6 zxnG&Zdqvi|?dR!Q1>3$AXX7^-)e0;==9iZ8uEy?Hs%Cy{cS^zcxSq;V5k|WSlG~fN zzW#rue!-c*%AG1M>y_I4cxGG5?|&2Wh%fKK->=dgni1z`SDSS$egDKLBS8O`Z_Eja zpib+3&HZ-&=gD^NbkK9J|I@W%f}u~vYv-DxV9O1q%=6ctOt~?E)8|y|q1V}K<|tf$ zbYsh#*iG!Nm$v^mdB*-^(yssF*ZzsP?Z0;GRNuvYbKlu;FI+u4En7EoLqg+G{+X6S zca|(&`tieI{@Z^UPQJOhd1uj6E@n2Kfc-aLy}G)3P2ApFDSO{Gv2vd{aU$Wtfksfi z`tqgZUj6@C(;Zu%Z$59Ad}fBBPSlnYD)y?Xt%--*KK}W9{`0-+_n O z+5Dy*Iey%@ d-}_BU*}d<{z3TT%v#zdMvSi7Iy1!ME{a37y**WRN36EVRFApv5x9eJ@ z@#f~{_T2sdy7*3 }r1*l)sDlx^L&YKfHB+zlO`zehFOWGxN~L$H#AOOlHr_%-r+u z*J~abiwT^ FxS4)${4!T(=5IkmJ=YzJN-no-kejjb>a9JMn-6=7i0MQmd{f-4KEGzt{JL9< z)@q$ (T#% S%7=LZ=bJ)*!_FnrLm!B7Rm*;0)U&s4mf8EuBKF~DQL}hoTUpJ*5e?8y& zX70sj&u3e&Xk6!cBs(bS#E!L+(-t@U(^Hi;&r5lHtk-XUseT^+#*G`#%(0w&u$eu0 ze_bu8FI-SyaD9Eex~b{ZZgKrh)!*~B*QBohuxC>2B85{cAMxecUf;Azf=|)w*rTJ} zD+Mzud*?b C%)!m>&>;lS_Ga>XW4P6 zSI4E%s(YvFlca9FcWIr{vxQU-tQEJNE?r#d-YxRAK1$5ERbWw!_Cr;!MSnhgS+iDH z_vXs1 z-?iBLPSj%-`lXSS$`;6_IVy$#^BLlp9j9Ua2-I>e~zN2w@Q#5<@hM==v z+Yaljy)OE6{K3r9tdj4(3CJcZ^&ikYqZ8NWJ}~pt