@echo off
setlocal EnableExtensions EnableDelayedExpansion
chcp 65001 >nul
title Aitrepreneur - Adaptive Anima Base LoRA Trainer Installer

rem ============================================================
rem  Anima Base LoRA Trainer - Adaptive Windows Installer
rem  Repo: https://github.com/aitrepreneur/citron-anima-lora-trainer-ui
rem ============================================================

set "REPO_URL=https://github.com/aitrepreneur/citron-anima-lora-trainer-ui.git"
set "APP_DIR=citron-anima-lora-trainer-ui"
set "PY_CMD="

echo ============================================================
echo  Anima Base LoRA Trainer - Adaptive Windows Installer
echo ============================================================
echo.
echo This installer detects your NVIDIA GPU and driver, then chooses
echo the safest PyTorch CUDA wheel automatically.
echo.
echo Important: the installed CUDA Toolkit on your PC is usually not used.
echo PyTorch brings its own CUDA runtime. Your NVIDIA driver matters most.
echo.

rem ------------------------------------------------------------
rem  1. Check / install Git
rem ------------------------------------------------------------
echo [1/10] Checking Git...
where git >nul 2>nul
if errorlevel 1 (
    echo Git was not found.
    where winget >nul 2>nul
    if errorlevel 1 (
        echo ERROR: Git is missing and winget is not available.
        echo Please install Git manually from https://git-scm.com/download/win
        pause
        exit /b 1
    )
    echo Installing Git with winget...
    winget install --id Git.Git -e --source winget --accept-source-agreements --accept-package-agreements
    set "PATH=%PATH%;%ProgramFiles%\Git\cmd;%ProgramFiles%\Git\bin"
)
where git >nul 2>nul
if errorlevel 1 (
    echo ERROR: Git still not found. Close this window, reopen it, and try again.
    pause
    exit /b 1
)
echo Git OK.
echo.

rem ------------------------------------------------------------
rem  2. Check / install Python 3.10
rem ------------------------------------------------------------
echo [2/10] Checking Python 3.10...
where py >nul 2>nul
if not errorlevel 1 (
    py -3.10 -c "import sys; print(sys.version)" >nul 2>nul
    if not errorlevel 1 set "PY_CMD=py -3.10"
)

if not defined PY_CMD (
    where python >nul 2>nul
    if not errorlevel 1 (
        python -c "import sys; raise SystemExit(0 if sys.version_info[:2] == (3,10) else 1)" >nul 2>nul
        if not errorlevel 1 set "PY_CMD=python"
    )
)

if not defined PY_CMD (
    echo Python 3.10 was not found.
    where winget >nul 2>nul
    if errorlevel 1 (
        echo ERROR: Python 3.10 is missing and winget is not available.
        echo Please install Python 3.10 manually, then run this installer again.
        pause
        exit /b 1
    )
    echo Installing Python 3.10 with winget...
    winget install --id Python.Python.3.10 -e --source winget --accept-source-agreements --accept-package-agreements
    set "PATH=%PATH%;%LocalAppData%\Programs\Python\Python310;%LocalAppData%\Programs\Python\Python310\Scripts"
    where py >nul 2>nul
    if not errorlevel 1 (
        py -3.10 -c "import sys; print(sys.version)" >nul 2>nul
        if not errorlevel 1 set "PY_CMD=py -3.10"
    )
)

if not defined PY_CMD (
    echo ERROR: Python 3.10 still not found. Restart Windows or open a new terminal and try again.
    pause
    exit /b 1
)
echo Using Python command: %PY_CMD%
echo.

rem ------------------------------------------------------------
rem  3. Detect GPU and choose PyTorch CUDA version
rem ------------------------------------------------------------
echo [3/10] Detecting NVIDIA GPU and choosing PyTorch CUDA version...
> _detect_gpu.b64 (
    echo CmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCByZQppbXBvcnQgc3lzCgpXSU5fTUlOX0NVMTI4ID0g
    echo IjU3MC42NSIKV0lOX01JTl9DVTEyNiA9ICI1NjEuMTciCldJTl9NSU5fQ1UxMTggPSAiNTIwLjA2
    echo IgoKVE9SQ0hfQ1UxMjggPSAicGlwIGluc3RhbGwgdG9yY2g9PTIuMTAuMCB0b3JjaHZpc2lvbj09
    echo MC4yNS4wIHRvcmNoYXVkaW89PTIuMTAuMCAtLWluZGV4LXVybCBodHRwczovL2Rvd25sb2FkLnB5
    echo dG9yY2gub3JnL3dobC9jdTEyOCIKVE9SQ0hfQ1UxMjYgPSAicGlwIGluc3RhbGwgdG9yY2g9PTIu
    echo MTAuMCB0b3JjaHZpc2lvbj09MC4yNS4wIHRvcmNoYXVkaW89PTIuMTAuMCAtLWluZGV4LXVybCBo
    echo dHRwczovL2Rvd25sb2FkLnB5dG9yY2gub3JnL3dobC9jdTEyNiIKVE9SQ0hfQ1UxMTggPSAicGlw
    echo IGluc3RhbGwgdG9yY2g9PTIuNy4xIHRvcmNodmlzaW9uPT0wLjIyLjEgdG9yY2hhdWRpbz09Mi43
    echo LjEgLS1pbmRleC11cmwgaHR0cHM6Ly9kb3dubG9hZC5weXRvcmNoLm9yZy93aGwvY3UxMTgiCgpk
    echo ZWYgY2xlYW4odmFsdWUpOgogICAgcmV0dXJuIHN0cih2YWx1ZSkucmVwbGFjZSgnIicsICcnKS5y
    echo ZXBsYWNlKCcmJywgJ2FuZCcpLnN0cmlwKCkKCmRlZiB3cml0ZV9jbWQoKippdGVtcyk6CiAgICB3
    echo aXRoIG9wZW4oJ19ncHVfY2hvaWNlLmNtZCcsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoK
    echo ICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpdGVtcy5pdGVtcygpOgogICAgICAgICAgICBmLndy
    echo aXRlKGYnc2V0ICJ7a2V5fT17Y2xlYW4odmFsdWUpfSJcbicpCgpkZWYgdmVyc2lvbl90dXBsZSh2
    echo YWx1ZSk6CiAgICBudW1zID0gcmUuZmluZGFsbChyJ1xkKycsIHN0cih2YWx1ZSkpCiAgICBudW1z
    echo ID0gW2ludCh4KSBmb3IgeCBpbiBudW1zWzo0XV0KICAgIHdoaWxlIGxlbihudW1zKSA8IDQ6CiAg
    echo ICAgICAgbnVtcy5hcHBlbmQoMCkKICAgIHJldHVybiB0dXBsZShudW1zKQoKZGVmIHZlcnNpb25f
    echo Z2UodmFsdWUsIG1pbmltdW0pOgogICAgcmV0dXJuIHZlcnNpb25fdHVwbGUodmFsdWUpID49IHZl
    echo cnNpb25fdHVwbGUobWluaW11bSkKCnRyeToKICAgIHF1ZXJ5ID0gc3VicHJvY2Vzcy5jaGVja19v
    echo dXRwdXQoCiAgICAgICAgWyJudmlkaWEtc21pIiwgIi0tcXVlcnktZ3B1PW5hbWUsZHJpdmVyX3Zl
    echo cnNpb24iLCAiLS1mb3JtYXQ9Y3N2LG5vaGVhZGVyLG5vdW5pdHMiXSwKICAgICAgICB0ZXh0PVRy
    echo dWUsCiAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAogICAgICAgIGVuY29kaW5nPSJ1
    echo dGYtOCIsCiAgICAgICAgZXJyb3JzPSJpZ25vcmUiLAogICAgKS5zdHJpcCgpLnNwbGl0bGluZXMo
    echo KVswXQogICAgcGFydHMgPSBbcC5zdHJpcCgpIGZvciBwIGluIHF1ZXJ5LnNwbGl0KCcsJyldCiAg
    echo ICBncHVfbmFtZSA9IHBhcnRzWzBdCiAgICBkcml2ZXJfdmVyc2lvbiA9IHBhcnRzWzFdIGlmIGxl
    echo bihwYXJ0cykgPiAxIGVsc2UgIjAiCiAgICBmdWxsX3NtaSA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0
    echo cHV0KAogICAgICAgIFsibnZpZGlhLXNtaSJdLCB0ZXh0PVRydWUsIHN0ZGVycj1zdWJwcm9jZXNz
    echo LlNURE9VVCwgZW5jb2Rpbmc9InV0Zi04IiwgZXJyb3JzPSJpZ25vcmUiCiAgICApCmV4Y2VwdCBF
    echo eGNlcHRpb24gYXMgZToKICAgIHdyaXRlX2NtZCgKICAgICAgICBBTklNQV9HUFVfT0s9IjAiLAog
    echo ICAgICAgIEFOSU1BX0dQVV9OQU1FPSJOT05FIiwKICAgICAgICBBTklNQV9EUklWRVJfVkVSU0lP
    echo Tj0iMCIsCiAgICAgICAgQU5JTUFfTlZJRElBX1NNSV9DVURBPSJVbmtub3duIiwKICAgICAgICBB
    echo TklNQV9UT1JDSF9DVURBPSJOT05FIiwKICAgICAgICBBTklNQV9NSVhFRF9QUkVDSVNJT049ImZw
    echo MTYiLAogICAgICAgIEFOSU1BX1RPUkNIX0lOU1RBTExfQ01EPSIiLAogICAgICAgIEFOSU1BX0dQ
    echo VV9SRUFTT049ZiJudmlkaWEtc21pIGZhaWxlZDoge2V9IiwKICAgICkKICAgIHN5cy5leGl0KDAp
    echo CgptID0gcmUuc2VhcmNoKHIiQ1VEQSBWZXJzaW9uOlxzKihbMC05Ll0rKSIsIGZ1bGxfc21pKQpu
    echo dmlkaWFfc21pX2N1ZGEgPSBtLmdyb3VwKDEpIGlmIG0gZWxzZSAiVW5rbm93biIKbmFtZSA9IGdw
    echo dV9uYW1lLmxvd2VyKCkKCmlzX2JsYWNrd2VsbCA9IGJvb2wocmUuc2VhcmNoKHIicnR4XHMqNTB8
    echo cnR4XHMqNTA5MHxydHhccyo1MDgwfHJ0eFxzKjUwNzB8cnR4XHMqNTA2MHxcYjUwOTBcYnxcYjUw
    echo ODBcYnxcYjUwNzBcYnxcYjUwNjBcYnxibGFja3dlbGwiLCBuYW1lKSkKaXNfcGFzY2FsX29yX21h
    echo eHdlbGwgPSBib29sKHJlLnNlYXJjaChyImd0eFxzKjEwfGd0eFxzKjl8XGIxMDUwXGJ8XGIxMDYw
    echo XGJ8XGIxMDcwXGJ8XGIxMDgwXGJ8XGI5NTBcYnxcYjk2MFxifFxiOTcwXGJ8XGI5ODBcYnx0aXRh
    echo biB4cHx0aXRhbiB4XGJ8cXVhZHJvXHMqcHx0ZXNsYVxzKnB8cDEwMHxwNDB8cDR8bWF4d2VsbHxw
    echo YXNjYWwiLCBuYW1lKSkKaXNfa2VwbGVyX29yX29sZGVyID0gYm9vbChyZS5zZWFyY2gociJndHhc
    echo cypbNDU2NzhdXGRcZHxcYjc1MFxifFxiNzYwXGJ8XGI3NzBcYnxcYjc4MFxifGtlcGxlcnxmZXJt
    echo aSIsIG5hbWUpKQppc190dXJpbmcgPSBib29sKHJlLnNlYXJjaChyInJ0eFxzKjIwfFxiMjA2MFxi
    echo fFxiMjA3MFxifFxiMjA4MFxifGd0eFxzKjE2fFxiMTY1MFxifFxiMTY2MFxifHQ0fHR1cmluZyIs
    echo IG5hbWUpKQppc19hbXBlcmVfb3JfbmV3ZXIgPSBib29sKHJlLnNlYXJjaChyInJ0eFxzKjMwfHJ0
    echo eFxzKjQwfHJ0eFxzKjUwfFxiMzA1MFxifFxiMzA2MFxifFxiMzA3MFxifFxiMzA4MFxifFxiMzA5
    echo MFxifFxiNDA1MFxifFxiNDA2MFxifFxiNDA3MFxifFxiNDA4MFxifFxiNDA5MFxifGExMDB8YTEw
    echo fGExNnxhMzB8YTQwfGE0MDAwfGE0NTAwfGE1MDAwfGE2MDAwfGw0fGw0MHxoMTAwfGgyMDB8YjEw
    echo MHxiMjAwfGJsYWNrd2VsbHxhbXBlcmV8YWRhfGhvcHBlciIsIG5hbWUpKQoKaWYgaXNfa2VwbGVy
    echo X29yX29sZGVyOgogICAgd3JpdGVfY21kKAogICAgICAgIEFOSU1BX0dQVV9PSz0iMCIsCiAgICAg
    echo ICAgQU5JTUFfR1BVX05BTUU9Z3B1X25hbWUsCiAgICAgICAgQU5JTUFfRFJJVkVSX1ZFUlNJT049
    echo ZHJpdmVyX3ZlcnNpb24sCiAgICAgICAgQU5JTUFfTlZJRElBX1NNSV9DVURBPW52aWRpYV9zbWlf
    echo Y3VkYSwKICAgICAgICBBTklNQV9UT1JDSF9DVURBPSJVTlNVUFBPUlRFRCIsCiAgICAgICAgQU5J
    echo TUFfTUlYRURfUFJFQ0lTSU9OPSJmcDE2IiwKICAgICAgICBBTklNQV9UT1JDSF9JTlNUQUxMX0NN
    echo RD0iIiwKICAgICAgICBBTklNQV9HUFVfUkVBU09OPSJHUFUgbG9va3MgdG9vIG9sZCBmb3IgdGhp
    echo cyB0cmFpbmVyLiBSZWNvbW1lbmRlZCBtaW5pbXVtIGlzIEdUWCAxMC1zZXJpZXMgNkdCLCBSVFgg
    echo MjAtc2VyaWVzLCBvciBuZXdlci4iLAogICAgKQogICAgc3lzLmV4aXQoMCkKCmlmIGlzX2JsYWNr
    echo d2VsbDoKICAgIGlmIG5vdCB2ZXJzaW9uX2dlKGRyaXZlcl92ZXJzaW9uLCBXSU5fTUlOX0NVMTI4
    echo KToKICAgICAgICB3cml0ZV9jbWQoCiAgICAgICAgICAgIEFOSU1BX0dQVV9PSz0iMCIsCiAgICAg
    echo ICAgICAgIEFOSU1BX0dQVV9OQU1FPWdwdV9uYW1lLAogICAgICAgICAgICBBTklNQV9EUklWRVJf
    echo VkVSU0lPTj1kcml2ZXJfdmVyc2lvbiwKICAgICAgICAgICAgQU5JTUFfTlZJRElBX1NNSV9DVURB
    echo PW52aWRpYV9zbWlfY3VkYSwKICAgICAgICAgICAgQU5JTUFfVE9SQ0hfQ1VEQT0iY3UxMjgiLAog
    echo ICAgICAgICAgICBBTklNQV9NSVhFRF9QUkVDSVNJT049ImJmMTYiLAogICAgICAgICAgICBBTklN
    echo QV9UT1JDSF9JTlNUQUxMX0NNRD0iIiwKICAgICAgICAgICAgQU5JTUFfR1BVX1JFQVNPTj1mIlJU
    echo WCA1MC1zZXJpZXMgZGV0ZWN0ZWQsIGJ1dCBkcml2ZXIgaXMgdG9vIG9sZC4gSW5zdGFsbCBOVklE
    echo SUEgZHJpdmVyIHtXSU5fTUlOX0NVMTI4fSBvciBuZXdlci4iLAogICAgICAgICkKICAgICAgICBz
    echo eXMuZXhpdCgwKQogICAgd3JpdGVfY21kKAogICAgICAgIEFOSU1BX0dQVV9PSz0iMSIsCiAgICAg
    echo ICAgQU5JTUFfR1BVX05BTUU9Z3B1X25hbWUsCiAgICAgICAgQU5JTUFfRFJJVkVSX1ZFUlNJT049
    echo ZHJpdmVyX3ZlcnNpb24sCiAgICAgICAgQU5JTUFfTlZJRElBX1NNSV9DVURBPW52aWRpYV9zbWlf
    echo Y3VkYSwKICAgICAgICBBTklNQV9UT1JDSF9DVURBPSJjdTEyOCIsCiAgICAgICAgQU5JTUFfTUlY
    echo RURfUFJFQ0lTSU9OPSJiZjE2IiwKICAgICAgICBBTklNQV9UT1JDSF9JTlNUQUxMX0NNRD1UT1JD
    echo SF9DVTEyOCwKICAgICAgICBBTklNQV9HUFVfUkVBU09OPSJSVFggNTAtc2VyaWVzIC8gQmxhY2t3
    echo ZWxsIGRldGVjdGVkLiBVc2luZyBQeVRvcmNoIENVREEgMTIuOCBmb3Igc21fMTIwIHN1cHBvcnQu
    echo IiwKICAgICkKICAgIHN5cy5leGl0KDApCgppZiBpc19wYXNjYWxfb3JfbWF4d2VsbDoKICAgIGlm
    echo IHZlcnNpb25fZ2UoZHJpdmVyX3ZlcnNpb24sIFdJTl9NSU5fQ1UxMjYpOgogICAgICAgIHRvcmNo
    echo X2N1ZGEgPSAiY3UxMjYiCiAgICAgICAgaW5zdGFsbF9jbWQgPSBUT1JDSF9DVTEyNgogICAgICAg
    echo IHJlYXNvbiA9ICJQYXNjYWwvTWF4d2VsbCBsZWdhY3kgR1BVIGRldGVjdGVkLiBBdm9pZGluZyBD
    echo VURBIDEyLjggYmVjYXVzZSBtb2Rlcm4gY3UxMjggUHlUb3JjaCB3aGVlbHMgbWF5IGRyb3AgUGFz
    echo Y2FsL01heHdlbGwgc3VwcG9ydC4gVXNpbmcgQ1VEQSAxMi42LiIKICAgIGVsaWYgdmVyc2lvbl9n
    echo ZShkcml2ZXJfdmVyc2lvbiwgV0lOX01JTl9DVTExOCk6CiAgICAgICAgdG9yY2hfY3VkYSA9ICJj
    echo dTExOCIKICAgICAgICBpbnN0YWxsX2NtZCA9IFRPUkNIX0NVMTE4CiAgICAgICAgcmVhc29uID0g
    echo IlBhc2NhbC9NYXh3ZWxsIGxlZ2FjeSBHUFUgZGV0ZWN0ZWQgd2l0aCBvbGRlciBkcml2ZXIuIFVz
    echo aW5nIENVREEgMTEuOCBmYWxsYmFjay4iCiAgICBlbHNlOgogICAgICAgIHdyaXRlX2NtZCgKICAg
    echo ICAgICAgICAgQU5JTUFfR1BVX09LPSIwIiwKICAgICAgICAgICAgQU5JTUFfR1BVX05BTUU9Z3B1
    echo X25hbWUsCiAgICAgICAgICAgIEFOSU1BX0RSSVZFUl9WRVJTSU9OPWRyaXZlcl92ZXJzaW9uLAog
    echo ICAgICAgICAgICBBTklNQV9OVklESUFfU01JX0NVREE9bnZpZGlhX3NtaV9jdWRhLAogICAgICAg
    echo ICAgICBBTklNQV9UT1JDSF9DVURBPSJjdTExOCIsCiAgICAgICAgICAgIEFOSU1BX01JWEVEX1BS
    echo RUNJU0lPTj0iZnAxNiIsCiAgICAgICAgICAgIEFOSU1BX1RPUkNIX0lOU1RBTExfQ01EPSIiLAog
    echo ICAgICAgICAgICBBTklNQV9HUFVfUkVBU09OPWYiRHJpdmVyIGlzIHRvbyBvbGQuIEluc3RhbGwg
    echo TlZJRElBIGRyaXZlciB7V0lOX01JTl9DVTExOH0gb3IgbmV3ZXIuIiwKICAgICAgICApCiAgICAg
    echo ICAgc3lzLmV4aXQoMCkKICAgIHdyaXRlX2NtZCgKICAgICAgICBBTklNQV9HUFVfT0s9IjEiLAog
    echo ICAgICAgIEFOSU1BX0dQVV9OQU1FPWdwdV9uYW1lLAogICAgICAgIEFOSU1BX0RSSVZFUl9WRVJT
    echo SU9OPWRyaXZlcl92ZXJzaW9uLAogICAgICAgIEFOSU1BX05WSURJQV9TTUlfQ1VEQT1udmlkaWFf
    echo c21pX2N1ZGEsCiAgICAgICAgQU5JTUFfVE9SQ0hfQ1VEQT10b3JjaF9jdWRhLAogICAgICAgIEFO
    echo SU1BX01JWEVEX1BSRUNJU0lPTj0iZnAxNiIsCiAgICAgICAgQU5JTUFfVE9SQ0hfSU5TVEFMTF9D
    echo TUQ9aW5zdGFsbF9jbWQsCiAgICAgICAgQU5JTUFfR1BVX1JFQVNPTj1yZWFzb24sCiAgICApCiAg
    echo ICBzeXMuZXhpdCgwKQoKIyBSVFggMjAvMzAvNDAsIEdUWCAxNiwgd29ya3N0YXRpb24vZGF0YWNl
    echo bnRlciBHUFVzLCBhbmQgbW9zdCBvdGhlciBtb2Rlcm4gTlZJRElBIEdQVXMuCmlmIHZlcnNpb25f
    echo Z2UoZHJpdmVyX3ZlcnNpb24sIFdJTl9NSU5fQ1UxMjgpOgogICAgdG9yY2hfY3VkYSA9ICJjdTEy
    echo OCIKICAgIGluc3RhbGxfY21kID0gVE9SQ0hfQ1UxMjgKICAgIHJlYXNvbiA9ICJNb2Rlcm4gTlZJ
    echo RElBIEdQVSBhbmQgbmV3IGRyaXZlciBkZXRlY3RlZC4gVXNpbmcgUHlUb3JjaCBDVURBIDEyLjgu
    echo IgplbGlmIHZlcnNpb25fZ2UoZHJpdmVyX3ZlcnNpb24sIFdJTl9NSU5fQ1UxMjYpOgogICAgdG9y
    echo Y2hfY3VkYSA9ICJjdTEyNiIKICAgIGluc3RhbGxfY21kID0gVE9SQ0hfQ1UxMjYKICAgIHJlYXNv
    echo biA9ICJNb2Rlcm4gTlZJRElBIEdQVSBkZXRlY3RlZCwgYnV0IGRyaXZlciBpcyBiZWxvdyBDVURB
    echo IDEyLjggbWluaW11bS4gVXNpbmcgQ1VEQSAxMi42IGZhbGxiYWNrLiIKZWxpZiB2ZXJzaW9uX2dl
    echo KGRyaXZlcl92ZXJzaW9uLCBXSU5fTUlOX0NVMTE4KToKICAgIHRvcmNoX2N1ZGEgPSAiY3UxMTgi
    echo CiAgICBpbnN0YWxsX2NtZCA9IFRPUkNIX0NVMTE4CiAgICByZWFzb24gPSAiTW9kZXJuIE5WSURJ
    echo QSBHUFUgZGV0ZWN0ZWQgd2l0aCBvbGRlciBkcml2ZXIuIFVzaW5nIENVREEgMTEuOCBmYWxsYmFj
    echo ay4iCmVsc2U6CiAgICB3cml0ZV9jbWQoCiAgICAgICAgQU5JTUFfR1BVX09LPSIwIiwKICAgICAg
    echo ICBBTklNQV9HUFVfTkFNRT1ncHVfbmFtZSwKICAgICAgICBBTklNQV9EUklWRVJfVkVSU0lPTj1k
    echo cml2ZXJfdmVyc2lvbiwKICAgICAgICBBTklNQV9OVklESUFfU01JX0NVREE9bnZpZGlhX3NtaV9j
    echo dWRhLAogICAgICAgIEFOSU1BX1RPUkNIX0NVREE9ImN1MTE4IiwKICAgICAgICBBTklNQV9NSVhF
    echo RF9QUkVDSVNJT049ImZwMTYiLAogICAgICAgIEFOSU1BX1RPUkNIX0lOU1RBTExfQ01EPSIiLAog
    echo ICAgICAgIEFOSU1BX0dQVV9SRUFTT049ZiJEcml2ZXIgaXMgdG9vIG9sZC4gSW5zdGFsbCBOVklE
    echo SUEgZHJpdmVyIHtXSU5fTUlOX0NVMTE4fSBvciBuZXdlci4iLAogICAgKQogICAgc3lzLmV4aXQo
    echo MCkKCm1peGVkID0gImJmMTYiIGlmIGlzX2FtcGVyZV9vcl9uZXdlciBlbHNlICJmcDE2IgppZiBp
    echo c190dXJpbmc6CiAgICBtaXhlZCA9ICJmcDE2IgoKd3JpdGVfY21kKAogICAgQU5JTUFfR1BVX09L
    echo PSIxIiwKICAgIEFOSU1BX0dQVV9OQU1FPWdwdV9uYW1lLAogICAgQU5JTUFfRFJJVkVSX1ZFUlNJ
    echo T049ZHJpdmVyX3ZlcnNpb24sCiAgICBBTklNQV9OVklESUFfU01JX0NVREE9bnZpZGlhX3NtaV9j
    echo dWRhLAogICAgQU5JTUFfVE9SQ0hfQ1VEQT10b3JjaF9jdWRhLAogICAgQU5JTUFfTUlYRURfUFJF
    echo Q0lTSU9OPW1peGVkLAogICAgQU5JTUFfVE9SQ0hfSU5TVEFMTF9DTUQ9aW5zdGFsbF9jbWQsCiAg
    echo ICBBTklNQV9HUFVfUkVBU09OPXJlYXNvbiwKKQo=
)
certutil -f -decode _detect_gpu.b64 _detect_gpu.py >nul 2>nul
if errorlevel 1 (
    echo ERROR: Could not create GPU detection helper.
    pause
    exit /b 1
)
%PY_CMD% _detect_gpu.py
if not exist _gpu_choice.cmd (
    echo ERROR: GPU detection failed.
    pause
    exit /b 1
)
call _gpu_choice.cmd

echo GPU: !ANIMA_GPU_NAME!
echo Driver: !ANIMA_DRIVER_VERSION!
echo nvidia-smi CUDA shown: !ANIMA_NVIDIA_SMI_CUDA!
echo Selected PyTorch CUDA: !ANIMA_TORCH_CUDA!
echo Mixed precision default: !ANIMA_MIXED_PRECISION!
echo Reason: !ANIMA_GPU_REASON!
echo.

if not "!ANIMA_GPU_OK!"=="1" (
    echo ERROR: This GPU/driver setup is not supported by the automatic installer.
    echo !ANIMA_GPU_REASON!
    echo.
    echo Fix: update your NVIDIA driver, then run this installer again.
    pause
    exit /b 1
)

del _detect_gpu.b64 >nul 2>nul
del _detect_gpu.py >nul 2>nul
del _gpu_choice.cmd >nul 2>nul
echo.

rem ------------------------------------------------------------
rem  4. Clone or update the UI repo
rem ------------------------------------------------------------
echo [4/10] Downloading trainer repo...
if not exist "%APP_DIR%\.git" (
    git clone "%REPO_URL%" "%APP_DIR%"
    if errorlevel 1 (
        echo ERROR: Failed to clone the trainer repo.
        pause
        exit /b 1
    )
) else (
    echo Repo already exists, updating it...
    git -C "%APP_DIR%" pull
)
cd /d "%APP_DIR%"
echo.

rem ------------------------------------------------------------
rem  5. Patch defaults for Anima Base and GPU precision
rem ------------------------------------------------------------
echo [5/10] Patching app defaults...
powershell -NoProfile -ExecutionPolicy Bypass -Command "$p='app.py'; $t=Get-Content -Path $p -Raw; $t=$t.Replace('\"base_model\": \"anima-preview\",','\"base_model\": \"anima-preview3-base\",'); $t=$t.Replace('\"mixed_precision\": \"bf16\",','\"mixed_precision\": \"%ANIMA_MIXED_PRECISION%\",'); if ('%ANIMA_MIXED_PRECISION%' -eq 'fp16') { $t=$t.Replace('\"save_precision\": \"bf16\",','\"save_precision\": \"fp16\",') }; Set-Content -Path $p -Value $t -Encoding UTF8"
if errorlevel 1 (
    echo WARNING: Could not patch app.py. You can still select settings manually in the UI.
)

if not exist "app_configs" mkdir "app_configs"
(
    echo compute_environment: LOCAL_MACHINE
    echo debug: false
    echo distributed_type: 'NO'
    echo downcast_bf16: 'no'
    echo gpu_ids: all
    echo machine_rank: 0
    echo main_training_function: main
    echo mixed_precision: '%ANIMA_MIXED_PRECISION%'
    echo num_machines: 1
    echo num_processes: 1
    echo rdzv_backend: static
    echo same_network: true
    echo use_cpu: false
) > app_configs\accelerate_gpu.yaml
echo.

rem ------------------------------------------------------------
rem  6. Create virtual environment
rem ------------------------------------------------------------
echo [6/10] Creating Python virtual environment...
if not exist ".venv" (
    %PY_CMD% -m venv .venv
    if errorlevel 1 (
        echo ERROR: Failed to create the virtual environment.
        pause
        exit /b 1
    )
) else (
    echo .venv already exists, reusing it.
)
call .venv\Scripts\activate.bat
python -m pip install --upgrade pip setuptools wheel
echo.

rem ------------------------------------------------------------
rem  7. Install selected PyTorch build
rem ------------------------------------------------------------
echo [7/10] Installing PyTorch...
echo Command: !ANIMA_TORCH_INSTALL_CMD!
pip uninstall -y torch torchvision torchaudio 2>nul
call !ANIMA_TORCH_INSTALL_CMD!
if errorlevel 1 (
    echo ERROR: Failed to install the selected PyTorch build.
    echo Selected build: !ANIMA_TORCH_CUDA!
    echo Try updating your NVIDIA driver, then run this installer again.
    pause
    exit /b 1
)
python -c "import torch; print('PyTorch:', torch.__version__); print('CUDA:', torch.version.cuda); print('CUDA available:', torch.cuda.is_available()); print('GPU:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'NONE')"
if errorlevel 1 (
    echo ERROR: PyTorch installed but failed to import.
    pause
    exit /b 1
)
echo.

rem ------------------------------------------------------------
rem  8. Install sd-scripts and app requirements
rem ------------------------------------------------------------
echo [8/10] Installing sd-scripts and requirements...
if not exist "sd-scripts\.git" (
    git clone https://github.com/kohya-ss/sd-scripts.git sd-scripts
    if errorlevel 1 (
        echo ERROR: Failed to clone kohya-ss/sd-scripts.
        pause
        exit /b 1
    )
) else (
    git -C sd-scripts pull
)

pushd sd-scripts
pip install -r requirements.txt
if errorlevel 1 (
    echo ERROR: Failed to install sd-scripts requirements.
    popd
    pause
    exit /b 1
)
popd

pip install -r requirements.txt
if errorlevel 1 (
    echo ERROR: Failed to install app requirements.
    pause
    exit /b 1
)

echo Re-checking PyTorch after requirements...
python -c "import torch; print('PyTorch:', torch.__version__); print('CUDA:', torch.version.cuda); print('CUDA available:', torch.cuda.is_available()); print('GPU:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'NONE')"
echo.

rem ------------------------------------------------------------
rem  9. Download required models
rem ------------------------------------------------------------
echo [9/10] Downloading Anima Base model files...
if not exist "models\anima\dit" mkdir "models\anima\dit"
if not exist "models\anima\text_encoder" mkdir "models\anima\text_encoder"
if not exist "models\anima\vae" mkdir "models\anima\vae"

if not exist "models\anima\text_encoder\qwen_3_06b_base.safetensors" (
    echo Downloading Qwen3 text encoder, about 1.19 GB...
    curl.exe -L -C - --progress-bar -o "models\anima\text_encoder\qwen_3_06b_base.safetensors" "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors"
    if errorlevel 1 goto :download_error
) else (
    echo Qwen3 text encoder already exists, skipping.
)

if not exist "models\anima\vae\qwen_image_vae.safetensors" (
    echo Downloading Qwen Image VAE, about 254 MB...
    curl.exe -L -C - --progress-bar -o "models\anima\vae\qwen_image_vae.safetensors" "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors"
    if errorlevel 1 goto :download_error
) else (
    echo VAE already exists, skipping.
)

if not exist "models\anima\dit\anima-base-v1.0.safetensors" (
    echo Downloading Anima base base model, about 4 GB...
    curl.exe -L -C - --progress-bar -o "models\anima\dit\anima-base-v1.0.safetensors" "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors"
    if errorlevel 1 goto :download_error
) else (
    echo Anima Preview 3 base model already exists, skipping.
)

goto :make_launcher

:download_error
echo ERROR: A model download failed.
echo Run this installer again. Downloads resume automatically.
pause
exit /b 1

:make_launcher
rem ------------------------------------------------------------
rem  10. Create launcher
rem ------------------------------------------------------------
echo [10/10] Creating launcher...
(
    echo @echo off
    echo chcp 65001 ^>nul
    echo set PYTHONIOENCODING=utf-8
    echo cd /d "%%~dp0"
    echo if not exist ".venv\Scripts\activate.bat" ^(
    echo     echo ERROR: .venv not found. Run install_anima_preview3_adaptive_windows.bat again.
    echo     pause
    echo     exit /b 1
    echo ^)
    echo call .venv\Scripts\activate.bat
    echo echo Starting Anima base LoRA Trainer at http://127.0.0.1:7860
    echo echo Recommended precision for your GPU was set to: %ANIMA_MIXED_PRECISION%
    echo python app.py
    echo pause
) > run_anima_base_windows.bat

echo.
echo ============================================================
echo  INSTALL COMPLETE!
echo ============================================================
echo.
echo GPU: %ANIMA_GPU_NAME%
echo Driver: %ANIMA_DRIVER_VERSION%
echo PyTorch CUDA build: %ANIMA_TORCH_CUDA%
echo Default mixed precision: %ANIMA_MIXED_PRECISION%
echo.
echo For GTX 10-series cards, keep resolution low, batch size 1,
echo and use fp16. GTX 1060 6GB can be very slow but may work.
echo GTX 1060 3GB is not realistic for this trainer.
echo.
echo Opening the trainer now...
echo When Gradio starts, open: http://127.0.0.1:7860
echo.
call run_anima_base_windows.bat
