Crack Lua Psycho src leak

Забаненный
Статус
Оффлайн
Регистрация
7 Авг 2022
Сообщения
10
Реакции[?]
3
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Данный скрипт не проверялся модераторами, так как является кряком приватной LUA и в нём может присутствовать обфускация. Даже известные пользователи могут выложить вредоносный скрипт под видом крякнутого, поэтому любое использование исключительно на свой страх и риск.

Credits: Hellfish#9343
смертрет
code_language.lua:
EngineClient.ExecuteClientCmd("clear")

--██╗░░██╗███████╗██╗░░░░░██╗░░░░░███████╗██╗░██████╗██╗░░██╗░░░██╗░██╗░░█████╗░██████╗░░░██╗██╗██████╗░
--██║░░██║██╔════╝██║░░░░░██║░░░░░██╔════╝██║██╔════╝██║░░██║██████████╗██╔══██╗╚════██╗░██╔╝██║╚════██╗
--███████║█████╗░░██║░░░░░██║░░░░░█████╗░░██║╚█████╗░███████║╚═██╔═██╔═╝╚██████║░█████╔╝██╔╝░██║░█████╔╝
--██╔══██║██╔══╝░░██║░░░░░██║░░░░░██╔══╝░░██║░╚═══██╗██╔══██║██████████╗░╚═══██║░╚═══██╗███████║░╚═══██╗
--██║░░██║███████╗███████╗███████╗██║░░░░░██║██████╔╝██║░░██║╚██╔═██╔══╝░█████╔╝██████╔╝╚════██║██████╔╝
--╚═╝░░╚═╝╚══════╝╚══════╝╚══════╝╚═╝░░░░░╚═╝╚═════╝░╚═╝░░╚═╝░╚═╝░╚═╝░░░░╚════╝░╚═════╝░░░░░░╚═╝╚═════╝░

ffi.cdef[[
    typedef struct
    {
        uint8_t r;
        uint8_t g;
        uint8_t b;
        uint8_t a;
    } uint_colors_t;


    typedef void*(__thiscall* c_entity_list_get_client_entity_t)(void*, int);
    typedef void (__cdecl* console_color_print)(void*, const uint_colors_t&, const char*, ...);
    typedef uintptr_t (__thiscall* GetClientEntity_4242425_t)(void*, int);

    void* GetProcAddress(void* hModule, const char* lpProcName);
    void* GetModuleHandleA(const char* lpModuleName);

    bool PathFileExistsA(const char* pszPath);
    bool CreateDirectoryA(const char* lpPathName, void* lpSecurityAttributes);
    bool DeleteUrlCacheEntryA(const char* lpszUrlName);
    void* __stdcall URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK);

    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
    void* VirtualAlloc(void* lpAddress, unsigned long dwSize, unsigned long  flAllocationType, unsigned long flProtect);
    int VirtualFree(void* lpAddress, unsigned long dwSize, unsigned long dwFreeType);

    typedef struct
    {
        float x;
        float y;
        float z;
    } Vector_t;

    typedef int16_t WORD;

    typedef struct {
        WORD wYear;
        WORD wMonth;
        WORD wDayOfWeek;
        WORD wDay;
        WORD wHour;
        WORD wMinute;
        WORD wSecond;
        WORD wMilliseconds;
    } SYSTEMTIME;

    void GetLocalTime(SYSTEMTIME* time);

    struct pose_params_t {
        char pad[8];
        float     m_flStart;
        float     m_flEnd;
        float     m_flState;
    };

    typedef struct
    {
        char    pad0[0x60]; // 0x00
        void* pEntity; // 0x60
        void* pActiveWeapon; // 0x64
        void* pLastActiveWeapon; // 0x68
        float        flLastUpdateTime; // 0x6C
        int            iLastUpdateFrame; // 0x70
        float        flLastUpdateIncrement; // 0x74
        float        flEyeYaw; // 0x78
        float        flEyePitch; // 0x7C
        float        flGoalFeetYaw; // 0x80
        float        flLastFeetYaw; // 0x84
        float        flMoveYaw; // 0x88
        float        flLastMoveYaw; // 0x8C // changes when moving/jumping/hitting ground
        float        flLeanAmount; // 0x90
        char    pad1[0x4]; // 0x94
        float        flFeetCycle; // 0x98 0 to 1
        float        flMoveWeight; // 0x9C 0 to 1
        float        flMoveWeightSmoothed; // 0xA0
        float        flDuckAmount; // 0xA4
        float        flHitGroundCycle; // 0xA8
        float        flRecrouchWeight; // 0xAC
        Vector_t        vecOrigin; // 0xB0
        Vector_t        vecLastOrigin;// 0xBC
        Vector_t        vecVelocity; // 0xC8
        Vector_t        vecVelocityNormalized; // 0xD4
        Vector_t        vecVelocityNormalizedNonZero; // 0xE0
        float        flVelocityLenght2D; // 0xEC
        float        flJumpFallVelocity; // 0xF0
        float        flSpeedNormalized; // 0xF4 // clamped velocity from 0 to 1
        float        flRunningSpeed; // 0xF8
        float        flDuckingSpeed; // 0xFC
        float        flDurationMoving; // 0x100
        float        flDurationStill; // 0x104
        bool        bOnGround; // 0x108
        bool        bHitGroundAnimation; // 0x109
        char    pad2[0x2]; // 0x10A
        float        flNextLowerBodyYawUpdateTime; // 0x10C
        float        flDurationInAir; // 0x110
        float        flLeftGroundHeight; // 0x114
        float        flHitGroundWeight; // 0x118 // from 0 to 1, is 1 when standing
        float        flWalkToRunTransition; // 0x11C // from 0 to 1, doesnt change when walking or crouching, only running
        char    pad3[0x4]; // 0x120
        float        flAffectedFraction; // 0x124 // affected while jumping and running, or when just jumping, 0 to 1
        char    pad4[0x208]; // 0x128
        float        flMinBodyYaw; // 0x330
        float        flMaxBodyYaw; // 0x334
        float        flMinPitch; //0x338
        float        flMaxPitch; // 0x33C
        int            iAnimsetVersion; // 0x340
    } CCSGOPlayerAnimationState_534535_t;
    int CreateDirectoryA(const char*, void*);
    void* CreateFileA(const char*, uintptr_t, uintptr_t, void*, uintptr_t, uintptr_t, void*);
    uintptr_t GetFileSize(void*, uintptr_t*);
    int ReadFile(void*, void*, uintptr_t, uintptr_t*, void*);
    int CloseHandle(void*);

    typedef int(__thiscall* get_clipboard_text_length)(void*);
    typedef void(__thiscall* set_clipboard_text)(void*, const char*, int);
    typedef void(__thiscall* get_clipboard_text)(void*, int, const char*, int);

    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
    void* VirtualAlloc(void* lpAddress, unsigned long dwSize, unsigned long  flAllocationType, unsigned long flProtect);
    int VirtualFree(void* lpAddress, unsigned long dwSize, unsigned long dwFreeType);
]]

local json = Panorama.LoadString([[
    return {
        parse: JSON.parse,
        stringify: JSON.stringify
    };
]])()

local ffi_functions = {}

ffi_functions.animstate_offset = 0x9960
ffi_functions.interface_type = ffi.typeof("uintptr_t**")
ffi_functions.bind_argument = function(r_function, arg)
    return function(...)
        return r_function(arg, ...)
    end
end

ffi_functions.engine_cvars = Utils.CreateInterface("vstdlib.dll", "VEngineCvar007")
ffi_functions.cvar_interface = ffi.cast(ffi_functions.interface_type, ffi_functions.engine_cvars)
ffi_functions.color_print = ffi.cast("console_color_print", ffi_functions.cvar_interface[0][25])

local color_print = function(text, color)
    local new_color = ffi.new("uint_colors_t")
    local rgba_table = {"r", "g", "b", "a"}

    for index, current_color in ipairs(rgba_table) do
        new_color[current_color] = color[current_color] * 255
    end
   
    local stringed_text = tostring(text)
    ffi_functions.color_print(ffi_functions.cvar_interface, new_color, stringed_text)
end

ffi_functions.interface_type = ffi.typeof('uintptr_t**')
ffi_functions.cvar_interface = ffi.cast(ffi_functions.interface_type, Utils.CreateInterface('vstdlib.dll', 'VEngineCvar007'))
ffi_functions.print = ffi.cast('console_color_print', ffi_functions.cvar_interface[0][25])

ffi_functions.color_print1 = function(color, text)
    if color == nil then return end
    if text == nil then return end
    local col = ffi.new('uint_colors_t')
    if col == nil then return end
    col.r = color.r * 255
    col.g = color.g * 255
    col.b = color.b * 255
    col.a = color.a * 255
    ffi_functions.print(ffi_functions.cvar_interface, col, text)
end

ffi_functions.i_client_entity_list = ffi.cast(ffi_functions.interface_type, Utils.CreateInterface("client.dll", "VClientEntityList003"))
ffi_functions.get_client_entity = ffi_functions.bind_argument(ffi.cast("c_entity_list_get_client_entity_t", ffi_functions.i_client_entity_list[0][3]), ffi_functions.i_client_entity_list)

local pose_parameter_pattern = "55 8B EC 8B 45 08 57 8B F9 8B 4F 04 85 C9 75 15"
ffi_functions.get_pose_parameters = ffi.cast( "struct pose_params_t*(__thiscall* )( void*, int )", Utils.PatternScan( "client.dll", pose_parameter_pattern))

ffi_functions.client_entity_list = Utils.CreateInterface("client.dll", "VClientEntityList003")
ffi_functions.entity_list_pointer = ffi.cast("void***", ffi_functions.client_entity_list)

ffi_functions.get_client_entity_fn = ffi.cast("GetClientEntity_4242425_t", ffi_functions.entity_list_pointer[0][3])
ffi_functions.get_entity_address = function(ent_index)
    local addr = ffi_functions.get_client_entity_fn(ffi_functions.entity_list_pointer, ent_index)
    return addr
end

local engine_client = Utils.CreateInterface('engine.dll', 'VEngineClient014')
local interfacePointer = ffi.typeof('void***')
local netChannelBool = ffi.typeof('bool(__thiscall*)(void*)')
local netChannelBoolWithArgs = ffi.typeof('bool(__thiscall*)(void*, int, int)')
local netChannelFloat = ffi.typeof('float(__thiscall*)(void*, int)')
local netChannelInt = ffi.typeof('int(__thiscall*)(void*, int)')
local netChannelFramerate = ffi.typeof('void(__thiscall*)(void*, float*, float*, float*)')

local I_EngineClientPtr = ffi.cast(interfacePointer, engine_client) or error('engine_client is nil', 2)
local getNetChannelInfo = ffi.cast('void*(__thiscall*)(void*)', I_EngineClientPtr[0][78]) or error('I_EngineClientPtr is nil')

function GetNetChannel(netChannelInfo)
    if netChannelInfo == nil then
        return
    end

    local SequenceNr = ffi.cast(netChannelInt, netChannelInfo[0][17])(netChannelInfo, 1)

    return {
        SequenceNr = SequenceNr,

        IsLoopback = ffi.cast(netChannelBool, netChannelInfo[0][6])(netChannelInfo),
        IsTimingOut = ffi.cast(netChannelBool, netChannelInfo[0][7])(netChannelInfo),

        Latency = {
            RTT = function(flow) return ffi.cast(netChannelFloat, netChannelInfo[0][9])(netChannelInfo, flow) end,
            AvgLatency = function(flow) return ffi.cast(netChannelFloat, netChannelInfo[0][10])(netChannelInfo, flow) end,
        },

        AvgLoss = ffi.cast(netChannelFloat, netChannelInfo[0][11])(netChannelInfo, 1),
        AvgChoke = ffi.cast(netChannelFloat, netChannelInfo[0][12])(netChannelInfo, 1),
        InputBytes = ffi.cast(netChannelFloat, netChannelInfo[0][13])(netChannelInfo, 1),
        SendBytes = ffi.cast(netChannelFloat, netChannelInfo[0][13])(netChannelInfo, 0),

        IsValidPacket = ffi.cast(netChannelBoolWithArgs, netChannelInfo[0][18])(netChannelInfo, 1, SequenceNr-1),
    }
end

hitlogs = {}
safety = 0
hit_id = -1
shot_id = 0
hit_ids = 0
total_hits = 0

ffi_functions.open_link = function(link)
    local panorama_handle = Panorama.Open()
    local steam_overlay_API = panorama_handle.SteamOverlayAPI
    local open_external_browser_url = steam_overlay_API.OpenExternalBrowserURL
   
    open_external_browser_url(link)
end
ffi_functions.urlmon = ffi.load('UrlMon')
ffi_functions.wininet = ffi.load('WinInet')
ffi_functions.download_file_from_url = function(from, to)
    ffi_functions.wininet.DeleteUrlCacheEntryA(from)
    ffi_functions.urlmon.URLDownloadToFileA(nil, from, to, 0,0)
end

ffi_functions.ct = ffi.typeof('char[?]')
ffi_functions.c_invalid_handle_value = ffi.cast('void*', -1)
local cfg_system = {}
package.loaded.readfile = function(filename)
    local fp = ffi.C.CreateFileA(filename, 0x80000000, 3, nil, 3, 128, nil)
    if ffi_functions.c_invalid_handle_value ~= fp then
        local size = ffi.C.GetFileSize(fp, nil)
        local buf = ffi_functions.ct(size + 1)
        ffi.C.ReadFile(fp, buf, size, nil, nil)
        ffi.C.CloseHandle(fp)
        return ffi.string(buf, size)
    end
end

local img_bytes = '\xFF\xD8\xFF\xDB\x00\x43\x00\x06\x04\x05\x06\x05\x04\x06\x06\x05\x06\x07\x07\x06\x08\x0A\x10\x0A\x0A\x09\x09\x0A\x14\x0E\x0F\x0C\x10\x17\x14\x18\x18\x17\x14\x16\x16\x1A\x1D\x25\x1F\x1A\x1B\x23\x1C\x16\x16\x20\x2C\x20\x23\x26\x27\x29\x2A\x29\x19\x1F\x2D\x30\x2D\x28\x30\x25\x28\x29\x28\xFF\xDB\x00\x43\x01\x07\x07\x07\x0A\x08\x0A\x13\x0A\x0A\x13\x28\x1A\x16\x1A\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\xFF\xC0\x00\x11\x08\x00\xB8\x00\xB8\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xFF\xC4\x00\x1B\x00\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x08\x07\x05\x06\x03\x01\xFF\xC4\x00\x43\x10\x00\x01\x03\x02\x01\x09\x05\x05\x03\x08\x0B\x00\x00\x00\x00\x00\x00\x01\x02\x04\x03\x05\x11\x06\x15\x21\x35\x54\x73\x93\xB2\xD1\x07\x12\x13\x31\x41\x08\x14\x51\x61\x71\x16\x22\xA1\x17\x23\x52\x56\x81\x91\x92\xA2\x25\x27\x33\x55\x62\x72\x94\x95\xB3\xC1\xD2\xFF\xC4\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xC4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xDA\x00\x0C\x03\x01\x00\x02\x11\x03\x11\x00\x3F\x00\xE2\xB7\x19\xB2\xE8\xDC\x24\xD2\xA3\x26\xBD\x3A\x6C\xAA\xE6\xB5\xAD\xA8\xA8\x88\x88\xAB\xF3\x26\xCE\x33\xB6\xD9\x3C\x57\x75\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x02\xAC\xE3\x3B\x6D\x93\xC5\x77\x51\x9C\x67\x6D\xB2\x78\xAE\xEA\x4A\x00\xAB\x38\xCE\xDB\x64\xF1\x5D\xD4\x67\x19\xDB\x6C\x9E\x2B\xBA\x92\x80\x2A\xCE\x33\xB6\xD9\x3C\x57\x75\x19\xC6\x76\xDB\x27\x8A\xEE\xA4\xA0\x0A\xB3\x8C\xED\xB6\x4F\x15\xDD\x46\x71\x9D\xB6\xC9\xE2\xBB\xA9\x28\x02\xAC\xE3\x3B\x6D\x93\xC5\x77\x51\x9C\x67\x6D\xB2\x78\xAE\xEA\x4A\x00\xAB\x38\xCE\xDB\x64\xF1\x5D\xD4\x67\x19\xDB\x6C\x9E\x2B\xBA\x92\x80\x2A\xCE\x33\xB6\xD9\x3C\x57\x75\x19\xC6\x76\xDB\x27\x8A\xEE\xA4\xA0\x0A\xB3\x8C\xED\xB6\x4F\x15\xDD\x46\x71\x9D\xB6\xC9\xE2\xBB\xA9\x28\x02\xAC\xE3\x3B\x6D\x93\xC5\x77\x51\x9C\x67\x6D\xB2\x78\xAE\xEA\x4A\x00\xAB\x38\xCE\xDB\x64\xF1\x5D\xD4\x67\x19\xDB\x6C\x9E\x2B\xBA\x92\x80\x3D\x3B\x74\xD9\x75\xAE\x11\xA9\x56\x93\x5E\xA5\x37\xD5\x6B\x5C\xD7\x54\x55\x45\x45\x54\xF9\x82\x6B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x0F\x6B\x25\x32\x5E\xEF\x95\x57\x14\x85\x64\x88\xFA\xEF\x4C\x16\xA3\xD7\x43\x29\x27\xC5\xCE\xF4\x4F\xC5\x7D\x31\x03\xC5\x06\x90\xC9\x9E\xC0\x2D\x94\x29\x32\xA6\x51\xDC\x6B\x4B\x91\x86\x2B\x4A\x2E\x14\xE9\xA2\xFA\xA7\x79\x51\x5C\xEF\xAE\x83\xEB\x5B\xD8\xE6\x42\xB5\xA8\x8B\x64\x57\x2A\x79\xAA\xCB\xAF\x8A\xFF\x00\x38\x19\x08\x1A\x82\xF9\xD8\x2E\x4D\xCC\xA6\xAB\x6A\x93\x36\xDD\x5B\x0F\xBB\xF7\x92\xB3\x3F\x6B\x5D\xA5\x7F\x62\xA1\xC4\xF2\xF7\xB3\x7B\xEE\x46\x3B\xC5\x9B\x49\x24\xDB\x95\x70\x6C\xCA\x18\xAB\x31\xF4\x47\x26\x18\xB5\x7E\xBA\x3E\x0A\xA0\x7C\x58\x00\x00\x00\x00\x00\x00\x00\x0A\xAD\x3A\xD6\x16\xF9\x9C\xC8\x05\xA7\x5A\xC2\xDF\x33\x99\x00\x0B\xB6\xB5\x9B\xBE\x7F\x32\x92\x95\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\x00\x00\x00\x00\x00\x00\x0F\x6F\x23\x32\x72\x5E\x55\xE5\x1C\x4B\x4C\x1F\xBA\xFA\xCE\xC5\xF5\x15\x31\x4A\x4C\x4D\x2E\x72\xFD\x3F\x15\xD0\x6C\xAC\x92\xC9\xBB\x76\x4A\xD9\x68\xDB\x6D\x34\x51\x94\x98\x88\xAF\x7A\xA2\x77\xEA\xBF\x0C\x15\xCE\x5F\x55\x5C\x3F\xE9\x34\x1C\xAF\xD9\x86\xC2\xC8\xF6\x1B\x8D\xF2\xA3\x3F\x3F\x2E\xAF\xBB\xD3\x55\xF4\xA6\xC4\x45\x5C\x3E\xAE\x5F\xE5\x3B\x68\x00\x71\x4E\xDB\xFB\x52\x97\x93\xF3\x56\xC1\x93\x8F\x65\x39\xE8\xC4\x74\x99\x2A\x88\xE5\xA2\x8A\x98\xA3\x5A\x9F\xA5\x82\xE3\x8A\xA6\x84\x5D\x1A\x7C\xB8\x0C\x8C\xA4\xBE\x48\xAE\xB5\xEB\xDE\x2E\x2F\xAC\xAB\x8F\x7D\xD2\x5E\xAB\x8F\xD7\x10\x37\x49\xF9\xC9\xA1\x4A\x54\x7A\x91\xE4\xD2\xA7\x5A\x85\x56\xAB\x5F\x4E\xA3\x51\x5A\xE4\x54\xC1\x51\x53\xD5\x0C\xCB\xD9\x87\x6C\x77\x3B\x54\xFA\x30\x72\xA2\x4D\x49\xF6\xAA\x8A\x8D\x5A\xF5\x55\x5D\x56\x82\xF9\x77\x95\xDE\x6E\x6F\xC5\x17\x15\xF8\x7C\x17\x4E\xB1\xED\x7B\x1A\xF6\x39\x1C\xD5\x44\x72\x2B\x57\x14\x54\xF3\xC5\x14\x0C\x97\xDB\x5F\x67\xFF\x00\x63\xAF\x2C\x95\x6E\x6A\xAD\x96\x6B\x97\xC2\x45\xC5\x56\x8B\xFD\x69\xAA\xFC\x3D\x51\x57\xD3\xE9\x89\xCD\x8D\xA5\xDA\xAD\x85\x99\x45\x90\x77\x68\x4A\xDE\xF5\x66\x52\x5A\xF4\x17\xD5\x2A\x31\x3B\xCD\xC3\xE1\x8E\x0A\x9F\x45\x31\x68\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x1A\xE3\xB0\x79\x11\xA9\x76\x55\x65\x6B\xEB\x51\x63\xD5\x6B\xAB\x91\x5C\x88\xB8\xF8\xEF\xF3\xD3\xF0\xC0\xFB\xEF\x7D\x8B\xB4\xD1\xFE\x34\xEA\x60\x90\x07\xAF\x96\x13\x9D\x72\xCA\xBB\xC4\xD7\xBB\xBE\xB5\xE5\xD5\x7A\x2E\x38\xA6\x0A\xE5\xC1\x11\x7E\x18\x68\x3C\x80\x00\x1B\x4F\xB2\x9A\xD5\xEB\xF6\x71\x93\xCF\x93\x8F\x89\xEE\x6C\x6E\x2B\xE6\xAD\x44\xC1\xAB\xFB\x91\x0C\xA1\xD9\xFE\x4A\x4B\xCB\x1C\xA5\x8F\x6C\x8A\x8A\xDA\x4A\xBD\xF9\x15\x91\x34\x51\xA6\x8A\x9D\xE7\x7D\x7D\x11\x3D\x54\xDA\x90\x62\xD1\x83\x0A\x3C\x48\xAC\x46\x50\xA1\x4D\xB4\xA9\xB1\x3C\x9A\xC6\xA2\x22\x27\xE0\x07\xEA\xE6\xA3\x9A\xAD\x72\x23\x9A\xE4\xC1\x51\x74\xA2\xA1\x80\x8D\xC9\x96\xB7\x76\x58\xB2\x4A\xEF\x72\x7B\x91\xAB\x1E\x33\xDC\xD5\x5D\x18\xBF\x0C\x18\x9F\xB5\xCA\xD4\x30\xD8\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x00\x03\xF5\x8B\x1E\xB4\xB9\x54\x63\xC5\xA6\xFA\xB2\x2A\xBD\x29\xD3\xA6\xC4\xC5\x5E\xE5\x5D\x08\x89\xEA\xB8\xA9\xF9\x1A\x1F\xD9\xDB\x20\x7C\x0A\x4D\xCA\xBB\xB5\x1F\xCE\xD4\x6A\xA4\x0A\x6F\x4D\x2D\x6F\xAD\x5C\x3E\x2B\xE4\x9F\x2C\x57\xD5\x00\xE8\x5D\x94\x64\x4D\x1C\x8A\xC9\xB6\x50\x7A\x31\xF7\x39\x18\x54\x97\x55\xBA\x71\x7E\x1A\x1A\x8B\xFA\x2D\xC7\x0F\x9E\x95\xF5\x3E\xD4\x1C\xD7\xB6\xDC\xBE\x4C\x91\xB1\xFB\x9D\xBE\xA7\xF4\xD4\xE6\x2B\x69\x61\xE7\x45\x9E\x4B\x51\x7E\x7E\x89\xF3\xD3\xE8\xA0\x73\x9F\x68\xAC\xBA\x65\xCA\x62\x64\xC5\xB2\xA7\x7A\x34\x5A\x9D\xE9\x75\x1A\xBA\x1F\x55\x31\xC1\x89\xF2\x6E\x3A\x7E\x7F\xE5\x38\x89\xFD\x73\x95\xCE\x57\x39\x55\xCE\x72\xE2\xAA\xBA\x55\x57\xE2\xA7\xF0\x00\x00\x00\x00\x00\x00\x0A\xAD\x3A\xD6\x16\xF9\x9C\xC8\x05\xA7\x5A\xC2\xDF\x33\x99\x00\x0B\xB6\xB5\x9B\xBE\x7F\x32\x92\x95\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\x00\x00\x00\x00\x00\x00\x00\x00\x0F\xA1\xEC\xFA\xC6\xDC\xA4\xCB\x4B\x45\xA6\xA6\x3E\x0C\x8A\xC9\xE2\xA2\x79\xAD\x36\xA2\xB9\xE8\x8B\xF1\xEE\xB5\x4D\xB7\x4A\x9B\x28\xD2\x65\x3A\x4C\x46\x53\x63\x51\xAD\x6B\x53\x04\x6A\x22\x60\x88\x89\xE8\x98\x19\x2B\xD9\xED\x3F\xAD\x2B\x6E\xEA\xB7\xFC\x6E\x35\xB8\x1E\x36\x58\x65\x14\x3C\x95\xC9\xE9\x57\x6B\x82\xE3\x4A\x8B\x7E\xEB\x11\x70\x5A\xAF\x5D\x0D\x6A\x7C\xD5\x7F\x72\x69\xF4\x31\x76\x53\xDF\x66\xE5\x25\xF2\x55\xD6\xE5\x53\xBF\x22\x43\xFB\xCA\x89\x8E\x0C\x4F\x24\x6B\x53\xD1\x11\x34\x1D\xD7\xDA\xA6\x5B\xD9\x6B\xC9\xE8\x68\xE5\x46\x55\xAD\x5A\xB2\xB7\xD1\x55\x8D\x6A\x22\xAF\xF1\xA9\x9D\x80\x00\x00\x00\x00\x00\x00\x00\x00\xAA\xD3\xAD\x61\x6F\x99\xCC\x80\x5A\x75\xAC\x2D\xF3\x39\x90\x00\xBB\x6B\x59\xBB\xE7\xF3\x29\x29\x55\xDB\x5A\xCD\xDF\x3F\x99\x49\x40\x00\x00\x00\x00\x00\x00\x00\x00\xFB\xAE\xC5\x2E\xD0\x6C\xBD\xA1\x41\x9B\x75\x93\x4E\x34\x46\x53\xAC\x8E\xAB\x53\x42\x22\xAD\x35\x44\xFC\x54\xD2\xBF\x94\xBC\x8D\xFD\x61\x83\xFC\x4B\xD0\xC6\x00\x0E\xCF\xED\x1B\x94\xD6\x6C\xA2\xFB\x3D\x99\x2E\x34\x66\xF8\x1E\xF1\xE2\xF8\x6A\xAB\xDC\xEF\x78\x5D\xDC\x74\x7F\x85\x4E\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x00\x1D\x0F\xB0\x3A\x14\x64\xF6\x9B\x6F\xA5\x26\x95\x3A\xB4\xD6\x9D\x65\x56\x54\x6A\x39\x17\xF3\x6A\xA9\xA0\xD5\x79\x96\xD5\xFD\xD9\x07\xFD\x3B\x7A\x19\x3F\xB0\xC9\xF0\xED\xBD\xA4\x40\x93\x71\x97\x1E\x24\x66\xD3\xAC\x8E\xAB\x5E\xA2\x53\x62\x2A\xD3\x54\x44\x57\x2A\xA2\x26\x93\x50\x7D\xB5\xC9\x6F\xD6\x5B\x27\xFB\x85\x2F\xFD\x01\xC6\x3D\xA8\xA1\x44\x87\xF6\x67\xDD\x23\x51\xA1\xDE\xF7\xAE\xF7\x86\xC4\x6F\x7B\xFB\x2C\x31\xC1\x34\xF9\x9C\x20\xED\xFE\xD2\xF7\xAB\x55\xE3\xEC\xE6\x68\xB9\xC1\x9F\xE1\x7B\xCF\x89\xEE\xB2\x1B\x57\xB9\x8F\x85\x87\x7B\xBA\xAB\x86\x38\x2F\x9F\xC0\xE2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\xD6\xB0\xB7\xCC\xE6\x40\x2D\x3A\xD6\x16\xF9\x9C\xC8\x00\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\xAA\xED\xAD\x66\xEF\x9F\xCC\xA4\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\xD6\xB0\xB7\xCC\xE6\x40\x2D\x3A\xD6\x16\xF9\x9C\xC8\x00\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\xAA\xED\xAD\x66\xEF\x9F\xCC\xA4\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\xD6\xB0\xB7\xCC\xE6\x40\x2D\x3A\xD6\x16\xF9\x9C\xC8\x00\xA6\xE3\x0A\x5D\x6B\x84\x9A\xB4\x63\x57\xA9\x4D\xF5\x5C\xE6\xB9\xB4\xD5\x51\x51\x55\x7E\x44\xD9\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x01\x4D\xBA\x14\xBA\x37\x08\xD5\x6B\x46\xAF\x4E\x9B\x2A\xB5\xCE\x73\xA9\xAA\x22\x22\x2A\x7C\x80\x00\x7F\xFF\xD9'
local globals = {
    screen_size = EngineClient.GetScreenSize(),
    username = Cheat.GetCheatUserName(),
    avatar = Render.LoadImage(Http.Get(string.format("https://neverlose.cc/static/avatars/%s.png", Cheat.GetCheatUserName())), Vector2.new(64, 164)),
    default_avatar = Render.LoadImage(img_bytes, Vector2.new(64, 64)),
    local_player,
    autopeek = false,
    autopeekq = false,
    zero_vec = Vector.new(0,0,0),
    autopeek_pos = Vector.new(0,0,0)
}
local shell32 = ffi.load "Shell32"
local smallest_pixel_7_link = "https://cdn.discordapp.com/attachments/897931346373128274/936931900059156500/smallest_pixel-7.ttf"
local arrows_font = "https://cdn.discordapp.com/attachments/976869884464095232/976876821796761710/arrows.ttf"
local indicator_logo = "https://cdn.discordapp.com/attachments/984436727475240960/987625219910959134/pngwing.png"
local avatar_logo = "https://cdn.discordapp.com/attachments/984414333662539837/986556441710186516/unknown.png"
local avatar2_logo = "https://cdn.discordapp.com/attachments/399443531560648714/986875005231063060/logo.png"
local background = "https://cdn.discordapp.com/attachments/717467105703886908/974324754880299039/background.png"
local files_dowloaded = false
local cache_size = Render.GetMenuSize()
local image_size = Vector2.new(cache_size.x * 3, cache_size.y * 3)
if package.loaded.readfile('nl\\psycho\\fonts\\smallest-pixel-7.ttf') and package.loaded.readfile('nl\\psycho\\fonts\\arrows.ttf') and package.loaded.readfile('nl\\psycho\\fonts\\pngwing.png') and package.loaded.readfile('nl\\psycho\\fonts\\unknown.png') and package.loaded.readfile('nl\\psycho\\fonts\\logo.png') then
    files_dowloaded = true
else
    files_dowloaded = false
    ffi.C.CreateDirectoryA('nl\\psycho\\', NULL)
    ffi.C.CreateDirectoryA('nl\\psycho\\fonts\\', NULL)
    ffi.C.CreateDirectoryA('nl\\psycho\\png\\', NULL)

    ffi_functions.download_file_from_url(smallest_pixel_7_link, 'nl\\psycho\\fonts\\smallest-pixel-7.ttf')
    ffi_functions.download_file_from_url(arrows_font, 'nl\\psycho\\fonts\\arrows.ttf')
    ffi_functions.download_file_from_url(indicator_logo, 'nl\\psycho\\png\\pngwing.png')
    ffi_functions.download_file_from_url(avatar_logo, 'nl\\psycho\\png\\unknown.png')
    ffi_functions.download_file_from_url(avatar2_logo, 'nl\\psycho\\png\\logo.png')
    ffi_functions.download_file_from_url(background, 'nl\\psycho\\png\\background.png')
    files_dowloaded = true
end

if files_dowloaded then
    globals.indicator_avatar = Render.LoadImageFromFile("nl\\psycho\\png\\pngwing.png", Vector2.new(150, 150))
    globals.logo_avatar = Render.LoadImageFromFile("nl\\psycho\\png\\pngwing.png", Vector2.new(64, 64))
    globals.logo_avatar2 = Render.LoadImageFromFile("nl\\psycho\\png\\logo.png", Vector2.new(64, 64))
    globals.background = Render.LoadImageFromFile("nl\\psycho\\png\\background.png", image_size)

end

local _state = {"Stand","Move","Slow walk","Duck","Air","Crouch in Air"}
local __state = {"[1]","[2]","[3]","[4]","[5]","[6]"}

local ui = {
    global = {
        default_cfg = Menu.Button('Main', 'Config System', 'Load Default Config', ''),
        export_cfg = Menu.Button('Main', 'Config System', 'Export Config', ''),
        import_cfg = Menu.Button('Main', 'Config System', 'Import Config', ''),
        information = Menu.Text('Main', 'Information', 'Welcome, ' ..globals.username),
        information1 = Menu.Text('Main', 'Information', 'Current build: stable'),
        information2 = Menu.Text('Main', 'Information', 'Last update date: 18.06.2022'),


    },

    ragebot = {
        ragebot_enable = Menu.Switch("Ragebot", 'Ragebot', 'Enable Ragebot', false),
        Teleport_In_Air = Menu.Switch("Ragebot", 'Main', 'Teleport In Air', false),
        tp_in_air = Menu.MultiCombo('Ragebot', 'Main', 'Auto Teleport in Air', {'AWP', 'AutoSnipers', 'Scout', 'Deagle', 'Revolver', 'Nades', 'Other', 'Pistols', 'Rifle/LMG', 'SMG', 'Shotgun', 'Taser'}, 0),
        dormant_aimbot = Menu.Switch("Ragebot", 'Main', 'Dormant Aimbot', false),
        dormant_aimbot_damage = Menu.SliderInt("Ragebot", 'Main', 'Minimum Damage', 5, 1, 100),
        override_doubletap = Menu.Switch("Ragebot", "Helpers", "Enable Doubletap Customization", false),
        doubletap_speed = Menu.SliderInt("Ragebot", "Helpers", "Speed", 13, 13, 18),
        doubletap_recharge = Menu.Switch("Ragebot", "Helpers", "Instant Recharge", false),
        bodyaims = Menu.Switch("Ragebot", "Helpers", "Baim if Enemy hp <", false),
        baimmode = Menu.Combo("Ragebot", "Helpers", "Baim Mode", {"Default", "Prefer", "Force"}, 0),
        baimhp = Menu.SliderInt("Ragebot", "Helpers", "Enemy hp <", 0, 0, 100),
        maxmissed = Menu.Switch("Ragebot", 'Helpers', 'Max. Misses', false, 'After Х misses, script disable head for ragebot.'),
        maxmissed_c = Menu.SliderInt("Ragebot", 'Helpers', 'Max. Misses count', 2, 1, 10),
        hitchances = Menu.MultiCombo("Ragebot", 'Helpers', "Custom Hitchance", {"In-Air", "Noscope"}, 0, "Overrides your hitchance on selected conditions. \n In-Air HitChance Works only for Revolver, Scout. \n No-Scope HitChance works only for Auto."),
        air_hitchance = Menu.SliderInt("Ragebot", 'Helpers', "In-Air Hitchance", 20, 0, 100),
        noscope_hitchance = Menu.SliderInt("Ragebot", 'Helpers', "Noscope Hitchance", 40, 0, 100),
    },

    anti_aims = {
        antiaim_enable = Menu.Switch('Anti-Aim', "Anti-Aim System", 'Enable Anti-Aim', false),
        states_selection = Menu.Combo('Anti-Aim', "Custom Anti-Aim System"," Current states",_state, 0),
        antiaim_helpers = Menu.MultiCombo('Anti-Aim', "Helpers", "Anti-Aim Tweaks", {"HS w/o Fakelags", "Animation Breakers", "Disable on Warmup", "Anti-Backstab", "Edge Yaw"}, 0),
        animbreakers = Menu.MultiCombo('Anti-Aim', 'Helpers', "Anim Breakers", {"On Ground", "Static Legs in Air ", "Pitch 0 on land"}, 0),

    },

    visuals = {
        visuals_enable = Menu.Switch('Visuals', 'Visuals', 'Enable Visuals System', false),
        widgets = Menu.MultiCombo("Visuals", "Main", "Widgets", {"Keybinds", "Spectators", "Watermark", "Panel", 'Indicators', "Logs"}, 0),
        watermark_info = Menu.MultiCombo("Visuals", "Main", "Watermark Info", {"Username", "FPS", "Delay", "Tickrate", "Time"}, 0),
        statepanel_image = Menu.Combo("Visuals", "Main", "Image Type", {"Disable", "Avatar", "Ghosty", "Avatar and Ghosty"}, 0),
        custom_username = Menu.TextBox("Visuals", "Main", "Custom Username", 64, Cheat.GetCheatUserName()),
        theme = Menu.ColorEdit("Visuals", "Main", "Widgets Color", Color.new(1, 1, 1, 0.25)),
        disable_blur = Menu.Switch('Visuals', 'Main', 'Disable Widgets Blur', false),
        disable_background = Menu.Switch('Visuals', 'Main', 'Disable Indicators Background', false),
        log_type = Menu.MultiCombo('Visuals', "Main", 'Logs Type', {'Widgets Style','Defaul Style', 'Console'}, 0),
        indicator_type = Menu.Combo("Visuals", "Main", "Indicator Type", {"Default", "Ghosty"}, 0),
        arrows = Menu.Combo("Visuals", "Main", "Arrows Type", {"Disable", "Default", "Modern", "Classic"}, 0),
        arrows_x = Menu.SliderInt('Visuals', 'Main', 'Arrows X Add', 0, 0, 100),
        ghosty_color = Menu.ColorEdit("Visuals", "Main", "Ghosty Color", Color.new(1, 1, 1, 1)),
        ind_name_color = Menu.ColorEdit("Visuals", "Main", "Indicator Name Color", Color.new(1, 1, 1, 1)),
        ind_state_color = Menu.ColorEdit("Visuals", "Main", "Indicator State Color", Color.new(1, 1, 1, 1)),
        ind_color = Menu.ColorEdit("Visuals", "Main", "Indicator Binds Color", Color.new(1, 1, 1, 1)),
        arrows_color = Menu.ColorEdit("Visuals", "Main", "Arrows Color", Color.new(1, 1, 1, 1)),
        custom_scope = Menu.SwitchColor("Visuals", "Miscellaneous", "Enable Scope Customization ", false, Color.new(1, 1, 1, 1)),
        scope_width = Menu.SliderInt("Visuals", "Miscellaneous", "Scope Lines Width", 80, 0, 300),
        scope_offset = Menu.SliderInt("Visuals", "Miscellaneous", "Scope Lines Offset", 10, 0, 300),
        scope_conditions = Menu.MultiCombo("Visuals", "Miscellaneous", "Scope Conditions", {"Invert Lines", "Disable Animations", "Scope Viewmodel", "Disable Arrows"}, 0),
        desync_circle = Menu.SwitchColor("Visuals", "Miscellaneous", "Enable Desync Circle", false, Color.new(0.57, 0.57, 1, 1)),
        desync_circle_conditions = Menu.MultiCombo("Visuals", "Miscellaneous", "Circle Conditions", {"Fake Based Color", "Remove Crosshair"}, 0),
        hitmarker = Menu.SwitchColor("Visuals", "Miscellaneous", "Enable Hitmarker", false, Color.RGBA(255, 255, 255)),
        hitmarker_length = Menu.SliderInt("Visuals", "Miscellaneous", "Hitmarker Length", 6, 2, 10),
        gamesense = Menu.Switch("Visuals", "Miscellaneous", "Enable Gamesense Indicators", false),
        gamesense_choose = Menu.MultiCombo("Visuals", "Miscellaneous", "Choose Indicators", {"Min Damage", "Dormant Aimbot", "Ping", "Bomb Info", "LC", "Fakeduck","Doubletap", "Hideshots", "Freestanding", "Force Body", "Safe Points"}, 0),

    },

    world = {
        world_enable = Menu.Switch('World', 'World Customization', 'Enable World Customization', false),
        sunset = Menu.Switch('World', 'World', 'Sunset Mode', false),
        shadow_x = Menu.SliderFloat('World', 'World', 'Sunset X', 0, -200, 200),
        shadow_y = Menu.SliderFloat('World', 'World', 'Sunset Y', 0, -200, 200),
        shadow_z = Menu.SliderFloat('World', 'World', 'Sunset Z', 0, -200, 200),
        shadow_dist = Menu.SliderInt('World', 'World', 'Sunset Distance', 1000, 0, 1500),
        custom_skybox = Menu.SwitchColor("World", 'World', "Custom Skybox Changer", false, Color.RGBA(255, 255, 255)),
        skybox_choose = Menu.TextBox("World", "World", 'Skybox Path', 64, "", "You can found skybox name in csgo/materials/skybox"),
        molly_conditions = Menu.MultiCombo("World", "Miscellaneous", "Molotov Conditions", {"Wireframe", "Ignore-Z"}, 0),
        enable_bloom = Menu.Switch("World", "Miscellaneous",  "Enable Effects", false),
        bloom = Menu.SliderFloat("World", "Miscellaneous",  "Bloom", 0, 0.0, 100.0),
        exposure = Menu.SliderFloat("World", "Miscellaneous", "Exposure", 0, 0.0, 100.0),
        model_ambient = Menu.SliderFloat("World", "Miscellaneous",  "Model Ambient", 0, 0.0, 100.0),
    },

    misc = {
        misc_enable = Menu.Switch("Miscellaneous", "Miscellaneous", "Enable Miscellaneous", false),
        clantag = Menu.Switch("Miscellaneous", "Helpers", "Enable Clantag", false),
        slowwalk_c = Menu.Switch("Miscellaneous", "Helpers", "Custom Slow Walk", false),
        slowwalk_slider = Menu.SliderInt("Miscellaneous", "Helpers", "Custom Speed", 50, 0, 150),
        hitsound = Menu.Switch("Miscellaneous", "Helpers", "Hitsound Customization", false),
        hitsound_direction = Menu.TextBox("Miscellaneous", "Helpers", "Sound Directory", 128, "csgo/sound/name.wav", "csgo/sound/name.wav"),
        hitsound_volume = Menu.SliderFloat("Miscellaneous", "Helpers", "Sound Volume", 1, 0, 1),
        menu_customize = Menu.Switch("Main","Menu Customization", "Enable Menu Customization", false),
        menu_glow = Menu.Switch("Main","Menu Customization", "Menu Glow", false, "Glow around the Menu."),
        glow_pulse = Menu.Switch("Main","Menu Customization", "Glow Pulse", false),
        color_edit = Menu.ColorEdit("Main","Menu Customization", "Glow Color", Color.RGBA(0, 0, 0, 200), "Pick a color."),
        menu_dim = Menu.Switch("Main", "Menu Customization", "Menu Dim", false, "Dims the Background."),
        dim_slider = Menu.SliderFloat("Main", "Menu Customization", "Dim Intensity:", 0.3, 0.1, 1),
        menu_blur = Menu.Switch("Main", "Menu Customization", "Menu Blur", false, "Blur the Background."),
        blur_slider = Menu.SliderFloat("Main", "Menu Customization", "Blur Intensity:", 0.3, 0.1, 1),
        thirdperson = Menu.Switch("Miscellaneous", "Helpers", "Thirdperson Customization", false),
        thirdperson_anim = Menu.Switch("Miscellaneous", "Helpers", "Disable Thirdperson Animation", false),
        thirdperson_distance = Menu.SliderInt("Miscellaneous", "Helpers", "Distance Value", 100, 0, 300),
        autopeek = Menu.SwitchColor("Miscellaneous", "Helpers", "Auto Peek",false,Color.new(1,0,0,1)),
        color_override = Menu.SwitchColor("Miscellaneous", "Helpers", "Override Color When Work",false, Color.new(0,1,0,1)),
        quick_peek = Menu.Switch("Miscellaneous", "Helpers", "Quick Peek",false),
    },

    refs = {
        slowwalk = Menu.FindVar('Aimbot', 'Anti Aim', 'Misc', 'Slow Walk'),
        minimum_damage = Menu.FindVar('Aimbot', 'Ragebot', 'Accuracy', 'Minimum Damage'),
        doubletap = Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'),
        hideshots = Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'),
        autopeek = Menu.FindVar('Miscellaneous', 'Main', 'Movement', 'Auto Peek'),
        yaw_base = Menu.FindVar('Aimbot', 'Anti Aim', 'Main', 'Yaw Base'),
        invert_side = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Inverter"),
        fakelags = Menu.FindVar("Aimbot", 'Anti Aim',"Fake Lag", "Enable Fake Lag"),
        antiaim = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Enable Anti Aim"),
        fakeduck = Menu.FindVar('Aimbot', 'Anti Aim', 'Misc', 'Fake Duck'),
        safepoints = Menu.FindVar('Aimbot', 'Ragebot', 'Misc', 'Safe Points'),
        bodyaim = Menu.FindVar('Aimbot', 'Ragebot', 'Misc', 'Body Aim'),
        scope = Menu.FindVar("Visuals", "View", "Camera", "Remove Scope"),

        aa_pitch = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Pitch"),
        aa_yaw_base = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Yaw Base"),
        aa_yaw_add = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Yaw Add"),
        aa_yaw_modifier = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Yaw Modifier"),
        aa_yaw_modifier_degree = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Modifier Degree"),
        aa_limit_left = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Left Limit"),
        aa_limit_right = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Right Limit"),
        aa_fake_options = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Fake Options"),
        aa_lby_mode = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "LBY Mode"),
        aa_freestanding_desync = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Freestanding Desync"),
        aa_desync_onshot = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Desync On Shot"),
        aa_fakelag_limit = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Lag", "Limit"),

        legs = Menu.FindVar("Aimbot", 'Anti Aim', "Misc", "Leg Movement"),

        skybox = Menu.FindVar("Visuals", "World", "Main", "SkyBox")
    }
}
ui.anti_aims.custom = {}
for k, v in pairs(_state) do
    ui.anti_aims.custom[k] = {
        enable = Menu.Switch('Anti-Aim', "Custom Anti-Aim System","Enable ".._state[k].. " setting", false),
        extra_options = Menu.MultiCombo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Extra Options", {'[-] Jitter w Choke'}, 0),
        yaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Yaw Built-In",{"Static","Period Jitter [Tick]","Period Jitter [Choke]","Period Jitter [Desync]"}, 0),
        static_yaw = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Yaw Modifier",0, -80,80),
        tick_yaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Tick Yaw Left",0, -80, 0),
        tick_yaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Tick Yaw Right",0, 0, 80),
        choke_yaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Choke Yaw Left",0, -80, 0),
        choke_yaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Choke Yaw Right",0, 0, 80),
        desync_yaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Desync Yaw Left",0, -80, 0),
        desync_yaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Desync Yaw Right",0, 0, 80),
        yaw_jitter = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Psycho Yaw Mode",{ "Off", "Center", "Offset", "Randomized" }, 0),
        yaw_jitter_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Psycho Yaw Jitter",{ "Static", "Randomized" }, 0),
        yaw_jitter_degree = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Jitter Degree [1]",0, 0,120),
        yaw_jitter_degree2 = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Jitter Degree [2]",0, 0,120),
        self_bodyyaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Psycho Body Yaw",{ "Off", "Opposite", "Jitter", "Static"}, 0),
        bodyyaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body Yaw Built-In",{"Off", "Static","Period jitter","Recursion"}, 0),
        bodyyaw_degree = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier",0, -180,180),
        jitter_bodyyaw_degree_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier left [Period]",0, -180,180),
        jitter_bodyyaw_degree_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier right [Period]",0, -180,180),
        body_yaw_step_ticks = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Recursion ticks ",1,0,15),
        body_yaw_step_value = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Recursion value",5,0,180),
        step_bodyyaw_degree_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier min [Recursion]",0,-180,180),
        step_bodyyaw_degree_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier max [Recursion]",0,-180,180),
        fake_yaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Desync Built-In",{"Static","Period Tick Jitter","Gradually Increase"}, 0),
        static_fakeyaw = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Fake Yaw Limit",58, 0,60),
        jitter_fakeyaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Period Limit Left",30, 0,60),
        jitter_fakeyaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Period Limit Right",30,0,60),
        step_ticks = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Gradually Ticks",8, 1,15),
        step_value = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Gradually Value",5, 1,60),
        step_abs = Menu.Switch('Anti-Aim', "Custom Anti-Aim System",__state[k].." Increment Absolute Value",false),
        step_fake_min = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Fake Limit Min",58, 0,60),
        step_fake_max = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Fake Limit Max",58, 0,60),
        freestanding_bodyyaw = Menu.Switch('Anti-Aim', "Custom Anti-Aim System",__state[k].." Freestanding Body Yaw",false)
    }
end

local fonts = {
    verdana = Render.InitFont("Verdana", 11, {"r"}),
    pixel = Render.InitFont("nl\\psycho\\fonts\\smallest-pixel-7.ttf", 9) or error and Render.InitFont('Smallest Pixel-7.ttf', 9),
    verdanabd11 = Render.InitFont('Verdana', 11, {'b'}),
    verdana11 = Render.InitFont('Verdana', 15, {'b'}),
    arrow_fonts = Render.InitFont("nl\\psycho\\fonts\\arrows.ttf", 24),
    arrow_font2 = Render.InitFont("nl\\psycho\\fonts\\arrows.ttf", 16),
    lucida_console = Render.InitFont('lucida console', 10, {'r'}),
    calibrib24 = Render.InitFont('calibri', 24, {'b'})
}

function C_BasePlayer:CanHit() trace_info = Cheat.FireBullet(self, self:GetEyePosition(), EntityList.GetLocalPlayer():GetEyePosition()) if trace_info.damage > 0 and ((trace_info.trace.hit_entity and trace_info.trace.hit_entity:GetPlayer() == EntityList.GetLocalPlayer()) or false) then     return true end return false end
function C_BasePlayer:GetVelocity() first_velocity = self:GetProp('m_vecVelocity[0]') second_velocity = self:GetProp('m_vecVelocity[1]') speed = math.floor(math.sqrt(first_velocity * first_velocity + second_velocity * second_velocity)) return speed end
function C_BasePlayer:GetFlag(shift) return bit.band(self:GetProp('m_fFlags'), bit.lshift(1, shift)) ~= 0 end

stuff = {}
local missgroup_names = { 'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' }
local miss_reason = { '?', 'spread', 'occlusion', 'prediction error' }

-- @region: math
local adjust_angle = function(angle)
    if(angle < 0) then
        angle = (90 + angle * (-1))
    elseif(angle > 0) then
        angle = (90 - angle)
    end
    return angle
end

local function breath(speed, need)
    need = need or 255
       return math.sin(math.abs(-math.pi + ((GlobalVars.curtime) * (speed / .75)) % (math.pi * 2))) * need
end

local function time_to_ticks(a)
    return math.floor(0.5 + a / GlobalVars.interval_per_tick)
end

function round(x)
    return x >= 0 and math.floor(x+0.5) or math.ceil(x-0.5)
end

function yaw_normalize(yaw)
    if yaw > 180 or yaw < -180 then
        local revolutions = round(math.abs(yaw / 360))
        if yaw < 0 then yaw = yaw + 360*revolutions else yaw = yaw - 360*revolutions end
    end
    return yaw
end

local math_lua = {
    dist_to = function(self,a,b)
        local delta_x = a.x - b.x;
        local delta_y = a.y - b.y;
        return self.round(math.sqrt(delta_x^2 + delta_y^2))
    end,
    round = function(a, b)
        local c = 10^(b or 0)
        return math.floor(a*c+0.5)/c
    end,
    clamp = function(x, y, z)
        if x < y then return y
        elseif x > z then return z
        else return x end
    end
}
local animations = {
    lerp = function(a, b, p)
        return a + (b - a) * p
    end
}

local function num_format(b) local c=b%10;if c==1 and b~=11 then return b..'st'elseif c==2 and b~=12 then return b..'nd'elseif c==3 and b~=13 then return b..'rd'else return b..'th'end end
shot_id = 0
hit_ids = 0
total_hits = 0

local normalize_yaw = function(yaw)
    while yaw > 180 do yaw = yaw - 360 end
    while yaw < -180 do yaw = yaw + 360 end
    return yaw
end
-- @endregion

local helpers = {
    fps_update_time = 0,
    fps = 0,

    text_shadow = function(self, text, pos, color, size, font, centered)
        local centered = centered or false
        Render.Text(text, pos + Vector2.new(1, 1), Color.new(0, 0, 0, color.a * 0.75), size, font, false, centered)
        Render.Text(text, pos, color, size, font, false, centered)
    end,

    mouse_in_bounds = function(self, s, e)
        local mouse_pos = Cheat.GetMousePos()
        return mouse_pos.x > s.x and mouse_pos.x < e.x and mouse_pos.y > s.y and mouse_pos.y < e.y
    end,

    lerp = function(self, x, y, perc)
        local perc = perc or 0.1
        return x + (y - x) * perc
    end,

    copy_color = function(self, c)
        return Color.new(c.r, c.g, c.b, c.a)
    end,

    alpha_modulate = function(self, c, a)
        return Color.new(c.r, c.g, c.b, a)
    end,

    get_fps = function(self)
        if GlobalVars.realtime - self.fps_update_time > 0.5 then
            self.fps = 1 / GlobalVars.frametime
        end

        return self.fps
    end,

    get_time = function(self)
        local sys_time = ffi.new("SYSTEMTIME[1]")
        ffi.C.GetLocalTime(sys_time)
        return ('%02d:%02d:%02d'):format(sys_time[0].wHour, sys_time[0].wMinute, sys_time[0].wSecond)
    end,

    clantag_cache = "",

    clantag_fn = ffi.cast('int(__fastcall*)(const char*, const char*)', Utils.PatternScan('engine.dll', '53 56 57 8B DA 8B F9 FF 15')),

    set_clantag = function (self, tag)
        if tag ~= self.clantag_cache then
            self.clantag_fn(tag, tag)

            self.clantag_cache = tag
        end
    end,
}


-- Check/Download Files
local C = ffi.C

ffi.cdef[[
    void*GetModuleHandleA(const char*);
    void*GetProcAddress(void*,const char*);
    bool TerminateThread(void*,unsigned long);
    bool GetExitCodeThread(void*,unsigned long*);
   
    void* __stdcall URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK);
    bool DeleteUrlCacheEntryA(const char* lpszUrlName);
]]

local urlmon = ffi.load("UrlMon")
local wininet = ffi.load("WinInet")
local Winmm = ffi.load("Winmm")

local function Download(from, to)
    wininet.DeleteUrlCacheEntryA(from)
    urlmon.URLDownloadToFileA(nil, from, to, 0,0)
end

local function file_exists(file, path_id)
    local func_file_exists = ffi.cast("bool (__thiscall*)(void*, const char*, const char*)", ffi.cast(ffi.typeof("void***"), Utils.CreateInterface("filesystem_stdio.dll", "VBaseFileSystem011"))[0][10])
    return func_file_exists(ffi.cast(ffi.typeof("void***"), Utils.CreateInterface("filesystem_stdio.dll", "VBaseFileSystem011")), file, path_id)
end

local create_simple_thread = ffi.cast("void*(__cdecl*)(intptr_t, intptr_t, size_t)", C.GetProcAddress(C.GetModuleHandleA("tier0.dll"), "CreateSimpleThread"))
local release_thread_handle = ffi.cast("bool(__cdecl*)(void*)", C.GetProcAddress(C.GetModuleHandleA("tier0.dll"), "ReleaseThreadHandle"))

if not file_exists(EngineClient.GetGameDirectory() .. "\\resource\\glow_background.png", "GAME") then
    Download("https://cdn.discordapp.com/attachments/717467105703886908/974324754880299039/background.png", EngineClient.GetGameDirectory() .. "\\resource\\glow_background.png")
end

local autopeek = {
    is_alive = function(ent)
        return ent:GetProp("m_iHealth") > 0
    end,
    set_movement = function(self,cmd,vec)
        local lc = EntityList.GetLocalPlayer()
        if not lc or not self.is_alive(lc) then return end
        local lc_pos = lc:GetRenderOrigin()
        local angles = EngineClient.GetViewAngles()
        local moveTo_x = lc_pos.x - vec.x
        local moveTo_y = lc_pos.y - vec.y
        local tv_x = -20*(moveTo_x * math.cos(angles.yaw / 180 * math.pi) + moveTo_y * math.sin(angles.yaw / 180 * math.pi))
        local tv_y = 20*(moveTo_y * math.cos(angles.yaw / 180 * math.pi) - moveTo_x * math.sin(angles.yaw / 180 * math.pi))
        cmd.forwardmove = tv_x
        cmd.sidemove = tv_y
    end,
    autopeek_main = function(self,cmd)
        local is_m1 = bit.band(cmd.buttons, 1) == 1
        local is_w = bit.band(cmd.buttons, 8) == 8
        local is_s = bit.band(cmd.buttons, 16) == 16
        local is_r = bit.band(cmd.buttons, 512) == 512
        local is_l = bit.band(cmd.buttons, 1024) == 1024
        globals.lp = EntityList.GetLocalPlayer()
        globals.lp_pos = globals.lp:GetRenderOrigin()
        globals.is_in_air = bit.band(globals.lp:GetProp("m_hGroundEntity"), 1)
        if is_m1 then
            globals.autopeek = true
        end
        if not is_w and not is_s and not is_r and not is_l and math_lua:dist_to(globals.lp_pos,globals.autopeek_pos) > 1 and ui.misc.quick_peek:Get() and ui.misc.misc_enable:Get() then
            globals.autopeekq = true
        else
            globals.autopeekq = false
        end
        if not ui.misc.autopeek:Get() then
            if globals.is_in_air == 1 then
                globals.autopeek_pos = EngineTrace.TraceRay(globals.lp_pos,Vector.new(globals.lp_pos.x, globals.lp_pos.y, globals.lp_pos.z-10000), globals.lp, 0xFFFFFFFF).endpos + globals.zero_vec
            else
                globals.autopeek_pos = globals.lp_pos + globals.zero_vec
            end
            globals.autopeek = false
        else
            if ((globals.autopeek and math_lua:dist_to(globals.lp_pos, globals.autopeek_pos) > 1) or globals.autopeekq) then
                if globals.is_in_air == 0 then
                    self:set_movement(cmd,globals.autopeek_pos)
                end
            else
                globals.autopeek = false
                globals.autopeekq = false
            end
        end
    end,
    ragebot_shot = function(shot)
        globals.autopeek = true
    end,
    paint_function = function(self)
        local lc = EntityList.GetLocalPlayer()
        if not lc or not self.is_alive(lc) then return end
        local ap_c = ui.misc.autopeek:GetColor()
        if ui.misc.color_override:Get() and ui.misc.misc_enable:Get() then
            if globals.autopeek or globals.autopeekq then
                ap_c = ui.misc.color_override:GetColor()
            else
                ap_c = ui.misc.autopeek:GetColor()
            end
        end
        if ui.misc.autopeek:Get() and ui.misc.misc_enable:Get() then
            for i = 1,40 do
                Render.Circle3DFilled(
                    globals.autopeek_pos,
                    60,
                    i/2,
                    Color.new(
                        ap_c.r,
                        ap_c.g,
                        ap_c.b,
                        ap_c.a*0.03),
                    false)
            end
        end
    end
}

-- @region: ragebot
local rage = {}
rage.data = {}

rage.fix_ang = function(angles)
    while angles.pitch < -180.0 do
        angles.pitch = angles.pitch + 360.0
    end
    while angles.pitch > 180.0 do
        angles.pitch = angles.pitch - 360.0
    end

    while angles.yaw < -180.0 do
        angles.yaw = angles.yaw + 360.0
    end
    while angles.yaw > 180.0 do
        angles.yaw = angles.yaw - 360.0
    end

    if angles.pitch > 89.0 then
        angles.pitch = 89.0
    elseif angles.pitch < -89.0 then
        angles.pitch = -89.0
    end
    if angles.yaw > 180.0 then
        angles.yaw = 180.0
    elseif angles.pitch < -180.0 then
        angles.pitch = -180.0
    end

    return angles
end

rage.vec_ang = function(src, dist)
    local forward = dist - src

    if forward.x == 0 and forward.y == 0 then
        local yaw = 0

        if forward.z > 0 then
            pitch = 270
        else
            pitch = 90
        end

    else
        yaw = (math.atan2(forward.y, forward.x) * 180 / math.pi)
        if yaw < 0 then
            yaw = yaw + 360
        end

        tmp = math.sqrt(forward.x * forward.x + forward.y * forward.y)
        pitch = (math.atan2(-forward.z, tmp) * 180 / math.pi)

        if pitch < 0 then
            pitch = pitch + 360
        end

    end

    return rage.fix_ang(QAngle.new(pitch, yaw, 0))
end
rage.modify_velocity = function(cmd, goalspeed)
    local minspeed = math.sqrt((cmd.forwardmove * cmd.forwardmove) + (cmd.sidemove * cmd.sidemove))
    if goalspeed <= 0 or minspeed <= 0 then
        return
    end

    if EntityList.GetLocalPlayer():GetProp('m_flDuckAmount') >= 1 then
        goalspeed = goalspeed * 2.94117647
    end

    if minspeed <= goalspeed then
        return
    end

    local speedfactor = goalspeed / minspeed
    cmd.forwardmove = cmd.forwardmove * speedfactor
    cmd.sidemove = cmd.sidemove * speedfactor
end
rage.roundStarted = 0
rage.player_info_prev = {}
for i = 1, 64 do
    rage.player_info_prev[i] = {
        origin = Vector.new(0, 0, 0),
    }
end


local baim = ui.refs.bodyaim:Get()

rage.baim = function()

    if not ui.ragebot.ragebot_enable:Get() and ui.ragebot.bodyaims:Get() then return end
    local all_players = EntityList.GetEntitiesByName("CCSPlayer")
    for i = 1, #all_players do
        local target = all_players[i]:GetPlayer()
        if target ~= EntityList.GetLocalPlayer() and not target:IsTeamMate() and target:GetProp("m_iHealth") > 0 then

        local me = EntityList.GetClientEntity(EngineClient.GetLocalPlayer()):GetPlayer()
        local weap = target:GetActiveWeapon()

        local hp = target:GetProp('m_iHealth')
            if ui.ragebot.baimmode:Get() == 0 then
                ui.refs.bodyaim:SetInt(baim)
            end
            if weap ~= nil and hp < ui.ragebot.baimhp:GetInt() and ui.ragebot.baimmode:Get() == 1 then
                ui.refs.bodyaim:SetInt(1)
            else
                ui.refs.bodyaim:SetInt(baim)
            end
            if weap ~= nil and hp < ui.ragebot.baimhp:GetInt() and ui.ragebot.baimmode:Get() == 2 then
                ui.refs.bodyaim:SetInt(2)
            else
                ui.refs.bodyaim:SetInt(baim)
            end

        end
    end

end

rage.hitchances = function()

    local accepted_weapons = {
        ["261"] = 1,
        ["242"] = 1,
    }
    local accepted_weapons2 = {
        ["267"] = 1,
        ["46"] = 1,
    }

    local get_enemies = function()
        local ret = {}
        local players = EntityList.GetPlayers()
        for _ , player in pairs(players) do      
            if player:IsTeamMate() or not player:IsAlive() or player:IsDormant() then goto s end

            ret[#ret+1] = player:EntIndex()
            ::s::
        end

        return ret
    end

    if not ui.ragebot.ragebot_enable or ui.ragebot.hitchances == 0 then return end
   
    local i = get_enemies()
    local air_check = bit.band(EntityList.GetLocalPlayer():GetProp("m_fFlags"), 1) == 0 and ui.ragebot.hitchances:Get(1) and EntityList.GetLocalPlayer():GetActiveWeapon() and accepted_weapons2[""..EntityList.GetLocalPlayer():GetActiveWeapon():GetClassID()]
    local wpn_check = ui.ragebot.hitchances:Get(2) and EntityList.GetLocalPlayer():GetProp("m_bIsScoped")==false and EntityList.GetLocalPlayer():GetActiveWeapon() and accepted_weapons[""..EntityList.GetLocalPlayer():GetActiveWeapon():GetClassID()]

    if (not air_check and not wpn_check)  then return end

    for k,v in pairs(i) do
        RageBot.OverrideHitchance(v , (air_check==1 and ui.ragebot.air_hitchance:Get() or ui.ragebot.noscope_hitchance:Get()))
    end
end

rage.ragebot = function(cmd)
    local localplayer = EntityList.GetLocalPlayer()
    if not localplayer or not localplayer:IsAlive() then
        return
    end

    if not ui.ragebot.ragebot_enable:Get() or not ui.ragebot.override_doubletap:Get() then return end

    if ui.ragebot.override_doubletap:Get() then
        Exploits.OverrideDoubleTapSpeed(ui.ragebot.doubletap_speed:Get())  
    end

    if ui.ragebot.doubletap_recharge:Get() then
        Exploits.ForceCharge()
    end

end

rage.dormant_aim = function(cmd)
    if ui.ragebot.dormant_aimbot:GetBool() then
        local lp = EntityList.GetClientEntity(EngineClient.GetLocalPlayer()):GetPlayer()
        if lp == nil then return end
        rage.can_hit_i = false
        rage.choke = false
        local ent = lp:GetActiveWeapon()
        if not ent then return end
        local inaccuracy = 1 / ent:GetInaccuracy(ent)
        if inaccuracy == nil then return end
        local tickcount = GlobalVars.tickcount
        local eyepos = lp:GetEyePosition()
        local simtime = lp:GetProp('m_flSimulationTime')
        local weapon = ent:GetWeaponID()
        local scoped = lp:GetProp('m_bIsScoped')
   
        local onground = bit.band(lp:GetProp('m_fFlags'), bit.lshift(1, 0))
        if tickcount < rage.roundStarted then return end -- to prevent shooting at ghost dormant esp @ the beginning of round
        local is_AWP = weapon == 9
        local is_auto = (weapon == 38 or weapon == 11)
        local is_scout = weapon == 40
        if ent:IsKnife() or ent:IsGrenade() or ent:IsReloading() or weapon == 31 then return end
        local hs_fix = ui.refs.hideshots:GetBool() and 0.3 or 0
        if weapon == 64 then -- for some reason can_shoot returns always false with r8 despite all 3 props being true, no idea why
            rage.can_shoot = simtime > ent:GetProp('m_flNextPrimaryAttack') + hs_fix -- doing this fixes it ><
        elseif ent:IsPistol() and not weapon == 64 and not weapon == 1 then
            rage.can_shoot = false
        else
            rage.can_shoot = simtime > math.max(lp:GetProp('m_flNextAttack') + hs_fix, ent:GetProp('m_flNextPrimaryAttack') + hs_fix, ent:GetProp('m_flNextSecondaryAttack'))
        end
   
        -- new player info
        local players = EntityList.GetEntitiesByName('CCSPlayer')
        rage.player_info = {}
        for i = 1, #players do
            local player = players[i]:GetPlayer()
            if EngineClient.IsConnected() and lp:IsAlive() then
                --if plist_get(player, 'Add to whitelist') then goto skip end
                if player:IsDormant() and not player:IsTeamMate() and player:GetProp('m_iHealth') > 0 and player ~= lp then
                    if player:GetRenderOrigin():Length2D() > ent:GetWeaponRange() then return end
                    rage.origin = player:GetProp('m_vecOrigin')
                    rage.alpha_multiplier = player:GetESPAlpha() -- grab alpha of the dormant esp
                    if rage.player_info_prev[i] ~= nil and rage.origin.x ~= 0 and rage.alpha_multiplier > 0 then -- if origin / dormant esp is valid
                        local dormant_accurate = rage.alpha_multiplier > 0.1 -- for debug purposes lower this to 0.1
                        if dormant_accurate then
                            local target_points = {
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 28) or Vector.new(0, 0, 38)),
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 30) or Vector.new(0, 0, 40)),
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 32) or Vector.new(0, 0, 42)),
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 40) or Vector.new(0, 0, 50))
                            }
                       
                            for i = 1, #target_points do
                                local target = target_points[i]
                                local target_pos = rage.vec_ang(eyepos, target)
                                local dmg = Cheat.FireBullet(lp, eyepos, target)
                                if is_AWP then
                                    max_player_speed_alt = 100
                                elseif is_auto then
                                    max_player_speed_alt = 120
                                else
                                    max_player_speed_alt = ent:GetMaxSpeed() * 0.86
                                end
                                rage.can_hit = (dmg.trace.hit_entity == nil or dmg.trace.hit_entity:EntIndex() == player:EntIndex()) and (dmg.damage > ui.ragebot.dormant_aimbot_damage:GetInt()) and (not player:IsVisible(target)) -- added visibility check to mitigate shooting at anomalies?
                               
                                if rage.can_hit then
                                    rage.can_hit_i = true
                                    if rage.can_shoot then
                                        rage.modify_velocity(cmd, (scoped and max_player_speed_alt or ent:GetMaxSpeed())*0.2)
                                        -- autoscope
                                        if not scoped and ent:IsSniper() and onground == 1 then
                                            cmd.buttons = bit.bor(cmd.buttons, 2048)
                                        end
                                    end
                                   
                                    if ui.refs.hideshots:GetBool() then
                                        rage.choke = rage.can_shoot
                                    else
                                        rage.choke = true
                                    end
                                   
                                    if inaccuracy >= 90 and rage.choke == true then
                                        cmd.viewangles.pitch = target_pos.pitch
                                        cmd.viewangles.yaw = target_pos.yaw
                                        cmd.viewangles.roll = 0
                                        cmd.buttons = bit.bor(cmd.buttons, 1)
                                        -- dont shoot again
                                        rage.can_shoot = false
                                    end
                                end
                            end
                        end
                    end
                    rage.player_info[i] = {rage.origin, rage.alpha_multiplier, rage.can_hit_i}
                end
            end
        end
        rage.player_info_prev = rage.player_info
    end
end

rage.resetter = function(event)
    if not ui.ragebot.dormant_aimbot:Get() then return end
    if event:GetName() ~= 'round_prestart' then return end
    local lp = EntityList.GetClientEntity(EngineClient.GetLocalPlayer()):GetPlayer()
    if lp == nil then return end
    freezetime = (CVar.FindVar('mp_freezetime'):GetFloat()+1) / GlobalVars.interval_per_tick -- get freezetime plus 1 second and disable dormantbob for that amount of ticks
    rage.roundStarted = GlobalVars.tickcount + freezetime
    rage.origin = nil
    rage.player_info_prev = {}
    for i = 1, 64 do
        rage.player_info_prev[i] = {
            origin = Vector.new(0, 0, 0),
        }
    end
    rage.player_info = {}
end

rage.on_registered_shot = function(shot)
    if shot.reason ~= 1 then return end
   
    if not rage.data[shot.target_index] then
        rage.data[shot.target_index] = {
            esp_bool = false,
            shots = 0,
        }
    end

    rage.data[shot.target_index].shots = rage.data[shot.target_index].shots + 1
end

rage.on_prediction = function()
    if not ui.ragebot.maxmissed:Get() and ui.ragebot.ragebot_enable:Get() then return end
   
    for player_index, data in pairs(rage.data) do
        if data.shots >= ui.ragebot.maxmissed_c:Get() then
            data.esp_bool = true

            RageBot.EnableHitbox(player_index, 0, false)
        end
    end
end

rage.reset_data = function(event)
    if event:GetName() ~= 'round_start' then return end
   
    rage.data = {}
end

-- @endregion

-- @region: misc
local misc = {}
misc.slowwalk = function(cmd)
    if not ui.misc.slowwalk_c:GetBool() then return end
        if cmd.forwardmove >= ui.misc.slowwalk_slider:GetInt() then cmd.forwardmove = ui.misc.slowwalk_slider:GetInt() end
        if cmd.sidemove >= ui.misc.slowwalk_slider:GetInt() then cmd.sidemove = ui.misc.slowwalk_slider:GetInt() end
        if cmd.forwardmove < 0 and -cmd.forwardmove >= ui.misc.slowwalk_slider:GetInt() then cmd.forwardmove = -ui.misc.slowwalk_slider:GetInt() end
        if cmd.sidemove < 0 and -cmd.sidemove >= ui.misc.slowwalk_slider:GetInt() then cmd.sidemove = -ui.misc.slowwalk_slider:GetInt() end
end

local clantag_restore = false
-- clantag
misc.clantag = function()
    local localplayer = EntityList.GetLocalPlayer()
    if not localplayer then return end

    if ui.misc.clantag:Get() and ui.misc.misc_enable:Get() then
        local tag =
        {
            "ps",
            "psy",
            "psyc",
            "psych ",
            "psycho",
            "psycho ",
            "psych",
            "psyc",
            "psy",
            "ps",
            "p",
            "",

        }

        local netchann_info = EngineClient.GetNetChannelInfo()

        if netchann_info == nil then
            return
        end

        local latency = netchann_info:GetLatency(0) / GlobalVars.interval_per_tick
        local tickcount_pred = GlobalVars.tickcount + latency
        local iter = math.floor(math.fmod(tickcount_pred / 32, #tag) + 1)
       
        helpers:set_clantag(tag[iter])
        clantag_restore = false

    elseif not clantag_restore then
        helpers:set_clantag("")  
    end
end

local t = {}
misc.removeimpact = function()
    if #t == nil then
        return
    end

    if not EngineClient.IsConnected() then
        table.remove(t, #t)
        return
    end

    for i = 1, #t do
        if t[i] == nil then
            return
        end

        if t[i].ctime + 4 > math.floor(GlobalVars.curtime) then
            return
        end

        t[i].a = t[i].a - math.floor(GlobalVars.frametime * 300)

        if t[i].a < 0 then
            table.remove(t, i)
        end
    end
end
-- @endregion

-- @region: anti-aims
local anti_aims = {}
local flag_status = 0

AntiAim.jitter = {}
AntiAim.jitter.c_var = {
    choke = 0,
    yaw_v = 0,
    yaw_r = 1,
    byaw_v = 0,
    byaw_r = 1,
    fyaw_v = 0,
    fyaw_r = 0
}

AntiAim.c_var = {
    c = 1,
    ground_ticks = 0,
    step_ticks = 0,
    min = 0,
    max = 0,
    step = 0,
    return_value = 0,
    bodystep_ticks = 0,
    bodystep_min = 0,
    bodystep_max = 0,
    bodystep_step = 0,
    bodystep_return_value = 0
}

AntiAim.save_antiaims = {
    pitch = "Off",
    yaw_base = "Local view",
    yaw_1 = "Off",
    yaw_2 = 0,
    yaw_jitter_1 = "Off",
    yaw_jitter_2 = 0,
    body_yaw_1 = "Off",
    body_yaw_2 = 0,
    fake_yaw_limit = 0,
    freestanding_body_yaw = false
}

function AntiAim.jitter:tick(a,b)
    return GlobalVars.tickcount % 4 >= 2 and a or b
end

function AntiAim.jitter:choke_yaw(a,b)
    if GlobalVars.tickcount - AntiAim.jitter.c_var.yaw_v > 1  and AntiAim.jitter.c_var.choke == 1 then
        AntiAim.jitter.c_var.yaw_r = AntiAim.jitter.c_var.yaw_r == 1 and 0 or 1
        AntiAim.jitter.c_var.yaw_v = GlobalVars.tickcount
    end
    local inverted = AntiAim.GetInverterState()
   
    if a == 60 or b == 60 then
        return inverted and a or b
    else
        return AntiAim.jitter.c_var.yaw_r >= 1 and a or b
    end
end

function AntiAim.jitter:normalize_yaw(p)
    while p > 180 do
        p = p - 360
    end
    while p < -180 do
        p = p + 360
    end
    return p
end

function AntiAim.jitter:choke_body_yaw(a,b)
    local inverted = AntiAim.GetInverterState()
    local invert = AntiAim.GetInverterState()

    if Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Fake Options'):Get(2) then
        return inverted and a or b
    else
        return invert and a or b
    end
end

function AntiAim.jitter:choke_fake(a,b)
    if GlobalVars.tickcount - AntiAim.jitter.c_var.fyaw_v > 1  and AntiAim.jitter.c_var.choke == 1 then
        AntiAim.jitter.c_var.fyaw_r = AntiAim.jitter.c_var.fyaw_r == 1 and 0 or 1
        AntiAim.jitter.c_var.fyaw_v = GlobalVars.tickcount
    end
    local inverted = AntiAim.GetInverterState()
   
    if a == 60 or b == 60 then
        return inverted and a or b
    else
        return AntiAim.jitter.c_var.yaw_r >= 1 and a or b
    end
end
local start_time = GlobalVars.curtime

local function get_tick()
    local end_time = GlobalVars.curtime
    local get_time = math.abs(math.floor((start_time - end_time) * 100)) % 2
    return get_time
end

function AntiAim.jitter:desync(a,b)
    local inverted = AntiAim.GetInverterState()

    if Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Fake Options'):Get(2) then
        return inverted and a or b
    else
        return inverted and a or b
    end
end

clamp = function(value, minimum, maximum)
    if minimum > maximum then
        return math.min(math.max(value, maximum), minimum)
    else
        return math.min(math.max(value, minimum), maximum)
    end
end

AntiAim.side = 1
AntiAim.override_yaw = function(cmd, yaw_add, jitter_value, jitter_type)
    if FakeLag.SentPackets() ~= 0 then
        AntiAim.side = AntiAim.side * -1
    end
   
    local yaw_modifier = yaw_add
   
    if jitter_type == 1 then
        yaw_modifier = yaw_modifier+(jitter_value/2)*AntiAim.side
    elseif jitter_type == 2 then
        yaw_modifier = yaw_modifier+jitter_value*((AntiAim.side+1)/2)
    elseif jitter_type == 3 then
        yaw_modifier = math.random(-jitter_value,jitter_value)
    elseif jitter_type == 4 then
        yaw_modifier = yaw_modifier-(GlobalVars.tickcount*3)%jitter_value
    end

    return yaw_modifier
end

function AntiAim:run_custom(cmd)
    if EntityList.GetLocalPlayer() == nil or not ui.anti_aims.antiaim_enable:GetBool() then
        return
    end
    local p_duck = EntityList.GetLocalPlayer():GetProp("m_flDuckAmount")
    local inair = bit.band(EntityList.GetLocalPlayer():GetProp("m_fFlags" ), 1 ) == 0
    local on_ground = bit.band(EntityList.GetLocalPlayer():GetProp("m_fFlags"), 1)
    local vx, vy, vz = EntityList.GetLocalPlayer():GetProp("m_vecVelocity").x, EntityList.GetLocalPlayer():GetProp("m_vecVelocity").y, EntityList.GetLocalPlayer():GetProp("m_vecVelocity").z
    local p_still = math.sqrt(vx ^ 2 + vy ^ 2)
    local p_slow = Menu.FindVar('Aimbot', 'Anti Aim', 'Misc', 'Slow Walk')

    AntiAim.jitter.c_var.choke = ClientState.m_choked_commands
    local m = ui.anti_aims.custom
    AntiAim.save_antiaims.yaw_1 = "180"

    if on_ground == 1 then
        AntiAim.c_var.ground_ticks = AntiAim.c_var.ground_ticks + 1
    else
        AntiAim.c_var.ground_ticks = 0
    end
    if m[3].enable:Get() and p_slow then
        AntiAim.c_var.c = 3
    elseif inair and m[6].enable:Get() and EntityList.GetLocalPlayer():GetProp('m_flDuckAmount') > 0.7 then
        AntiAim.c_var.c = 6
    elseif inair and m[5].enable:Get() then
        AntiAim.c_var.c = 5
    elseif p_duck > 0.8 and not inair and AntiAim.c_var.ground_ticks > 8 and m[4].enable:Get() then
        AntiAim.c_var.c = 4
    elseif p_still > 70 and AntiAim.c_var.ground_ticks > 8 and m[2].enable:Get() then
        AntiAim.c_var.c = 2
    elseif p_still < 2 and  AntiAim.c_var.ground_ticks > 8 and m[1].enable:Get() then
        AntiAim.c_var.c = 1
    else
        AntiAim.c_var.c = 5
    end
    AntiAim.save_antiaims.yaw_base = "At targets"
    AntiAim.save_antiaims.yaw_1 = "180"
    AntiAim.save_antiaims.pitch = 1

    if AntiAim.c_var.c == 1 and m[1].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 0
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 2 and m[2].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 0
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 3 and m[3].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 24
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 4 and m[4].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 35
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 5 and m[5].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 15
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 6 and m[5].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 17
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    else
        AntiAim.c_var.max = m[AntiAim.c_var.c].step_fake_max:Get()
        AntiAim.c_var.min = m[AntiAim.c_var.c].step_fake_min:Get()
        AntiAim.c_var.step = m[AntiAim.c_var.c].step_value:Get()
        AntiAim.c_var.step_ticks = GlobalVars.tickcount % m[AntiAim.c_var.c].step_ticks:Get()

        if m[AntiAim.c_var.c].step_fake_min:Get() >= m[AntiAim.c_var.c].step_fake_max:Get()then
            m[AntiAim.c_var.c].step_fake_min:Set(m[AntiAim.c_var.c].step_fake_max:Get())
        end

        if AntiAim.c_var.step_ticks == m[AntiAim.c_var.c].step_ticks:Get() - 1 then
            if AntiAim.c_var.return_value < AntiAim.c_var.max then
                AntiAim.c_var.return_value = AntiAim.c_var.return_value + m[AntiAim.c_var.c].step_value:Get()
            elseif AntiAim.c_var.return_value >= AntiAim.c_var.max then
                AntiAim.c_var.return_value = AntiAim.c_var.min
            end
        end

        AntiAim.c_var.bodystep_max = m[AntiAim.c_var.c].step_bodyyaw_degree_right:Get()
        AntiAim.c_var.bodystep_min = m[AntiAim.c_var.c].step_bodyyaw_degree_left:Get()
        AntiAim.c_var.bodystep_step = m[AntiAim.c_var.c].body_yaw_step_value:Get()
        AntiAim.c_var.bodystep_ticks = GlobalVars.tickcount % m[AntiAim.c_var.c].body_yaw_step_ticks:Get()

        if m[AntiAim.c_var.c].step_bodyyaw_degree_left:Get() >= m[AntiAim.c_var.c].step_bodyyaw_degree_right:Get() then
            m[AntiAim.c_var.c].step_bodyyaw_degree_left:Set(m[AntiAim.c_var.c].step_bodyyaw_degree_right:Get())
           
        end
        if AntiAim.c_var.bodystep_ticks == m[AntiAim.c_var.c].body_yaw_step_ticks:Get() - 1 then
            if AntiAim.c_var.bodystep_return_value < AntiAim.c_var.bodystep_max then
                AntiAim.c_var.bodystep_return_value = AntiAim.c_var.bodystep_return_value + AntiAim.c_var.bodystep_step
            elseif AntiAim.c_var.bodystep_return_value >= AntiAim.c_var.bodystep_max then
                AntiAim.c_var.bodystep_return_value = AntiAim.c_var.bodystep_min
            end
        end

        if m[AntiAim.c_var.c].yaw_mode:Get() == 0 then
            AntiAim.save_antiaims.yaw_2 = m[AntiAim.c_var.c].static_yaw:Get()
        elseif m[AntiAim.c_var.c].yaw_mode:Get() == 1 then
            AntiAim.save_antiaims.yaw_2 = AntiAim.jitter:tick(m[AntiAim.c_var.c].tick_yaw_left:Get(),m[AntiAim.c_var.c].tick_yaw_right:Get())
        elseif m[AntiAim.c_var.c].yaw_mode:Get() == 2 then
            AntiAim.save_antiaims.yaw_2 = AntiAim.jitter:choke_yaw(m[AntiAim.c_var.c].choke_yaw_left:Get(),m[AntiAim.c_var.c].choke_yaw_right:Get())
        elseif m[AntiAim.c_var.c].yaw_mode:Get() == 3 then
            AntiAim.save_antiaims.yaw_2 = AntiAim.jitter:desync(m[AntiAim.c_var.c].desync_yaw_left:Get(),m[AntiAim.c_var.c].desync_yaw_right:Get())
        end

        if m[AntiAim.c_var.c].yaw_jitter_mode:Get() == 1 then
            if m[AntiAim.c_var.c].yaw_jitter_degree:Get() >= m[AntiAim.c_var.c].yaw_jitter_degree2:Get() then
                m[AntiAim.c_var.c].yaw_jitter_degree:Set(m[AntiAim.c_var.c].yaw_jitter_degree2:Get())
            end
        end

        AntiAim.save_antiaims.yaw_jitter_1 = m[AntiAim.c_var.c].yaw_jitter:Get()
        AntiAim.save_antiaims.yaw_jitter_2 = m[AntiAim.c_var.c].yaw_jitter_mode:Get() == 0 and m[AntiAim.c_var.c].yaw_jitter_degree:Get() or math.random(m[AntiAim.c_var.c].yaw_jitter_degree:Get(), m[AntiAim.c_var.c].yaw_jitter_degree2:Get())
        AntiAim.save_antiaims.body_yaw_1 = m[AntiAim.c_var.c].self_bodyyaw_mode:Get()

        if m[AntiAim.c_var.c].bodyyaw_mode:Get() == 1 then
            AntiAim.save_antiaims.body_yaw_2 = m[AntiAim.c_var.c].bodyyaw_degree:Get()
        elseif m[AntiAim.c_var.c].bodyyaw_mode:Get() == 2 then
            AntiAim.save_antiaims.body_yaw_2 = AntiAim.jitter:choke_body_yaw(m[AntiAim.c_var.c].jitter_bodyyaw_degree_left:Get(), m[AntiAim.c_var.c].jitter_bodyyaw_degree_right:Get())
        elseif m[AntiAim.c_var.c].bodyyaw_mode:Get() == 3 then
            AntiAim.save_antiaims.body_yaw_2 = clamp(AntiAim.c_var.bodystep_return_value, AntiAim.c_var.bodystep_min, AntiAim.c_var.bodystep_max)
        end

        if m[AntiAim.c_var.c].fake_yaw_mode:Get() == 0 then
            AntiAim.save_antiaims.fake_yaw_limit = m[AntiAim.c_var.c].static_fakeyaw:Get()
        elseif m[AntiAim.c_var.c].fake_yaw_mode:Get() == 1 then
            AntiAim.save_antiaims.fake_yaw_limit = AntiAim.jitter:choke_fake(m[AntiAim.c_var.c].jitter_fakeyaw_left:Get(),m[AntiAim.c_var.c].jitter_fakeyaw_right:Get())
        elseif m[AntiAim.c_var.c].fake_yaw_mode:Get() == 2 then
            if m[AntiAim.c_var.c].step_abs:Get() then
                AntiAim.save_antiaims.fake_yaw_limit = math.abs(clamp(AntiAim.c_var.return_value,AntiAim.c_var.min,AntiAim.c_var.max))
            else
                AntiAim.save_antiaims.fake_yaw_limit = clamp(AntiAim.c_var.return_value,AntiAim.c_var.min,AntiAim.c_var.max)
            end
        end
        AntiAim.save_antiaims.freestanding_body_yaw = m[AntiAim.c_var.c].freestanding_bodyyaw:Get()
    end
    Menu.FindVar('Aimbot', 'Anti Aim', 'Main', 'Pitch'):Set(AntiAim.save_antiaims.pitch)

    AntiAim.OverrideYawOffset(AntiAim.override_yaw(cmd, AntiAim.save_antiaims.yaw_2, AntiAim.save_antiaims.yaw_jitter_2, AntiAim.save_antiaims.yaw_jitter_1))
    AntiAim.OverrideLimit(AntiAim.save_antiaims.fake_yaw_limit)

    if AntiAim.save_antiaims.body_yaw_1 == 0 then -- off
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(0)
        AntiAim.OverrideInverter(Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Inverter'):Get() and true or false)
    elseif AntiAim.save_antiaims.body_yaw_1 == 1 then -- opposite
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(1)
        AntiAim.OverrideInverter(Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Inverter'):Get() and true or false)
    elseif AntiAim.save_antiaims.body_yaw_1 == 2 then -- jitter
        AntiAim.OverrideInverter(AntiAim.side ~= 1)
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(1)
    else -- static
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Fake Options'):Set(2, false)
        AntiAim.OverrideInverter(Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Inverter'):Get() and true or false)
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(0)
    end
   
    Menu.FindVar('Aimbot', 'Anti Aim', 'Main', 'Yaw Add'):Set(0)
   
    Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Freestanding Desync'):Set(AntiAim.save_antiaims.freestanding_body_yaw and 1 or 0)
end

vector_lerp = function(vecSource, vecDestination, flPercentage) return vecSource + (vecDestination - vecSource) * flPercentage end
anti_aims.vecnew = Vector.new()
anti_aims.edge_yaw = function()
    if not ui.anti_aims.antiaim_enable:Get() then return end
    if ui.anti_aims.antiaim_helpers:Get(5) then
        local local_player = EntityList.GetLocalPlayer()
        if local_player == nil then return end
        local flag = EntityList.GetLocalPlayer():GetProp("m_fFlags")
        if (flag == 256 or flag == 262) then -- air
            return
        end
        --if local_player:GetState() == 'Air' then return end
        if ClientState.m_choked_commands == 0 then
            anti_aims.vecnew = local_player:GetEyePosition()
        end
        local trace_end = {}
        local ang_view_angles = EngineClient.GetViewAngles()
        for yaww = 18, 360, 18 do
            local yaww = normalize_yaw(yaww)
            local edge_angle = QAngle.new(0, yaww, 0)
            local vec_trace_end = anti_aims.vecnew + Cheat.AngleToForward(edge_angle) * 0x60
            local traceInfo = EngineTrace.TraceRay(anti_aims.vecnew, vec_trace_end, local_player, 0x200400B)
            if traceInfo.hit_entity and traceInfo.hit_entity:GetClassName() == 'CWorld' and traceInfo.fraction < 0.3 then
                trace_end[#trace_end + 1] = {
                    vec_trace_end = traceInfo.endpos,
                    yaww = yaww
                }
            end
        end
        table.sort(trace_end, function(a, b)
            return a.yaww < b.yaww
        end)
        local edge_angle
        if #trace_end >= 2 then
            local vec_trace_center = vector_lerp(trace_end[1].vec_trace_end, trace_end[#trace_end].vec_trace_end, 0.5)
            edge_angle = Cheat.VectorToAngle(anti_aims.vecnew - vec_trace_center)
        end

        if edge_angle then
            local yaww = ang_view_angles.yaw
            local edgee_yaw = edge_angle.yaw
            local difff = normalize_yaw(edgee_yaw - yaww)
            if math.abs(difff) < 90 then
                difff = 0
                yaww = normalize_yaw(edgee_yaw + 180)
            end
            local new_yaw = -yaww
            new_yaw = normalize_yaw(new_yaw + edgee_yaw + 180)
            new_yaw = normalize_yaw(new_yaw + difff)
            AntiAim.OverrideYawOffset(new_yaw)
        end
    end
end

anti_aims.avoid_backstab = function()
    if ui.anti_aims.antiaim_enable:Get() and ui.anti_aims.antiaim_helpers:Get(4) then
        local all_players = EntityList.GetEntitiesByName('CCSPlayer')
        for i = 1, #all_players do
            local enemy = all_players[i]:GetPlayer()
            if enemy ~= EntityList.GetLocalPlayer() and not enemy:IsTeamMate() and not enemy:IsDormant() and enemy:IsAlive() and enemy:GetActiveWeapon() ~= nil and enemy:GetActiveWeapon():IsKnife() then
                if EntityList.GetLocalPlayer():GetRenderOrigin():DistTo(enemy:GetProp('m_vecOrigin')) <= 300 then
                    AntiAim.OverrideYawOffset(180)
                end
            end
        end
    end
end

anti_aims.antiaim_helpers = function()

    if not ui.anti_aims.antiaim_enable:Get() then return end

        if ui.anti_aims.antiaim_helpers:Get(1) then

            if ui.refs.hideshots:Get() then
                    ui.refs.fakelags:Set(false)
                else
                    ui.refs.fakelags:Set(true)
            end
        end
end

anti_aims.disable_aa_warmup = function()

    local warmup_period = EntityList.GetGameRules():GetProp("m_bWarmupPeriod")

    if  ui.anti_aims.antiaim_enable:Get() and ui.anti_aims.antiaim_helpers:Get(3) then

        if warmup_period == true then
            ui.refs.antiaim:Set(false)
        else
            ui.refs.antiaim:Set(true)
        end

    end

end

anti_aims.exploit_teleport = function()
    if ui.ragebot.tp_in_air:Get() ~= 0 and ui.anti_aims.antiaim_enable:Get() and ui.refs.doubletap:Get() and ui.ragebot.Teleport_In_Air:Get() then
        local allow_teleport = false
        local enable_teleport = false

        local active_weapon = EntityList.GetLocalPlayer():GetActiveWeapon()
        if active_weapon == nil then return end
        local weapon_id = active_weapon:GetWeaponID()

        local guns = {
            is_AWP = weapon_id == 9,
            is_auto = (weapon_id == 38 or weapon_id == 11),
            is_scout = weapon_id == 40,
            is_deagle = weapon_id == 1,
            is_r8 = weapon_id == 64,
            is_nades = active_weapon:IsGrenade(),
            is_pistols = active_weapon:IsPistol() and not is_deagle and not is_r8,
            is_smg = (weapon_id == 34 or weapon_id == 23 or weapon_id == 24 or weapon_id == 19 or weapon_id == 26 or weapon_id == 33 or weapon_id == 17),
            is_shotguns = (weapon_id == 35 or weapon_id == 25 or weapon_id == 27 or weapon_id == 29),
            is_rifle = active_weapon:IsRifle() and not is_smg and not is_shotguns,
            is_taser = weapon_id == 31,
        }
       
        for _, weapons in pairs({
            {Value = 1, active_weapon = guns.is_AWP},
            {Value = 2, active_weapon = guns.is_auto},
            {Value = 3, active_weapon = guns.is_scout},
            {Value = 4, active_weapon = guns.is_deagle},
            {Value = 5, active_weapon = guns.is_r8},
            {Value = 6, active_weapon = guns.is_nades},
            {Value = 7, active_weapon = not (guns.is_AWP or guns.is_auto or guns.is_scout or guns.is_deagle or guns.is_r8 or guns.is_nades or guns.is_pistols or guns.is_rifle or guns.is_smg or guns.is_shotguns or guns.is_taser)},
            {Value = 8, active_weapon = guns.is_pistols},
            {Value = 9, active_weapon = guns.is_rifle},
            {Value = 10, active_weapon = guns.is_smg},
            {Value = 11, active_weapon = guns.is_shotguns},
            {Value = 12, active_weapon = guns.is_taser}
        }) do
            if ui.ragebot.tp_in_air:Get(weapons.Value) and weapons.active_weapon then
                allow_teleport = true
            end
        end

        if allow_teleport then
            all_players = EntityList.GetEntitiesByName('CCSPlayer')
            for i = 1, #all_players do
                enemy = all_players[i]:GetPlayer()
                if not enemy:IsTeamMate() and enemy:IsAlive() and not enemy:IsDormant() and enemy:CanHit() then
                    enable_teleport = true
                end
            end
        end
       
        if enable_teleport and not EntityList.GetLocalPlayer():GetFlag(0) and EntityList.GetLocalPlayer():GetVelocity() > 25 then
            Exploits.ForceTeleport()
        end
    end
end

ffi_functions.ENTITY_LIST_POINTER = ffi.cast('void***', Utils.CreateInterface('client.dll', 'VClientEntityList003')) or error('Failed to find VClientEntityList003!')
ffi_functions.GET_CLIENT_ENTITY_FN = ffi.cast('uintptr_t (__thiscall*)(void*, int)', ffi_functions.ENTITY_LIST_POINTER[0][3])

ffi_functions.get_entity_address = function(entity_index)
    local addr = ffi_functions.GET_CLIENT_ENTITY_FN(ffi_functions.ENTITY_LIST_POINTER, entity_index)
    return addr
end

ffi_functions.hook = {hooks = {}}
ffi_functions.hook.new = function(cast, callback, hook_addr, size, trampoline, org_bytes_tramp)
    local size = size or 5
    local trampoline = trampoline or false
    local new_hook, mt = {}, {}
    local detour_addr = tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, callback))))
    local void_addr = ffi.cast('void*', hook_addr)
    local old_prot = ffi.new('unsigned long[1]')
    local org_bytes = ffi.new('uint8_t[?]', size)
    ffi.copy(org_bytes, void_addr, size)
    if trampoline then
        local alloc_addr = ffi.gc(ffi.C.VirtualAlloc(nil, size + 5, 0x1000, 0x40), function(addr) ffi.C.VirtualFree(addr, 0, 0x8000) end)
        local trampoline_bytes = ffi.new('uint8_t[?]', size + 5, 0x90)
        if org_bytes_tramp then
            local bytes = {}
            for byte in org_bytes_tramp:gmatch('(%x%x)') do
                table.insert(bytes, tonumber(byte, 16))
            end
            trampoline_bytes = ffi.new('uint8_t[?]', size + 5, bytes)
        else
            ffi.copy(trampoline_bytes, org_bytes, size)
        end
        trampoline_bytes[size] = 0xE9
        ffi.cast('uint32_t*', trampoline_bytes + size + 1)[0] = hook_addr - tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, alloc_addr)))) - size
        ffi.copy(alloc_addr, trampoline_bytes, size + 5)
        new_hook.call = ffi.cast(cast, alloc_addr)
        mt = {__call = function(self, ...)
            return self.call(...)
        end}
    else
        new_hook.call = ffi.cast(cast, hook_addr)
        mt = {__call = function(self, ...)
            self.stop()
            local res = self.call(...)
            self.start()
            return res
        end}
    end
    local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
    hook_bytes[0] = 0xE9
    ffi.cast('uint32_t*', hook_bytes + 1)[0] = detour_addr - hook_addr - 5
    new_hook.status = false
    local function set_status(bool)
        new_hook.status = bool
        ffi.C.VirtualProtect(void_addr, size, 0x40, old_prot)
        ffi.copy(void_addr, bool and hook_bytes or org_bytes, size)
        ffi.C.VirtualProtect(void_addr, size, old_prot[0], old_prot)
    end
    new_hook.stop = function() set_status(false) end
    new_hook.start = function() set_status(true) end
    new_hook.start()

    table.insert(ffi_functions.hook.hooks, new_hook)
    return setmetatable(new_hook, mt)
end

anti_aims.is_jumping = false
anti_aims.ground_ticks, anti_aims.end_time = 1, 0
anti_aims.updateCSA_hk = function(thisptr, edx)
    local localplayer = EntityList.GetClientEntity(EngineClient.GetLocalPlayer())
    if localplayer == nil then return anti_aims.updateCSA_fn(thisptr, edx) end
    local lp_ptr = ffi_functions.get_entity_address(EngineClient.GetLocalPlayer())

    if ui.anti_aims.animbreakers:Get(1) then ui.refs.legs:Set(1) end

    if ui.anti_aims.animbreakers:Get() == 0 or not ui.anti_aims.antiaim_enable:Get() then anti_aims.updateCSA_fn(thisptr, edx) return end

    if ui.anti_aims.animbreakers:Get(1) then
        ffi.cast('float*' , lp_ptr+10104)[6] = 1
    end

    if ui.anti_aims.animbreakers:Get(2) then
        ffi.cast('float*' , lp_ptr+10104)[0] = 1
    end

    if ui.anti_aims.animbreakers:Get(3) then
        ffi.cast('float*' , lp_ptr+10104)[12] = 0
    end

    anti_aims.updateCSA_fn(thisptr, edx)

    if ui.anti_aims.animbreakers:Get(1) then
        ffi.cast('float*' , lp_ptr+10104)[6] = 1
    end
   
    if ui.anti_aims.animbreakers:Get(3) then
        if bit.band(EntityList.GetLocalPlayer():GetProp('m_fFlags'), 1) == 1 then
            anti_aims.ground_ticks = anti_aims.ground_ticks + 1
        else
            anti_aims.ground_ticks = 0
            anti_aims.end_time = GlobalVars.curtime + 1
        end
        if not anti_aims.is_jumping and anti_aims.ground_ticks > 1 and anti_aims.end_time > GlobalVars.curtime then
            ffi.cast('float*' , lp_ptr+10104)[12] = 0.5
        end
    end
end

Cheat.RegisterCallback('destroy', function()
    for i, v in ipairs(ffi_functions.hook.hooks) do
        if v.status then
            v.stop()
        end
    end
end)

anti_aims.updateCSA_fn = ffi_functions.hook.new('void(__fastcall*)(void*, void*)', anti_aims.updateCSA_hk, ffi.cast('uintptr_t', Utils.PatternScan('client.dll', '8B F1 80 BE ? ? ? ? ? 74 36', -5))) or error("updateCSA_fn can't hook")
-- @endregion

local draggable = {}
function draggable:new(name, size, init_pos)
    local drag = {}
    local init_pos = init_pos or Vector2.new(100, 100)
    drag.size = size
    drag.x = Menu.SliderInt('Visuals', "draggable elements", name .. "_x", init_pos.x, 0, globals.screen_size.x)
    drag.y = Menu.SliderInt('Visuals', "draggable elements", name .. "_y", init_pos.y, 0, globals.screen_size.y)
    drag.x:SetVisible(false)
    drag.y:SetVisible(false)
    drag.captured = false
    drag.clicked = false
    drag.mouse_offset = Vector2.new(0, 0)

    setmetatable(drag, self)
    self.__index = self
   
    return drag
end

function draggable:get()
    return Vector2.new(self.x:Get(), self.y:Get())
end

function draggable:update()
    if not Cheat.IsMenuVisible() then
        return
    end

    local mouse_pos = Cheat.GetMousePos()
    local mouse_hold = Cheat.IsKeyDown(1)

    if not self.clicked and mouse_hold then
        self.clicked = true
        if not self.captured and mouse_hold and helpers:mouse_in_bounds(self:get(), self:get() + self.size) then
            self.captured = true
            self.mouse_offset = mouse_pos - self:get()
        end
    end

    if not mouse_hold then
        self.captured = false
        self.clicked = false
    end

    if self.captured then
        self.x:Set(mouse_pos.x - self.mouse_offset.x)
        self.y:Set(mouse_pos.y - self.mouse_offset.y)
    end
end

function draggable:set_size(size)
    self.size = size
end

-- @region: widgets
local indicators = {}
indicators.on_plant_time, indicators.fill, indicators.planting_site, indicators.planting = 0, 0, '', false
indicators.Render_Shadow = function(start_pos, endpos, color)
    Render.GradientBoxFilled(start_pos, Vector2.new(start_pos.x + ((endpos.x - start_pos.x) / 2), endpos.y), Color.RGBA(0.0, 0.0, 0.0, 0.0), color, Color.RGBA(0.0, 0.0, 0.0, 0.0), color)
    Render.GradientBoxFilled(Vector2.new(start_pos.x + ((endpos.x - start_pos.x) / 2), start_pos.y), endpos, color, Color.RGBA(0.0, 0.0, 0.0, 0.0), color, Color.RGBA(0.0, 0.0, 0.0, 0.0))
end

indicators.contains = function(table, val)
    for i=1, #table do
        if table[i] == val then
            return true
        end
    end
    return false
end

indicators.clear_planting_info = function()
    planting = false
    fill = 0
    on_plant_time = 0
    planting_site = ''
end

indicators.bomb = function(event)
    typese = {
        'bomb_abortplant', 'bomb_defused', 'bomb_planted', 'round_prestart'
    }
   
    if indicators.contains(typese, event:GetName()) then indicators.clear_planting_info() end
   
    if event:GetName() == 'bomb_beginplant' then
        on_plant_time = GlobalVars.curtime
        planting = true
        bombsite = event:GetInt('site');
        APlants = (454 or 372 or 102 or 276 or 174 or 121 or 301 or 142 or 408 or 97 or 213 or 216)
        if bombsite == APlants then
            planting_site = 'Bombsite A'
        else
            planting_site = 'Bombsite B'
        end
    end
end

indicators.Render_Indicator = function(text, col, cur)
    local position = Vector2.new(20, (globals.screen_size.y / 1.55) + (39 * cur))
    local positionS = Vector2.new(21, (globals.screen_size.y / 1.55 + 1) + (39 * cur))
    local textsize = Render.CalcTextSize(text, 24, fonts.calibrib24)

    indicators.Render_Shadow(Vector2.new(position.x - 10, position.y - 7), Vector2.new(position.x + textsize.x - 10, position.y + textsize.y + 2), Color.RGBA(0, 0, 0, 56 * col.a))

    Render.Text(text, positionS, Color.RGBA(33, 33, 33, 127 * col.a), 24, fonts.calibrib24)
    Render.Text(text, position, col, 24, fonts.calibrib24)
end

widgets = {
    create_window = function(self, s, e, alpha)
        local color = helpers:copy_color(ui.visuals.theme:Get())
        local background_color = Color.new(0, 0, 0, alpha * ui.visuals.theme:Get().a)
        local border_color1 = helpers:alpha_modulate(color, alpha)
        local border_color2 = helpers:alpha_modulate(color, alpha * 0.4)

        Render.Blur(s, e, Color.new(1 - background_color.a, 1 - background_color.a, 1 - background_color.a, alpha), 5)

        if not ui.visuals.disable_blur:Get() then
        Render.Box(s - Vector2.new(6, 6), e + Vector2.new(6, 6), helpers:alpha_modulate(border_color1, alpha * 0.02), 5)
        Render.Box(s - Vector2.new(5, 5), e + Vector2.new(5, 5), helpers:alpha_modulate(border_color1, alpha * 0.03), 5)
        Render.Box(s - Vector2.new(4, 4), e + Vector2.new(4, 4), helpers:alpha_modulate(border_color1, alpha * 0.04), 5)
        Render.Box(s - Vector2.new(3, 3), e + Vector2.new(3, 3), helpers:alpha_modulate(border_color1, alpha * 0.08), 5)
        Render.Box(s - Vector2.new(2, 2), e + Vector2.new(2, 2), helpers:alpha_modulate(border_color1, alpha * 0.13), 5)
        Render.Box(s - Vector2.new(1, 1), e + Vector2.new(1, 1), helpers:alpha_modulate(border_color1, alpha * 0.20), 5)
        end
       
        Render.BoxFilled(s + Vector2.new(5, 0), Vector2.new(e.x - 5, s.y + 1), border_color1)
        Render.BoxFilled(Vector2.new(s.x + 5, e.y - 1), e - Vector2.new(5, 0), border_color2)
        Render.GradientBoxFilled(Vector2.new(s.x, s.y + 5), Vector2.new(s.x + 1, e.y - 5), border_color1, border_color1, border_color2, border_color2)
        Render.GradientBoxFilled(Vector2.new(e.x - 1, s.y + 5), Vector2.new(e.x, e.y - 5), border_color1, border_color1, border_color2, border_color2)
        Render.Circle(s + Vector2.new(5, 5), 5, 8, border_color1, 1, -90, -180)
        Render.Circle(Vector2.new(s.x + 5, e.y - 5), 5, 8, border_color2, 1, 90, 180)
        Render.Circle(e - Vector2.new(5, 5), 5, 8, border_color2, 1, 0, 90)
        Render.Circle(Vector2.new(e.x - 5, s.y + 5), 5, 8, border_color1, 1, -90, 0)
    end,

    keybinds = {
        anims = {},
        drag = draggable:new("keybinds", Vector2.new(150, 20)),
        size = 100,
        alpha = 0,
        draw = function(self)
            if not ui.visuals.widgets:Get(1) then
                return
            end

            self.drag:update()
            local pos = self.drag:get()

            local bind_list = Cheat.GetBinds()
            local render_list = {}
            local opened = Cheat.IsMenuVisible()
            local render_offset = 0
            local raw_size = 100

            for _, bind in pairs(bind_list) do
                local bind_name = bind:GetName()
                if not self.anims[bind_name] then
                    self.anims[bind_name] = 0
                end

                self.anims[bind_name] = helpers:lerp(self.anims[bind_name], bind:IsActive() and 1 or 0)

                if bind:IsActive() then
                    opened = true
                end

                if self.anims[bind_name] > 0.01 then
                    local r_bind = {}

                    r_bind.name = bind_name:lower():gsub("^%l", string.upper)
                    r_bind.value = string.format("[%s]", bind:GetValue())
                    r_bind.alpha = self.anims[bind_name]
                    r_bind.offset = render_offset

                    if r_bind.value == "[on]" or r_bind.value == "[off]" then
                        r_bind.value = bind:GetMode() == 0 and "[toggled]" or "[hold]"
                    end

                    local name_size = Render.CalcTextSize(r_bind.name, 11, fonts.verdana).x + Render.CalcTextSize(r_bind.value, 11, fonts.verdana).x + 15

                    render_offset = render_offset + r_bind.alpha * 16
                    raw_size = math.max(raw_size, name_size)

                    table.insert(render_list, r_bind)
                end
            end

            self.alpha = helpers:lerp(self.alpha, opened and 1 or 0)
            self.size = helpers:lerp(self.size, raw_size)

            if self.alpha < 0.01 then
                return
            end
            widgets:create_window(pos, pos + Vector2.new(self.size, 20), self.alpha)
            helpers:text_shadow("keybinds", pos + Vector2.new(self.size, 20) / 2, Color.new(1, 1, 1, self.alpha), 11, fonts.verdana, true)

            for _, r in pairs(render_list) do
                helpers:text_shadow(r.name, pos + Vector2.new(5, 22 + r.offset), Color.new(1, 1, 1, r.alpha), 11, fonts.verdana)
                helpers:text_shadow(r.value, pos + Vector2.new(self.size - 5 - Render.CalcTextSize(r.value, 11, fonts.verdana).x, 22 + r.offset), Color.new(1, 1, 1, r.alpha), 11, fonts.verdana)
            end
        end
    },
   
    spectators = {
        data = {},
        drag = draggable:new("spectators", Vector2.new(120, 20)),
        size = 100,
        alpha = 0,
        getsteamid64 = function(self, steamid)
            return string.sub(tostring(ffi.new("uint64_t", 76561197960265728) + ffi.new("uint64_t", steamid)), 1, -4)
        end,
        get_list = function(self)
            if not EntityList.GetLocalPlayer() then
                return {}, Cheat.IsMenuVisible()
            end

            local observe_target = EntityList.GetLocalPlayer()

            if EntityList.GetLocalPlayer():GetProp("m_iObserverMode") ~= 0 then
                local ent = EntityList.GetClientEntityFromHandle(EntityList.GetLocalPlayer():GetProp("m_hObserverTarget"))

                if ent and ent:IsPlayer() then
                    observe_target = ent:GetPlayer()
                end
            end

            if not observe_target then
                return {}, Cheat.IsMenuVisible()
            end

            local players = EntityList.GetPlayers()
            local rtn_list = {}
            local opened = Cheat.IsMenuVisible()

            for _, pl in pairs(players) do  
                if pl ~= EntityList.GetLocalPlayer() then
                    local name = pl:GetName()
                    local info = pl:GetPlayerInfo()
                    local steamid = self:getsteamid64(info.iSteamID)

                    if not self.data[steamid] then
                        if not info.fakeplayer then
                            self.data[steamid] = {
                                name = name,
                                alpha = 0,
                            }

                            local player_data = self.data[steamid]

                            player_data.callback1 = function(content)
                                local parsed = json.parse(content).response
                                if not parsed then
                                    return
                                end
                                parsed = parsed.players[0]
                                if not parsed then
                                    return
                                end
                                Http.GetAsync(parsed.avatar, player_data.callback2)
                            end

                            player_data.callback2 = function(content)
                                player_data.avatar = Render.LoadImage(content, Vector2.new(32, 32))
                            end

                            Http.GetAsync("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=E8A1E59F9C119FA9BFB73F29C2A8A109&steamids=" .. steamid, player_data.callback1)
                        else
                            self.data[steamid] = {
                                name = name,
                                alpha = 0,
                                avatar = globals.default_avatar,
                            }
                        end
                    end

                    local data = self.data[steamid]
                    local observer = EntityList.GetClientEntityFromHandle(pl:GetProp("m_hObserverTarget"))
                    local is_observer = (observer and observer:IsPlayer() and observer:GetPlayer() == observe_target)
               
                    if is_observer then
                        opened = true
                    end

                    data.alpha = helpers:lerp(data.alpha, is_observer and 1 or 0)

                    if data.alpha > 0.01 then
                        table.insert(rtn_list, data)
                    end
                end
            end

            return rtn_list, opened
        end,
        draw = function(self)
            if not ui.visuals.widgets:Get(2) then
                return
            end

            self.drag:update()
            local pos = self.drag:get()

            local render_offset = 0
            local raw_size = 100

            local list, opened = self:get_list()

            for _, data in pairs(list) do
                local reneder_pos = pos + Vector2.new(5, 23 + render_offset)

                if not data.avatar then return end
                Render.Image(data.avatar, reneder_pos, Vector2.new(16, 16), Color.new(1, 1, 1, data.alpha))
                helpers:text_shadow(data.name, reneder_pos + Vector2.new(21, 2), Color.new(1, 1, 1, data.alpha), 11, fonts.verdana)

                local size = 30 + Render.CalcTextSize(data.name, 11, fonts.verdana).x

                if size > raw_size then
                    raw_size = size
                end

                render_offset = render_offset + 18 * data.alpha
            end

            self.size = helpers:lerp(self.size, raw_size)
            self.alpha = helpers:lerp(self.alpha, opened and 1 or 0)

            if self.alpha > 0.01 then
                widgets:create_window(pos, pos + Vector2.new(self.size, 20), self.alpha)
                helpers:text_shadow("spectators", pos + Vector2.new(self.size / 2, 10), Color.new(1, 1, 1, self.alpha), 11, fonts.verdana, true)
            end
        end,
    },

    watermark = {
        size = 0,
        draw = function(self)
            if not ui.visuals.widgets:Get(3) then
                return
            end

            local full_text = ""

            if ui.visuals.watermark_info:Get(1) then
                full_text = full_text .. " | " .. ui.visuals.custom_username:Get()
            end

            if ui.visuals.watermark_info:Get(2) then
                full_text = full_text .. " | " .. tostring(math.floor(helpers:get_fps())) .. " fps"
            end

            if ui.visuals.watermark_info:Get(3) then
                local net_channel = EngineClient.GetNetChannelInfo()
                local ping = 0

                if net_channel then
                    ping = net_channel:GetAvgLatency(0)
                end

                full_text = full_text .. " | delay: " .. tostring(math.floor(ping * 1000)) .. "ms"
            end

            if ui.visuals.watermark_info:Get(4) then
                full_text = full_text .. " | " .. tostring(math.floor(1 / GlobalVars.interval_per_tick + 0.5)) .. "tick"
            end

            if ui.visuals.watermark_info:Get(5) then
                full_text = full_text .. " | " .. helpers:get_time()
            end

            local size = Render.CalcTextSize("psycho" .. full_text, 11, fonts.verdana).x + 54
            self.size = helpers:lerp(self.size, size)

            local pos = Vector2.new(globals.screen_size.x - 10 - self.size, 10)
            widgets:create_window(pos, pos + Vector2.new(self.size, 20), 1)
            pos = pos + Vector2.new(6, 3)

            helpers:text_shadow("psy", pos, Color.new(1, 1, 1), 11, fonts.verdana)
            pos.x = pos.x + Render.CalcTextSize("psy", 11, fonts.verdana).x
            helpers:text_shadow("cho", pos, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)
            pos.x = pos.x + Render.CalcTextSize("cho", 11, fonts.verdana).x
            helpers:text_shadow(" [stable]", pos, Color.new(1, 1, 1), 11, fonts.verdana)
            pos.x = pos.x + Render.CalcTextSize(" [stable]", 11, fonts.verdana).x
            helpers:text_shadow(full_text, pos, Color.new(1, 1, 1), 11, fonts.verdana)

        end
    },

    lua_panel = {
        drag = draggable:new("lua_panel", Vector2.new(170, 45), Vector2.new(100, globals.screen_size.y / 2 - 23)),
        draw = function(self)
            if not ui.visuals.widgets:Get(4) then
                return
            end

            self.drag:update()

            local pos = self.drag:get()

            widgets:create_window(pos, pos + Vector2.new(170, 45), 1)

            local cursor = pos + Vector2.new(5, 4)

            helpers:text_shadow("» psycho anti-aim", cursor, Color.new(1, 1, 1), 11, fonts.verdana)
            cursor.x = cursor.x + Render.CalcTextSize("» psycho anti-aim ", 11, fonts.verdana).x
            helpers:text_shadow("technology", cursor, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)
            cursor = Vector2.new(pos.x + 5, cursor.y + 12)

            helpers:text_shadow("» user:", cursor, Color.new(1, 1, 1), 11, fonts.verdana)
            cursor.x = cursor.x + Render.CalcTextSize("» user: ", 11, fonts.verdana).x
            helpers:text_shadow(globals.username, cursor, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)
            cursor = Vector2.new(pos.x + 5, cursor.y + 12)

            helpers:text_shadow("» build: ", cursor, Color.new(1, 1, 1), 11, fonts.verdana)
            cursor.x = cursor.x + Render.CalcTextSize("» build: ", 11, fonts.verdana).x
            helpers:text_shadow("stable", cursor, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)

            if ui.visuals.statepanel_image:Get() == 1 then
                Render.Image(globals.avatar, pos + Vector2.new(145, 20), Vector2.new(20, 20))
            elseif ui.visuals.statepanel_image:Get() == 2 then
                Render.Image(globals.logo_avatar2, pos + Vector2.new(134, 15), Vector2.new(30, 30))
            else
                Render.Image(globals.logo_avatar2, pos + Vector2.new(134, 15), Vector2.new(30, 30))
                Render.Image(globals.avatar, pos + Vector2.new(105, 19), Vector2.new(22, 22))
            end

        end
    },

    gamesense = {

        draw = function(self)

            local local_player = EntityList.GetLocalPlayer()
            if not local_player then return end

            if not local_player:IsAlive() then return end
            local cur_dmg = ui.refs.minimum_damage:GetInt()
            if cur_dmg > 100 then cur_dmg = '+'..cur_dmg-100 end
            local isDmg = false
            local isPing = false
            local binds = Cheat.GetBinds()
            for i = 1, #binds do
                bind = binds[i]
                if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                    isDmg = true
                end
                if bind:GetName() == 'Fake Ping' and bind:IsActive() then
                    isPing = true
                end
            end
            local ground = bit.band(local_player:GetProp('m_fFlags'), bit.lshift(1,0)) == 0
            local crouch = local_player:GetProp('m_flDuckAmount')
            local isDmg = false
            local binds = Cheat.GetBinds()
            for i = 1, #binds do
                local bind = binds[i]
                if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                    isDmg = true
                end
            end

            if ui.visuals.gamesense:Get() then
                local current_pos = 1
               
                if ui.visuals.gamesense_choose:Get(1) and isDmg then
                    indicators.Render_Indicator('DMG: '..tostring(cur_dmg), Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
       
                if ui.visuals.gamesense_choose:Get(2) and ui.ragebot.dormant_aimbot:GetBool() then
                    local colors = Color.RGBA(132,196,20,255)
                    for k, v in pairs(rage.player_info_prev) do
                        if k ~= nil then
                            if v[3] == true then
                                colors = Color.RGBA(252,222,30,255)
                                break
                            end
                        end
                    end
                    indicators.Render_Indicator('DA', colors, current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(3) and isPing then
                    local net_channel = EngineClient.GetNetChannelInfo()
                    local outgoing, incoming = net_channel:GetLatency(0), net_channel:GetLatency(1)
                    local ping = math.max(0, (incoming-outgoing)*1000)
                    indicators.Render_Indicator('PING', Color.RGBA(math.floor(255 - ((ping / 189 * 60) * 1.90)), math.floor((ping / 189 * 60) * 3.05), math.floor((ping / 189 * 60) * 0.32), 255), current_pos); current_pos = current_pos - 1;
                end
                local c4 = EntityList.GetEntitiesByClassID(129)[1];
                if ui.visuals.gamesense_choose:Get(4) and c4 ~= nil then
                    local time = c4:GetProp('m_flC4Blow') - GlobalVars.curtime
                    local timer = string.format('%.1f', time)
                    local defused = c4:GetProp('m_bBombDefused')
                    if math.floor(timer) > 0 and not defused then
                        local defusestart = c4:GetProp('m_hBombDefuser') ~= 4294967295
                        local defuselength = c4:GetProp('m_flDefuseLength')
                        local defusetimer = defusestart and (c4:GetProp('m_flDefuseCountDown') - GlobalVars.curtime) / 1 or -1
                        if defusetimer > 0 then
                            local color = math.floor(timer) > defusetimer and Color.RGBA(75, 230, 64, 80) or Color.RGBA(255, 0, 0, 80)
                       
                            local barlength = ((globals.screen_size.y - 50) / defuselength) * (defusetimer)
                            Render.BoxFilled(Vector2.new(0.0, 0.0), Vector2.new(20, globals.screen_size.y), Color.RGBA(32, 32, 32, 50))
                            Render.Box(Vector2.new(0.0, 0.0), Vector2.new(20, globals.screen_size.y), Color.RGBA(32, 32, 32, 50))
                           
                            Render.BoxFilled(Vector2.new(0, globals.screen_size.y - barlength), Vector2.new(19, globals.screen_size.y), color)
                        end
                       
                        local bombsite = c4:GetProp('m_nBombSite') == 0 and 'A' or 'B'
                        local health = EntityList.GetLocalPlayer():GetProp('m_iHealth')
                        local armor = EntityList.GetLocalPlayer():GetProp('m_ArmorValue')
                        local willKill = false
                        local eLoc = c4:GetRenderOrigin()
                        local lLoc = EntityList.GetLocalPlayer():GetRenderOrigin()
                        local distance = eLoc:DistTo(lLoc)
                        local a = 450.7
                        local b = 75.68
                        local c = 789.2
                        local d = (distance - b) / c;
       
                        local damage = a * math.exp(-d * d)
                        if armor > 0 then
                            newDmg = damage * 0.5;
           
                            armorDmg = (damage - newDmg) * 0.5
                            if armorDmg > armor then
                                armor = armor * (1 / .5)
                                newDmg = damage - armorDmg
                            end
                            damage = newDmg;
                        end
                        local dmg = math.ceil(damage)
                        if dmg >= health then
                            willKill = true
                        else
                            willKill = false
                        end
                        indicators.Render_Indicator(bombsite..' - '..string.format('%.1f', timer)..'s', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                        if EntityList.GetLocalPlayer() then
                            if willKill == true then
                                indicators.Render_Indicator('FATAL', Color.RGBA(255, 0, 0, 255), current_pos); current_pos = current_pos - 1;
                            elseif damage > 0.5 then
                                indicators.Render_Indicator('-'..dmg..' HP', Color.RGBA(252, 243, 105, 255), current_pos); current_pos = current_pos - 1;
                            end
                        end
                    end
                end
                if ui.visuals.gamesense_choose:Get(4) and planting then
                    indicators.Render_Indicator(planting_site, Color.RGBA(252, 243, 105, 255), current_pos); current_pos = current_pos - 1;
                    local fill = 3.125 - (3.125 + on_plant_time - GlobalVars.curtime)
                    if fill > 3.125 then
                        fill = 3.125
                    end
                    local ts = Render.CalcTextSize(planting_site, 24, fonts.calibrib24)
                    Render.Circle(Vector2.new(153, globals.screen_size.y / 1.55 + 48 + (39 * current_pos - 1)), 8, 32, Color.RGBA(0, 0, 0, 200), 5)
                    Render.Circle(Vector2.new(153, globals.screen_size.y / 1.55 + 48 + (39 * current_pos - 1)), 8, 32, Color.RGBA(213, 213, 214, 255), 3, -1, (fill/3.3)*375)
                end

                if ui.visuals.gamesense_choose:Get(5) and bit.band(EntityList.GetLocalPlayer():GetProp('m_fFlags'), bit.lshift(1,0)) == 0 then
                    indicators.Render_Indicator('LC', EntityList.GetLocalPlayer():GetVelocity() > 260 and Color.RGBA(132, 196, 20, 255) or Color.RGBA(255, 0, 0, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(6) and ui.refs.fakeduck:Get() then
                    indicators.Render_Indicator('DUCK', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
                if  ui.visuals.gamesense_choose:Get(7) and ui.refs.doubletap:Get() then
                    indicators.Render_Indicator('DT', Exploits.GetCharge() == 1 and Color.RGBA(213, 213, 214, 255) or Color.RGBA(255, 0, 0, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(8) and ui.refs.hideshots:Get() then
                    indicators.Render_Indicator('ONSHOT', Color.RGBA(132, 196, 20, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(9) and ui.refs.yaw_base:Get() == 5 then
                    indicators.Render_Indicator('FS', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
       
                if ui.visuals.gamesense_choose:Get(10) and ui.refs.bodyaim:Get() == 2 then
                    indicators.Render_Indicator('BODY', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(11) and ui.refs.safepoints:Get() == 2 then
                    indicators.Render_Indicator('SAFE', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
            end
        end
    },

    indicators = {
        x_add = 0,
        -----------------------
        draw = function(self)
            if not ui.visuals.widgets:Get(5) then return end
                local local_player = EntityList.GetLocalPlayer()
                if not local_player then return end

                if not local_player:IsAlive() then return end
                local cur_dmg = ui.refs.minimum_damage:GetInt()
                if cur_dmg > 100 then cur_dmg = '+'..cur_dmg-100 end
                local isDmg = false
                local isPing = false
                local binds = Cheat.GetBinds()
                for i = 1, #binds do
                    bind = binds[i]
                    if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                        isDmg = true
                    end
                    if bind:GetName() == 'Fake Ping' and bind:IsActive() then
                        isPing = true
                    end
                end
                local ground = bit.band(local_player:GetProp('m_fFlags'), bit.lshift(1,0)) == 0
                local crouch = local_player:GetProp('m_flDuckAmount')
                local isDmg = false
                local binds = Cheat.GetBinds()
                for i = 1, #binds do
                    local bind = binds[i]
                    if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                        isDmg = true
                    end
                end
                local scope = local_player:GetProp('m_bIsScoped')
                self.x_add = helpers:lerp(self.x_add, scope and 35 or 0, GlobalVars.frametime * 8)

                local alpha = 0
                local y = 0

                if scope then
                    alpha = 0.5
                else
                    alpha = 1
                end
                if globals.indicator_avatar == nil then return end
                if globals.logo_avatar2 == nil then return end
                if fonts.pixel == nil then return end
                if fonts.arrow_fonts == nil then return end
                if fonts.arrow_font2 == nil then return end

                if ui.visuals.indicator_type:Get() == 1 then
                   
                    if not ui.visuals.disable_background:Get() then
                        Render.Image(globals.indicator_avatar, Vector2.new(globals.screen_size.x/2 - 50 +self.x_add, globals.screen_size.y/2 - 2), Vector2.new(100, 75), Color.new(ui.visuals.ghosty_color:GetColor().r, ui.visuals.ghosty_color:GetColor().g, ui.visuals.ghosty_color:GetColor().b, breath(2, ui.visuals.ghosty_color:GetColor().a * 100 / 235)))
                    end

                    Render.Image(globals.logo_avatar2, Vector2.new(globals.screen_size.x/2 - 20 +self.x_add, globals.screen_size.y/2 + 17), Vector2.new(40, 40), Color.new(ui.visuals.ghosty_color:GetColor().r, ui.visuals.ghosty_color:GetColor().g, ui.visuals.ghosty_color:GetColor().b, alpha))
                end
                --if ui.visuals.indicator_type:Get() == 1 then
                --Render.Image(globals.logo_avatar, Vector2.new(globals.screen_size.x/2 - 21 +self.x_add, globals.screen_size.y/2 + 20), Vector2.new(35, 35), Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, alpha))
                --end

                if ui.visuals.indicator_type:Get() == 0 then

                    if not ui.visuals.disable_background:Get() then
                        Render.Image(globals.indicator_avatar, Vector2.new(globals.screen_size.x/2 - 50 +self.x_add, globals.screen_size.y/2 - 8), Vector2.new(100, 75), Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, breath(2, ui.visuals.ind_name_color:GetColor().a * 100 / 235)))
                    end

                    Render.Text('psycho', Vector2.new(globals.screen_size.x/2-17+self.x_add, globals.screen_size.y/2+16), Color.new(0, 0, 0, 0.5), 11, fonts.verdanabd11)
                    Render.Text('psy', Vector2.new(globals.screen_size.x/2-18+self.x_add, globals.screen_size.y/2+15), AntiAim.GetInverterState() and Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, 1) or Color.new(1, 1, 1, 1), 11, fonts.verdanabd11)
                    Render.Text('cho', Vector2.new(globals.screen_size.x/2-1+self.x_add, globals.screen_size.y/2+15), not AntiAim.GetInverterState() and Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, 1) or Color.new(1, 1, 1, 1), 11, fonts.verdanabd11)
               
                    if ground then
                        state = 'AIR'
                    elseif crouch >= 1 then
                        state = 'CROUCHING'
                    elseif ui.refs.slowwalk:Get() then
                        state = 'SLOWWALKING'
                    elseif local_player:GetVelocity() > 5 then
                        state = 'MOVING'
                    else
                        state = 'STANDING'
                    end
                    local text_sizes = Render.CalcTextSize(state, 9, fonts.pixel)
                    Render.Text(state, Vector2.new(globals.screen_size.x/2+1-text_sizes.x/2+self.x_add, globals.screen_size.y/2+28), Color.new(ui.visuals.ind_state_color:GetColor().r, ui.visuals.ind_state_color:GetColor().g, ui.visuals.ind_state_color:GetColor().b, 1), 9, fonts.pixel, true)

                    Render.Text('OS', Vector2.new(globals.screen_size.x/2-18+self.x_add, globals.screen_size.y/2+37), ui.refs.hideshots:Get() and Color.new(ui.visuals.ind_color:GetColor().r, ui.visuals.ind_color:GetColor().g, ui.visuals.ind_color:GetColor().b, 1) or Color.new(0.8, 0.8, 0.8, 0.7), 9, fonts.pixel, true)
                    Render.Text('DT', Vector2.new(globals.screen_size.x/2-4+self.x_add, globals.screen_size.y/2+37), ui.refs.doubletap:Get() and (Exploits.GetCharge() >= 0.9 and Color.new(0, 1, 0, 1) or Color.new(1, 0, 0, 1)) or Color.new(0.8, 0.8, 0.8, 0.7), 9, fonts.pixel, true)
                    Render.Text('AP', Vector2.new(globals.screen_size.x/2+9+self.x_add, globals.screen_size.y/2+37), ui.refs.autopeek:Get() and Color.new(ui.visuals.ind_color:GetColor().r, ui.visuals.ind_color:GetColor().g, ui.visuals.ind_color:GetColor().b, 1) or Color.new(0.8, 0.8, 0.8, 0.7), 9, fonts.pixel, true)
                        if isDmg then
                            local text_size = Render.CalcTextSize(('DMG: %s'):format(ui.refs.minimum_damage:Get()), 9, fonts.pixel)
                            Render.Text(('DMG: %s'):format(ui.refs.minimum_damage:Get()), Vector2.new(globals.screen_size.x/2-text_size.x/2+1+self.x_add, globals.screen_size.y/2+46), Color.new(1, 1, 1, 1), 9, fonts.pixel, true)
                        end
                    end
                scope = EntityList.GetLocalPlayer():GetProp("m_bIsScoped")
                alpha = 0.7
       
                if ui.visuals.scope_conditions:Get(4) and scope then
                    alpha = 0
                else
                    if ui.visuals.arrows:GetInt() == 1 then
                        Render.Text('<', Vector2.new(globals.screen_size.x/2-40-ui.visuals.arrows_x:Get(), globals.screen_size.y/2-8), ui.refs.yaw_base:Get() == 3 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 15, fonts.verdana11)
                        Render.Text('>', Vector2.new(globals.screen_size.x/2+31+ui.visuals.arrows_x:Get(), globals.screen_size.y/2-8), ui.refs.yaw_base:Get() == 2 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 15, fonts.verdana11)
                    end

                    if ui.visuals.arrows:GetInt() == 2 then
                        Render.Text('X', Vector2.new(globals.screen_size.x/2-40-ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 3 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                        Render.Text('Z', Vector2.new(globals.screen_size.x/2+31+ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 2 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                    end

                    if ui.visuals.arrows:GetInt() == 3 then
                        Render.Text('w', Vector2.new(globals.screen_size.x/2-40-ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 3 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                        Render.Text('x', Vector2.new(globals.screen_size.x/2+31+ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 2 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                    end
                end
            end
        }
}
-- @endregion

-- @region: visuals
local visuals = {}
local scope_anim = 0
visuals.scope = function()
    -- vars
    x,y,w,o = globals.screen_size.x / 2, globals.screen_size.y / 2, ui.visuals.scope_width:GetInt(), ui.visuals.scope_offset:GetInt()
    -- проверки
    local fov_cs_debug = CVar.FindVar("fov_cs_debug")

    if not EngineClient.IsConnected() then return end
    if not EntityList.GetLocalPlayer() then return end
    if not EntityList.GetLocalPlayer():GetProp("m_bIsScoped") then return end
    if ui.visuals.custom_scope:GetBool() then
        ui.refs.scope:SetInt(2)
       
        if scope_anim > 0 then scope_anim = scope_anim - 5
            else scope_anim = 0
        end
        if ui.visuals.scope_conditions:Get(2) then scope_anim = 255 else if scope_anim < 255 then scope_anim = scope_anim + 5 else scope_anim = 255 end end
        if ui.visuals.custom_scope and ui.visuals.scope_conditions:Get(3) and fov_cs_debug:GetInt()~=90 then fov_cs_debug:SetInt(90) end

        if ui.visuals.scope_conditions:Get(1) then
            color1 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, scope_anim / 255)
            color2 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, 0)
        else
            color1 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, 0)
            color2 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, scope_anim / 255)
        end

        Render.GradientBoxFilled(Vector2.new(x - w - o, y), Vector2.new(x - o, y + 1), color1, color2, color1, color2)
        Render.GradientBoxFilled(Vector2.new(x + w + o, y), Vector2.new(x + o, y + 1), color1, color2, color1, color2)
        Render.GradientBoxFilled(Vector2.new(x, y - o - w), Vector2.new(x + 1, y - o), color1, color1, color2, color2)
        Render.GradientBoxFilled(Vector2.new(x, y + o + w), Vector2.new(x + 1, y + o), color1, color1, color2, color2)
    else
        ui.refs.scope:SetInt(1)
    end
end

visuals.circle_desync = function()  
   
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then return end

     if not local_player:IsAlive() then return end
    if ui.visuals.desync_circle_conditions:Get(2) and ui.visuals.desync_circle:GetBool() then
        CVar.FindVar('crosshair'):SetInt(0)
    else
        CVar.FindVar('crosshair'):SetInt(1)
    end

    if ui.visuals.desync_circle:Get() then

        local color = Color.new(ui.visuals.desync_circle:GetColor().r, ui.visuals.desync_circle:GetColor().g, ui.visuals.desync_circle:GetColor().b, 1)
        local view_angles = EngineClient.GetViewAngles()
        local real_yaw = AntiAim.GetCurrentRealRotation()
        local view_yaw = view_angles.yaw - 180;
        local fake = adjust_angle(real_yaw - view_yaw);
        local delta = math.abs(normalize_yaw(AntiAim.GetCurrentRealRotation() % 360 - AntiAim.GetFakeRotation() % 360)) / 2
        local fake_color = Color.RGBA(math.floor(255 - (delta * 2.29824561404)), math.floor(delta * 3.42105263158), math.floor(delta * 0.22807017543), 255)

        Render.Circle(Vector2.new(globals.screen_size.x/2, globals.screen_size.y/2), 7, 32, Color.new(0, 0, 0, 1), 4, 0, 360)
        Render.Circle(Vector2.new(globals.screen_size.x/2, globals.screen_size.y/2), 7, 32, ui.visuals.desync_circle_conditions:Get(1) and fake_color or color, 4, 90, ui.refs.invert_side == false and -90 or 270)
        Render.Circle(Vector2.new(globals.screen_size.x/2, globals.screen_size.y/2), 15, 32, ui.visuals.desync_circle_conditions:Get(1) and fake_color or color, 4, fake+30, fake-30)
    end
end

visuals.hitmarker = function()
    if not EngineClient.IsConnected() then return end
    if not ui.visuals.hitmarker:Get() then return end

    misc.removeimpact()
    local color = ui.visuals.hitmarker:GetColor()
    local r = color.r local g = color.g local b = color.b local l = ui.visuals.hitmarker_length:Get()

    for i = 1, #t do

        local screen_pos = Render.WorldToScreen(Vector.new(t[i].x, t[i].y, t[i].z))
        local sx,sy = screen_pos.x, screen_pos.y

        Render.BoxFilled(Vector2.new(sx, sy - l), Vector2.new(sx, sy + l), Color.new(r, g, b, (t[i].a / 255)), 1.0)
        Render.BoxFilled(Vector2.new(sx - l, sy), Vector2.new(sx + l, sy), Color.new(r, g, b, (t[i].a / 255)), 1.0)
    end
end

visuals.thirdperson = function()
    if ui.misc.thirdperson:Get() and ui.misc.misc_enable:Get() then
        Menu.FindVar("Visuals", "View", "Thirdperson", "Distance"):Set(ui.misc.thirdperson_distance:Get())
    end
        if ui.misc.thirdperson:Get() and ui.misc.misc_enable:Get() then
            Cheat.SetThirdPersonAnim(not ui.misc.thirdperson_anim:Get())
        else
            Cheat.SetThirdPersonAnim(true)
        end
end
visuals._verification = function(shot)
    local text = ''

    local hg_diff = hgroup ~= aimed_hgroup
    local dmg_diff = shot.damage ~= shot.wanted_damage

    if hg_diff or dmg_diff then
        text = string.format(
            ' | mismatch: [ %s ]', (function()
                local addr = ''

                if dmg_diff then addr = 'dmg: ' .. shot.wanted_damage .. (hg_diff and ' | ' or '') end
                if hg_diff then addr = addr .. (hg_diff and 'hitgroup: ' .. aimed_hgroup or '') end

                return addr
            end)()
        )
    end

    return text
end

local size_changed = false

local text = ''

visuals.glowmenu = function()
    if not ui.misc.menu_customize:Get() then return end
    local menu_pos = Render.GetMenuPos()
    local menu_sz = Render.GetMenuSize()
   
    function force_update()    image_size = Vector2.new(menu_sz.x * 3, menu_sz.y * 3)    end
    if menu_sz.x ~= cache_size.x then force_update() size_changed = true end
    if size_changed == true and cache_size.x == menu_sz.x then force_update() end
    if not Cheat.IsMenuVisible() then return end
   
    if ui.misc.menu_dim:Get() then
        Render.BoxFilled(Vector2.new(0.0, 0.0), Vector2.new(EngineClient.GetScreenSize().x, EngineClient.GetScreenSize().y), Color.new(0, 0, 0, ui.misc.dim_slider:GetFloat()))
    end

    if ui.misc.menu_blur:Get() then

        Render.Blur(Vector2.new(0.0, 0.0), Vector2.new(EngineClient.GetScreenSize().x, EngineClient.GetScreenSize().y), Color.new(1, 1, 1, ui.misc.blur_slider:GetFloat()))
    end
   
    if ui.misc.menu_glow:Get() then
        local alpha = 0
        if ui.misc.glow_pulse:Get() then
                alpha = breath(2, ui.misc.color_edit:GetColor().a * 175 / 235)
            else
                alpha = ui.misc.color_edit:GetColor().a
        end

        Render.Image(globals.background, Vector2.new(menu_pos.x - menu_sz.x, menu_pos.y - menu_sz.y), image_size, Color.new(ui.misc.color_edit:GetColor().r, ui.misc.color_edit:GetColor().g, ui.misc.color_edit:GetColor().b, alpha ))
    end
end

visuals.events = function(event)

    local name = event:GetName()
    if name == "player_hurt" then
        local attacker = event:GetInt("attacker")

        if EntityList.GetPlayerForUserID(attacker) == globals.local_player then
       
            if ui.visuals.widgets:Get(6) and ui.visuals.log_type:Get(1) then
                local player = EntityList.GetPlayerForUserID(event:GetInt("userid"))

                if not player then
                    return
                end

                local hitgroup_names = {
                    [0] = "generic",
                    [1] = "head",
                    [2] = "chest",
                    [3] = "stomach",
                    [4] = "left arm",
                    [5] = "right arm",
                    [6] = "left leg",
                    [7] = "right leg",
                    [10] = "gear"
                }

                logs:add(string.format("Hit %s in the %s for %d damage (%d health remaining)", player:GetName(), hitgroup_names[event:GetInt("hitgroup")] or "?", event:GetInt("dmg_health"), event:GetInt("health")))
            end
        end
    end

    if name == "bullet_impact" then
        local fire_plr = EntityList.GetPlayerForUserID(event:GetInt("userid"))
        local localplayer = EntityList.GetLocalPlayer()
            if fire_plr ~= localplayer then
                return
            end
         table.insert(t, {
            x = event:GetInt("x"),
            y = event:GetInt("y"),
            z = event:GetInt("z"),
            a = 255,
            ctime = GlobalVars.curtime,
         })
    end

    if name == 'player_connect_full' then
        t = {}
    end

    if name == "player_hurt" then
        local localplayer = EntityList.GetLocalPlayer()
        local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker"))
        if ui.misc.hitsound:Get() and ui.misc.misc_enable:Get() then
            if attacker == localplayer then
                EngineClient.ExecuteClientCmd(string.format("playvol %s %s", ui.misc.hitsound_direction:Get(), ui.misc.hitsound_volume:Get()))
            end
        end
    end

    if name == 'player_hurt' then
        local weapon = event:GetString('weapon', '');
        if (weapon == 'hegrenade' or weapon == 'inferno' or weapon == 'knife') then
            if event:GetInt('userid') == nil then return end
            if event:GetInt('attacker') == nil then return end
            local attacker_id = EntityList.GetPlayerForUserID(event:GetInt('attacker'))
            if attacker_id == nil or attacker_id ~= EntityList.GetLocalPlayer() then
                return
            end
           
            local hittype = 'Hit'
            if weapon == 'hegrenade' then
                hittype = 'Naded';
            elseif weapon == 'inferno' then
                hittype = 'Burned';
            elseif weapon == 'knife' then
                hittype = 'Knifed';
            end
            local server_damage = event:GetInt('dmg_health')
            local target_id = EntityList.GetPlayerForUserID(event:GetInt('userid'))
            if target_id == nil then return end
            local target_name = string.lower(target_id:GetName())
            local health = target_id:GetProp('m_iHealth')-server_damage
            if health < 0 then health = 0 end
            text = string.format('%s %s for %i damage (%i remaining)', hittype, target_name, server_damage, health)
            if ui.visuals.log_type:Get(3) then
                ffi_functions.color_print1(Color.RGBA(255, 162, 163, 255), '[psycho] ')
                ffi_functions.color_print1(Color.RGBA(216, 216, 216, 255), text..'\n')

                table.insert(hitlogs, {text = text, time = GlobalVars.realtime})

            end
        end
    end

end
local hitgroup_names1 = { 'generic', 'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' }

visuals.ragebot_shot = function(shot)
    miss_hitbox = missgroup_names[shot.hitgroup] or '?'
end

visuals.registered_shot = function(shot)

    hit_id = hit_id + 1
    shot_id = num_format((hit_id % 15) + 1)
    local safety = Menu.FindVar('Aimbot', 'Ragebot', 'Misc', 'Safe Points'):Get()
    local name = string.lower(EntityList.GetClientEntity(shot.target_index):GetPlayer():GetName())
    if name == nil then return end
    local hgroup = hitgroup_names1[shot.hitgroup + 1] or '?'
    local hit_chance = tostring(math.floor(shot.hitchance + 0.5))
    local backtrack = shot.backtrack
    local m_iHealth = EntityList.GetClientEntity(shot.target_index):GetPlayer():GetProp('m_iHealth')
    if m_iHealth == nil then return end
    local health = m_iHealth - shot.damage
    if health < 0 then health = 0 end
    local aimed_hgroup = hitgroup_names1[shot.wanted_hitgroup + 1] or '?'
   
    local feet_yaw = math.min(58, math.max(yaw_normalize(EntityList.GetClientEntity(shot.target_index):GetPlayer():GetProp('m_flPoseParameter')[12] * 120 - 60), -58))
    if EntityList.GetClientEntity(shot.target_index):GetPlayer():GetProp('m_flPoseParameter') == nil then return end
    if feet_yaw == nil then return end
    local ping = EngineClient.GetNetChannelInfo():GetLatency(0)*1000
    local avg_ping = EngineClient.GetNetChannelInfo():GetAvgLatency(0)*1000
    --if shot.reason == nil or hit_id == nil or aimed_hgroup == nil or shot_id == nil or feet_yaw == nil or safety == nil or name == nil or hit_chance == nil or ping == nil or avg_ping == nil then return end
    local netChannelInfo = ffi.cast('void***', getNetChannelInfo(I_EngineClientPtr)) or error('netchaninfo is nil')
    local netChannel = GetNetChannel(netChannelInfo)
    local net_state = string.format(
        'delay: %d:%.2f | dropped: %.0f',
        avg_ping, math.abs(avg_ping-ping), (netChannel.AvgLoss*100)
    )
   
    local uflags = {
        math.abs(avg_ping-ping) < 1 and 0 or 1,
        CVar.FindVar('cl_clock_correction'):GetInt() == 1 and 0 or 1,
        CVar.FindVar('cl_clock_correction_force_server_tick') == 999 and 0 or 1
    }

    local pflags = {
        ClientState.m_choked_commands > 1 and 1 or 0,
        EntityList.GetLocalPlayer():GetProp('m_flVelocityModifier') < 1.00 and 1 or 0,
        (EntityList.GetLocalPlayer():GetRenderOrigin().z <= EntityList.GetClientEntity(shot.target_index):GetPlayer():GetRenderOrigin().z) and 1 or 0
    }

    local correction = Menu.FindVar('Aimbot', 'Ragebot', 'Main', 'Override Resolver'):GetBool()
   
    if shot.reason == 0 then
        text = string.format('Registered %s shot in %s\'s %s for %d damage [angle: %.2f° | %d:%d°] ( hitchance: %s%% | safety: %s | history(Δ): %d | flags: %s%s )',
        shot_id, name, hgroup, shot.damage, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, hit_chance, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags), visuals._verification(shot))
        textc = string.format('Registered %s shot in %s\'s %s for %d damage [angle: %.2f° | %d:%d°] ( hitchance: %s | safety: %s | history(Δ): %d | flags: %s%s )',
        shot_id, name, hgroup, shot.damage, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, hit_chance .. '%%', safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags), visuals._verification(shot))
    elseif shot.reason == 1 then
        shot_reason = (shot.reason == 1 and total_hits ~= EntityList.GetLocalPlayer():GetProp('m_totalHitsOnServer')) and 'damage rejection' or string.format('unknown [angle: %.2f° | %d:%d°]', shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw)
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to %s ( dmg: %d | safety: %d | history(Δ): %d | flags: %s )',
        shot_id, name, miss_hitbox, hit_chance, shot_reason, shot.wanted_damage, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags))
    elseif shot.reason == 2 then
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to spread [angle: %.2f° | %d:%d°] ( dmg: %d | safety: %d | history(Δ): %d | flags: %s )',
        shot_id, name, miss_hitbox, hit_chance, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, shot.wanted_damage, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags))
    elseif shot.reason == 3 then
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to occlusion [angle: %.2f° | %d:%d°] ( dmg: %d | safety: %d | history(Δ): %d | flags: %s )',
        shot_id, name, miss_hitbox, hit_chance, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, shot.wanted_damage, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags))
    elseif shot.reason == 4 then
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to prediction error [%s] [vel_modifier: %.1f | history(Δ): %d | error: %s]',
        shot_id, name, miss_hitbox, hit_chance, net_state, EntityList.GetLocalPlayer():GetProp('m_flVelocityModifier'), backtrack, table.concat(uflags))
    end
    if ui.visuals.log_type:Get(3) then

        if shot.reason == 0 then
            ffi_functions.color_print1(Color.RGBA(255, 162, 163, 255), '[psycho] ')
            ffi_functions.color_print1(Color.RGBA(216, 216, 216, 255), textc..'\n')
        else
            ffi_functions.color_print1(Color.RGBA(255, 162, 163, 255), '[psycho] ')
            ffi_functions.color_print1(Color.RGBA(216, 216, 216, 200), text1..'\n')
        end

        table.insert(hitlogs, {text = text, time = GlobalVars.realtime})
    end

end

-- @endregion

-- @region: world
local world = {}
world.sun_set = function()
    if not ui.world.world_enable:GetBool() then return end
    local CCascadeLights = EntityList.GetEntitiesByName('CCascadeLight')
    if not CCascadeLights == nil then return end
    for i=1, #CCascadeLights do
        local CCascadeLight = CCascadeLights[i]
        if ui.world.sunset:GetBool() then
            if CCascadeLight:GetProp('m_shadowDirection') ~= Vector.new(ui.world.shadow_x:Get(), ui.world.shadow_y:Get(), ui.world.shadow_z:Get()) then
                CCascadeLight:SetProp('m_shadowDirection', Vector.new(ui.world.shadow_x:Get(), ui.world.shadow_y:Get(), ui.world.shadow_z:Get()))
                CCascadeLight:SetProp('m_envLightShadowDirection', Vector.new(ui.world.shadow_x:Get(), ui.world.shadow_y:Get(), ui.world.shadow_z:Get()))
            end
            if CCascadeLight:GetProp('m_flMaxShadowDist') ~= ui.world.shadow_dist:Get() then
                CCascadeLight:SetProp('m_flMaxShadowDist', ui.world.shadow_dist:Get())
            end
        else
            if CCascadeLight:GetProp('m_shadowDirection') ~= Vector.new(0, 0, 0) then
                CCascadeLight:SetProp('m_shadowDirection', Vector.new(0, 0, 0))
                CCascadeLight:SetProp('m_envLightShadowDirection', Vector.new(0, 0, 0))
            end
        end
    end
end

local materials = {
    "particle/fire_burning_character/fire_env_fire_depthblend_oriented", "particle/fire_burning_character/fire_burning_character", "particle/fire_explosion_1/fire_explosion_1_oriented", "particle/fire_explosion_1/fire_explosion_1_bright", "particle/fire_burning_character/fire_burning_character_depthblend", "particle/fire_burning_character/fire_env_fire_depthblend",
}

world.molotov = function()
    for _, v in pairs(materials) do
        local material = MatSystem.FindMaterial(v, "")

        if material ~= nil then
            material:SetMaterialVarFlag(bit.lshift(1, 28), ui.world.molly_conditions:Get(1) and ui.world.world_enable:GetBool())
            material:SetMaterialVarFlag(bit.lshift(1, 15), ui.world.molly_conditions:Get(2) and ui.world.world_enable:GetBool())
        end
    end

end

-- effects
world.effects = function()
    if not ui.world.enable_bloom:Get() and ui.world.world_enable:Get() then return end
    if not EntityList.GetLocalPlayer() then
        return
    end

        local ambient = CVar.FindVar('r_modelAmbientMin')

        local CETC = EntityList.GetEntitiesByName('CEnvTonemapController')

        for idx, entity in pairs(CETC) do
            entity:SetProp('m_bUseCustomAutoExposureMin', true)
            entity:SetProp('m_bUseCustomAutoExposureMax', true)
            entity:SetProp('m_bUseCustomBloomScale', true)
            entity:SetProp('m_flCustomAutoExposureMin', ui.world.exposure:GetFloat() / 10);
            entity:SetProp('m_flCustomAutoExposureMax', ui.world.exposure:GetFloat() / 10);
            entity:SetProp('m_flCustomBloomScale', ui.world.bloom:GetFloat() / 10);
        end

        ambient:SetFloat(ui.world.model_ambient:GetFloat() / 10)

end

world.custom_skybox = function()
    if ui.world.custom_skybox:GetBool() and ui.world.world_enable:GetBool() then
        skybox_color = ui.world.custom_skybox:GetColor()
        skyboxname = ui.world.skybox_choose:GetString()
        cvar = CVar.FindVar("sv_skyname")
        ui.refs.skybox:SetInt(0)
        ui.refs.skybox:SetColor(skybox_color)
        cvar:SetString(skyboxname)
    else
        return  
    end
end
-- @endregion

logs = {
    logs = {},
    draw = function(self)
        local draw_offset = 50

        for _, log in pairs(self.logs) do
            local expired = log.expire_time < GlobalVars.realtime

            if expired then
                log.alpha = helpers:lerp(log.alpha, 0)
                log.pos = helpers:lerp(log.pos, 0)
            else
                log.alpha = helpers:lerp(log.alpha, 1)
                log.pos = helpers:lerp(log.pos, draw_offset)
                draw_offset = draw_offset + 30
            end

            if log.alpha < 0.01 and expired then
                table.remove(self.logs, _)
            else
                local size = Render.CalcTextSize(log.text, 11, fonts.verdana).x
                local pos = Vector2.new((globals.screen_size.x - size) * 0.5 - 5, globals.screen_size.y - log.pos)
                widgets:create_window(pos, pos + Vector2.new(size + 10, 20), log.alpha)
                Render.Text(log.text, pos + Vector2.new(5, 4), Color.new(1, 1, 1, log.alpha), 11, fonts.verdana)
            end
        end
    end,
    add = function(self, text)
        local log = {
            text = text,
            expire_time = GlobalVars.realtime + 5,
            pos = 0,
            alpha = 0,
        }

        table.insert(self.logs, log)
    end
}

-- @region: config system
ffi_functions.VGUI_System = ffi.cast(ffi.typeof('void***'), Utils.CreateInterface('vgui2.dll', 'VGUI_System010'))
ffi_functions.get_clipboard_text_length = ffi.cast('get_clipboard_text_length', ffi_functions.VGUI_System[0][7])
ffi_functions.get_clipboard_text = ffi.cast('get_clipboard_text', ffi_functions.VGUI_System[0][11])
ffi_functions.set_clipboard_text = ffi.cast('set_clipboard_text', ffi_functions.VGUI_System[0][9])

cfg_system.set_clipboard = function(text)
    ffi_functions.set_clipboard_text(ffi_functions.VGUI_System, text, #text)
end

cfg_system.get_clipboard = function()
    local clipboard_text_length = ffi_functions.get_clipboard_text_length(ffi_functions.VGUI_System)

    if (clipboard_text_length > 0) then
        local buffer = ffi.new('char[?]', clipboard_text_length)

        ffi_functions.get_clipboard_text(ffi_functions.VGUI_System, 0, buffer, clipboard_text_length * ffi.sizeof('char[?]', clipboard_text_length))
        return ffi.string(buffer, clipboard_text_length - 1)
    end

    return ''
end

cfg_system.cfg_data = {
    bools = {
        ui.anti_aims.custom[1].enable, ui.anti_aims.custom[2].enable, ui.anti_aims.custom[3].enable, ui.anti_aims.custom[4].enable, ui.anti_aims.custom[5].enable, ui.anti_aims.custom[6].enable,
        ui.anti_aims.custom[1].freestanding_bodyyaw, ui.anti_aims.custom[2].freestanding_bodyyaw, ui.anti_aims.custom[3].freestanding_bodyyaw, ui.anti_aims.custom[4].freestanding_bodyyaw, ui.anti_aims.custom[5].freestanding_bodyyaw, ui.anti_aims.custom[6].freestanding_bodyyaw,
        ui.anti_aims.custom[1].step_abs, ui.anti_aims.custom[2].step_abs, ui.anti_aims.custom[3].step_abs, ui.anti_aims.custom[4].step_abs, ui.anti_aims.custom[5].step_abs, ui.anti_aims.custom[6].step_abs,
        ui.misc.misc_enable,
        ui.misc.slowwalk_c,
        ui.misc.hitsound,
        ui.world.custom_skybox,
        ui.world.world_enable,
        ui.world.sunset,
        ui.visuals.visuals_enable,
        ui.visuals.disable_blur,
        ui.visuals.disable_background,
        ui.visuals.custom_scope,
        ui.visuals.desync_circle,
        ui.visuals.hitmarker,
        ui.anti_aims.antiaim_enable,
        ui.misc.menu_glow,
        ui.misc.glow_pulse,
        ui.misc.menu_dim,
        ui.misc.menu_blur,
        ui.misc.menu_customize,
        ui.misc.thirdperson,
        ui.ragebot.maxmissed,
        ui.misc.thirdperson_anim,
        ui.world.enable_bloom,
        ui.misc.clantag,
        ui.ragebot.dormant_aimbot,
        ui.ragebot.doubletap_recharge,
        ui.ragebot.override_doubletap,
        ui.ragebot.Teleport_In_Air,
        ui.visuals.gamesense,
        ui.ragebot.bodyaims,
        ui.misc.color_override,
        ui.misc.autopeek,
        ui.misc.quick_peek

    },
    ints = {
        ui.anti_aims.custom[1].yaw_mode, ui.anti_aims.custom[2].yaw_mode, ui.anti_aims.custom[3].yaw_mode, ui.anti_aims.custom[4].yaw_mode, ui.anti_aims.custom[5].yaw_mode, ui.anti_aims.custom[6].yaw_mode,
        ui.anti_aims.custom[1].static_yaw, ui.anti_aims.custom[2].static_yaw, ui.anti_aims.custom[3].static_yaw, ui.anti_aims.custom[4].static_yaw, ui.anti_aims.custom[5].static_yaw, ui.anti_aims.custom[6].static_yaw,
        ui.anti_aims.custom[1].tick_yaw_left, ui.anti_aims.custom[2].tick_yaw_left, ui.anti_aims.custom[3].tick_yaw_left, ui.anti_aims.custom[4].tick_yaw_left, ui.anti_aims.custom[5].tick_yaw_left, ui.anti_aims.custom[6].tick_yaw_left,
        ui.anti_aims.custom[1].tick_yaw_right, ui.anti_aims.custom[2].tick_yaw_right, ui.anti_aims.custom[3].tick_yaw_right, ui.anti_aims.custom[4].tick_yaw_right, ui.anti_aims.custom[5].tick_yaw_right, ui.anti_aims.custom[6].tick_yaw_right,
        ui.anti_aims.custom[1].choke_yaw_left, ui.anti_aims.custom[2].choke_yaw_left, ui.anti_aims.custom[3].choke_yaw_left, ui.anti_aims.custom[4].choke_yaw_left, ui.anti_aims.custom[5].choke_yaw_left, ui.anti_aims.custom[6].choke_yaw_left,
        ui.anti_aims.custom[1].choke_yaw_right, ui.anti_aims.custom[2].choke_yaw_right, ui.anti_aims.custom[3].choke_yaw_right, ui.anti_aims.custom[4].choke_yaw_right, ui.anti_aims.custom[5].choke_yaw_right, ui.anti_aims.custom[6].choke_yaw_right,
        ui.anti_aims.custom[1].desync_yaw_left, ui.anti_aims.custom[2].desync_yaw_left, ui.anti_aims.custom[3].desync_yaw_left, ui.anti_aims.custom[4].desync_yaw_left, ui.anti_aims.custom[5].desync_yaw_left, ui.anti_aims.custom[6].desync_yaw_left,
        ui.anti_aims.custom[1].desync_yaw_right, ui.anti_aims.custom[2].desync_yaw_right, ui.anti_aims.custom[3].desync_yaw_right, ui.anti_aims.custom[4].desync_yaw_right, ui.anti_aims.custom[5].desync_yaw_right, ui.anti_aims.custom[6].desync_yaw_right,
        ui.anti_aims.custom[1].yaw_jitter, ui.anti_aims.custom[2].yaw_jitter, ui.anti_aims.custom[3].yaw_jitter, ui.anti_aims.custom[4].yaw_jitter, ui.anti_aims.custom[5].yaw_jitter, ui.anti_aims.custom[6].yaw_jitter,
        ui.anti_aims.custom[1].yaw_jitter_degree, ui.anti_aims.custom[2].yaw_jitter_degree, ui.anti_aims.custom[3].yaw_jitter_degree, ui.anti_aims.custom[4].yaw_jitter_degree, ui.anti_aims.custom[5].yaw_jitter_degree, ui.anti_aims.custom[6].yaw_jitter_degree,
        ui.anti_aims.custom[1].yaw_jitter_degree, ui.anti_aims.custom[2].yaw_jitter_degree2, ui.anti_aims.custom[3].yaw_jitter_degree2, ui.anti_aims.custom[4].yaw_jitter_degree2, ui.anti_aims.custom[5].yaw_jitter_degree2, ui.anti_aims.custom[6].yaw_jitter_degree2,
     
        ui.anti_aims.custom[1].self_bodyyaw_mode, ui.anti_aims.custom[2].self_bodyyaw_mode, ui.anti_aims.custom[3].self_bodyyaw_mode, ui.anti_aims.custom[4].self_bodyyaw_mode, ui.anti_aims.custom[5].self_bodyyaw_mode, ui.anti_aims.custom[6].self_bodyyaw_mode,
        ui.anti_aims.custom[1].bodyyaw_mode, ui.anti_aims.custom[2].bodyyaw_mode, ui.anti_aims.custom[3].bodyyaw_mode, ui.anti_aims.custom[4].bodyyaw_mode, ui.anti_aims.custom[5].bodyyaw_mode, ui.anti_aims.custom[6].bodyyaw_mode,
        ui.anti_aims.custom[1].bodyyaw_degree, ui.anti_aims.custom[2].bodyyaw_degree, ui.anti_aims.custom[3].bodyyaw_degree, ui.anti_aims.custom[4].bodyyaw_degree, ui.anti_aims.custom[5].bodyyaw_degree, ui.anti_aims.custom[6].bodyyaw_degree,
        ui.anti_aims.custom[1].jitter_bodyyaw_degree_left, ui.anti_aims.custom[2].jitter_bodyyaw_degree_left, ui.anti_aims.custom[3].jitter_bodyyaw_degree_left, ui.anti_aims.custom[4].jitter_bodyyaw_degree_left, ui.anti_aims.custom[5].jitter_bodyyaw_degree_left, ui.anti_aims.custom[6].jitter_bodyyaw_degree_left,
        ui.anti_aims.custom[1].jitter_bodyyaw_degree_right, ui.anti_aims.custom[2].jitter_bodyyaw_degree_right, ui.anti_aims.custom[3].jitter_bodyyaw_degree_right, ui.anti_aims.custom[4].jitter_bodyyaw_degree_right, ui.anti_aims.custom[5].jitter_bodyyaw_degree_right, ui.anti_aims.custom[6].jitter_bodyyaw_degree_right,
        ui.anti_aims.custom[1].step_bodyyaw_degree_left, ui.anti_aims.custom[2].step_bodyyaw_degree_left, ui.anti_aims.custom[3].step_bodyyaw_degree_left, ui.anti_aims.custom[4].step_bodyyaw_degree_left, ui.anti_aims.custom[5].step_bodyyaw_degree_left, ui.anti_aims.custom[6].step_bodyyaw_degree_left,
        ui.anti_aims.custom[1].step_bodyyaw_degree_right, ui.anti_aims.custom[2].step_bodyyaw_degree_right, ui.anti_aims.custom[3].step_bodyyaw_degree_right, ui.anti_aims.custom[4].step_bodyyaw_degree_right, ui.anti_aims.custom[5].step_bodyyaw_degree_right, ui.anti_aims.custom[6].step_bodyyaw_degree_right,
        ui.anti_aims.custom[1].body_yaw_step_ticks, ui.anti_aims.custom[2].body_yaw_step_ticks, ui.anti_aims.custom[3].body_yaw_step_ticks, ui.anti_aims.custom[4].body_yaw_step_ticks, ui.anti_aims.custom[5].body_yaw_step_ticks, ui.anti_aims.custom[6].body_yaw_step_ticks,
        ui.anti_aims.custom[1].body_yaw_step_value, ui.anti_aims.custom[2].body_yaw_step_value, ui.anti_aims.custom[3].body_yaw_step_value, ui.anti_aims.custom[4].body_yaw_step_value, ui.anti_aims.custom[5].body_yaw_step_value, ui.anti_aims.custom[6].body_yaw_step_value,

        ui.anti_aims.custom[1].fake_yaw_mode, ui.anti_aims.custom[2].fake_yaw_mode, ui.anti_aims.custom[3].fake_yaw_mode, ui.anti_aims.custom[4].fake_yaw_mode, ui.anti_aims.custom[5].fake_yaw_mode, ui.anti_aims.custom[6].fake_yaw_mode,
        ui.anti_aims.custom[1].static_fakeyaw, ui.anti_aims.custom[2].static_fakeyaw, ui.anti_aims.custom[3].static_fakeyaw, ui.anti_aims.custom[4].static_fakeyaw, ui.anti_aims.custom[5].static_fakeyaw, ui.anti_aims.custom[6].static_fakeyaw,
        ui.anti_aims.custom[1].jitter_fakeyaw_left, ui.anti_aims.custom[2].jitter_fakeyaw_left, ui.anti_aims.custom[3].jitter_fakeyaw_left, ui.anti_aims.custom[4].jitter_fakeyaw_left, ui.anti_aims.custom[5].jitter_fakeyaw_left, ui.anti_aims.custom[6].jitter_fakeyaw_left,
        ui.anti_aims.custom[1].jitter_fakeyaw_right, ui.anti_aims.custom[2].jitter_fakeyaw_right, ui.anti_aims.custom[3].jitter_fakeyaw_right, ui.anti_aims.custom[4].jitter_fakeyaw_right, ui.anti_aims.custom[5].jitter_fakeyaw_right, ui.anti_aims.custom[6].jitter_fakeyaw_right,
        ui.anti_aims.custom[1].step_ticks, ui.anti_aims.custom[2].step_ticks, ui.anti_aims.custom[3].step_ticks, ui.anti_aims.custom[4].step_ticks, ui.anti_aims.custom[5].step_ticks, ui.anti_aims.custom[6].step_ticks,
        ui.anti_aims.custom[1].step_value, ui.anti_aims.custom[2].step_value, ui.anti_aims.custom[3].step_value, ui.anti_aims.custom[4].step_value, ui.anti_aims.custom[5].step_value, ui.anti_aims.custom[6].step_value,
        ui.anti_aims.custom[1].step_fake_min, ui.anti_aims.custom[2].step_fake_min, ui.anti_aims.custom[3].step_fake_min, ui.anti_aims.custom[4].step_fake_min, ui.anti_aims.custom[5].step_fake_min, ui.anti_aims.custom[6].step_fake_min,
        ui.anti_aims.custom[1].step_fake_max, ui.anti_aims.custom[2].step_fake_max, ui.anti_aims.custom[3].step_fake_max, ui.anti_aims.custom[4].step_fake_max, ui.anti_aims.custom[5].step_fake_max, ui.anti_aims.custom[6].step_fake_max,
        ui.anti_aims.custom[1].extra_options, ui.anti_aims.custom[2].extra_options, ui.anti_aims.custom[3].extra_options, ui.anti_aims.custom[4].extra_options, ui.anti_aims.custom[5].extra_options, ui.anti_aims.custom[6].extra_options,
        ui.misc.slowwalk_slider,
        ui.world.shadow_dist,
        ui.world.molly_conditions,
        ui.visuals.widgets,
        ui.visuals.watermark_info,
        ui.visuals.statepanel_image,
        ui.visuals.log_type,
        ui.visuals.indicator_type,
        ui.visuals.arrows,
        ui.visuals.arrows_x,
        ui.visuals.scope_width,
        ui.visuals.scope_offset,
        ui.visuals.scope_conditions,
        ui.visuals.desync_circle_conditions,
        ui.visuals.hitmarker_length,
       
        ui.anti_aims.antiaim_helpers,
        ui.ragebot.tp_in_air,
        ui.anti_aims.animbreakers,
        ui.misc.thirdperson_distance,
        ui.ragebot.maxmissed_c,
        ui.ragebot.dormant_aimbot_damage,
        ui.ragebot.doubletap_speed,
        ui.visuals.gamesense_choose,
        ui.ragebot.baimhp,
        ui.ragebot.baimmode,
        ui.ragebot.hitchances,
        ui.ragebot.air_hitchance,
        ui.ragebot.noscope_hitchance,

    },

    floats = {
        ui.misc.hitsound_volume,
        ui.world.shadow_x,
        ui.world.shadow_y,
        ui.world.shadow_z,
        ui.misc.blur_slider,
        ui.misc.dim_slider,
        ui.world.exposure,
        ui.world.bloom,
        ui.world.model_ambient,

    },

    strings = {
        ui.misc.hitsound_direction,
        ui.world.skybox_choose,
        ui.visuals.custom_username
    },

    colors = {
        ui.visuals.ghosty_color,
        ui.visuals.ind_name_color,
        ui.visuals.ind_state_color,
        ui.visuals.ind_color,
        ui.visuals.arrows_color,
        ui.visuals.theme,
        ui.world.custom_skybox,
        ui.visuals.custom_scope,
        ui.visuals.desync_circle,
        ui.visuals.hitmarker,
        ui.misc.color_edit,
        ui.misc.color_override,
        ui.misc.autopeek
    }
}

de_en_coding = 'pl3KmT/U1Djka4d7xA9WHXfNvngIbe56PSRFZGLOwrq2Ms8QEytVYhBJoC0i+czu'

cfg_system.encode = function(data)
    return ((data:gsub('.', function(x)
        local r,de_en_coding= '', x:byte()
        for i=8,1,-1 do r=r..(de_en_coding%2^i-de_en_coding%2^(i-1)>0 and '1' or '0') end
        return r;
    end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then return '' end
        local c=0
        for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
        return de_en_coding:sub(c+1,c+1)
    end)..({ '', '==', '=' })[#data%3+1])
end

cfg_system.decode = function(data)
    data = string.gsub(data, '[^'..de_en_coding..'=]', '')
    return (data:gsub('.', function(x)
        if (x == '=') then return '' end
        local r,f='',(de_en_coding:find(x)-1)
        for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end
        return r;
    end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if (#x ~= 8) then return '' end
        local c=0
        for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end
            return string.char(c)
    end))
end
ui.global.export_cfg:RegisterCallback(function()
    local code = {{}, {}, {}, {}, {}}

    for _, bools in pairs(cfg_system.cfg_data.bools) do
        table.insert(code[1], bools:GetBool())
    end

    for _, ints in pairs(cfg_system.cfg_data.ints) do
        table.insert(code[2], ints:GetInt())
    end

    for _, floats in pairs(cfg_system.cfg_data.floats) do
        table.insert(code[3], floats:GetFloat())
    end

    for _, strings in pairs(cfg_system.cfg_data.strings) do
        table.insert(code[4], strings:GetString())
    end

    for _, colors in pairs(cfg_system.cfg_data.colors) do
        local clr = colors:GetColor()
        table.insert(code[5], string.format('%02X%02X%02X%02X', math.floor(clr.r * 255), math.floor(clr.g * 255), math.floor(clr.b * 255), math.floor(clr.a * 255)))
    end
   
    cfg_system.set_clipboard(cfg_system.encode(json.stringify(code)))
    logs:add('Config exported to clipboard.')
end)

cfg_system.config_load = function(text)
    local decode_cfg = json.parse(cfg_system.decode(text))
    if decode_cfg == nil then
        logs:add('Failed to load config.')
    else
        for k, v in pairs(decode_cfg) do
            k = ({[1] = 'bools', [2] = 'ints', [3] = 'floats', [4] = 'strings', [5] = 'colors'})[k]

            for k2, v2 in pairs(v) do
                if (k == 'bools') then
                    cfg_system.cfg_data[k][k2]:SetBool(v2)
                end

                if (k == 'ints') then
                    cfg_system.cfg_data[k][k2]:SetInt(v2)
                end

                if (k == 'floats') then
                    cfg_system.cfg_data[k][k2]:SetFloat(v2)
                end

                if (k == 'strings') then
                    cfg_system.cfg_data[k][k2]:SetString(v2)
                end

                if (k == 'colors') then
                    cfg_system.cfg_data[k][k2]:SetColor(Color.new(tonumber('0x'..v2:sub(1, 2))/255, tonumber('0x'..v2:sub(3, 4))/255, tonumber('0x'..v2:sub(5, 6))/255, tonumber('0x'..v2:sub(7, 8))/255))
                end
            end
        end
       
        logs:add("Applied imported config.")
    end
end
ui.global.import_cfg:RegisterCallback(function()
    cfg_system.config_load(cfg_system.get_clipboard())
end)

ui.global.default_cfg:RegisterCallback(function()
    cfg_system.config_load("5t1y1Fri1FmRdOAtefHM1F1RdOAtefHM1FaRdLnSIU4Gk31Y1FrYbOXGk31h1FrYbOXGk31B1FrYbOXGk31J1FrYbOXGk31o1FrLvfyVn9ERd910eUDhn9ERaWpRdOAtefHM1Fmy1FrLvfyVn9ERaW1RdLnSIU4Gk31yat10nLTMbBHM1FmY1FrLvfyVn9ERaWHRdLnSIU4Gk31y4R10nLTMbBHM1FmJ1FrLvfyVn9ERaWPRdLnSIU4Gk31yd910eUDhn9ERaFpRdLnSIU4Gk31ta910eUDhn9ERaF1RdOAtefHM1F1V1FrYbOXGk31t4310eUDhn9ERaFHRdOAtefHM1F1B1FrLvfyVn9ERaFbRdLnSIU4Gk31td310eUDhn9ERaFZRdOAtefHM1FaE1FrYbOXGk31Va910eUDhn9ERaV1RdOAtefHM1FaV1FrYbOXGk31V4310eUDhn9ERaVHRdLnSIU4Gk31V4R10eUDhn9ERaVbRdOAtefHM1Fao1FrYbOXGk31Vd910eUDhn9ER4KpRdLnSIU4Gk31Ya910eUDhn9ER4K1RdOAtefHM1FxV1FrLvfyVn9ER4KxRdOAtefHM1Fxh1FrYbOXGk31Y4R10eUDhnNYM1F1RdOMRa910a9ERaR10aRERat10a3ER4310a3ER4910a9ER4R10aRER4t10a3ERd310a3ERd910a3ERaWpRdFpM1Fmy1Fwoa3ERaW1RdFpM1FmV1FwsaRERaWxRdFpM1Fmh1FwEk31y4R10a3ERaWbRdRYtk31yd310a3ERaWZRdF1M1F1E1FwEk31ta910a3ERaF1RdFpM1F1V1Fwtk31t4310a3ERaFHRdFpM1F1B1FwsaRERaFbRdFpM1F1o1FwEk31td910a3ERaVpRdRYtk31Va910a3ERaV1RdF1M1FaV1FwEk31V4310a3ERaVHRdFpM1FaB1Fwtk31V4t10a3ERaVPRdFpM1FaC1FwEk31Ya310a3ER4KmRdFpM1Fxt1FwEk31Yat10a3ER4KxRdFpM1Fxh1FwEk31Y4R10a3ER4KbRdFpM1Fxo1FwEk31Yd910a9ER4WpRdFmM1FHy1Fwyk31haR10a9ER4WaRdFmM1FHY1Fwyk31h49104FvM1FHB1FwJa9ER4WbRdFbJk31hd310aW1M1FHC1FwBa9ER4FpRdFvtk31Ba9104FvM1Fvt1FwJatER4FaRdFPyk31B4310a3ER4FHRdFvhk31B4R104FbM1FvJ1Fwtk31Bd310aRER4FZRdF1M1FbE1FwVk31Ja910aRER4V1RdF1M1FbV1Fwtk31J4310aRER4VHRdFpM1FbB1FwEk31J4t10a9ER4VPRdF1M1FbC1Fwhd3ERdKpRdFHok31oa9104FpM1FPt1FwBa3ERdKaRdFHok31o43104WPM1FPh1FwVa3ERdKvRdFaEk31o4t10aVpM1FPo1FwVa3ERdKZRdFHtk31Ca310aVpM1FZy1FwVa3ERdW1RdFaEk31Cat10aVpM1FZY1FwVa3ERdWHRdFvEk31C4R10aVpM1FZJ1FwYk31Cd31049ERdWZRdFPM1FmEa310d3ERaWpy1Fwok31yaK1RdFxM1FmEat10aRERaWpY1Fwtk31yaKHRdFHM1FmE4R1049ERaWpJ1Fwhk31yaKPRdFmM1FmEd9104WpM1Fmya3104WpM1Fmya9104WPM1FmyaR104WPM1Fmyat104WPM1Fmy43104WpM1Fmy49104FpM1Fmy4R104FpM1Fmy4t104WPM1Fmyd3104WPM1Fmyd9104WPM1Fmta3104FpM1Fmta910a3ERaW1t1FwEk31yaFaRdFpM1Fmt4310a3ERaW1h1FwEk31yaFvRdFpM1Fmt4t104WpM1Fmtd310aWpEa3ERaW1C1FwVk31yaVpRdFvVk31yaVmRdF1Ck31yaV1RdFaM1FmVat1049ERaWaY1Fwyk31yaVHRdF1M1FmV4R10a3ERaWaJ1Fwod9ERaWao1FwtaRERaWaC1Fwy43ERaWxE1Fwtk31y4KmRdFvM1FmYaR10aWmM1FmYat1043ERaWxY1FwJk31y4KHRdFvhk31y4KvRdF1M1FmY4t10a9ERaWxo1Fwy4tERaWxC1FwtaKxJ69ERat105t1y1Fwyk31t1FwBa3ERat104FpM1FxRdFmEa3ER4910a9ER4R10a3oVaKpEaKpEaWmCaFpCaFPC4RER4t10a3ERd310a3ERd910aUYM1FxRdOMRa9101O4EvND2I/H8eBTB1RERaR101G4Evf4GAfCOgfCGkYCGvOXMvX+E431M1FaRdRDEgfCO5LXYn9Dck31h1Fri1FmRdRD3xHmYAZnKd31M1F1RdRD/AZn/AZn/AR1M1FaRdRD/AZn/AZn/AR1M1FxRdRD/AZn/AZn/AR1M1FHRdRD3xFG3AZnKd31M1FvRdRD34KS3AZvEa31M1FbRdRD/AZnTAZX/AR1M1FPRdRD3AWG3AZnKd31M1FZRdRDlaVZyAZn/AR1M1FmE1FwRdWPJAZHoxVPRk31ya9101FPB4ZD/AFxY1Ohc")
end)
-- @endregion

function ui_set_visible(vis, bool)
    vis:SetVisible(bool)
end

local function ui_callbacks()
    --ragebot
    ui.ragebot.maxmissed:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.maxmissed_c:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.maxmissed:GetBool())
    ui.ragebot.dormant_aimbot:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.dormant_aimbot_damage:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.dormant_aimbot:GetBool())
    ui.ragebot.override_doubletap:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.doubletap_speed:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.override_doubletap:GetBool())
    ui.ragebot.doubletap_recharge:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.override_doubletap:GetBool())
    ui.ragebot.Teleport_In_Air:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.tp_in_air:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.Teleport_In_Air:Get())
    ui.ragebot.bodyaims:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.baimmode:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.bodyaims:Get())
    ui.ragebot.baimhp:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.bodyaims:Get())
    ui.ragebot.hitchances:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.air_hitchance:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.hitchances:Get(1))
    ui.ragebot.noscope_hitchance:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.hitchances:Get(2))


    --widgets
    ui.visuals.widgets:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.watermark_info:SetVisible(ui.visuals.widgets:Get(3) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.statepanel_image:SetVisible(ui.visuals.widgets:Get(4) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.custom_username:SetVisible(ui.visuals.watermark_info:Get(1) and ui.visuals.widgets:Get(3) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.theme:SetVisible(ui.visuals.visuals_enable:GetBool() and (ui.visuals.widgets:Get(1) or ui.visuals.widgets:Get(2) or ui.visuals.widgets:Get(3) or ui.visuals.widgets:Get(4) or ui.visuals.widgets:Get(6)))
    ui.visuals.disable_blur:SetVisible(ui.visuals.visuals_enable:GetBool() and (ui.visuals.widgets:Get(1) or ui.visuals.widgets:Get(2) or ui.visuals.widgets:Get(3) or ui.visuals.widgets:Get(4) or ui.visuals.widgets:Get(6)))
    ui.visuals.disable_background:SetVisible(ui.visuals.visuals_enable:GetBool() and ui.visuals.widgets:Get(5))
    ui.visuals.indicator_type:SetVisible(ui.visuals.visuals_enable:GetBool() and ui.visuals.widgets:Get(5))
    ui.visuals.arrows:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.arrows_x:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.arrows:Get() ~= 0 and ui.visuals.visuals_enable:GetBool())
    ui.visuals.arrows_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.arrows:Get() ~= 0 and ui.visuals.visuals_enable:GetBool())
    ui.visuals.ghosty_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 1)
    ui.visuals.ind_name_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 0)
    ui.visuals.ind_state_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 0)
    ui.visuals.ind_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 0)

    --visuals micellaneous
    ui.visuals.custom_scope:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.scope_width:SetVisible(ui.visuals.custom_scope:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.scope_offset:SetVisible(ui.visuals.custom_scope:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.scope_conditions:SetVisible(ui.visuals.custom_scope:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.desync_circle:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.desync_circle_conditions:SetVisible(ui.visuals.desync_circle:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.hitmarker:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.hitmarker_length:SetVisible(ui.visuals.hitmarker:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.log_type:SetVisible(ui.visuals.visuals_enable:GetBool() and ui.visuals.widgets:Get(6))
    ui.visuals.gamesense:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.gamesense_choose:SetVisible(ui.visuals.gamesense:GetBool() and ui.visuals.visuals_enable:GetBool())
    -- world
    ui.world.sunset:SetVisible(ui.world.world_enable:GetBool())
    ui.world.shadow_x:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.shadow_y:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.shadow_z:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.shadow_dist:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.molly_conditions:SetVisible(ui.world.world_enable:GetBool())
    ui.world.custom_skybox:SetVisible(ui.world.world_enable:GetBool())
    ui.world.skybox_choose:SetVisible(ui.world.world_enable:GetBool() and ui.world.custom_skybox:GetBool())
    ui.world.enable_bloom:SetVisible(ui.world.world_enable:GetBool())
    ui.world.model_ambient:SetVisible(ui.world.enable_bloom:GetBool() and ui.world.world_enable:GetBool())
    ui.world.bloom:SetVisible(ui.world.enable_bloom:GetBool() and ui.world.world_enable:GetBool())
    ui.world.exposure:SetVisible(ui.world.enable_bloom:GetBool() and ui.world.world_enable:GetBool())

    --antiaim
    ui.anti_aims.antiaim_helpers:SetVisible(ui.anti_aims.antiaim_enable:GetBool())
    ui.anti_aims.animbreakers:SetVisible(ui.anti_aims.antiaim_enable:GetBool() and ui.anti_aims.antiaim_helpers:Get(2))

    --misc
    ui.misc.slowwalk_c:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.slowwalk_slider:SetVisible(ui.misc.slowwalk_c:GetBool() and ui.misc.misc_enable:GetBool())
    ui.misc.hitsound:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.hitsound_direction:SetVisible(ui.misc.hitsound:GetBool() and ui.misc.misc_enable:GetBool())
    ui.misc.hitsound_volume:SetVisible(ui.misc.hitsound:GetBool() and ui.misc.misc_enable:GetBool())
    ui.misc.thirdperson:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.thirdperson_distance:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.thirdperson:GetBool())
    ui.misc.thirdperson_anim:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.thirdperson:GetBool())
    ui.misc.clantag:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.autopeek:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.color_override:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.autopeek:GetBool())
    ui.misc.quick_peek:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.autopeek:GetBool())

    --main
    ui.misc.menu_glow:SetVisible(ui.misc.menu_customize:Get())
    ui.misc.glow_pulse:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_glow:Get())
    ui.misc.color_edit:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_glow:Get())
    ui.misc.menu_dim:SetVisible(ui.misc.menu_customize:Get())
    ui.misc.dim_slider:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_dim:Get())
    ui.misc.menu_blur:SetVisible(ui.misc.menu_customize:Get())
    ui.misc.blur_slider:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_blur:Get())

    --aa buider
   
    local m = ui.anti_aims
    for i = 1,#_state do
        local selects = ui.anti_aims.states_selection:Get()+1
        local cswitch = m.custom[i].enable:Get()
        local show = selects == i and cswitch and ui.anti_aims.antiaim_enable:GetBool()
        ui.anti_aims.states_selection:SetVisible(ui.anti_aims.antiaim_enable:GetBool())
        m.custom[i].enable:SetVisible(selects == i and ui.anti_aims.antiaim_enable:GetBool())
        m.custom[i].extra_options:SetVisible(show)
        ui_set_visible(m.custom[i].yaw_mode,show)
        ---- {"Static","Period jitter \aC08A8AFF[Tick]","Period jitter \aC08A8AFF[Choke]","Period jitter \aC08A8AFF[Desync]"}
        ui_set_visible(m.custom[i].static_yaw,show and m.custom[i].yaw_mode:Get() == 0)
        ui_set_visible(m.custom[i].tick_yaw_left,show and m.custom[i].yaw_mode:Get() == 1)
        ui_set_visible(m.custom[i].tick_yaw_right,show and m.custom[i].yaw_mode:Get() == 1)
        ui_set_visible(m.custom[i].choke_yaw_left,show and m.custom[i].yaw_mode:Get() == 2)
        ui_set_visible(m.custom[i].choke_yaw_right,show and m.custom[i].yaw_mode:Get() == 2)
        ui_set_visible(m.custom[i].desync_yaw_left,show and m.custom[i].yaw_mode:Get() == 3)
        ui_set_visible(m.custom[i].desync_yaw_right,show and m.custom[i].yaw_mode:Get() == 3)
        ui_set_visible(m.custom[i].yaw_jitter,show)
        ui_set_visible(m.custom[i].yaw_jitter_mode,show and m.custom[i].yaw_jitter:Get() ~= 0)
        ui_set_visible(m.custom[i].yaw_jitter_degree,show and m.custom[i].yaw_jitter:Get() ~= 0)
        ui_set_visible(m.custom[i].yaw_jitter_degree2,show and m.custom[i].yaw_jitter:Get() ~= 0 and m.custom[i].yaw_jitter_mode:Get() == 1)

        ui_set_visible(m.custom[i].self_bodyyaw_mode,show)
        ui_set_visible(m.custom[i].bodyyaw_mode,show and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)    
        ui_set_visible(m.custom[i].bodyyaw_degree,show and m.custom[i].bodyyaw_mode:Get() == 1 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1 )
        ui_set_visible(m.custom[i].jitter_bodyyaw_degree_left,show and m.custom[i].bodyyaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].jitter_bodyyaw_degree_right,show and m.custom[i].bodyyaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].step_bodyyaw_degree_left,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].step_bodyyaw_degree_right,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].body_yaw_step_ticks,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].body_yaw_step_value,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)

        ui_set_visible(m.custom[i].fake_yaw_mode,show and m.custom[i].self_bodyyaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].static_fakeyaw,show and m.custom[i].fake_yaw_mode:Get() == 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].jitter_fakeyaw_left,show and m.custom[i].fake_yaw_mode:Get() == 1 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].jitter_fakeyaw_right,show and m.custom[i].fake_yaw_mode:Get() == 1 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].step_ticks,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].step_value,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].step_ticks,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
--
        ui_set_visible(m.custom[i].step_abs,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].step_fake_min,show  and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].step_fake_max,show  and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].freestanding_bodyyaw,show and m.custom[i].self_bodyyaw_mode:Get() ~= 0)
    end

end
local time_to_ticks = function(t) return math.floor(0.5 + (t / GlobalVars.interval_per_tick)) end
local callbacks = {

    on_draw = function()
        if Cheat.IsMenuVisible() then
            ui_callbacks()
        end

        globals.local_player = EntityList.GetLocalPlayer()

        visuals.glowmenu()
       
        misc.clantag()
        autopeek:paint_function()
      if ui.visuals.visuals_enable:Get() then
        widgets.lua_panel:draw()
        widgets.indicators:draw()
        widgets.watermark:draw()
        widgets.keybinds:draw()
        widgets.spectators:draw()
        widgets.gamesense:draw()
        visuals.scope()
        visuals.hitmarker()
        visuals.circle_desync()
        logs:draw()

        local x, y = 5, 5
        if(ui.visuals.log_type:Get(2)) then
            for i, hitlog in ipairs(hitlogs) do
                    Render.Text(hitlog.text, Vector2.new(x+1, y+1), Color.RGBA(0, 0, 0, math.floor((hitlog.time + 10 - GlobalVars.realtime)*500)-105), 10, fonts.lucida_console)
                    Render.Text(hitlog.text, Vector2.new(x, y), Color.RGBA(255, 255, 255, math.floor((hitlog.time + 10 - GlobalVars.realtime)*500)), 10, fonts.lucida_console)
                y = y + 15
                if #hitlogs > 15 then table.remove(hitlogs,1) end
                if hitlog.time + 10 < GlobalVars.realtime then table.remove(hitlogs, i) end
            end
        end
      end

        world.sun_set()
        world.molotov()
        world.custom_skybox()
        world.effects()
        visuals.thirdperson()
    end,

    on_player_connect_full = function()
        t = {}
    end,

    on_prediction = function(cmd)
        anti_aims.avoid_backstab()
        anti_aims.exploit_teleport()
        anti_aims.disable_aa_warmup()
        rage.ragebot(cmd)
        anti_aims.antiaim_helpers()
        AntiAim.run_custom(cmd)
        anti_aims.edge_yaw()
        misc.slowwalk(cmd)
        rage.on_prediction()
        rage.dormant_aim(cmd)
        autopeek:autopeek_main(cmd)
    end,

    on_createmove = function(cmd)
        rage.baim()
    end,

    on_ragebot_shot = function(shot)
        if EntityList.GetLocalPlayer() == nil then return end
        total_hits = EntityList.GetLocalPlayer():GetProp('m_totalHitsOnServer')
        if total_hits == nil then return end
        miss_hitbox = missgroup_names[shot.hitgroup] or '?'
        self_choke = ClientState.m_choked_commands
        choke = time_to_ticks(GlobalVars.curtime - EntityList.GetClientEntity(shot.index):GetPlayer():GetProp('m_flSimulationTime')) + 1;
        if choke < 0 then
            choke = 0
        elseif choke > 14 then
            choke = 14
        end
        visuals.ragebot_shot(shot)
        autopeek.ragebot_shot(shot)
    end,

    on_pre_prediction = function(cmd)
        rage.hitchances()
    end,

    registered_shot = function(shot)
        rage.on_registered_shot(shot)
        visuals.registered_shot(shot)

        if ui.visuals.widgets:Get(6) and ui.visuals.log_type:Get(2) and shot.reason ~= 0 then
            local name = EntityList.GetPlayer(shot.target_index):GetName()
            local hitgroup_names = {
                [0] = "generic",
                [1] = "head",
                [2] = "chest",
                [3] = "stomach",
                [4] = "left arm",
                [5] = "right arm",
                [6] = "left leg",
                [7] = "right leg",
                [10] = "gear"
            }
            local miss_reasons = {"animation desync", "spread", "occlusion", "prediction error"}
            logs:add(string.format("Missed %s's %s due to %s", name, hitgroup_names[shot.wanted_hitgroup], miss_reasons[shot.reason]))
        end

    end,

    on_events = function(event)
        rage.reset_data(event)
        rage.resetter(event)
        visuals.events(event)
        indicators.bomb(event)
    end,
}

Cheat.RegisterCallback("draw", callbacks.on_draw)
Cheat.RegisterCallback("prediction", callbacks.on_prediction)
Cheat.RegisterCallback("createmove", callbacks.on_createmove)
Cheat.RegisterCallback("pre_prediction", callbacks.on_pre_prediction)
Cheat.RegisterCallback("registered_shot", callbacks.registered_shot)
Cheat.RegisterCallback("ragebot_shot", callbacks.on_ragebot_shot)
Cheat.RegisterCallback("events", callbacks.on_events)
logs:add("Welcome to psycho, " ..globals.username)
 
Последнее редактирование:
Забаненный
Статус
Оффлайн
Регистрация
8 Июл 2022
Сообщения
6
Реакции[?]
0
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
жаль что старая версия хывахвыха
 
Начинающий
Статус
Оффлайн
Регистрация
20 Сен 2021
Сообщения
95
Реакции[?]
11
Поинты[?]
0
Credits: Hellfish#9343
смертрет
code_language.lua:
EngineClient.ExecuteClientCmd("clear")

--██╗░░██╗███████╗██╗░░░░░██╗░░░░░███████╗██╗░██████╗██╗░░██╗░░░██╗░██╗░░█████╗░██████╗░░░██╗██╗██████╗░
--██║░░██║██╔════╝██║░░░░░██║░░░░░██╔════╝██║██╔════╝██║░░██║██████████╗██╔══██╗╚════██╗░██╔╝██║╚════██╗
--███████║█████╗░░██║░░░░░██║░░░░░█████╗░░██║╚█████╗░███████║╚═██╔═██╔═╝╚██████║░█████╔╝██╔╝░██║░█████╔╝
--██╔══██║██╔══╝░░██║░░░░░██║░░░░░██╔══╝░░██║░╚═══██╗██╔══██║██████████╗░╚═══██║░╚═══██╗███████║░╚═══██╗
--██║░░██║███████╗███████╗███████╗██║░░░░░██║██████╔╝██║░░██║╚██╔═██╔══╝░█████╔╝██████╔╝╚════██║██████╔╝
--╚═╝░░╚═╝╚══════╝╚══════╝╚══════╝╚═╝░░░░░╚═╝╚═════╝░╚═╝░░╚═╝░╚═╝░╚═╝░░░░╚════╝░╚═════╝░░░░░░╚═╝╚═════╝░

ffi.cdef[[
    typedef struct
    {
        uint8_t r;
        uint8_t g;
        uint8_t b;
        uint8_t a;
    } uint_colors_t;


    typedef void*(__thiscall* c_entity_list_get_client_entity_t)(void*, int);
    typedef void (__cdecl* console_color_print)(void*, const uint_colors_t&, const char*, ...);
    typedef uintptr_t (__thiscall* GetClientEntity_4242425_t)(void*, int);

    void* GetProcAddress(void* hModule, const char* lpProcName);
    void* GetModuleHandleA(const char* lpModuleName);

    bool PathFileExistsA(const char* pszPath);
    bool CreateDirectoryA(const char* lpPathName, void* lpSecurityAttributes);
    bool DeleteUrlCacheEntryA(const char* lpszUrlName);
    void* __stdcall URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK);

    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
    void* VirtualAlloc(void* lpAddress, unsigned long dwSize, unsigned long  flAllocationType, unsigned long flProtect);
    int VirtualFree(void* lpAddress, unsigned long dwSize, unsigned long dwFreeType);

    typedef struct
    {
        float x;
        float y;
        float z;
    } Vector_t;

    typedef int16_t WORD;

    typedef struct {
        WORD wYear;
        WORD wMonth;
        WORD wDayOfWeek;
        WORD wDay;
        WORD wHour;
        WORD wMinute;
        WORD wSecond;
        WORD wMilliseconds;
    } SYSTEMTIME;

    void GetLocalTime(SYSTEMTIME* time);

    struct pose_params_t {
        char pad[8];
        float     m_flStart;
        float     m_flEnd;
        float     m_flState;
    };

    typedef struct
    {
        char    pad0[0x60]; // 0x00
        void* pEntity; // 0x60
        void* pActiveWeapon; // 0x64
        void* pLastActiveWeapon; // 0x68
        float        flLastUpdateTime; // 0x6C
        int            iLastUpdateFrame; // 0x70
        float        flLastUpdateIncrement; // 0x74
        float        flEyeYaw; // 0x78
        float        flEyePitch; // 0x7C
        float        flGoalFeetYaw; // 0x80
        float        flLastFeetYaw; // 0x84
        float        flMoveYaw; // 0x88
        float        flLastMoveYaw; // 0x8C // changes when moving/jumping/hitting ground
        float        flLeanAmount; // 0x90
        char    pad1[0x4]; // 0x94
        float        flFeetCycle; // 0x98 0 to 1
        float        flMoveWeight; // 0x9C 0 to 1
        float        flMoveWeightSmoothed; // 0xA0
        float        flDuckAmount; // 0xA4
        float        flHitGroundCycle; // 0xA8
        float        flRecrouchWeight; // 0xAC
        Vector_t        vecOrigin; // 0xB0
        Vector_t        vecLastOrigin;// 0xBC
        Vector_t        vecVelocity; // 0xC8
        Vector_t        vecVelocityNormalized; // 0xD4
        Vector_t        vecVelocityNormalizedNonZero; // 0xE0
        float        flVelocityLenght2D; // 0xEC
        float        flJumpFallVelocity; // 0xF0
        float        flSpeedNormalized; // 0xF4 // clamped velocity from 0 to 1
        float        flRunningSpeed; // 0xF8
        float        flDuckingSpeed; // 0xFC
        float        flDurationMoving; // 0x100
        float        flDurationStill; // 0x104
        bool        bOnGround; // 0x108
        bool        bHitGroundAnimation; // 0x109
        char    pad2[0x2]; // 0x10A
        float        flNextLowerBodyYawUpdateTime; // 0x10C
        float        flDurationInAir; // 0x110
        float        flLeftGroundHeight; // 0x114
        float        flHitGroundWeight; // 0x118 // from 0 to 1, is 1 when standing
        float        flWalkToRunTransition; // 0x11C // from 0 to 1, doesnt change when walking or crouching, only running
        char    pad3[0x4]; // 0x120
        float        flAffectedFraction; // 0x124 // affected while jumping and running, or when just jumping, 0 to 1
        char    pad4[0x208]; // 0x128
        float        flMinBodyYaw; // 0x330
        float        flMaxBodyYaw; // 0x334
        float        flMinPitch; //0x338
        float        flMaxPitch; // 0x33C
        int            iAnimsetVersion; // 0x340
    } CCSGOPlayerAnimationState_534535_t;
    int CreateDirectoryA(const char*, void*);
    void* CreateFileA(const char*, uintptr_t, uintptr_t, void*, uintptr_t, uintptr_t, void*);
    uintptr_t GetFileSize(void*, uintptr_t*);
    int ReadFile(void*, void*, uintptr_t, uintptr_t*, void*);
    int CloseHandle(void*);

    typedef int(__thiscall* get_clipboard_text_length)(void*);
    typedef void(__thiscall* set_clipboard_text)(void*, const char*, int);
    typedef void(__thiscall* get_clipboard_text)(void*, int, const char*, int);

    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
    void* VirtualAlloc(void* lpAddress, unsigned long dwSize, unsigned long  flAllocationType, unsigned long flProtect);
    int VirtualFree(void* lpAddress, unsigned long dwSize, unsigned long dwFreeType);
]]

local json = Panorama.LoadString([[
    return {
        parse: JSON.parse,
        stringify: JSON.stringify
    };
]])()

local ffi_functions = {}

ffi_functions.animstate_offset = 0x9960
ffi_functions.interface_type = ffi.typeof("uintptr_t**")
ffi_functions.bind_argument = function(r_function, arg)
    return function(...)
        return r_function(arg, ...)
    end
end

ffi_functions.engine_cvars = Utils.CreateInterface("vstdlib.dll", "VEngineCvar007")
ffi_functions.cvar_interface = ffi.cast(ffi_functions.interface_type, ffi_functions.engine_cvars)
ffi_functions.color_print = ffi.cast("console_color_print", ffi_functions.cvar_interface[0][25])

local color_print = function(text, color)
    local new_color = ffi.new("uint_colors_t")
    local rgba_table = {"r", "g", "b", "a"}

    for index, current_color in ipairs(rgba_table) do
        new_color[current_color] = color[current_color] * 255
    end
  
    local stringed_text = tostring(text)
    ffi_functions.color_print(ffi_functions.cvar_interface, new_color, stringed_text)
end

ffi_functions.interface_type = ffi.typeof('uintptr_t**')
ffi_functions.cvar_interface = ffi.cast(ffi_functions.interface_type, Utils.CreateInterface('vstdlib.dll', 'VEngineCvar007'))
ffi_functions.print = ffi.cast('console_color_print', ffi_functions.cvar_interface[0][25])

ffi_functions.color_print1 = function(color, text)
    if color == nil then return end
    if text == nil then return end
    local col = ffi.new('uint_colors_t')
    if col == nil then return end
    col.r = color.r * 255
    col.g = color.g * 255
    col.b = color.b * 255
    col.a = color.a * 255
    ffi_functions.print(ffi_functions.cvar_interface, col, text)
end

ffi_functions.i_client_entity_list = ffi.cast(ffi_functions.interface_type, Utils.CreateInterface("client.dll", "VClientEntityList003"))
ffi_functions.get_client_entity = ffi_functions.bind_argument(ffi.cast("c_entity_list_get_client_entity_t", ffi_functions.i_client_entity_list[0][3]), ffi_functions.i_client_entity_list)

local pose_parameter_pattern = "55 8B EC 8B 45 08 57 8B F9 8B 4F 04 85 C9 75 15"
ffi_functions.get_pose_parameters = ffi.cast( "struct pose_params_t*(__thiscall* )( void*, int )", Utils.PatternScan( "client.dll", pose_parameter_pattern))

ffi_functions.client_entity_list = Utils.CreateInterface("client.dll", "VClientEntityList003")
ffi_functions.entity_list_pointer = ffi.cast("void***", ffi_functions.client_entity_list)

ffi_functions.get_client_entity_fn = ffi.cast("GetClientEntity_4242425_t", ffi_functions.entity_list_pointer[0][3])
ffi_functions.get_entity_address = function(ent_index)
    local addr = ffi_functions.get_client_entity_fn(ffi_functions.entity_list_pointer, ent_index)
    return addr
end

local engine_client = Utils.CreateInterface('engine.dll', 'VEngineClient014')
local interfacePointer = ffi.typeof('void***')
local netChannelBool = ffi.typeof('bool(__thiscall*)(void*)')
local netChannelBoolWithArgs = ffi.typeof('bool(__thiscall*)(void*, int, int)')
local netChannelFloat = ffi.typeof('float(__thiscall*)(void*, int)')
local netChannelInt = ffi.typeof('int(__thiscall*)(void*, int)')
local netChannelFramerate = ffi.typeof('void(__thiscall*)(void*, float*, float*, float*)')

local I_EngineClientPtr = ffi.cast(interfacePointer, engine_client) or error('engine_client is nil', 2)
local getNetChannelInfo = ffi.cast('void*(__thiscall*)(void*)', I_EngineClientPtr[0][78]) or error('I_EngineClientPtr is nil')

function GetNetChannel(netChannelInfo)
    if netChannelInfo == nil then
        return
    end

    local SequenceNr = ffi.cast(netChannelInt, netChannelInfo[0][17])(netChannelInfo, 1)

    return {
        SequenceNr = SequenceNr,

        IsLoopback = ffi.cast(netChannelBool, netChannelInfo[0][6])(netChannelInfo),
        IsTimingOut = ffi.cast(netChannelBool, netChannelInfo[0][7])(netChannelInfo),

        Latency = {
            RTT = function(flow) return ffi.cast(netChannelFloat, netChannelInfo[0][9])(netChannelInfo, flow) end,
            AvgLatency = function(flow) return ffi.cast(netChannelFloat, netChannelInfo[0][10])(netChannelInfo, flow) end,
        },

        AvgLoss = ffi.cast(netChannelFloat, netChannelInfo[0][11])(netChannelInfo, 1),
        AvgChoke = ffi.cast(netChannelFloat, netChannelInfo[0][12])(netChannelInfo, 1),
        InputBytes = ffi.cast(netChannelFloat, netChannelInfo[0][13])(netChannelInfo, 1),
        SendBytes = ffi.cast(netChannelFloat, netChannelInfo[0][13])(netChannelInfo, 0),

        IsValidPacket = ffi.cast(netChannelBoolWithArgs, netChannelInfo[0][18])(netChannelInfo, 1, SequenceNr-1),
    }
end

hitlogs = {}
safety = 0
hit_id = -1
shot_id = 0
hit_ids = 0
total_hits = 0

ffi_functions.open_link = function(link)
    local panorama_handle = Panorama.Open()
    local steam_overlay_API = panorama_handle.SteamOverlayAPI
    local open_external_browser_url = steam_overlay_API.OpenExternalBrowserURL
  
    open_external_browser_url(link)
end
ffi_functions.urlmon = ffi.load('UrlMon')
ffi_functions.wininet = ffi.load('WinInet')
ffi_functions.download_file_from_url = function(from, to)
    ffi_functions.wininet.DeleteUrlCacheEntryA(from)
    ffi_functions.urlmon.URLDownloadToFileA(nil, from, to, 0,0)
end

ffi_functions.ct = ffi.typeof('char[?]')
ffi_functions.c_invalid_handle_value = ffi.cast('void*', -1)
local cfg_system = {}
package.loaded.readfile = function(filename)
    local fp = ffi.C.CreateFileA(filename, 0x80000000, 3, nil, 3, 128, nil)
    if ffi_functions.c_invalid_handle_value ~= fp then
        local size = ffi.C.GetFileSize(fp, nil)
        local buf = ffi_functions.ct(size + 1)
        ffi.C.ReadFile(fp, buf, size, nil, nil)
        ffi.C.CloseHandle(fp)
        return ffi.string(buf, size)
    end
end

local img_bytes = '\xFF\xD8\xFF\xDB\x00\x43\x00\x06\x04\x05\x06\x05\x04\x06\x06\x05\x06\x07\x07\x06\x08\x0A\x10\x0A\x0A\x09\x09\x0A\x14\x0E\x0F\x0C\x10\x17\x14\x18\x18\x17\x14\x16\x16\x1A\x1D\x25\x1F\x1A\x1B\x23\x1C\x16\x16\x20\x2C\x20\x23\x26\x27\x29\x2A\x29\x19\x1F\x2D\x30\x2D\x28\x30\x25\x28\x29\x28\xFF\xDB\x00\x43\x01\x07\x07\x07\x0A\x08\x0A\x13\x0A\x0A\x13\x28\x1A\x16\x1A\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\xFF\xC0\x00\x11\x08\x00\xB8\x00\xB8\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xFF\xC4\x00\x1B\x00\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x08\x07\x05\x06\x03\x01\xFF\xC4\x00\x43\x10\x00\x01\x03\x02\x01\x09\x05\x05\x03\x08\x0B\x00\x00\x00\x00\x00\x00\x01\x02\x04\x03\x05\x11\x06\x15\x21\x35\x54\x73\x93\xB2\xD1\x07\x12\x13\x31\x41\x08\x14\x51\x61\x71\x16\x22\xA1\x17\x23\x52\x56\x81\x91\x92\xA2\x25\x27\x33\x55\x62\x72\x94\x95\xB3\xC1\xD2\xFF\xC4\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xC4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xDA\x00\x0C\x03\x01\x00\x02\x11\x03\x11\x00\x3F\x00\xE2\xB7\x19\xB2\xE8\xDC\x24\xD2\xA3\x26\xBD\x3A\x6C\xAA\xE6\xB5\xAD\xA8\xA8\x88\x88\xAB\xF3\x26\xCE\x33\xB6\xD9\x3C\x57\x75\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x02\xAC\xE3\x3B\x6D\x93\xC5\x77\x51\x9C\x67\x6D\xB2\x78\xAE\xEA\x4A\x00\xAB\x38\xCE\xDB\x64\xF1\x5D\xD4\x67\x19\xDB\x6C\x9E\x2B\xBA\x92\x80\x2A\xCE\x33\xB6\xD9\x3C\x57\x75\x19\xC6\x76\xDB\x27\x8A\xEE\xA4\xA0\x0A\xB3\x8C\xED\xB6\x4F\x15\xDD\x46\x71\x9D\xB6\xC9\xE2\xBB\xA9\x28\x02\xAC\xE3\x3B\x6D\x93\xC5\x77\x51\x9C\x67\x6D\xB2\x78\xAE\xEA\x4A\x00\xAB\x38\xCE\xDB\x64\xF1\x5D\xD4\x67\x19\xDB\x6C\x9E\x2B\xBA\x92\x80\x2A\xCE\x33\xB6\xD9\x3C\x57\x75\x19\xC6\x76\xDB\x27\x8A\xEE\xA4\xA0\x0A\xB3\x8C\xED\xB6\x4F\x15\xDD\x46\x71\x9D\xB6\xC9\xE2\xBB\xA9\x28\x02\xAC\xE3\x3B\x6D\x93\xC5\x77\x51\x9C\x67\x6D\xB2\x78\xAE\xEA\x4A\x00\xAB\x38\xCE\xDB\x64\xF1\x5D\xD4\x67\x19\xDB\x6C\x9E\x2B\xBA\x92\x80\x3D\x3B\x74\xD9\x75\xAE\x11\xA9\x56\x93\x5E\xA5\x37\xD5\x6B\x5C\xD7\x54\x55\x45\x45\x54\xF9\x82\x6B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x0F\x6B\x25\x32\x5E\xEF\x95\x57\x14\x85\x64\x88\xFA\xEF\x4C\x16\xA3\xD7\x43\x29\x27\xC5\xCE\xF4\x4F\xC5\x7D\x31\x03\xC5\x06\x90\xC9\x9E\xC0\x2D\x94\x29\x32\xA6\x51\xDC\x6B\x4B\x91\x86\x2B\x4A\x2E\x14\xE9\xA2\xFA\xA7\x79\x51\x5C\xEF\xAE\x83\xEB\x5B\xD8\xE6\x42\xB5\xA8\x8B\x64\x57\x2A\x79\xAA\xCB\xAF\x8A\xFF\x00\x38\x19\x08\x1A\x82\xF9\xD8\x2E\x4D\xCC\xA6\xAB\x6A\x93\x36\xDD\x5B\x0F\xBB\xF7\x92\xB3\x3F\x6B\x5D\xA5\x7F\x62\xA1\xC4\xF2\xF7\xB3\x7B\xEE\x46\x3B\xC5\x9B\x49\x24\xDB\x95\x70\x6C\xCA\x18\xAB\x31\xF4\x47\x26\x18\xB5\x7E\xBA\x3E\x0A\xA0\x7C\x58\x00\x00\x00\x00\x00\x00\x00\x0A\xAD\x3A\xD6\x16\xF9\x9C\xC8\x05\xA7\x5A\xC2\xDF\x33\x99\x00\x0B\xB6\xB5\x9B\xBE\x7F\x32\x92\x95\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\x00\x00\x00\x00\x00\x00\x0F\x6F\x23\x32\x72\x5E\x55\xE5\x1C\x4B\x4C\x1F\xBA\xFA\xCE\xC5\xF5\x15\x31\x4A\x4C\x4D\x2E\x72\xFD\x3F\x15\xD0\x6C\xAC\x92\xC9\xBB\x76\x4A\xD9\x68\xDB\x6D\x34\x51\x94\x98\x88\xAF\x7A\xA2\x77\xEA\xBF\x0C\x15\xCE\x5F\x55\x5C\x3F\xE9\x34\x1C\xAF\xD9\x86\xC2\xC8\xF6\x1B\x8D\xF2\xA3\x3F\x3F\x2E\xAF\xBB\xD3\x55\xF4\xA6\xC4\x45\x5C\x3E\xAE\x5F\xE5\x3B\x68\x00\x71\x4E\xDB\xFB\x52\x97\x93\xF3\x56\xC1\x93\x8F\x65\x39\xE8\xC4\x74\x99\x2A\x88\xE5\xA2\x8A\x98\xA3\x5A\x9F\xA5\x82\xE3\x8A\xA6\x84\x5D\x1A\x7C\xB8\x0C\x8C\xA4\xBE\x48\xAE\xB5\xEB\xDE\x2E\x2F\xAC\xAB\x8F\x7D\xD2\x5E\xAB\x8F\xD7\x10\x37\x49\xF9\xC9\xA1\x4A\x54\x7A\x91\xE4\xD2\xA7\x5A\x85\x56\xAB\x5F\x4E\xA3\x51\x5A\xE4\x54\xC1\x51\x53\xD5\x0C\xCB\xD9\x87\x6C\x77\x3B\x54\xFA\x30\x72\xA2\x4D\x49\xF6\xAA\x8A\x8D\x5A\xF5\x55\x5D\x56\x82\xF9\x77\x95\xDE\x6E\x6F\xC5\x17\x15\xF8\x7C\x17\x4E\xB1\xED\x7B\x1A\xF6\x39\x1C\xD5\x44\x72\x2B\x57\x14\x54\xF3\xC5\x14\x0C\x97\xDB\x5F\x67\xFF\x00\x63\xAF\x2C\x95\x6E\x6A\xAD\x96\x6B\x97\xC2\x45\xC5\x56\x8B\xFD\x69\xAA\xFC\x3D\x51\x57\xD3\xE9\x89\xCD\x8D\xA5\xDA\xAD\x85\x99\x45\x90\x77\x68\x4A\xDE\xF5\x66\x52\x5A\xF4\x17\xD5\x2A\x31\x3B\xCD\xC3\xE1\x8E\x0A\x9F\x45\x31\x68\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x1A\xE3\xB0\x79\x11\xA9\x76\x55\x65\x6B\xEB\x51\x63\xD5\x6B\xAB\x91\x5C\x88\xB8\xF8\xEF\xF3\xD3\xF0\xC0\xFB\xEF\x7D\x8B\xB4\xD1\xFE\x34\xEA\x60\x90\x07\xAF\x96\x13\x9D\x72\xCA\xBB\xC4\xD7\xBB\xBE\xB5\xE5\xD5\x7A\x2E\x38\xA6\x0A\xE5\xC1\x11\x7E\x18\x68\x3C\x80\x00\x1B\x4F\xB2\x9A\xD5\xEB\xF6\x71\x93\xCF\x93\x8F\x89\xEE\x6C\x6E\x2B\xE6\xAD\x44\xC1\xAB\xFB\x91\x0C\xA1\xD9\xFE\x4A\x4B\xCB\x1C\xA5\x8F\x6C\x8A\x8A\xDA\x4A\xBD\xF9\x15\x91\x34\x51\xA6\x8A\x9D\xE7\x7D\x7D\x11\x3D\x54\xDA\x90\x62\xD1\x83\x0A\x3C\x48\xAC\x46\x50\xA1\x4D\xB4\xA9\xB1\x3C\x9A\xC6\xA2\x22\x27\xE0\x07\xEA\xE6\xA3\x9A\xAD\x72\x23\x9A\xE4\xC1\x51\x74\xA2\xA1\x80\x8D\xC9\x96\xB7\x76\x58\xB2\x4A\xEF\x72\x7B\x91\xAB\x1E\x33\xDC\xD5\x5D\x18\xBF\x0C\x18\x9F\xB5\xCA\xD4\x30\xD8\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x00\x03\xF5\x8B\x1E\xB4\xB9\x54\x63\xC5\xA6\xFA\xB2\x2A\xBD\x29\xD3\xA6\xC4\xC5\x5E\xE5\x5D\x08\x89\xEA\xB8\xA9\xF9\x1A\x1F\xD9\xDB\x20\x7C\x0A\x4D\xCA\xBB\xB5\x1F\xCE\xD4\x6A\xA4\x0A\x6F\x4D\x2D\x6F\xAD\x5C\x3E\x2B\xE4\x9F\x2C\x57\xD5\x00\xE8\x5D\x94\x64\x4D\x1C\x8A\xC9\xB6\x50\x7A\x31\xF7\x39\x18\x54\x97\x55\xBA\x71\x7E\x1A\x1A\x8B\xFA\x2D\xC7\x0F\x9E\x95\xF5\x3E\xD4\x1C\xD7\xB6\xDC\xBE\x4C\x91\xB1\xFB\x9D\xBE\xA7\xF4\xD4\xE6\x2B\x69\x61\xE7\x45\x9E\x4B\x51\x7E\x7E\x89\xF3\xD3\xE8\xA0\x73\x9F\x68\xAC\xBA\x65\xCA\x62\x64\xC5\xB2\xA7\x7A\x34\x5A\x9D\xE9\x75\x1A\xBA\x1F\x55\x31\xC1\x89\xF2\x6E\x3A\x7E\x7F\xE5\x38\x89\xFD\x73\x95\xCE\x57\x39\x55\xCE\x72\xE2\xAA\xBA\x55\x57\xE2\xA7\xF0\x00\x00\x00\x00\x00\x00\x0A\xAD\x3A\xD6\x16\xF9\x9C\xC8\x05\xA7\x5A\xC2\xDF\x33\x99\x00\x0B\xB6\xB5\x9B\xBE\x7F\x32\x92\x95\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\x00\x00\x00\x00\x00\x00\x00\x00\x0F\xA1\xEC\xFA\xC6\xDC\xA4\xCB\x4B\x45\xA6\xA6\x3E\x0C\x8A\xC9\xE2\xA2\x79\xAD\x36\xA2\xB9\xE8\x8B\xF1\xEE\xB5\x4D\xB7\x4A\x9B\x28\xD2\x65\x3A\x4C\x46\x53\x63\x51\xAD\x6B\x53\x04\x6A\x22\x60\x88\x89\xE8\x98\x19\x2B\xD9\xED\x3F\xAD\x2B\x6E\xEA\xB7\xFC\x6E\x35\xB8\x1E\x36\x58\x65\x14\x3C\x95\xC9\xE9\x57\x6B\x82\xE3\x4A\x8B\x7E\xEB\x11\x70\x5A\xAF\x5D\x0D\x6A\x7C\xD5\x7F\x72\x69\xF4\x31\x76\x53\xDF\x66\xE5\x25\xF2\x55\xD6\xE5\x53\xBF\x22\x43\xFB\xCA\x89\x8E\x0C\x4F\x24\x6B\x53\xD1\x11\x34\x1D\xD7\xDA\xA6\x5B\xD9\x6B\xC9\xE8\x68\xE5\x46\x55\xAD\x5A\xB2\xB7\xD1\x55\x8D\x6A\x22\xAF\xF1\xA9\x9D\x80\x00\x00\x00\x00\x00\x00\x00\x00\xAA\xD3\xAD\x61\x6F\x99\xCC\x80\x5A\x75\xAC\x2D\xF3\x39\x90\x00\xBB\x6B\x59\xBB\xE7\xF3\x29\x29\x55\xDB\x5A\xCD\xDF\x3F\x99\x49\x40\x00\x00\x00\x00\x00\x00\x00\x00\xFB\xAE\xC5\x2E\xD0\x6C\xBD\xA1\x41\x9B\x75\x93\x4E\x34\x46\x53\xAC\x8E\xAB\x53\x42\x22\xAD\x35\x44\xFC\x54\xD2\xBF\x94\xBC\x8D\xFD\x61\x83\xFC\x4B\xD0\xC6\x00\x0E\xCF\xED\x1B\x94\xD6\x6C\xA2\xFB\x3D\x99\x2E\x34\x66\xF8\x1E\xF1\xE2\xF8\x6A\xAB\xDC\xEF\x78\x5D\xDC\x74\x7F\x85\x4E\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x00\x1D\x0F\xB0\x3A\x14\x64\xF6\x9B\x6F\xA5\x26\x95\x3A\xB4\xD6\x9D\x65\x56\x54\x6A\x39\x17\xF3\x6A\xA9\xA0\xD5\x79\x96\xD5\xFD\xD9\x07\xFD\x3B\x7A\x19\x3F\xB0\xC9\xF0\xED\xBD\xA4\x40\x93\x71\x97\x1E\x24\x66\xD3\xAC\x8E\xAB\x5E\xA2\x53\x62\x2A\xD3\x54\x44\x57\x2A\xA2\x26\x93\x50\x7D\xB5\xC9\x6F\xD6\x5B\x27\xFB\x85\x2F\xFD\x01\xC6\x3D\xA8\xA1\x44\x87\xF6\x67\xDD\x23\x51\xA1\xDE\xF7\xAE\xF7\x86\xC4\x6F\x7B\xFB\x2C\x31\xC1\x34\xF9\x9C\x20\xED\xFE\xD2\xF7\xAB\x55\xE3\xEC\xE6\x68\xB9\xC1\x9F\xE1\x7B\xCF\x89\xEE\xB2\x1B\x57\xB9\x8F\x85\x87\x7B\xBA\xAB\x86\x38\x2F\x9F\xC0\xE2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\xD6\xB0\xB7\xCC\xE6\x40\x2D\x3A\xD6\x16\xF9\x9C\xC8\x00\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\xAA\xED\xAD\x66\xEF\x9F\xCC\xA4\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\xD6\xB0\xB7\xCC\xE6\x40\x2D\x3A\xD6\x16\xF9\x9C\xC8\x00\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\xAA\xED\xAD\x66\xEF\x9F\xCC\xA4\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\xD6\xB0\xB7\xCC\xE6\x40\x2D\x3A\xD6\x16\xF9\x9C\xC8\x00\xA6\xE3\x0A\x5D\x6B\x84\x9A\xB4\x63\x57\xA9\x4D\xF5\x5C\xE6\xB9\xB4\xD5\x51\x51\x55\x7E\x44\xD9\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x01\x4D\xBA\x14\xBA\x37\x08\xD5\x6B\x46\xAF\x4E\x9B\x2A\xB5\xCE\x73\xA9\xAA\x22\x22\x2A\x7C\x80\x00\x7F\xFF\xD9'
local globals = {
    screen_size = EngineClient.GetScreenSize(),
    username = Cheat.GetCheatUserName(),
    avatar = Render.LoadImage(Http.Get(string.format("https://neverlose.cc/static/avatars/%s.png", Cheat.GetCheatUserName())), Vector2.new(64, 164)),
    default_avatar = Render.LoadImage(img_bytes, Vector2.new(64, 64)),
    local_player,
    autopeek = false,
    autopeekq = false,
    zero_vec = Vector.new(0,0,0),
    autopeek_pos = Vector.new(0,0,0)
}
local shell32 = ffi.load "Shell32"
local smallest_pixel_7_link = "https://cdn.discordapp.com/attachments/897931346373128274/936931900059156500/smallest_pixel-7.ttf"
local arrows_font = "https://cdn.discordapp.com/attachments/976869884464095232/976876821796761710/arrows.ttf"
local indicator_logo = "https://cdn.discordapp.com/attachments/984436727475240960/987625219910959134/pngwing.png"
local avatar_logo = "https://cdn.discordapp.com/attachments/984414333662539837/986556441710186516/unknown.png"
local avatar2_logo = "https://cdn.discordapp.com/attachments/399443531560648714/986875005231063060/logo.png"
local background = "https://cdn.discordapp.com/attachments/717467105703886908/974324754880299039/background.png"
local files_dowloaded = false
local cache_size = Render.GetMenuSize()
local image_size = Vector2.new(cache_size.x * 3, cache_size.y * 3)
if package.loaded.readfile('nl\\psycho\\fonts\\smallest-pixel-7.ttf') and package.loaded.readfile('nl\\psycho\\fonts\\arrows.ttf') and package.loaded.readfile('nl\\psycho\\fonts\\pngwing.png') and package.loaded.readfile('nl\\psycho\\fonts\\unknown.png') and package.loaded.readfile('nl\\psycho\\fonts\\logo.png') then
    files_dowloaded = true
else
    files_dowloaded = false
    ffi.C.CreateDirectoryA('nl\\psycho\\', NULL)
    ffi.C.CreateDirectoryA('nl\\psycho\\fonts\\', NULL)
    ffi.C.CreateDirectoryA('nl\\psycho\\png\\', NULL)

    ffi_functions.download_file_from_url(smallest_pixel_7_link, 'nl\\psycho\\fonts\\smallest-pixel-7.ttf')
    ffi_functions.download_file_from_url(arrows_font, 'nl\\psycho\\fonts\\arrows.ttf')
    ffi_functions.download_file_from_url(indicator_logo, 'nl\\psycho\\png\\pngwing.png')
    ffi_functions.download_file_from_url(avatar_logo, 'nl\\psycho\\png\\unknown.png')
    ffi_functions.download_file_from_url(avatar2_logo, 'nl\\psycho\\png\\logo.png')
    ffi_functions.download_file_from_url(background, 'nl\\psycho\\png\\background.png')
    files_dowloaded = true
end

if files_dowloaded then
    globals.indicator_avatar = Render.LoadImageFromFile("nl\\psycho\\png\\pngwing.png", Vector2.new(150, 150))
    globals.logo_avatar = Render.LoadImageFromFile("nl\\psycho\\png\\pngwing.png", Vector2.new(64, 64))
    globals.logo_avatar2 = Render.LoadImageFromFile("nl\\psycho\\png\\logo.png", Vector2.new(64, 64))
    globals.background = Render.LoadImageFromFile("nl\\psycho\\png\\background.png", image_size)

end

local _state = {"Stand","Move","Slow walk","Duck","Air","Crouch in Air"}
local __state = {"[1]","[2]","[3]","[4]","[5]","[6]"}

local ui = {
    global = {
        default_cfg = Menu.Button('Main', 'Config System', 'Load Default Config', ''),
        export_cfg = Menu.Button('Main', 'Config System', 'Export Config', ''),
        import_cfg = Menu.Button('Main', 'Config System', 'Import Config', ''),
        information = Menu.Text('Main', 'Information', 'Welcome, ' ..globals.username),
        information1 = Menu.Text('Main', 'Information', 'Current build: stable'),
        information2 = Menu.Text('Main', 'Information', 'Last update date: 18.06.2022'),


    },

    ragebot = {
        ragebot_enable = Menu.Switch("Ragebot", 'Ragebot', 'Enable Ragebot', false),
        Teleport_In_Air = Menu.Switch("Ragebot", 'Main', 'Teleport In Air', false),
        tp_in_air = Menu.MultiCombo('Ragebot', 'Main', 'Auto Teleport in Air', {'AWP', 'AutoSnipers', 'Scout', 'Deagle', 'Revolver', 'Nades', 'Other', 'Pistols', 'Rifle/LMG', 'SMG', 'Shotgun', 'Taser'}, 0),
        dormant_aimbot = Menu.Switch("Ragebot", 'Main', 'Dormant Aimbot', false),
        dormant_aimbot_damage = Menu.SliderInt("Ragebot", 'Main', 'Minimum Damage', 5, 1, 100),
        override_doubletap = Menu.Switch("Ragebot", "Helpers", "Enable Doubletap Customization", false),
        doubletap_speed = Menu.SliderInt("Ragebot", "Helpers", "Speed", 13, 13, 18),
        doubletap_recharge = Menu.Switch("Ragebot", "Helpers", "Instant Recharge", false),
        bodyaims = Menu.Switch("Ragebot", "Helpers", "Baim if Enemy hp <", false),
        baimmode = Menu.Combo("Ragebot", "Helpers", "Baim Mode", {"Default", "Prefer", "Force"}, 0),
        baimhp = Menu.SliderInt("Ragebot", "Helpers", "Enemy hp <", 0, 0, 100),
        maxmissed = Menu.Switch("Ragebot", 'Helpers', 'Max. Misses', false, 'After Х misses, script disable head for ragebot.'),
        maxmissed_c = Menu.SliderInt("Ragebot", 'Helpers', 'Max. Misses count', 2, 1, 10),
        hitchances = Menu.MultiCombo("Ragebot", 'Helpers', "Custom Hitchance", {"In-Air", "Noscope"}, 0, "Overrides your hitchance on selected conditions. \n In-Air HitChance Works only for Revolver, Scout. \n No-Scope HitChance works only for Auto."),
        air_hitchance = Menu.SliderInt("Ragebot", 'Helpers', "In-Air Hitchance", 20, 0, 100),
        noscope_hitchance = Menu.SliderInt("Ragebot", 'Helpers', "Noscope Hitchance", 40, 0, 100),
    },

    anti_aims = {
        antiaim_enable = Menu.Switch('Anti-Aim', "Anti-Aim System", 'Enable Anti-Aim', false),
        states_selection = Menu.Combo('Anti-Aim', "Custom Anti-Aim System"," Current states",_state, 0),
        antiaim_helpers = Menu.MultiCombo('Anti-Aim', "Helpers", "Anti-Aim Tweaks", {"HS w/o Fakelags", "Animation Breakers", "Disable on Warmup", "Anti-Backstab", "Edge Yaw"}, 0),
        animbreakers = Menu.MultiCombo('Anti-Aim', 'Helpers', "Anim Breakers", {"On Ground", "Static Legs in Air ", "Pitch 0 on land"}, 0),

    },

    visuals = {
        visuals_enable = Menu.Switch('Visuals', 'Visuals', 'Enable Visuals System', false),
        widgets = Menu.MultiCombo("Visuals", "Main", "Widgets", {"Keybinds", "Spectators", "Watermark", "Panel", 'Indicators', "Logs"}, 0),
        watermark_info = Menu.MultiCombo("Visuals", "Main", "Watermark Info", {"Username", "FPS", "Delay", "Tickrate", "Time"}, 0),
        statepanel_image = Menu.Combo("Visuals", "Main", "Image Type", {"Disable", "Avatar", "Ghosty", "Avatar and Ghosty"}, 0),
        custom_username = Menu.TextBox("Visuals", "Main", "Custom Username", 64, Cheat.GetCheatUserName()),
        theme = Menu.ColorEdit("Visuals", "Main", "Widgets Color", Color.new(1, 1, 1, 0.25)),
        disable_blur = Menu.Switch('Visuals', 'Main', 'Disable Widgets Blur', false),
        disable_background = Menu.Switch('Visuals', 'Main', 'Disable Indicators Background', false),
        log_type = Menu.MultiCombo('Visuals', "Main", 'Logs Type', {'Widgets Style','Defaul Style', 'Console'}, 0),
        indicator_type = Menu.Combo("Visuals", "Main", "Indicator Type", {"Default", "Ghosty"}, 0),
        arrows = Menu.Combo("Visuals", "Main", "Arrows Type", {"Disable", "Default", "Modern", "Classic"}, 0),
        arrows_x = Menu.SliderInt('Visuals', 'Main', 'Arrows X Add', 0, 0, 100),
        ghosty_color = Menu.ColorEdit("Visuals", "Main", "Ghosty Color", Color.new(1, 1, 1, 1)),
        ind_name_color = Menu.ColorEdit("Visuals", "Main", "Indicator Name Color", Color.new(1, 1, 1, 1)),
        ind_state_color = Menu.ColorEdit("Visuals", "Main", "Indicator State Color", Color.new(1, 1, 1, 1)),
        ind_color = Menu.ColorEdit("Visuals", "Main", "Indicator Binds Color", Color.new(1, 1, 1, 1)),
        arrows_color = Menu.ColorEdit("Visuals", "Main", "Arrows Color", Color.new(1, 1, 1, 1)),
        custom_scope = Menu.SwitchColor("Visuals", "Miscellaneous", "Enable Scope Customization ", false, Color.new(1, 1, 1, 1)),
        scope_width = Menu.SliderInt("Visuals", "Miscellaneous", "Scope Lines Width", 80, 0, 300),
        scope_offset = Menu.SliderInt("Visuals", "Miscellaneous", "Scope Lines Offset", 10, 0, 300),
        scope_conditions = Menu.MultiCombo("Visuals", "Miscellaneous", "Scope Conditions", {"Invert Lines", "Disable Animations", "Scope Viewmodel", "Disable Arrows"}, 0),
        desync_circle = Menu.SwitchColor("Visuals", "Miscellaneous", "Enable Desync Circle", false, Color.new(0.57, 0.57, 1, 1)),
        desync_circle_conditions = Menu.MultiCombo("Visuals", "Miscellaneous", "Circle Conditions", {"Fake Based Color", "Remove Crosshair"}, 0),
        hitmarker = Menu.SwitchColor("Visuals", "Miscellaneous", "Enable Hitmarker", false, Color.RGBA(255, 255, 255)),
        hitmarker_length = Menu.SliderInt("Visuals", "Miscellaneous", "Hitmarker Length", 6, 2, 10),
        gamesense = Menu.Switch("Visuals", "Miscellaneous", "Enable Gamesense Indicators", false),
        gamesense_choose = Menu.MultiCombo("Visuals", "Miscellaneous", "Choose Indicators", {"Min Damage", "Dormant Aimbot", "Ping", "Bomb Info", "LC", "Fakeduck","Doubletap", "Hideshots", "Freestanding", "Force Body", "Safe Points"}, 0),

    },

    world = {
        world_enable = Menu.Switch('World', 'World Customization', 'Enable World Customization', false),
        sunset = Menu.Switch('World', 'World', 'Sunset Mode', false),
        shadow_x = Menu.SliderFloat('World', 'World', 'Sunset X', 0, -200, 200),
        shadow_y = Menu.SliderFloat('World', 'World', 'Sunset Y', 0, -200, 200),
        shadow_z = Menu.SliderFloat('World', 'World', 'Sunset Z', 0, -200, 200),
        shadow_dist = Menu.SliderInt('World', 'World', 'Sunset Distance', 1000, 0, 1500),
        custom_skybox = Menu.SwitchColor("World", 'World', "Custom Skybox Changer", false, Color.RGBA(255, 255, 255)),
        skybox_choose = Menu.TextBox("World", "World", 'Skybox Path', 64, "", "You can found skybox name in csgo/materials/skybox"),
        molly_conditions = Menu.MultiCombo("World", "Miscellaneous", "Molotov Conditions", {"Wireframe", "Ignore-Z"}, 0),
        enable_bloom = Menu.Switch("World", "Miscellaneous",  "Enable Effects", false),
        bloom = Menu.SliderFloat("World", "Miscellaneous",  "Bloom", 0, 0.0, 100.0),
        exposure = Menu.SliderFloat("World", "Miscellaneous", "Exposure", 0, 0.0, 100.0),
        model_ambient = Menu.SliderFloat("World", "Miscellaneous",  "Model Ambient", 0, 0.0, 100.0),
    },

    misc = {
        misc_enable = Menu.Switch("Miscellaneous", "Miscellaneous", "Enable Miscellaneous", false),
        clantag = Menu.Switch("Miscellaneous", "Helpers", "Enable Clantag", false),
        slowwalk_c = Menu.Switch("Miscellaneous", "Helpers", "Custom Slow Walk", false),
        slowwalk_slider = Menu.SliderInt("Miscellaneous", "Helpers", "Custom Speed", 50, 0, 150),
        hitsound = Menu.Switch("Miscellaneous", "Helpers", "Hitsound Customization", false),
        hitsound_direction = Menu.TextBox("Miscellaneous", "Helpers", "Sound Directory", 128, "csgo/sound/name.wav", "csgo/sound/name.wav"),
        hitsound_volume = Menu.SliderFloat("Miscellaneous", "Helpers", "Sound Volume", 1, 0, 1),
        menu_customize = Menu.Switch("Main","Menu Customization", "Enable Menu Customization", false),
        menu_glow = Menu.Switch("Main","Menu Customization", "Menu Glow", false, "Glow around the Menu."),
        glow_pulse = Menu.Switch("Main","Menu Customization", "Glow Pulse", false),
        color_edit = Menu.ColorEdit("Main","Menu Customization", "Glow Color", Color.RGBA(0, 0, 0, 200), "Pick a color."),
        menu_dim = Menu.Switch("Main", "Menu Customization", "Menu Dim", false, "Dims the Background."),
        dim_slider = Menu.SliderFloat("Main", "Menu Customization", "Dim Intensity:", 0.3, 0.1, 1),
        menu_blur = Menu.Switch("Main", "Menu Customization", "Menu Blur", false, "Blur the Background."),
        blur_slider = Menu.SliderFloat("Main", "Menu Customization", "Blur Intensity:", 0.3, 0.1, 1),
        thirdperson = Menu.Switch("Miscellaneous", "Helpers", "Thirdperson Customization", false),
        thirdperson_anim = Menu.Switch("Miscellaneous", "Helpers", "Disable Thirdperson Animation", false),
        thirdperson_distance = Menu.SliderInt("Miscellaneous", "Helpers", "Distance Value", 100, 0, 300),
        autopeek = Menu.SwitchColor("Miscellaneous", "Helpers", "Auto Peek",false,Color.new(1,0,0,1)),
        color_override = Menu.SwitchColor("Miscellaneous", "Helpers", "Override Color When Work",false, Color.new(0,1,0,1)),
        quick_peek = Menu.Switch("Miscellaneous", "Helpers", "Quick Peek",false),
    },

    refs = {
        slowwalk = Menu.FindVar('Aimbot', 'Anti Aim', 'Misc', 'Slow Walk'),
        minimum_damage = Menu.FindVar('Aimbot', 'Ragebot', 'Accuracy', 'Minimum Damage'),
        doubletap = Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'),
        hideshots = Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'),
        autopeek = Menu.FindVar('Miscellaneous', 'Main', 'Movement', 'Auto Peek'),
        yaw_base = Menu.FindVar('Aimbot', 'Anti Aim', 'Main', 'Yaw Base'),
        invert_side = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Inverter"),
        fakelags = Menu.FindVar("Aimbot", 'Anti Aim',"Fake Lag", "Enable Fake Lag"),
        antiaim = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Enable Anti Aim"),
        fakeduck = Menu.FindVar('Aimbot', 'Anti Aim', 'Misc', 'Fake Duck'),
        safepoints = Menu.FindVar('Aimbot', 'Ragebot', 'Misc', 'Safe Points'),
        bodyaim = Menu.FindVar('Aimbot', 'Ragebot', 'Misc', 'Body Aim'),
        scope = Menu.FindVar("Visuals", "View", "Camera", "Remove Scope"),

        aa_pitch = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Pitch"),
        aa_yaw_base = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Yaw Base"),
        aa_yaw_add = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Yaw Add"),
        aa_yaw_modifier = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Yaw Modifier"),
        aa_yaw_modifier_degree = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Modifier Degree"),
        aa_limit_left = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Left Limit"),
        aa_limit_right = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Right Limit"),
        aa_fake_options = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Fake Options"),
        aa_lby_mode = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "LBY Mode"),
        aa_freestanding_desync = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Freestanding Desync"),
        aa_desync_onshot = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Desync On Shot"),
        aa_fakelag_limit = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Lag", "Limit"),

        legs = Menu.FindVar("Aimbot", 'Anti Aim', "Misc", "Leg Movement"),

        skybox = Menu.FindVar("Visuals", "World", "Main", "SkyBox")
    }
}
ui.anti_aims.custom = {}
for k, v in pairs(_state) do
    ui.anti_aims.custom[k] = {
        enable = Menu.Switch('Anti-Aim', "Custom Anti-Aim System","Enable ".._state[k].. " setting", false),
        extra_options = Menu.MultiCombo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Extra Options", {'[-] Jitter w Choke'}, 0),
        yaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Yaw Built-In",{"Static","Period Jitter [Tick]","Period Jitter [Choke]","Period Jitter [Desync]"}, 0),
        static_yaw = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Yaw Modifier",0, -80,80),
        tick_yaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Tick Yaw Left",0, -80, 0),
        tick_yaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Tick Yaw Right",0, 0, 80),
        choke_yaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Choke Yaw Left",0, -80, 0),
        choke_yaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Choke Yaw Right",0, 0, 80),
        desync_yaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Desync Yaw Left",0, -80, 0),
        desync_yaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Desync Yaw Right",0, 0, 80),
        yaw_jitter = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Psycho Yaw Mode",{ "Off", "Center", "Offset", "Randomized" }, 0),
        yaw_jitter_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Psycho Yaw Jitter",{ "Static", "Randomized" }, 0),
        yaw_jitter_degree = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Jitter Degree [1]",0, 0,120),
        yaw_jitter_degree2 = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Jitter Degree [2]",0, 0,120),
        self_bodyyaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Psycho Body Yaw",{ "Off", "Opposite", "Jitter", "Static"}, 0),
        bodyyaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body Yaw Built-In",{"Off", "Static","Period jitter","Recursion"}, 0),
        bodyyaw_degree = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier",0, -180,180),
        jitter_bodyyaw_degree_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier left [Period]",0, -180,180),
        jitter_bodyyaw_degree_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier right [Period]",0, -180,180),
        body_yaw_step_ticks = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Recursion ticks ",1,0,15),
        body_yaw_step_value = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Recursion value",5,0,180),
        step_bodyyaw_degree_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier min [Recursion]",0,-180,180),
        step_bodyyaw_degree_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier max [Recursion]",0,-180,180),
        fake_yaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Desync Built-In",{"Static","Period Tick Jitter","Gradually Increase"}, 0),
        static_fakeyaw = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Fake Yaw Limit",58, 0,60),
        jitter_fakeyaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Period Limit Left",30, 0,60),
        jitter_fakeyaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Period Limit Right",30,0,60),
        step_ticks = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Gradually Ticks",8, 1,15),
        step_value = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Gradually Value",5, 1,60),
        step_abs = Menu.Switch('Anti-Aim', "Custom Anti-Aim System",__state[k].." Increment Absolute Value",false),
        step_fake_min = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Fake Limit Min",58, 0,60),
        step_fake_max = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Fake Limit Max",58, 0,60),
        freestanding_bodyyaw = Menu.Switch('Anti-Aim', "Custom Anti-Aim System",__state[k].." Freestanding Body Yaw",false)
    }
end

local fonts = {
    verdana = Render.InitFont("Verdana", 11, {"r"}),
    pixel = Render.InitFont("nl\\psycho\\fonts\\smallest-pixel-7.ttf", 9) or error and Render.InitFont('Smallest Pixel-7.ttf', 9),
    verdanabd11 = Render.InitFont('Verdana', 11, {'b'}),
    verdana11 = Render.InitFont('Verdana', 15, {'b'}),
    arrow_fonts = Render.InitFont("nl\\psycho\\fonts\\arrows.ttf", 24),
    arrow_font2 = Render.InitFont("nl\\psycho\\fonts\\arrows.ttf", 16),
    lucida_console = Render.InitFont('lucida console', 10, {'r'}),
    calibrib24 = Render.InitFont('calibri', 24, {'b'})
}

function C_BasePlayer:CanHit() trace_info = Cheat.FireBullet(self, self:GetEyePosition(), EntityList.GetLocalPlayer():GetEyePosition()) if trace_info.damage > 0 and ((trace_info.trace.hit_entity and trace_info.trace.hit_entity:GetPlayer() == EntityList.GetLocalPlayer()) or false) then     return true end return false end
function C_BasePlayer:GetVelocity() first_velocity = self:GetProp('m_vecVelocity[0]') second_velocity = self:GetProp('m_vecVelocity[1]') speed = math.floor(math.sqrt(first_velocity * first_velocity + second_velocity * second_velocity)) return speed end
function C_BasePlayer:GetFlag(shift) return bit.band(self:GetProp('m_fFlags'), bit.lshift(1, shift)) ~= 0 end

stuff = {}
local missgroup_names = { 'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' }
local miss_reason = { '?', 'spread', 'occlusion', 'prediction error' }

-- @region: math
local adjust_angle = function(angle)
    if(angle < 0) then
        angle = (90 + angle * (-1))
    elseif(angle > 0) then
        angle = (90 - angle)
    end
    return angle
end

local function breath(speed, need)
    need = need or 255
       return math.sin(math.abs(-math.pi + ((GlobalVars.curtime) * (speed / .75)) % (math.pi * 2))) * need
end

local function time_to_ticks(a)
    return math.floor(0.5 + a / GlobalVars.interval_per_tick)
end

function round(x)
    return x >= 0 and math.floor(x+0.5) or math.ceil(x-0.5)
end

function yaw_normalize(yaw)
    if yaw > 180 or yaw < -180 then
        local revolutions = round(math.abs(yaw / 360))
        if yaw < 0 then yaw = yaw + 360*revolutions else yaw = yaw - 360*revolutions end
    end
    return yaw
end

local math_lua = {
    dist_to = function(self,a,b)
        local delta_x = a.x - b.x;
        local delta_y = a.y - b.y;
        return self.round(math.sqrt(delta_x^2 + delta_y^2))
    end,
    round = function(a, b)
        local c = 10^(b or 0)
        return math.floor(a*c+0.5)/c
    end,
    clamp = function(x, y, z)
        if x < y then return y
        elseif x > z then return z
        else return x end
    end
}
local animations = {
    lerp = function(a, b, p)
        return a + (b - a) * p
    end
}

local function num_format(b) local c=b%10;if c==1 and b~=11 then return b..'st'elseif c==2 and b~=12 then return b..'nd'elseif c==3 and b~=13 then return b..'rd'else return b..'th'end end
shot_id = 0
hit_ids = 0
total_hits = 0

local normalize_yaw = function(yaw)
    while yaw > 180 do yaw = yaw - 360 end
    while yaw < -180 do yaw = yaw + 360 end
    return yaw
end
-- @endregion

local helpers = {
    fps_update_time = 0,
    fps = 0,

    text_shadow = function(self, text, pos, color, size, font, centered)
        local centered = centered or false
        Render.Text(text, pos + Vector2.new(1, 1), Color.new(0, 0, 0, color.a * 0.75), size, font, false, centered)
        Render.Text(text, pos, color, size, font, false, centered)
    end,

    mouse_in_bounds = function(self, s, e)
        local mouse_pos = Cheat.GetMousePos()
        return mouse_pos.x > s.x and mouse_pos.x < e.x and mouse_pos.y > s.y and mouse_pos.y < e.y
    end,

    lerp = function(self, x, y, perc)
        local perc = perc or 0.1
        return x + (y - x) * perc
    end,

    copy_color = function(self, c)
        return Color.new(c.r, c.g, c.b, c.a)
    end,

    alpha_modulate = function(self, c, a)
        return Color.new(c.r, c.g, c.b, a)
    end,

    get_fps = function(self)
        if GlobalVars.realtime - self.fps_update_time > 0.5 then
            self.fps = 1 / GlobalVars.frametime
        end

        return self.fps
    end,

    get_time = function(self)
        local sys_time = ffi.new("SYSTEMTIME[1]")
        ffi.C.GetLocalTime(sys_time)
        return ('%02d:%02d:%02d'):format(sys_time[0].wHour, sys_time[0].wMinute, sys_time[0].wSecond)
    end,

    clantag_cache = "",

    clantag_fn = ffi.cast('int(__fastcall*)(const char*, const char*)', Utils.PatternScan('engine.dll', '53 56 57 8B DA 8B F9 FF 15')),

    set_clantag = function (self, tag)
        if tag ~= self.clantag_cache then
            self.clantag_fn(tag, tag)

            self.clantag_cache = tag
        end
    end,
}


-- Check/Download Files
local C = ffi.C

ffi.cdef[[
    void*GetModuleHandleA(const char*);
    void*GetProcAddress(void*,const char*);
    bool TerminateThread(void*,unsigned long);
    bool GetExitCodeThread(void*,unsigned long*);
  
    void* __stdcall URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK);
    bool DeleteUrlCacheEntryA(const char* lpszUrlName);
]]

local urlmon = ffi.load("UrlMon")
local wininet = ffi.load("WinInet")
local Winmm = ffi.load("Winmm")

local function Download(from, to)
    wininet.DeleteUrlCacheEntryA(from)
    urlmon.URLDownloadToFileA(nil, from, to, 0,0)
end

local function file_exists(file, path_id)
    local func_file_exists = ffi.cast("bool (__thiscall*)(void*, const char*, const char*)", ffi.cast(ffi.typeof("void***"), Utils.CreateInterface("filesystem_stdio.dll", "VBaseFileSystem011"))[0][10])
    return func_file_exists(ffi.cast(ffi.typeof("void***"), Utils.CreateInterface("filesystem_stdio.dll", "VBaseFileSystem011")), file, path_id)
end

local create_simple_thread = ffi.cast("void*(__cdecl*)(intptr_t, intptr_t, size_t)", C.GetProcAddress(C.GetModuleHandleA("tier0.dll"), "CreateSimpleThread"))
local release_thread_handle = ffi.cast("bool(__cdecl*)(void*)", C.GetProcAddress(C.GetModuleHandleA("tier0.dll"), "ReleaseThreadHandle"))

if not file_exists(EngineClient.GetGameDirectory() .. "\\resource\\glow_background.png", "GAME") then
    Download("https://cdn.discordapp.com/attachments/717467105703886908/974324754880299039/background.png", EngineClient.GetGameDirectory() .. "\\resource\\glow_background.png")
end

local autopeek = {
    is_alive = function(ent)
        return ent:GetProp("m_iHealth") > 0
    end,
    set_movement = function(self,cmd,vec)
        local lc = EntityList.GetLocalPlayer()
        if not lc or not self.is_alive(lc) then return end
        local lc_pos = lc:GetRenderOrigin()
        local angles = EngineClient.GetViewAngles()
        local moveTo_x = lc_pos.x - vec.x
        local moveTo_y = lc_pos.y - vec.y
        local tv_x = -20*(moveTo_x * math.cos(angles.yaw / 180 * math.pi) + moveTo_y * math.sin(angles.yaw / 180 * math.pi))
        local tv_y = 20*(moveTo_y * math.cos(angles.yaw / 180 * math.pi) - moveTo_x * math.sin(angles.yaw / 180 * math.pi))
        cmd.forwardmove = tv_x
        cmd.sidemove = tv_y
    end,
    autopeek_main = function(self,cmd)
        local is_m1 = bit.band(cmd.buttons, 1) == 1
        local is_w = bit.band(cmd.buttons, 8) == 8
        local is_s = bit.band(cmd.buttons, 16) == 16
        local is_r = bit.band(cmd.buttons, 512) == 512
        local is_l = bit.band(cmd.buttons, 1024) == 1024
        globals.lp = EntityList.GetLocalPlayer()
        globals.lp_pos = globals.lp:GetRenderOrigin()
        globals.is_in_air = bit.band(globals.lp:GetProp("m_hGroundEntity"), 1)
        if is_m1 then
            globals.autopeek = true
        end
        if not is_w and not is_s and not is_r and not is_l and math_lua:dist_to(globals.lp_pos,globals.autopeek_pos) > 1 and ui.misc.quick_peek:Get() and ui.misc.misc_enable:Get() then
            globals.autopeekq = true
        else
            globals.autopeekq = false
        end
        if not ui.misc.autopeek:Get() then
            if globals.is_in_air == 1 then
                globals.autopeek_pos = EngineTrace.TraceRay(globals.lp_pos,Vector.new(globals.lp_pos.x, globals.lp_pos.y, globals.lp_pos.z-10000), globals.lp, 0xFFFFFFFF).endpos + globals.zero_vec
            else
                globals.autopeek_pos = globals.lp_pos + globals.zero_vec
            end
            globals.autopeek = false
        else
            if ((globals.autopeek and math_lua:dist_to(globals.lp_pos, globals.autopeek_pos) > 1) or globals.autopeekq) then
                if globals.is_in_air == 0 then
                    self:set_movement(cmd,globals.autopeek_pos)
                end
            else
                globals.autopeek = false
                globals.autopeekq = false
            end
        end
    end,
    ragebot_shot = function(shot)
        globals.autopeek = true
    end,
    paint_function = function(self)
        local lc = EntityList.GetLocalPlayer()
        if not lc or not self.is_alive(lc) then return end
        local ap_c = ui.misc.autopeek:GetColor()
        if ui.misc.color_override:Get() and ui.misc.misc_enable:Get() then
            if globals.autopeek or globals.autopeekq then
                ap_c = ui.misc.color_override:GetColor()
            else
                ap_c = ui.misc.autopeek:GetColor()
            end
        end
        if ui.misc.autopeek:Get() and ui.misc.misc_enable:Get() then
            for i = 1,40 do
                Render.Circle3DFilled(
                    globals.autopeek_pos,
                    60,
                    i/2,
                    Color.new(
                        ap_c.r,
                        ap_c.g,
                        ap_c.b,
                        ap_c.a*0.03),
                    false)
            end
        end
    end
}

-- @region: ragebot
local rage = {}
rage.data = {}

rage.fix_ang = function(angles)
    while angles.pitch < -180.0 do
        angles.pitch = angles.pitch + 360.0
    end
    while angles.pitch > 180.0 do
        angles.pitch = angles.pitch - 360.0
    end

    while angles.yaw < -180.0 do
        angles.yaw = angles.yaw + 360.0
    end
    while angles.yaw > 180.0 do
        angles.yaw = angles.yaw - 360.0
    end

    if angles.pitch > 89.0 then
        angles.pitch = 89.0
    elseif angles.pitch < -89.0 then
        angles.pitch = -89.0
    end
    if angles.yaw > 180.0 then
        angles.yaw = 180.0
    elseif angles.pitch < -180.0 then
        angles.pitch = -180.0
    end

    return angles
end

rage.vec_ang = function(src, dist)
    local forward = dist - src

    if forward.x == 0 and forward.y == 0 then
        local yaw = 0

        if forward.z > 0 then
            pitch = 270
        else
            pitch = 90
        end

    else
        yaw = (math.atan2(forward.y, forward.x) * 180 / math.pi)
        if yaw < 0 then
            yaw = yaw + 360
        end

        tmp = math.sqrt(forward.x * forward.x + forward.y * forward.y)
        pitch = (math.atan2(-forward.z, tmp) * 180 / math.pi)

        if pitch < 0 then
            pitch = pitch + 360
        end

    end

    return rage.fix_ang(QAngle.new(pitch, yaw, 0))
end
rage.modify_velocity = function(cmd, goalspeed)
    local minspeed = math.sqrt((cmd.forwardmove * cmd.forwardmove) + (cmd.sidemove * cmd.sidemove))
    if goalspeed <= 0 or minspeed <= 0 then
        return
    end

    if EntityList.GetLocalPlayer():GetProp('m_flDuckAmount') >= 1 then
        goalspeed = goalspeed * 2.94117647
    end

    if minspeed <= goalspeed then
        return
    end

    local speedfactor = goalspeed / minspeed
    cmd.forwardmove = cmd.forwardmove * speedfactor
    cmd.sidemove = cmd.sidemove * speedfactor
end
rage.roundStarted = 0
rage.player_info_prev = {}
for i = 1, 64 do
    rage.player_info_prev[i] = {
        origin = Vector.new(0, 0, 0),
    }
end


local baim = ui.refs.bodyaim:Get()

rage.baim = function()

    if not ui.ragebot.ragebot_enable:Get() and ui.ragebot.bodyaims:Get() then return end
    local all_players = EntityList.GetEntitiesByName("CCSPlayer")
    for i = 1, #all_players do
        local target = all_players[i]:GetPlayer()
        if target ~= EntityList.GetLocalPlayer() and not target:IsTeamMate() and target:GetProp("m_iHealth") > 0 then

        local me = EntityList.GetClientEntity(EngineClient.GetLocalPlayer()):GetPlayer()
        local weap = target:GetActiveWeapon()

        local hp = target:GetProp('m_iHealth')
            if ui.ragebot.baimmode:Get() == 0 then
                ui.refs.bodyaim:SetInt(baim)
            end
            if weap ~= nil and hp < ui.ragebot.baimhp:GetInt() and ui.ragebot.baimmode:Get() == 1 then
                ui.refs.bodyaim:SetInt(1)
            else
                ui.refs.bodyaim:SetInt(baim)
            end
            if weap ~= nil and hp < ui.ragebot.baimhp:GetInt() and ui.ragebot.baimmode:Get() == 2 then
                ui.refs.bodyaim:SetInt(2)
            else
                ui.refs.bodyaim:SetInt(baim)
            end

        end
    end

end

rage.hitchances = function()

    local accepted_weapons = {
        ["261"] = 1,
        ["242"] = 1,
    }
    local accepted_weapons2 = {
        ["267"] = 1,
        ["46"] = 1,
    }

    local get_enemies = function()
        local ret = {}
        local players = EntityList.GetPlayers()
        for _ , player in pairs(players) do     
            if player:IsTeamMate() or not player:IsAlive() or player:IsDormant() then goto s end

            ret[#ret+1] = player:EntIndex()
            ::s::
        end

        return ret
    end

    if not ui.ragebot.ragebot_enable or ui.ragebot.hitchances == 0 then return end
  
    local i = get_enemies()
    local air_check = bit.band(EntityList.GetLocalPlayer():GetProp("m_fFlags"), 1) == 0 and ui.ragebot.hitchances:Get(1) and EntityList.GetLocalPlayer():GetActiveWeapon() and accepted_weapons2[""..EntityList.GetLocalPlayer():GetActiveWeapon():GetClassID()]
    local wpn_check = ui.ragebot.hitchances:Get(2) and EntityList.GetLocalPlayer():GetProp("m_bIsScoped")==false and EntityList.GetLocalPlayer():GetActiveWeapon() and accepted_weapons[""..EntityList.GetLocalPlayer():GetActiveWeapon():GetClassID()]

    if (not air_check and not wpn_check)  then return end

    for k,v in pairs(i) do
        RageBot.OverrideHitchance(v , (air_check==1 and ui.ragebot.air_hitchance:Get() or ui.ragebot.noscope_hitchance:Get()))
    end
end

rage.ragebot = function(cmd)
    local localplayer = EntityList.GetLocalPlayer()
    if not localplayer or not localplayer:IsAlive() then
        return
    end

    if not ui.ragebot.ragebot_enable:Get() or not ui.ragebot.override_doubletap:Get() then return end

    if ui.ragebot.override_doubletap:Get() then
        Exploits.OverrideDoubleTapSpeed(ui.ragebot.doubletap_speed:Get()) 
    end

    if ui.ragebot.doubletap_recharge:Get() then
        Exploits.ForceCharge()
    end

end

rage.dormant_aim = function(cmd)
    if ui.ragebot.dormant_aimbot:GetBool() then
        local lp = EntityList.GetClientEntity(EngineClient.GetLocalPlayer()):GetPlayer()
        if lp == nil then return end
        rage.can_hit_i = false
        rage.choke = false
        local ent = lp:GetActiveWeapon()
        if not ent then return end
        local inaccuracy = 1 / ent:GetInaccuracy(ent)
        if inaccuracy == nil then return end
        local tickcount = GlobalVars.tickcount
        local eyepos = lp:GetEyePosition()
        local simtime = lp:GetProp('m_flSimulationTime')
        local weapon = ent:GetWeaponID()
        local scoped = lp:GetProp('m_bIsScoped')
  
        local onground = bit.band(lp:GetProp('m_fFlags'), bit.lshift(1, 0))
        if tickcount < rage.roundStarted then return end -- to prevent shooting at ghost dormant esp @ the beginning of round
        local is_AWP = weapon == 9
        local is_auto = (weapon == 38 or weapon == 11)
        local is_scout = weapon == 40
        if ent:IsKnife() or ent:IsGrenade() or ent:IsReloading() or weapon == 31 then return end
        local hs_fix = ui.refs.hideshots:GetBool() and 0.3 or 0
        if weapon == 64 then -- for some reason can_shoot returns always false with r8 despite all 3 props being true, no idea why
            rage.can_shoot = simtime > ent:GetProp('m_flNextPrimaryAttack') + hs_fix -- doing this fixes it ><
        elseif ent:IsPistol() and not weapon == 64 and not weapon == 1 then
            rage.can_shoot = false
        else
            rage.can_shoot = simtime > math.max(lp:GetProp('m_flNextAttack') + hs_fix, ent:GetProp('m_flNextPrimaryAttack') + hs_fix, ent:GetProp('m_flNextSecondaryAttack'))
        end
  
        -- new player info
        local players = EntityList.GetEntitiesByName('CCSPlayer')
        rage.player_info = {}
        for i = 1, #players do
            local player = players[i]:GetPlayer()
            if EngineClient.IsConnected() and lp:IsAlive() then
                --if plist_get(player, 'Add to whitelist') then goto skip end
                if player:IsDormant() and not player:IsTeamMate() and player:GetProp('m_iHealth') > 0 and player ~= lp then
                    if player:GetRenderOrigin():Length2D() > ent:GetWeaponRange() then return end
                    rage.origin = player:GetProp('m_vecOrigin')
                    rage.alpha_multiplier = player:GetESPAlpha() -- grab alpha of the dormant esp
                    if rage.player_info_prev[i] ~= nil and rage.origin.x ~= 0 and rage.alpha_multiplier > 0 then -- if origin / dormant esp is valid
                        local dormant_accurate = rage.alpha_multiplier > 0.1 -- for debug purposes lower this to 0.1
                        if dormant_accurate then
                            local target_points = {
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 28) or Vector.new(0, 0, 38)),
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 30) or Vector.new(0, 0, 40)),
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 32) or Vector.new(0, 0, 42)),
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 40) or Vector.new(0, 0, 50))
                            }
                      
                            for i = 1, #target_points do
                                local target = target_points[i]
                                local target_pos = rage.vec_ang(eyepos, target)
                                local dmg = Cheat.FireBullet(lp, eyepos, target)
                                if is_AWP then
                                    max_player_speed_alt = 100
                                elseif is_auto then
                                    max_player_speed_alt = 120
                                else
                                    max_player_speed_alt = ent:GetMaxSpeed() * 0.86
                                end
                                rage.can_hit = (dmg.trace.hit_entity == nil or dmg.trace.hit_entity:EntIndex() == player:EntIndex()) and (dmg.damage > ui.ragebot.dormant_aimbot_damage:GetInt()) and (not player:IsVisible(target)) -- added visibility check to mitigate shooting at anomalies?
                              
                                if rage.can_hit then
                                    rage.can_hit_i = true
                                    if rage.can_shoot then
                                        rage.modify_velocity(cmd, (scoped and max_player_speed_alt or ent:GetMaxSpeed())*0.2)
                                        -- autoscope
                                        if not scoped and ent:IsSniper() and onground == 1 then
                                            cmd.buttons = bit.bor(cmd.buttons, 2048)
                                        end
                                    end
                                  
                                    if ui.refs.hideshots:GetBool() then
                                        rage.choke = rage.can_shoot
                                    else
                                        rage.choke = true
                                    end
                                  
                                    if inaccuracy >= 90 and rage.choke == true then
                                        cmd.viewangles.pitch = target_pos.pitch
                                        cmd.viewangles.yaw = target_pos.yaw
                                        cmd.viewangles.roll = 0
                                        cmd.buttons = bit.bor(cmd.buttons, 1)
                                        -- dont shoot again
                                        rage.can_shoot = false
                                    end
                                end
                            end
                        end
                    end
                    rage.player_info[i] = {rage.origin, rage.alpha_multiplier, rage.can_hit_i}
                end
            end
        end
        rage.player_info_prev = rage.player_info
    end
end

rage.resetter = function(event)
    if not ui.ragebot.dormant_aimbot:Get() then return end
    if event:GetName() ~= 'round_prestart' then return end
    local lp = EntityList.GetClientEntity(EngineClient.GetLocalPlayer()):GetPlayer()
    if lp == nil then return end
    freezetime = (CVar.FindVar('mp_freezetime'):GetFloat()+1) / GlobalVars.interval_per_tick -- get freezetime plus 1 second and disable dormantbob for that amount of ticks
    rage.roundStarted = GlobalVars.tickcount + freezetime
    rage.origin = nil
    rage.player_info_prev = {}
    for i = 1, 64 do
        rage.player_info_prev[i] = {
            origin = Vector.new(0, 0, 0),
        }
    end
    rage.player_info = {}
end

rage.on_registered_shot = function(shot)
    if shot.reason ~= 1 then return end
  
    if not rage.data[shot.target_index] then
        rage.data[shot.target_index] = {
            esp_bool = false,
            shots = 0,
        }
    end

    rage.data[shot.target_index].shots = rage.data[shot.target_index].shots + 1
end

rage.on_prediction = function()
    if not ui.ragebot.maxmissed:Get() and ui.ragebot.ragebot_enable:Get() then return end
  
    for player_index, data in pairs(rage.data) do
        if data.shots >= ui.ragebot.maxmissed_c:Get() then
            data.esp_bool = true

            RageBot.EnableHitbox(player_index, 0, false)
        end
    end
end

rage.reset_data = function(event)
    if event:GetName() ~= 'round_start' then return end
  
    rage.data = {}
end

-- @endregion

-- @region: misc
local misc = {}
misc.slowwalk = function(cmd)
    if not ui.misc.slowwalk_c:GetBool() then return end
        if cmd.forwardmove >= ui.misc.slowwalk_slider:GetInt() then cmd.forwardmove = ui.misc.slowwalk_slider:GetInt() end
        if cmd.sidemove >= ui.misc.slowwalk_slider:GetInt() then cmd.sidemove = ui.misc.slowwalk_slider:GetInt() end
        if cmd.forwardmove < 0 and -cmd.forwardmove >= ui.misc.slowwalk_slider:GetInt() then cmd.forwardmove = -ui.misc.slowwalk_slider:GetInt() end
        if cmd.sidemove < 0 and -cmd.sidemove >= ui.misc.slowwalk_slider:GetInt() then cmd.sidemove = -ui.misc.slowwalk_slider:GetInt() end
end

local clantag_restore = false
-- clantag
misc.clantag = function()
    local localplayer = EntityList.GetLocalPlayer()
    if not localplayer then return end

    if ui.misc.clantag:Get() and ui.misc.misc_enable:Get() then
        local tag =
        {
            "ps",
            "psy",
            "psyc",
            "psych ",
            "psycho",
            "psycho ",
            "psych",
            "psyc",
            "psy",
            "ps",
            "p",
            "",

        }

        local netchann_info = EngineClient.GetNetChannelInfo()

        if netchann_info == nil then
            return
        end

        local latency = netchann_info:GetLatency(0) / GlobalVars.interval_per_tick
        local tickcount_pred = GlobalVars.tickcount + latency
        local iter = math.floor(math.fmod(tickcount_pred / 32, #tag) + 1)
      
        helpers:set_clantag(tag[iter])
        clantag_restore = false

    elseif not clantag_restore then
        helpers:set_clantag("") 
    end
end

local t = {}
misc.removeimpact = function()
    if #t == nil then
        return
    end

    if not EngineClient.IsConnected() then
        table.remove(t, #t)
        return
    end

    for i = 1, #t do
        if t[i] == nil then
            return
        end

        if t[i].ctime + 4 > math.floor(GlobalVars.curtime) then
            return
        end

        t[i].a = t[i].a - math.floor(GlobalVars.frametime * 300)

        if t[i].a < 0 then
            table.remove(t, i)
        end
    end
end
-- @endregion

-- @region: anti-aims
local anti_aims = {}
local flag_status = 0

AntiAim.jitter = {}
AntiAim.jitter.c_var = {
    choke = 0,
    yaw_v = 0,
    yaw_r = 1,
    byaw_v = 0,
    byaw_r = 1,
    fyaw_v = 0,
    fyaw_r = 0
}

AntiAim.c_var = {
    c = 1,
    ground_ticks = 0,
    step_ticks = 0,
    min = 0,
    max = 0,
    step = 0,
    return_value = 0,
    bodystep_ticks = 0,
    bodystep_min = 0,
    bodystep_max = 0,
    bodystep_step = 0,
    bodystep_return_value = 0
}

AntiAim.save_antiaims = {
    pitch = "Off",
    yaw_base = "Local view",
    yaw_1 = "Off",
    yaw_2 = 0,
    yaw_jitter_1 = "Off",
    yaw_jitter_2 = 0,
    body_yaw_1 = "Off",
    body_yaw_2 = 0,
    fake_yaw_limit = 0,
    freestanding_body_yaw = false
}

function AntiAim.jitter:tick(a,b)
    return GlobalVars.tickcount % 4 >= 2 and a or b
end

function AntiAim.jitter:choke_yaw(a,b)
    if GlobalVars.tickcount - AntiAim.jitter.c_var.yaw_v > 1  and AntiAim.jitter.c_var.choke == 1 then
        AntiAim.jitter.c_var.yaw_r = AntiAim.jitter.c_var.yaw_r == 1 and 0 or 1
        AntiAim.jitter.c_var.yaw_v = GlobalVars.tickcount
    end
    local inverted = AntiAim.GetInverterState()
  
    if a == 60 or b == 60 then
        return inverted and a or b
    else
        return AntiAim.jitter.c_var.yaw_r >= 1 and a or b
    end
end

function AntiAim.jitter:normalize_yaw(p)
    while p > 180 do
        p = p - 360
    end
    while p < -180 do
        p = p + 360
    end
    return p
end

function AntiAim.jitter:choke_body_yaw(a,b)
    local inverted = AntiAim.GetInverterState()
    local invert = AntiAim.GetInverterState()

    if Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Fake Options'):Get(2) then
        return inverted and a or b
    else
        return invert and a or b
    end
end

function AntiAim.jitter:choke_fake(a,b)
    if GlobalVars.tickcount - AntiAim.jitter.c_var.fyaw_v > 1  and AntiAim.jitter.c_var.choke == 1 then
        AntiAim.jitter.c_var.fyaw_r = AntiAim.jitter.c_var.fyaw_r == 1 and 0 or 1
        AntiAim.jitter.c_var.fyaw_v = GlobalVars.tickcount
    end
    local inverted = AntiAim.GetInverterState()
  
    if a == 60 or b == 60 then
        return inverted and a or b
    else
        return AntiAim.jitter.c_var.yaw_r >= 1 and a or b
    end
end
local start_time = GlobalVars.curtime

local function get_tick()
    local end_time = GlobalVars.curtime
    local get_time = math.abs(math.floor((start_time - end_time) * 100)) % 2
    return get_time
end

function AntiAim.jitter:desync(a,b)
    local inverted = AntiAim.GetInverterState()

    if Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Fake Options'):Get(2) then
        return inverted and a or b
    else
        return inverted and a or b
    end
end

clamp = function(value, minimum, maximum)
    if minimum > maximum then
        return math.min(math.max(value, maximum), minimum)
    else
        return math.min(math.max(value, minimum), maximum)
    end
end

AntiAim.side = 1
AntiAim.override_yaw = function(cmd, yaw_add, jitter_value, jitter_type)
    if FakeLag.SentPackets() ~= 0 then
        AntiAim.side = AntiAim.side * -1
    end
  
    local yaw_modifier = yaw_add
  
    if jitter_type == 1 then
        yaw_modifier = yaw_modifier+(jitter_value/2)*AntiAim.side
    elseif jitter_type == 2 then
        yaw_modifier = yaw_modifier+jitter_value*((AntiAim.side+1)/2)
    elseif jitter_type == 3 then
        yaw_modifier = math.random(-jitter_value,jitter_value)
    elseif jitter_type == 4 then
        yaw_modifier = yaw_modifier-(GlobalVars.tickcount*3)%jitter_value
    end

    return yaw_modifier
end

function AntiAim:run_custom(cmd)
    if EntityList.GetLocalPlayer() == nil or not ui.anti_aims.antiaim_enable:GetBool() then
        return
    end
    local p_duck = EntityList.GetLocalPlayer():GetProp("m_flDuckAmount")
    local inair = bit.band(EntityList.GetLocalPlayer():GetProp("m_fFlags" ), 1 ) == 0
    local on_ground = bit.band(EntityList.GetLocalPlayer():GetProp("m_fFlags"), 1)
    local vx, vy, vz = EntityList.GetLocalPlayer():GetProp("m_vecVelocity").x, EntityList.GetLocalPlayer():GetProp("m_vecVelocity").y, EntityList.GetLocalPlayer():GetProp("m_vecVelocity").z
    local p_still = math.sqrt(vx ^ 2 + vy ^ 2)
    local p_slow = Menu.FindVar('Aimbot', 'Anti Aim', 'Misc', 'Slow Walk')

    AntiAim.jitter.c_var.choke = ClientState.m_choked_commands
    local m = ui.anti_aims.custom
    AntiAim.save_antiaims.yaw_1 = "180"

    if on_ground == 1 then
        AntiAim.c_var.ground_ticks = AntiAim.c_var.ground_ticks + 1
    else
        AntiAim.c_var.ground_ticks = 0
    end
    if m[3].enable:Get() and p_slow then
        AntiAim.c_var.c = 3
    elseif inair and m[6].enable:Get() and EntityList.GetLocalPlayer():GetProp('m_flDuckAmount') > 0.7 then
        AntiAim.c_var.c = 6
    elseif inair and m[5].enable:Get() then
        AntiAim.c_var.c = 5
    elseif p_duck > 0.8 and not inair and AntiAim.c_var.ground_ticks > 8 and m[4].enable:Get() then
        AntiAim.c_var.c = 4
    elseif p_still > 70 and AntiAim.c_var.ground_ticks > 8 and m[2].enable:Get() then
        AntiAim.c_var.c = 2
    elseif p_still < 2 and  AntiAim.c_var.ground_ticks > 8 and m[1].enable:Get() then
        AntiAim.c_var.c = 1
    else
        AntiAim.c_var.c = 5
    end
    AntiAim.save_antiaims.yaw_base = "At targets"
    AntiAim.save_antiaims.yaw_1 = "180"
    AntiAim.save_antiaims.pitch = 1

    if AntiAim.c_var.c == 1 and m[1].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 0
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 2 and m[2].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 0
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 3 and m[3].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 24
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 4 and m[4].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 35
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 5 and m[5].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 15
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 6 and m[5].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 17
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    else
        AntiAim.c_var.max = m[AntiAim.c_var.c].step_fake_max:Get()
        AntiAim.c_var.min = m[AntiAim.c_var.c].step_fake_min:Get()
        AntiAim.c_var.step = m[AntiAim.c_var.c].step_value:Get()
        AntiAim.c_var.step_ticks = GlobalVars.tickcount % m[AntiAim.c_var.c].step_ticks:Get()

        if m[AntiAim.c_var.c].step_fake_min:Get() >= m[AntiAim.c_var.c].step_fake_max:Get()then
            m[AntiAim.c_var.c].step_fake_min:Set(m[AntiAim.c_var.c].step_fake_max:Get())
        end

        if AntiAim.c_var.step_ticks == m[AntiAim.c_var.c].step_ticks:Get() - 1 then
            if AntiAim.c_var.return_value < AntiAim.c_var.max then
                AntiAim.c_var.return_value = AntiAim.c_var.return_value + m[AntiAim.c_var.c].step_value:Get()
            elseif AntiAim.c_var.return_value >= AntiAim.c_var.max then
                AntiAim.c_var.return_value = AntiAim.c_var.min
            end
        end

        AntiAim.c_var.bodystep_max = m[AntiAim.c_var.c].step_bodyyaw_degree_right:Get()
        AntiAim.c_var.bodystep_min = m[AntiAim.c_var.c].step_bodyyaw_degree_left:Get()
        AntiAim.c_var.bodystep_step = m[AntiAim.c_var.c].body_yaw_step_value:Get()
        AntiAim.c_var.bodystep_ticks = GlobalVars.tickcount % m[AntiAim.c_var.c].body_yaw_step_ticks:Get()

        if m[AntiAim.c_var.c].step_bodyyaw_degree_left:Get() >= m[AntiAim.c_var.c].step_bodyyaw_degree_right:Get() then
            m[AntiAim.c_var.c].step_bodyyaw_degree_left:Set(m[AntiAim.c_var.c].step_bodyyaw_degree_right:Get())
          
        end
        if AntiAim.c_var.bodystep_ticks == m[AntiAim.c_var.c].body_yaw_step_ticks:Get() - 1 then
            if AntiAim.c_var.bodystep_return_value < AntiAim.c_var.bodystep_max then
                AntiAim.c_var.bodystep_return_value = AntiAim.c_var.bodystep_return_value + AntiAim.c_var.bodystep_step
            elseif AntiAim.c_var.bodystep_return_value >= AntiAim.c_var.bodystep_max then
                AntiAim.c_var.bodystep_return_value = AntiAim.c_var.bodystep_min
            end
        end

        if m[AntiAim.c_var.c].yaw_mode:Get() == 0 then
            AntiAim.save_antiaims.yaw_2 = m[AntiAim.c_var.c].static_yaw:Get()
        elseif m[AntiAim.c_var.c].yaw_mode:Get() == 1 then
            AntiAim.save_antiaims.yaw_2 = AntiAim.jitter:tick(m[AntiAim.c_var.c].tick_yaw_left:Get(),m[AntiAim.c_var.c].tick_yaw_right:Get())
        elseif m[AntiAim.c_var.c].yaw_mode:Get() == 2 then
            AntiAim.save_antiaims.yaw_2 = AntiAim.jitter:choke_yaw(m[AntiAim.c_var.c].choke_yaw_left:Get(),m[AntiAim.c_var.c].choke_yaw_right:Get())
        elseif m[AntiAim.c_var.c].yaw_mode:Get() == 3 then
            AntiAim.save_antiaims.yaw_2 = AntiAim.jitter:desync(m[AntiAim.c_var.c].desync_yaw_left:Get(),m[AntiAim.c_var.c].desync_yaw_right:Get())
        end

        if m[AntiAim.c_var.c].yaw_jitter_mode:Get() == 1 then
            if m[AntiAim.c_var.c].yaw_jitter_degree:Get() >= m[AntiAim.c_var.c].yaw_jitter_degree2:Get() then
                m[AntiAim.c_var.c].yaw_jitter_degree:Set(m[AntiAim.c_var.c].yaw_jitter_degree2:Get())
            end
        end

        AntiAim.save_antiaims.yaw_jitter_1 = m[AntiAim.c_var.c].yaw_jitter:Get()
        AntiAim.save_antiaims.yaw_jitter_2 = m[AntiAim.c_var.c].yaw_jitter_mode:Get() == 0 and m[AntiAim.c_var.c].yaw_jitter_degree:Get() or math.random(m[AntiAim.c_var.c].yaw_jitter_degree:Get(), m[AntiAim.c_var.c].yaw_jitter_degree2:Get())
        AntiAim.save_antiaims.body_yaw_1 = m[AntiAim.c_var.c].self_bodyyaw_mode:Get()

        if m[AntiAim.c_var.c].bodyyaw_mode:Get() == 1 then
            AntiAim.save_antiaims.body_yaw_2 = m[AntiAim.c_var.c].bodyyaw_degree:Get()
        elseif m[AntiAim.c_var.c].bodyyaw_mode:Get() == 2 then
            AntiAim.save_antiaims.body_yaw_2 = AntiAim.jitter:choke_body_yaw(m[AntiAim.c_var.c].jitter_bodyyaw_degree_left:Get(), m[AntiAim.c_var.c].jitter_bodyyaw_degree_right:Get())
        elseif m[AntiAim.c_var.c].bodyyaw_mode:Get() == 3 then
            AntiAim.save_antiaims.body_yaw_2 = clamp(AntiAim.c_var.bodystep_return_value, AntiAim.c_var.bodystep_min, AntiAim.c_var.bodystep_max)
        end

        if m[AntiAim.c_var.c].fake_yaw_mode:Get() == 0 then
            AntiAim.save_antiaims.fake_yaw_limit = m[AntiAim.c_var.c].static_fakeyaw:Get()
        elseif m[AntiAim.c_var.c].fake_yaw_mode:Get() == 1 then
            AntiAim.save_antiaims.fake_yaw_limit = AntiAim.jitter:choke_fake(m[AntiAim.c_var.c].jitter_fakeyaw_left:Get(),m[AntiAim.c_var.c].jitter_fakeyaw_right:Get())
        elseif m[AntiAim.c_var.c].fake_yaw_mode:Get() == 2 then
            if m[AntiAim.c_var.c].step_abs:Get() then
                AntiAim.save_antiaims.fake_yaw_limit = math.abs(clamp(AntiAim.c_var.return_value,AntiAim.c_var.min,AntiAim.c_var.max))
            else
                AntiAim.save_antiaims.fake_yaw_limit = clamp(AntiAim.c_var.return_value,AntiAim.c_var.min,AntiAim.c_var.max)
            end
        end
        AntiAim.save_antiaims.freestanding_body_yaw = m[AntiAim.c_var.c].freestanding_bodyyaw:Get()
    end
    Menu.FindVar('Aimbot', 'Anti Aim', 'Main', 'Pitch'):Set(AntiAim.save_antiaims.pitch)

    AntiAim.OverrideYawOffset(AntiAim.override_yaw(cmd, AntiAim.save_antiaims.yaw_2, AntiAim.save_antiaims.yaw_jitter_2, AntiAim.save_antiaims.yaw_jitter_1))
    AntiAim.OverrideLimit(AntiAim.save_antiaims.fake_yaw_limit)

    if AntiAim.save_antiaims.body_yaw_1 == 0 then -- off
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(0)
        AntiAim.OverrideInverter(Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Inverter'):Get() and true or false)
    elseif AntiAim.save_antiaims.body_yaw_1 == 1 then -- opposite
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(1)
        AntiAim.OverrideInverter(Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Inverter'):Get() and true or false)
    elseif AntiAim.save_antiaims.body_yaw_1 == 2 then -- jitter
        AntiAim.OverrideInverter(AntiAim.side ~= 1)
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(1)
    else -- static
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Fake Options'):Set(2, false)
        AntiAim.OverrideInverter(Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Inverter'):Get() and true or false)
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(0)
    end
  
    Menu.FindVar('Aimbot', 'Anti Aim', 'Main', 'Yaw Add'):Set(0)
  
    Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Freestanding Desync'):Set(AntiAim.save_antiaims.freestanding_body_yaw and 1 or 0)
end

vector_lerp = function(vecSource, vecDestination, flPercentage) return vecSource + (vecDestination - vecSource) * flPercentage end
anti_aims.vecnew = Vector.new()
anti_aims.edge_yaw = function()
    if not ui.anti_aims.antiaim_enable:Get() then return end
    if ui.anti_aims.antiaim_helpers:Get(5) then
        local local_player = EntityList.GetLocalPlayer()
        if local_player == nil then return end
        local flag = EntityList.GetLocalPlayer():GetProp("m_fFlags")
        if (flag == 256 or flag == 262) then -- air
            return
        end
        --if local_player:GetState() == 'Air' then return end
        if ClientState.m_choked_commands == 0 then
            anti_aims.vecnew = local_player:GetEyePosition()
        end
        local trace_end = {}
        local ang_view_angles = EngineClient.GetViewAngles()
        for yaww = 18, 360, 18 do
            local yaww = normalize_yaw(yaww)
            local edge_angle = QAngle.new(0, yaww, 0)
            local vec_trace_end = anti_aims.vecnew + Cheat.AngleToForward(edge_angle) * 0x60
            local traceInfo = EngineTrace.TraceRay(anti_aims.vecnew, vec_trace_end, local_player, 0x200400B)
            if traceInfo.hit_entity and traceInfo.hit_entity:GetClassName() == 'CWorld' and traceInfo.fraction < 0.3 then
                trace_end[#trace_end + 1] = {
                    vec_trace_end = traceInfo.endpos,
                    yaww = yaww
                }
            end
        end
        table.sort(trace_end, function(a, b)
            return a.yaww < b.yaww
        end)
        local edge_angle
        if #trace_end >= 2 then
            local vec_trace_center = vector_lerp(trace_end[1].vec_trace_end, trace_end[#trace_end].vec_trace_end, 0.5)
            edge_angle = Cheat.VectorToAngle(anti_aims.vecnew - vec_trace_center)
        end

        if edge_angle then
            local yaww = ang_view_angles.yaw
            local edgee_yaw = edge_angle.yaw
            local difff = normalize_yaw(edgee_yaw - yaww)
            if math.abs(difff) < 90 then
                difff = 0
                yaww = normalize_yaw(edgee_yaw + 180)
            end
            local new_yaw = -yaww
            new_yaw = normalize_yaw(new_yaw + edgee_yaw + 180)
            new_yaw = normalize_yaw(new_yaw + difff)
            AntiAim.OverrideYawOffset(new_yaw)
        end
    end
end

anti_aims.avoid_backstab = function()
    if ui.anti_aims.antiaim_enable:Get() and ui.anti_aims.antiaim_helpers:Get(4) then
        local all_players = EntityList.GetEntitiesByName('CCSPlayer')
        for i = 1, #all_players do
            local enemy = all_players[i]:GetPlayer()
            if enemy ~= EntityList.GetLocalPlayer() and not enemy:IsTeamMate() and not enemy:IsDormant() and enemy:IsAlive() and enemy:GetActiveWeapon() ~= nil and enemy:GetActiveWeapon():IsKnife() then
                if EntityList.GetLocalPlayer():GetRenderOrigin():DistTo(enemy:GetProp('m_vecOrigin')) <= 300 then
                    AntiAim.OverrideYawOffset(180)
                end
            end
        end
    end
end

anti_aims.antiaim_helpers = function()

    if not ui.anti_aims.antiaim_enable:Get() then return end

        if ui.anti_aims.antiaim_helpers:Get(1) then

            if ui.refs.hideshots:Get() then
                    ui.refs.fakelags:Set(false)
                else
                    ui.refs.fakelags:Set(true)
            end
        end
end

anti_aims.disable_aa_warmup = function()

    local warmup_period = EntityList.GetGameRules():GetProp("m_bWarmupPeriod")

    if  ui.anti_aims.antiaim_enable:Get() and ui.anti_aims.antiaim_helpers:Get(3) then

        if warmup_period == true then
            ui.refs.antiaim:Set(false)
        else
            ui.refs.antiaim:Set(true)
        end

    end

end

anti_aims.exploit_teleport = function()
    if ui.ragebot.tp_in_air:Get() ~= 0 and ui.anti_aims.antiaim_enable:Get() and ui.refs.doubletap:Get() and ui.ragebot.Teleport_In_Air:Get() then
        local allow_teleport = false
        local enable_teleport = false

        local active_weapon = EntityList.GetLocalPlayer():GetActiveWeapon()
        if active_weapon == nil then return end
        local weapon_id = active_weapon:GetWeaponID()

        local guns = {
            is_AWP = weapon_id == 9,
            is_auto = (weapon_id == 38 or weapon_id == 11),
            is_scout = weapon_id == 40,
            is_deagle = weapon_id == 1,
            is_r8 = weapon_id == 64,
            is_nades = active_weapon:IsGrenade(),
            is_pistols = active_weapon:IsPistol() and not is_deagle and not is_r8,
            is_smg = (weapon_id == 34 or weapon_id == 23 or weapon_id == 24 or weapon_id == 19 or weapon_id == 26 or weapon_id == 33 or weapon_id == 17),
            is_shotguns = (weapon_id == 35 or weapon_id == 25 or weapon_id == 27 or weapon_id == 29),
            is_rifle = active_weapon:IsRifle() and not is_smg and not is_shotguns,
            is_taser = weapon_id == 31,
        }
      
        for _, weapons in pairs({
            {Value = 1, active_weapon = guns.is_AWP},
            {Value = 2, active_weapon = guns.is_auto},
            {Value = 3, active_weapon = guns.is_scout},
            {Value = 4, active_weapon = guns.is_deagle},
            {Value = 5, active_weapon = guns.is_r8},
            {Value = 6, active_weapon = guns.is_nades},
            {Value = 7, active_weapon = not (guns.is_AWP or guns.is_auto or guns.is_scout or guns.is_deagle or guns.is_r8 or guns.is_nades or guns.is_pistols or guns.is_rifle or guns.is_smg or guns.is_shotguns or guns.is_taser)},
            {Value = 8, active_weapon = guns.is_pistols},
            {Value = 9, active_weapon = guns.is_rifle},
            {Value = 10, active_weapon = guns.is_smg},
            {Value = 11, active_weapon = guns.is_shotguns},
            {Value = 12, active_weapon = guns.is_taser}
        }) do
            if ui.ragebot.tp_in_air:Get(weapons.Value) and weapons.active_weapon then
                allow_teleport = true
            end
        end

        if allow_teleport then
            all_players = EntityList.GetEntitiesByName('CCSPlayer')
            for i = 1, #all_players do
                enemy = all_players[i]:GetPlayer()
                if not enemy:IsTeamMate() and enemy:IsAlive() and not enemy:IsDormant() and enemy:CanHit() then
                    enable_teleport = true
                end
            end
        end
      
        if enable_teleport and not EntityList.GetLocalPlayer():GetFlag(0) and EntityList.GetLocalPlayer():GetVelocity() > 25 then
            Exploits.ForceTeleport()
        end
    end
end

ffi_functions.ENTITY_LIST_POINTER = ffi.cast('void***', Utils.CreateInterface('client.dll', 'VClientEntityList003')) or error('Failed to find VClientEntityList003!')
ffi_functions.GET_CLIENT_ENTITY_FN = ffi.cast('uintptr_t (__thiscall*)(void*, int)', ffi_functions.ENTITY_LIST_POINTER[0][3])

ffi_functions.get_entity_address = function(entity_index)
    local addr = ffi_functions.GET_CLIENT_ENTITY_FN(ffi_functions.ENTITY_LIST_POINTER, entity_index)
    return addr
end

ffi_functions.hook = {hooks = {}}
ffi_functions.hook.new = function(cast, callback, hook_addr, size, trampoline, org_bytes_tramp)
    local size = size or 5
    local trampoline = trampoline or false
    local new_hook, mt = {}, {}
    local detour_addr = tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, callback))))
    local void_addr = ffi.cast('void*', hook_addr)
    local old_prot = ffi.new('unsigned long[1]')
    local org_bytes = ffi.new('uint8_t[?]', size)
    ffi.copy(org_bytes, void_addr, size)
    if trampoline then
        local alloc_addr = ffi.gc(ffi.C.VirtualAlloc(nil, size + 5, 0x1000, 0x40), function(addr) ffi.C.VirtualFree(addr, 0, 0x8000) end)
        local trampoline_bytes = ffi.new('uint8_t[?]', size + 5, 0x90)
        if org_bytes_tramp then
            local bytes = {}
            for byte in org_bytes_tramp:gmatch('(%x%x)') do
                table.insert(bytes, tonumber(byte, 16))
            end
            trampoline_bytes = ffi.new('uint8_t[?]', size + 5, bytes)
        else
            ffi.copy(trampoline_bytes, org_bytes, size)
        end
        trampoline_bytes[size] = 0xE9
        ffi.cast('uint32_t*', trampoline_bytes + size + 1)[0] = hook_addr - tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, alloc_addr)))) - size
        ffi.copy(alloc_addr, trampoline_bytes, size + 5)
        new_hook.call = ffi.cast(cast, alloc_addr)
        mt = {__call = function(self, ...)
            return self.call(...)
        end}
    else
        new_hook.call = ffi.cast(cast, hook_addr)
        mt = {__call = function(self, ...)
            self.stop()
            local res = self.call(...)
            self.start()
            return res
        end}
    end
    local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
    hook_bytes[0] = 0xE9
    ffi.cast('uint32_t*', hook_bytes + 1)[0] = detour_addr - hook_addr - 5
    new_hook.status = false
    local function set_status(bool)
        new_hook.status = bool
        ffi.C.VirtualProtect(void_addr, size, 0x40, old_prot)
        ffi.copy(void_addr, bool and hook_bytes or org_bytes, size)
        ffi.C.VirtualProtect(void_addr, size, old_prot[0], old_prot)
    end
    new_hook.stop = function() set_status(false) end
    new_hook.start = function() set_status(true) end
    new_hook.start()

    table.insert(ffi_functions.hook.hooks, new_hook)
    return setmetatable(new_hook, mt)
end

anti_aims.is_jumping = false
anti_aims.ground_ticks, anti_aims.end_time = 1, 0
anti_aims.updateCSA_hk = function(thisptr, edx)
    local localplayer = EntityList.GetClientEntity(EngineClient.GetLocalPlayer())
    if localplayer == nil then return anti_aims.updateCSA_fn(thisptr, edx) end
    local lp_ptr = ffi_functions.get_entity_address(EngineClient.GetLocalPlayer())

    if ui.anti_aims.animbreakers:Get(1) then ui.refs.legs:Set(1) end

    if ui.anti_aims.animbreakers:Get() == 0 or not ui.anti_aims.antiaim_enable:Get() then anti_aims.updateCSA_fn(thisptr, edx) return end

    if ui.anti_aims.animbreakers:Get(1) then
        ffi.cast('float*' , lp_ptr+10104)[6] = 1
    end

    if ui.anti_aims.animbreakers:Get(2) then
        ffi.cast('float*' , lp_ptr+10104)[0] = 1
    end

    if ui.anti_aims.animbreakers:Get(3) then
        ffi.cast('float*' , lp_ptr+10104)[12] = 0
    end

    anti_aims.updateCSA_fn(thisptr, edx)

    if ui.anti_aims.animbreakers:Get(1) then
        ffi.cast('float*' , lp_ptr+10104)[6] = 1
    end
  
    if ui.anti_aims.animbreakers:Get(3) then
        if bit.band(EntityList.GetLocalPlayer():GetProp('m_fFlags'), 1) == 1 then
            anti_aims.ground_ticks = anti_aims.ground_ticks + 1
        else
            anti_aims.ground_ticks = 0
            anti_aims.end_time = GlobalVars.curtime + 1
        end
        if not anti_aims.is_jumping and anti_aims.ground_ticks > 1 and anti_aims.end_time > GlobalVars.curtime then
            ffi.cast('float*' , lp_ptr+10104)[12] = 0.5
        end
    end
end

Cheat.RegisterCallback('destroy', function()
    for i, v in ipairs(ffi_functions.hook.hooks) do
        if v.status then
            v.stop()
        end
    end
end)

anti_aims.updateCSA_fn = ffi_functions.hook.new('void(__fastcall*)(void*, void*)', anti_aims.updateCSA_hk, ffi.cast('uintptr_t', Utils.PatternScan('client.dll', '8B F1 80 BE ? ? ? ? ? 74 36', -5))) or error("updateCSA_fn can't hook")
-- @endregion

local draggable = {}
function draggable:new(name, size, init_pos)
    local drag = {}
    local init_pos = init_pos or Vector2.new(100, 100)
    drag.size = size
    drag.x = Menu.SliderInt('Visuals', "draggable elements", name .. "_x", init_pos.x, 0, globals.screen_size.x)
    drag.y = Menu.SliderInt('Visuals', "draggable elements", name .. "_y", init_pos.y, 0, globals.screen_size.y)
    drag.x:SetVisible(false)
    drag.y:SetVisible(false)
    drag.captured = false
    drag.clicked = false
    drag.mouse_offset = Vector2.new(0, 0)

    setmetatable(drag, self)
    self.__index = self
  
    return drag
end

function draggable:get()
    return Vector2.new(self.x:Get(), self.y:Get())
end

function draggable:update()
    if not Cheat.IsMenuVisible() then
        return
    end

    local mouse_pos = Cheat.GetMousePos()
    local mouse_hold = Cheat.IsKeyDown(1)

    if not self.clicked and mouse_hold then
        self.clicked = true
        if not self.captured and mouse_hold and helpers:mouse_in_bounds(self:get(), self:get() + self.size) then
            self.captured = true
            self.mouse_offset = mouse_pos - self:get()
        end
    end

    if not mouse_hold then
        self.captured = false
        self.clicked = false
    end

    if self.captured then
        self.x:Set(mouse_pos.x - self.mouse_offset.x)
        self.y:Set(mouse_pos.y - self.mouse_offset.y)
    end
end

function draggable:set_size(size)
    self.size = size
end

-- @region: widgets
local indicators = {}
indicators.on_plant_time, indicators.fill, indicators.planting_site, indicators.planting = 0, 0, '', false
indicators.Render_Shadow = function(start_pos, endpos, color)
    Render.GradientBoxFilled(start_pos, Vector2.new(start_pos.x + ((endpos.x - start_pos.x) / 2), endpos.y), Color.RGBA(0.0, 0.0, 0.0, 0.0), color, Color.RGBA(0.0, 0.0, 0.0, 0.0), color)
    Render.GradientBoxFilled(Vector2.new(start_pos.x + ((endpos.x - start_pos.x) / 2), start_pos.y), endpos, color, Color.RGBA(0.0, 0.0, 0.0, 0.0), color, Color.RGBA(0.0, 0.0, 0.0, 0.0))
end

indicators.contains = function(table, val)
    for i=1, #table do
        if table[i] == val then
            return true
        end
    end
    return false
end

indicators.clear_planting_info = function()
    planting = false
    fill = 0
    on_plant_time = 0
    planting_site = ''
end

indicators.bomb = function(event)
    typese = {
        'bomb_abortplant', 'bomb_defused', 'bomb_planted', 'round_prestart'
    }
  
    if indicators.contains(typese, event:GetName()) then indicators.clear_planting_info() end
  
    if event:GetName() == 'bomb_beginplant' then
        on_plant_time = GlobalVars.curtime
        planting = true
        bombsite = event:GetInt('site');
        APlants = (454 or 372 or 102 or 276 or 174 or 121 or 301 or 142 or 408 or 97 or 213 or 216)
        if bombsite == APlants then
            planting_site = 'Bombsite A'
        else
            planting_site = 'Bombsite B'
        end
    end
end

indicators.Render_Indicator = function(text, col, cur)
    local position = Vector2.new(20, (globals.screen_size.y / 1.55) + (39 * cur))
    local positionS = Vector2.new(21, (globals.screen_size.y / 1.55 + 1) + (39 * cur))
    local textsize = Render.CalcTextSize(text, 24, fonts.calibrib24)

    indicators.Render_Shadow(Vector2.new(position.x - 10, position.y - 7), Vector2.new(position.x + textsize.x - 10, position.y + textsize.y + 2), Color.RGBA(0, 0, 0, 56 * col.a))

    Render.Text(text, positionS, Color.RGBA(33, 33, 33, 127 * col.a), 24, fonts.calibrib24)
    Render.Text(text, position, col, 24, fonts.calibrib24)
end

widgets = {
    create_window = function(self, s, e, alpha)
        local color = helpers:copy_color(ui.visuals.theme:Get())
        local background_color = Color.new(0, 0, 0, alpha * ui.visuals.theme:Get().a)
        local border_color1 = helpers:alpha_modulate(color, alpha)
        local border_color2 = helpers:alpha_modulate(color, alpha * 0.4)

        Render.Blur(s, e, Color.new(1 - background_color.a, 1 - background_color.a, 1 - background_color.a, alpha), 5)

        if not ui.visuals.disable_blur:Get() then
        Render.Box(s - Vector2.new(6, 6), e + Vector2.new(6, 6), helpers:alpha_modulate(border_color1, alpha * 0.02), 5)
        Render.Box(s - Vector2.new(5, 5), e + Vector2.new(5, 5), helpers:alpha_modulate(border_color1, alpha * 0.03), 5)
        Render.Box(s - Vector2.new(4, 4), e + Vector2.new(4, 4), helpers:alpha_modulate(border_color1, alpha * 0.04), 5)
        Render.Box(s - Vector2.new(3, 3), e + Vector2.new(3, 3), helpers:alpha_modulate(border_color1, alpha * 0.08), 5)
        Render.Box(s - Vector2.new(2, 2), e + Vector2.new(2, 2), helpers:alpha_modulate(border_color1, alpha * 0.13), 5)
        Render.Box(s - Vector2.new(1, 1), e + Vector2.new(1, 1), helpers:alpha_modulate(border_color1, alpha * 0.20), 5)
        end
      
        Render.BoxFilled(s + Vector2.new(5, 0), Vector2.new(e.x - 5, s.y + 1), border_color1)
        Render.BoxFilled(Vector2.new(s.x + 5, e.y - 1), e - Vector2.new(5, 0), border_color2)
        Render.GradientBoxFilled(Vector2.new(s.x, s.y + 5), Vector2.new(s.x + 1, e.y - 5), border_color1, border_color1, border_color2, border_color2)
        Render.GradientBoxFilled(Vector2.new(e.x - 1, s.y + 5), Vector2.new(e.x, e.y - 5), border_color1, border_color1, border_color2, border_color2)
        Render.Circle(s + Vector2.new(5, 5), 5, 8, border_color1, 1, -90, -180)
        Render.Circle(Vector2.new(s.x + 5, e.y - 5), 5, 8, border_color2, 1, 90, 180)
        Render.Circle(e - Vector2.new(5, 5), 5, 8, border_color2, 1, 0, 90)
        Render.Circle(Vector2.new(e.x - 5, s.y + 5), 5, 8, border_color1, 1, -90, 0)
    end,

    keybinds = {
        anims = {},
        drag = draggable:new("keybinds", Vector2.new(150, 20)),
        size = 100,
        alpha = 0,
        draw = function(self)
            if not ui.visuals.widgets:Get(1) then
                return
            end

            self.drag:update()
            local pos = self.drag:get()

            local bind_list = Cheat.GetBinds()
            local render_list = {}
            local opened = Cheat.IsMenuVisible()
            local render_offset = 0
            local raw_size = 100

            for _, bind in pairs(bind_list) do
                local bind_name = bind:GetName()
                if not self.anims[bind_name] then
                    self.anims[bind_name] = 0
                end

                self.anims[bind_name] = helpers:lerp(self.anims[bind_name], bind:IsActive() and 1 or 0)

                if bind:IsActive() then
                    opened = true
                end

                if self.anims[bind_name] > 0.01 then
                    local r_bind = {}

                    r_bind.name = bind_name:lower():gsub("^%l", string.upper)
                    r_bind.value = string.format("[%s]", bind:GetValue())
                    r_bind.alpha = self.anims[bind_name]
                    r_bind.offset = render_offset

                    if r_bind.value == "[on]" or r_bind.value == "[off]" then
                        r_bind.value = bind:GetMode() == 0 and "[toggled]" or "[hold]"
                    end

                    local name_size = Render.CalcTextSize(r_bind.name, 11, fonts.verdana).x + Render.CalcTextSize(r_bind.value, 11, fonts.verdana).x + 15

                    render_offset = render_offset + r_bind.alpha * 16
                    raw_size = math.max(raw_size, name_size)

                    table.insert(render_list, r_bind)
                end
            end

            self.alpha = helpers:lerp(self.alpha, opened and 1 or 0)
            self.size = helpers:lerp(self.size, raw_size)

            if self.alpha < 0.01 then
                return
            end
            widgets:create_window(pos, pos + Vector2.new(self.size, 20), self.alpha)
            helpers:text_shadow("keybinds", pos + Vector2.new(self.size, 20) / 2, Color.new(1, 1, 1, self.alpha), 11, fonts.verdana, true)

            for _, r in pairs(render_list) do
                helpers:text_shadow(r.name, pos + Vector2.new(5, 22 + r.offset), Color.new(1, 1, 1, r.alpha), 11, fonts.verdana)
                helpers:text_shadow(r.value, pos + Vector2.new(self.size - 5 - Render.CalcTextSize(r.value, 11, fonts.verdana).x, 22 + r.offset), Color.new(1, 1, 1, r.alpha), 11, fonts.verdana)
            end
        end
    },
  
    spectators = {
        data = {},
        drag = draggable:new("spectators", Vector2.new(120, 20)),
        size = 100,
        alpha = 0,
        getsteamid64 = function(self, steamid)
            return string.sub(tostring(ffi.new("uint64_t", 76561197960265728) + ffi.new("uint64_t", steamid)), 1, -4)
        end,
        get_list = function(self)
            if not EntityList.GetLocalPlayer() then
                return {}, Cheat.IsMenuVisible()
            end

            local observe_target = EntityList.GetLocalPlayer()

            if EntityList.GetLocalPlayer():GetProp("m_iObserverMode") ~= 0 then
                local ent = EntityList.GetClientEntityFromHandle(EntityList.GetLocalPlayer():GetProp("m_hObserverTarget"))

                if ent and ent:IsPlayer() then
                    observe_target = ent:GetPlayer()
                end
            end

            if not observe_target then
                return {}, Cheat.IsMenuVisible()
            end

            local players = EntityList.GetPlayers()
            local rtn_list = {}
            local opened = Cheat.IsMenuVisible()

            for _, pl in pairs(players) do 
                if pl ~= EntityList.GetLocalPlayer() then
                    local name = pl:GetName()
                    local info = pl:GetPlayerInfo()
                    local steamid = self:getsteamid64(info.iSteamID)

                    if not self.data[steamid] then
                        if not info.fakeplayer then
                            self.data[steamid] = {
                                name = name,
                                alpha = 0,
                            }

                            local player_data = self.data[steamid]

                            player_data.callback1 = function(content)
                                local parsed = json.parse(content).response
                                if not parsed then
                                    return
                                end
                                parsed = parsed.players[0]
                                if not parsed then
                                    return
                                end
                                Http.GetAsync(parsed.avatar, player_data.callback2)
                            end

                            player_data.callback2 = function(content)
                                player_data.avatar = Render.LoadImage(content, Vector2.new(32, 32))
                            end

                            Http.GetAsync("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=E8A1E59F9C119FA9BFB73F29C2A8A109&steamids=" .. steamid, player_data.callback1)
                        else
                            self.data[steamid] = {
                                name = name,
                                alpha = 0,
                                avatar = globals.default_avatar,
                            }
                        end
                    end

                    local data = self.data[steamid]
                    local observer = EntityList.GetClientEntityFromHandle(pl:GetProp("m_hObserverTarget"))
                    local is_observer = (observer and observer:IsPlayer() and observer:GetPlayer() == observe_target)
              
                    if is_observer then
                        opened = true
                    end

                    data.alpha = helpers:lerp(data.alpha, is_observer and 1 or 0)

                    if data.alpha > 0.01 then
                        table.insert(rtn_list, data)
                    end
                end
            end

            return rtn_list, opened
        end,
        draw = function(self)
            if not ui.visuals.widgets:Get(2) then
                return
            end

            self.drag:update()
            local pos = self.drag:get()

            local render_offset = 0
            local raw_size = 100

            local list, opened = self:get_list()

            for _, data in pairs(list) do
                local reneder_pos = pos + Vector2.new(5, 23 + render_offset)

                if not data.avatar then return end
                Render.Image(data.avatar, reneder_pos, Vector2.new(16, 16), Color.new(1, 1, 1, data.alpha))
                helpers:text_shadow(data.name, reneder_pos + Vector2.new(21, 2), Color.new(1, 1, 1, data.alpha), 11, fonts.verdana)

                local size = 30 + Render.CalcTextSize(data.name, 11, fonts.verdana).x

                if size > raw_size then
                    raw_size = size
                end

                render_offset = render_offset + 18 * data.alpha
            end

            self.size = helpers:lerp(self.size, raw_size)
            self.alpha = helpers:lerp(self.alpha, opened and 1 or 0)

            if self.alpha > 0.01 then
                widgets:create_window(pos, pos + Vector2.new(self.size, 20), self.alpha)
                helpers:text_shadow("spectators", pos + Vector2.new(self.size / 2, 10), Color.new(1, 1, 1, self.alpha), 11, fonts.verdana, true)
            end
        end,
    },

    watermark = {
        size = 0,
        draw = function(self)
            if not ui.visuals.widgets:Get(3) then
                return
            end

            local full_text = ""

            if ui.visuals.watermark_info:Get(1) then
                full_text = full_text .. " | " .. ui.visuals.custom_username:Get()
            end

            if ui.visuals.watermark_info:Get(2) then
                full_text = full_text .. " | " .. tostring(math.floor(helpers:get_fps())) .. " fps"
            end

            if ui.visuals.watermark_info:Get(3) then
                local net_channel = EngineClient.GetNetChannelInfo()
                local ping = 0

                if net_channel then
                    ping = net_channel:GetAvgLatency(0)
                end

                full_text = full_text .. " | delay: " .. tostring(math.floor(ping * 1000)) .. "ms"
            end

            if ui.visuals.watermark_info:Get(4) then
                full_text = full_text .. " | " .. tostring(math.floor(1 / GlobalVars.interval_per_tick + 0.5)) .. "tick"
            end

            if ui.visuals.watermark_info:Get(5) then
                full_text = full_text .. " | " .. helpers:get_time()
            end

            local size = Render.CalcTextSize("psycho" .. full_text, 11, fonts.verdana).x + 54
            self.size = helpers:lerp(self.size, size)

            local pos = Vector2.new(globals.screen_size.x - 10 - self.size, 10)
            widgets:create_window(pos, pos + Vector2.new(self.size, 20), 1)
            pos = pos + Vector2.new(6, 3)

            helpers:text_shadow("psy", pos, Color.new(1, 1, 1), 11, fonts.verdana)
            pos.x = pos.x + Render.CalcTextSize("psy", 11, fonts.verdana).x
            helpers:text_shadow("cho", pos, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)
            pos.x = pos.x + Render.CalcTextSize("cho", 11, fonts.verdana).x
            helpers:text_shadow(" [stable]", pos, Color.new(1, 1, 1), 11, fonts.verdana)
            pos.x = pos.x + Render.CalcTextSize(" [stable]", 11, fonts.verdana).x
            helpers:text_shadow(full_text, pos, Color.new(1, 1, 1), 11, fonts.verdana)

        end
    },

    lua_panel = {
        drag = draggable:new("lua_panel", Vector2.new(170, 45), Vector2.new(100, globals.screen_size.y / 2 - 23)),
        draw = function(self)
            if not ui.visuals.widgets:Get(4) then
                return
            end

            self.drag:update()

            local pos = self.drag:get()

            widgets:create_window(pos, pos + Vector2.new(170, 45), 1)

            local cursor = pos + Vector2.new(5, 4)

            helpers:text_shadow("» psycho anti-aim", cursor, Color.new(1, 1, 1), 11, fonts.verdana)
            cursor.x = cursor.x + Render.CalcTextSize("» psycho anti-aim ", 11, fonts.verdana).x
            helpers:text_shadow("technology", cursor, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)
            cursor = Vector2.new(pos.x + 5, cursor.y + 12)

            helpers:text_shadow("» user:", cursor, Color.new(1, 1, 1), 11, fonts.verdana)
            cursor.x = cursor.x + Render.CalcTextSize("» user: ", 11, fonts.verdana).x
            helpers:text_shadow(globals.username, cursor, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)
            cursor = Vector2.new(pos.x + 5, cursor.y + 12)

            helpers:text_shadow("» build: ", cursor, Color.new(1, 1, 1), 11, fonts.verdana)
            cursor.x = cursor.x + Render.CalcTextSize("» build: ", 11, fonts.verdana).x
            helpers:text_shadow("stable", cursor, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)

            if ui.visuals.statepanel_image:Get() == 1 then
                Render.Image(globals.avatar, pos + Vector2.new(145, 20), Vector2.new(20, 20))
            elseif ui.visuals.statepanel_image:Get() == 2 then
                Render.Image(globals.logo_avatar2, pos + Vector2.new(134, 15), Vector2.new(30, 30))
            else
                Render.Image(globals.logo_avatar2, pos + Vector2.new(134, 15), Vector2.new(30, 30))
                Render.Image(globals.avatar, pos + Vector2.new(105, 19), Vector2.new(22, 22))
            end

        end
    },

    gamesense = {

        draw = function(self)

            local local_player = EntityList.GetLocalPlayer()
            if not local_player then return end

            if not local_player:IsAlive() then return end
            local cur_dmg = ui.refs.minimum_damage:GetInt()
            if cur_dmg > 100 then cur_dmg = '+'..cur_dmg-100 end
            local isDmg = false
            local isPing = false
            local binds = Cheat.GetBinds()
            for i = 1, #binds do
                bind = binds[i]
                if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                    isDmg = true
                end
                if bind:GetName() == 'Fake Ping' and bind:IsActive() then
                    isPing = true
                end
            end
            local ground = bit.band(local_player:GetProp('m_fFlags'), bit.lshift(1,0)) == 0
            local crouch = local_player:GetProp('m_flDuckAmount')
            local isDmg = false
            local binds = Cheat.GetBinds()
            for i = 1, #binds do
                local bind = binds[i]
                if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                    isDmg = true
                end
            end

            if ui.visuals.gamesense:Get() then
                local current_pos = 1
              
                if ui.visuals.gamesense_choose:Get(1) and isDmg then
                    indicators.Render_Indicator('DMG: '..tostring(cur_dmg), Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
      
                if ui.visuals.gamesense_choose:Get(2) and ui.ragebot.dormant_aimbot:GetBool() then
                    local colors = Color.RGBA(132,196,20,255)
                    for k, v in pairs(rage.player_info_prev) do
                        if k ~= nil then
                            if v[3] == true then
                                colors = Color.RGBA(252,222,30,255)
                                break
                            end
                        end
                    end
                    indicators.Render_Indicator('DA', colors, current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(3) and isPing then
                    local net_channel = EngineClient.GetNetChannelInfo()
                    local outgoing, incoming = net_channel:GetLatency(0), net_channel:GetLatency(1)
                    local ping = math.max(0, (incoming-outgoing)*1000)
                    indicators.Render_Indicator('PING', Color.RGBA(math.floor(255 - ((ping / 189 * 60) * 1.90)), math.floor((ping / 189 * 60) * 3.05), math.floor((ping / 189 * 60) * 0.32), 255), current_pos); current_pos = current_pos - 1;
                end
                local c4 = EntityList.GetEntitiesByClassID(129)[1];
                if ui.visuals.gamesense_choose:Get(4) and c4 ~= nil then
                    local time = c4:GetProp('m_flC4Blow') - GlobalVars.curtime
                    local timer = string.format('%.1f', time)
                    local defused = c4:GetProp('m_bBombDefused')
                    if math.floor(timer) > 0 and not defused then
                        local defusestart = c4:GetProp('m_hBombDefuser') ~= 4294967295
                        local defuselength = c4:GetProp('m_flDefuseLength')
                        local defusetimer = defusestart and (c4:GetProp('m_flDefuseCountDown') - GlobalVars.curtime) / 1 or -1
                        if defusetimer > 0 then
                            local color = math.floor(timer) > defusetimer and Color.RGBA(75, 230, 64, 80) or Color.RGBA(255, 0, 0, 80)
                      
                            local barlength = ((globals.screen_size.y - 50) / defuselength) * (defusetimer)
                            Render.BoxFilled(Vector2.new(0.0, 0.0), Vector2.new(20, globals.screen_size.y), Color.RGBA(32, 32, 32, 50))
                            Render.Box(Vector2.new(0.0, 0.0), Vector2.new(20, globals.screen_size.y), Color.RGBA(32, 32, 32, 50))
                          
                            Render.BoxFilled(Vector2.new(0, globals.screen_size.y - barlength), Vector2.new(19, globals.screen_size.y), color)
                        end
                      
                        local bombsite = c4:GetProp('m_nBombSite') == 0 and 'A' or 'B'
                        local health = EntityList.GetLocalPlayer():GetProp('m_iHealth')
                        local armor = EntityList.GetLocalPlayer():GetProp('m_ArmorValue')
                        local willKill = false
                        local eLoc = c4:GetRenderOrigin()
                        local lLoc = EntityList.GetLocalPlayer():GetRenderOrigin()
                        local distance = eLoc:DistTo(lLoc)
                        local a = 450.7
                        local b = 75.68
                        local c = 789.2
                        local d = (distance - b) / c;
      
                        local damage = a * math.exp(-d * d)
                        if armor > 0 then
                            newDmg = damage * 0.5;
          
                            armorDmg = (damage - newDmg) * 0.5
                            if armorDmg > armor then
                                armor = armor * (1 / .5)
                                newDmg = damage - armorDmg
                            end
                            damage = newDmg;
                        end
                        local dmg = math.ceil(damage)
                        if dmg >= health then
                            willKill = true
                        else
                            willKill = false
                        end
                        indicators.Render_Indicator(bombsite..' - '..string.format('%.1f', timer)..'s', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                        if EntityList.GetLocalPlayer() then
                            if willKill == true then
                                indicators.Render_Indicator('FATAL', Color.RGBA(255, 0, 0, 255), current_pos); current_pos = current_pos - 1;
                            elseif damage > 0.5 then
                                indicators.Render_Indicator('-'..dmg..' HP', Color.RGBA(252, 243, 105, 255), current_pos); current_pos = current_pos - 1;
                            end
                        end
                    end
                end
                if ui.visuals.gamesense_choose:Get(4) and planting then
                    indicators.Render_Indicator(planting_site, Color.RGBA(252, 243, 105, 255), current_pos); current_pos = current_pos - 1;
                    local fill = 3.125 - (3.125 + on_plant_time - GlobalVars.curtime)
                    if fill > 3.125 then
                        fill = 3.125
                    end
                    local ts = Render.CalcTextSize(planting_site, 24, fonts.calibrib24)
                    Render.Circle(Vector2.new(153, globals.screen_size.y / 1.55 + 48 + (39 * current_pos - 1)), 8, 32, Color.RGBA(0, 0, 0, 200), 5)
                    Render.Circle(Vector2.new(153, globals.screen_size.y / 1.55 + 48 + (39 * current_pos - 1)), 8, 32, Color.RGBA(213, 213, 214, 255), 3, -1, (fill/3.3)*375)
                end

                if ui.visuals.gamesense_choose:Get(5) and bit.band(EntityList.GetLocalPlayer():GetProp('m_fFlags'), bit.lshift(1,0)) == 0 then
                    indicators.Render_Indicator('LC', EntityList.GetLocalPlayer():GetVelocity() > 260 and Color.RGBA(132, 196, 20, 255) or Color.RGBA(255, 0, 0, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(6) and ui.refs.fakeduck:Get() then
                    indicators.Render_Indicator('DUCK', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
                if  ui.visuals.gamesense_choose:Get(7) and ui.refs.doubletap:Get() then
                    indicators.Render_Indicator('DT', Exploits.GetCharge() == 1 and Color.RGBA(213, 213, 214, 255) or Color.RGBA(255, 0, 0, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(8) and ui.refs.hideshots:Get() then
                    indicators.Render_Indicator('ONSHOT', Color.RGBA(132, 196, 20, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(9) and ui.refs.yaw_base:Get() == 5 then
                    indicators.Render_Indicator('FS', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
      
                if ui.visuals.gamesense_choose:Get(10) and ui.refs.bodyaim:Get() == 2 then
                    indicators.Render_Indicator('BODY', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(11) and ui.refs.safepoints:Get() == 2 then
                    indicators.Render_Indicator('SAFE', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
            end
        end
    },

    indicators = {
        x_add = 0,
        -----------------------
        draw = function(self)
            if not ui.visuals.widgets:Get(5) then return end
                local local_player = EntityList.GetLocalPlayer()
                if not local_player then return end

                if not local_player:IsAlive() then return end
                local cur_dmg = ui.refs.minimum_damage:GetInt()
                if cur_dmg > 100 then cur_dmg = '+'..cur_dmg-100 end
                local isDmg = false
                local isPing = false
                local binds = Cheat.GetBinds()
                for i = 1, #binds do
                    bind = binds[i]
                    if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                        isDmg = true
                    end
                    if bind:GetName() == 'Fake Ping' and bind:IsActive() then
                        isPing = true
                    end
                end
                local ground = bit.band(local_player:GetProp('m_fFlags'), bit.lshift(1,0)) == 0
                local crouch = local_player:GetProp('m_flDuckAmount')
                local isDmg = false
                local binds = Cheat.GetBinds()
                for i = 1, #binds do
                    local bind = binds[i]
                    if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                        isDmg = true
                    end
                end
                local scope = local_player:GetProp('m_bIsScoped')
                self.x_add = helpers:lerp(self.x_add, scope and 35 or 0, GlobalVars.frametime * 8)

                local alpha = 0
                local y = 0

                if scope then
                    alpha = 0.5
                else
                    alpha = 1
                end
                if globals.indicator_avatar == nil then return end
                if globals.logo_avatar2 == nil then return end
                if fonts.pixel == nil then return end
                if fonts.arrow_fonts == nil then return end
                if fonts.arrow_font2 == nil then return end

                if ui.visuals.indicator_type:Get() == 1 then
                  
                    if not ui.visuals.disable_background:Get() then
                        Render.Image(globals.indicator_avatar, Vector2.new(globals.screen_size.x/2 - 50 +self.x_add, globals.screen_size.y/2 - 2), Vector2.new(100, 75), Color.new(ui.visuals.ghosty_color:GetColor().r, ui.visuals.ghosty_color:GetColor().g, ui.visuals.ghosty_color:GetColor().b, breath(2, ui.visuals.ghosty_color:GetColor().a * 100 / 235)))
                    end

                    Render.Image(globals.logo_avatar2, Vector2.new(globals.screen_size.x/2 - 20 +self.x_add, globals.screen_size.y/2 + 17), Vector2.new(40, 40), Color.new(ui.visuals.ghosty_color:GetColor().r, ui.visuals.ghosty_color:GetColor().g, ui.visuals.ghosty_color:GetColor().b, alpha))
                end
                --if ui.visuals.indicator_type:Get() == 1 then
                --Render.Image(globals.logo_avatar, Vector2.new(globals.screen_size.x/2 - 21 +self.x_add, globals.screen_size.y/2 + 20), Vector2.new(35, 35), Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, alpha))
                --end

                if ui.visuals.indicator_type:Get() == 0 then

                    if not ui.visuals.disable_background:Get() then
                        Render.Image(globals.indicator_avatar, Vector2.new(globals.screen_size.x/2 - 50 +self.x_add, globals.screen_size.y/2 - 8), Vector2.new(100, 75), Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, breath(2, ui.visuals.ind_name_color:GetColor().a * 100 / 235)))
                    end

                    Render.Text('psycho', Vector2.new(globals.screen_size.x/2-17+self.x_add, globals.screen_size.y/2+16), Color.new(0, 0, 0, 0.5), 11, fonts.verdanabd11)
                    Render.Text('psy', Vector2.new(globals.screen_size.x/2-18+self.x_add, globals.screen_size.y/2+15), AntiAim.GetInverterState() and Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, 1) or Color.new(1, 1, 1, 1), 11, fonts.verdanabd11)
                    Render.Text('cho', Vector2.new(globals.screen_size.x/2-1+self.x_add, globals.screen_size.y/2+15), not AntiAim.GetInverterState() and Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, 1) or Color.new(1, 1, 1, 1), 11, fonts.verdanabd11)
              
                    if ground then
                        state = 'AIR'
                    elseif crouch >= 1 then
                        state = 'CROUCHING'
                    elseif ui.refs.slowwalk:Get() then
                        state = 'SLOWWALKING'
                    elseif local_player:GetVelocity() > 5 then
                        state = 'MOVING'
                    else
                        state = 'STANDING'
                    end
                    local text_sizes = Render.CalcTextSize(state, 9, fonts.pixel)
                    Render.Text(state, Vector2.new(globals.screen_size.x/2+1-text_sizes.x/2+self.x_add, globals.screen_size.y/2+28), Color.new(ui.visuals.ind_state_color:GetColor().r, ui.visuals.ind_state_color:GetColor().g, ui.visuals.ind_state_color:GetColor().b, 1), 9, fonts.pixel, true)

                    Render.Text('OS', Vector2.new(globals.screen_size.x/2-18+self.x_add, globals.screen_size.y/2+37), ui.refs.hideshots:Get() and Color.new(ui.visuals.ind_color:GetColor().r, ui.visuals.ind_color:GetColor().g, ui.visuals.ind_color:GetColor().b, 1) or Color.new(0.8, 0.8, 0.8, 0.7), 9, fonts.pixel, true)
                    Render.Text('DT', Vector2.new(globals.screen_size.x/2-4+self.x_add, globals.screen_size.y/2+37), ui.refs.doubletap:Get() and (Exploits.GetCharge() >= 0.9 and Color.new(0, 1, 0, 1) or Color.new(1, 0, 0, 1)) or Color.new(0.8, 0.8, 0.8, 0.7), 9, fonts.pixel, true)
                    Render.Text('AP', Vector2.new(globals.screen_size.x/2+9+self.x_add, globals.screen_size.y/2+37), ui.refs.autopeek:Get() and Color.new(ui.visuals.ind_color:GetColor().r, ui.visuals.ind_color:GetColor().g, ui.visuals.ind_color:GetColor().b, 1) or Color.new(0.8, 0.8, 0.8, 0.7), 9, fonts.pixel, true)
                        if isDmg then
                            local text_size = Render.CalcTextSize(('DMG: %s'):format(ui.refs.minimum_damage:Get()), 9, fonts.pixel)
                            Render.Text(('DMG: %s'):format(ui.refs.minimum_damage:Get()), Vector2.new(globals.screen_size.x/2-text_size.x/2+1+self.x_add, globals.screen_size.y/2+46), Color.new(1, 1, 1, 1), 9, fonts.pixel, true)
                        end
                    end
                scope = EntityList.GetLocalPlayer():GetProp("m_bIsScoped")
                alpha = 0.7
      
                if ui.visuals.scope_conditions:Get(4) and scope then
                    alpha = 0
                else
                    if ui.visuals.arrows:GetInt() == 1 then
                        Render.Text('<', Vector2.new(globals.screen_size.x/2-40-ui.visuals.arrows_x:Get(), globals.screen_size.y/2-8), ui.refs.yaw_base:Get() == 3 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 15, fonts.verdana11)
                        Render.Text('>', Vector2.new(globals.screen_size.x/2+31+ui.visuals.arrows_x:Get(), globals.screen_size.y/2-8), ui.refs.yaw_base:Get() == 2 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 15, fonts.verdana11)
                    end

                    if ui.visuals.arrows:GetInt() == 2 then
                        Render.Text('X', Vector2.new(globals.screen_size.x/2-40-ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 3 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                        Render.Text('Z', Vector2.new(globals.screen_size.x/2+31+ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 2 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                    end

                    if ui.visuals.arrows:GetInt() == 3 then
                        Render.Text('w', Vector2.new(globals.screen_size.x/2-40-ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 3 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                        Render.Text('x', Vector2.new(globals.screen_size.x/2+31+ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 2 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                    end
                end
            end
        }
}
-- @endregion

-- @region: visuals
local visuals = {}
local scope_anim = 0
visuals.scope = function()
    -- vars
    x,y,w,o = globals.screen_size.x / 2, globals.screen_size.y / 2, ui.visuals.scope_width:GetInt(), ui.visuals.scope_offset:GetInt()
    -- проверки
    local fov_cs_debug = CVar.FindVar("fov_cs_debug")

    if not EngineClient.IsConnected() then return end
    if not EntityList.GetLocalPlayer() then return end
    if not EntityList.GetLocalPlayer():GetProp("m_bIsScoped") then return end
    if ui.visuals.custom_scope:GetBool() then
        ui.refs.scope:SetInt(2)
      
        if scope_anim > 0 then scope_anim = scope_anim - 5
            else scope_anim = 0
        end
        if ui.visuals.scope_conditions:Get(2) then scope_anim = 255 else if scope_anim < 255 then scope_anim = scope_anim + 5 else scope_anim = 255 end end
        if ui.visuals.custom_scope and ui.visuals.scope_conditions:Get(3) and fov_cs_debug:GetInt()~=90 then fov_cs_debug:SetInt(90) end

        if ui.visuals.scope_conditions:Get(1) then
            color1 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, scope_anim / 255)
            color2 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, 0)
        else
            color1 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, 0)
            color2 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, scope_anim / 255)
        end

        Render.GradientBoxFilled(Vector2.new(x - w - o, y), Vector2.new(x - o, y + 1), color1, color2, color1, color2)
        Render.GradientBoxFilled(Vector2.new(x + w + o, y), Vector2.new(x + o, y + 1), color1, color2, color1, color2)
        Render.GradientBoxFilled(Vector2.new(x, y - o - w), Vector2.new(x + 1, y - o), color1, color1, color2, color2)
        Render.GradientBoxFilled(Vector2.new(x, y + o + w), Vector2.new(x + 1, y + o), color1, color1, color2, color2)
    else
        ui.refs.scope:SetInt(1)
    end
end

visuals.circle_desync = function() 
  
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then return end

     if not local_player:IsAlive() then return end
    if ui.visuals.desync_circle_conditions:Get(2) and ui.visuals.desync_circle:GetBool() then
        CVar.FindVar('crosshair'):SetInt(0)
    else
        CVar.FindVar('crosshair'):SetInt(1)
    end

    if ui.visuals.desync_circle:Get() then

        local color = Color.new(ui.visuals.desync_circle:GetColor().r, ui.visuals.desync_circle:GetColor().g, ui.visuals.desync_circle:GetColor().b, 1)
        local view_angles = EngineClient.GetViewAngles()
        local real_yaw = AntiAim.GetCurrentRealRotation()
        local view_yaw = view_angles.yaw - 180;
        local fake = adjust_angle(real_yaw - view_yaw);
        local delta = math.abs(normalize_yaw(AntiAim.GetCurrentRealRotation() % 360 - AntiAim.GetFakeRotation() % 360)) / 2
        local fake_color = Color.RGBA(math.floor(255 - (delta * 2.29824561404)), math.floor(delta * 3.42105263158), math.floor(delta * 0.22807017543), 255)

        Render.Circle(Vector2.new(globals.screen_size.x/2, globals.screen_size.y/2), 7, 32, Color.new(0, 0, 0, 1), 4, 0, 360)
        Render.Circle(Vector2.new(globals.screen_size.x/2, globals.screen_size.y/2), 7, 32, ui.visuals.desync_circle_conditions:Get(1) and fake_color or color, 4, 90, ui.refs.invert_side == false and -90 or 270)
        Render.Circle(Vector2.new(globals.screen_size.x/2, globals.screen_size.y/2), 15, 32, ui.visuals.desync_circle_conditions:Get(1) and fake_color or color, 4, fake+30, fake-30)
    end
end

visuals.hitmarker = function()
    if not EngineClient.IsConnected() then return end
    if not ui.visuals.hitmarker:Get() then return end

    misc.removeimpact()
    local color = ui.visuals.hitmarker:GetColor()
    local r = color.r local g = color.g local b = color.b local l = ui.visuals.hitmarker_length:Get()

    for i = 1, #t do

        local screen_pos = Render.WorldToScreen(Vector.new(t[i].x, t[i].y, t[i].z))
        local sx,sy = screen_pos.x, screen_pos.y

        Render.BoxFilled(Vector2.new(sx, sy - l), Vector2.new(sx, sy + l), Color.new(r, g, b, (t[i].a / 255)), 1.0)
        Render.BoxFilled(Vector2.new(sx - l, sy), Vector2.new(sx + l, sy), Color.new(r, g, b, (t[i].a / 255)), 1.0)
    end
end

visuals.thirdperson = function()
    if ui.misc.thirdperson:Get() and ui.misc.misc_enable:Get() then
        Menu.FindVar("Visuals", "View", "Thirdperson", "Distance"):Set(ui.misc.thirdperson_distance:Get())
    end
        if ui.misc.thirdperson:Get() and ui.misc.misc_enable:Get() then
            Cheat.SetThirdPersonAnim(not ui.misc.thirdperson_anim:Get())
        else
            Cheat.SetThirdPersonAnim(true)
        end
end
visuals._verification = function(shot)
    local text = ''

    local hg_diff = hgroup ~= aimed_hgroup
    local dmg_diff = shot.damage ~= shot.wanted_damage

    if hg_diff or dmg_diff then
        text = string.format(
            ' | mismatch: [ %s ]', (function()
                local addr = ''

                if dmg_diff then addr = 'dmg: ' .. shot.wanted_damage .. (hg_diff and ' | ' or '') end
                if hg_diff then addr = addr .. (hg_diff and 'hitgroup: ' .. aimed_hgroup or '') end

                return addr
            end)()
        )
    end

    return text
end

local size_changed = false

local text = ''

visuals.glowmenu = function()
    if not ui.misc.menu_customize:Get() then return end
    local menu_pos = Render.GetMenuPos()
    local menu_sz = Render.GetMenuSize()
  
    function force_update()    image_size = Vector2.new(menu_sz.x * 3, menu_sz.y * 3)    end
    if menu_sz.x ~= cache_size.x then force_update() size_changed = true end
    if size_changed == true and cache_size.x == menu_sz.x then force_update() end
    if not Cheat.IsMenuVisible() then return end
  
    if ui.misc.menu_dim:Get() then
        Render.BoxFilled(Vector2.new(0.0, 0.0), Vector2.new(EngineClient.GetScreenSize().x, EngineClient.GetScreenSize().y), Color.new(0, 0, 0, ui.misc.dim_slider:GetFloat()))
    end

    if ui.misc.menu_blur:Get() then

        Render.Blur(Vector2.new(0.0, 0.0), Vector2.new(EngineClient.GetScreenSize().x, EngineClient.GetScreenSize().y), Color.new(1, 1, 1, ui.misc.blur_slider:GetFloat()))
    end
  
    if ui.misc.menu_glow:Get() then
        local alpha = 0
        if ui.misc.glow_pulse:Get() then
                alpha = breath(2, ui.misc.color_edit:GetColor().a * 175 / 235)
            else
                alpha = ui.misc.color_edit:GetColor().a
        end

        Render.Image(globals.background, Vector2.new(menu_pos.x - menu_sz.x, menu_pos.y - menu_sz.y), image_size, Color.new(ui.misc.color_edit:GetColor().r, ui.misc.color_edit:GetColor().g, ui.misc.color_edit:GetColor().b, alpha ))
    end
end

visuals.events = function(event)

    local name = event:GetName()
    if name == "player_hurt" then
        local attacker = event:GetInt("attacker")

        if EntityList.GetPlayerForUserID(attacker) == globals.local_player then
      
            if ui.visuals.widgets:Get(6) and ui.visuals.log_type:Get(1) then
                local player = EntityList.GetPlayerForUserID(event:GetInt("userid"))

                if not player then
                    return
                end

                local hitgroup_names = {
                    [0] = "generic",
                    [1] = "head",
                    [2] = "chest",
                    [3] = "stomach",
                    [4] = "left arm",
                    [5] = "right arm",
                    [6] = "left leg",
                    [7] = "right leg",
                    [10] = "gear"
                }

                logs:add(string.format("Hit %s in the %s for %d damage (%d health remaining)", player:GetName(), hitgroup_names[event:GetInt("hitgroup")] or "?", event:GetInt("dmg_health"), event:GetInt("health")))
            end
        end
    end

    if name == "bullet_impact" then
        local fire_plr = EntityList.GetPlayerForUserID(event:GetInt("userid"))
        local localplayer = EntityList.GetLocalPlayer()
            if fire_plr ~= localplayer then
                return
            end
         table.insert(t, {
            x = event:GetInt("x"),
            y = event:GetInt("y"),
            z = event:GetInt("z"),
            a = 255,
            ctime = GlobalVars.curtime,
         })
    end

    if name == 'player_connect_full' then
        t = {}
    end

    if name == "player_hurt" then
        local localplayer = EntityList.GetLocalPlayer()
        local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker"))
        if ui.misc.hitsound:Get() and ui.misc.misc_enable:Get() then
            if attacker == localplayer then
                EngineClient.ExecuteClientCmd(string.format("playvol %s %s", ui.misc.hitsound_direction:Get(), ui.misc.hitsound_volume:Get()))
            end
        end
    end

    if name == 'player_hurt' then
        local weapon = event:GetString('weapon', '');
        if (weapon == 'hegrenade' or weapon == 'inferno' or weapon == 'knife') then
            if event:GetInt('userid') == nil then return end
            if event:GetInt('attacker') == nil then return end
            local attacker_id = EntityList.GetPlayerForUserID(event:GetInt('attacker'))
            if attacker_id == nil or attacker_id ~= EntityList.GetLocalPlayer() then
                return
            end
          
            local hittype = 'Hit'
            if weapon == 'hegrenade' then
                hittype = 'Naded';
            elseif weapon == 'inferno' then
                hittype = 'Burned';
            elseif weapon == 'knife' then
                hittype = 'Knifed';
            end
            local server_damage = event:GetInt('dmg_health')
            local target_id = EntityList.GetPlayerForUserID(event:GetInt('userid'))
            if target_id == nil then return end
            local target_name = string.lower(target_id:GetName())
            local health = target_id:GetProp('m_iHealth')-server_damage
            if health < 0 then health = 0 end
            text = string.format('%s %s for %i damage (%i remaining)', hittype, target_name, server_damage, health)
            if ui.visuals.log_type:Get(3) then
                ffi_functions.color_print1(Color.RGBA(255, 162, 163, 255), '[psycho] ')
                ffi_functions.color_print1(Color.RGBA(216, 216, 216, 255), text..'\n')

                table.insert(hitlogs, {text = text, time = GlobalVars.realtime})

            end
        end
    end

end
local hitgroup_names1 = { 'generic', 'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' }

visuals.ragebot_shot = function(shot)
    miss_hitbox = missgroup_names[shot.hitgroup] or '?'
end

visuals.registered_shot = function(shot)

    hit_id = hit_id + 1
    shot_id = num_format((hit_id % 15) + 1)
    local safety = Menu.FindVar('Aimbot', 'Ragebot', 'Misc', 'Safe Points'):Get()
    local name = string.lower(EntityList.GetClientEntity(shot.target_index):GetPlayer():GetName())
    if name == nil then return end
    local hgroup = hitgroup_names1[shot.hitgroup + 1] or '?'
    local hit_chance = tostring(math.floor(shot.hitchance + 0.5))
    local backtrack = shot.backtrack
    local m_iHealth = EntityList.GetClientEntity(shot.target_index):GetPlayer():GetProp('m_iHealth')
    if m_iHealth == nil then return end
    local health = m_iHealth - shot.damage
    if health < 0 then health = 0 end
    local aimed_hgroup = hitgroup_names1[shot.wanted_hitgroup + 1] or '?'
  
    local feet_yaw = math.min(58, math.max(yaw_normalize(EntityList.GetClientEntity(shot.target_index):GetPlayer():GetProp('m_flPoseParameter')[12] * 120 - 60), -58))
    if EntityList.GetClientEntity(shot.target_index):GetPlayer():GetProp('m_flPoseParameter') == nil then return end
    if feet_yaw == nil then return end
    local ping = EngineClient.GetNetChannelInfo():GetLatency(0)*1000
    local avg_ping = EngineClient.GetNetChannelInfo():GetAvgLatency(0)*1000
    --if shot.reason == nil or hit_id == nil or aimed_hgroup == nil or shot_id == nil or feet_yaw == nil or safety == nil or name == nil or hit_chance == nil or ping == nil or avg_ping == nil then return end
    local netChannelInfo = ffi.cast('void***', getNetChannelInfo(I_EngineClientPtr)) or error('netchaninfo is nil')
    local netChannel = GetNetChannel(netChannelInfo)
    local net_state = string.format(
        'delay: %d:%.2f | dropped: %.0f',
        avg_ping, math.abs(avg_ping-ping), (netChannel.AvgLoss*100)
    )
  
    local uflags = {
        math.abs(avg_ping-ping) < 1 and 0 or 1,
        CVar.FindVar('cl_clock_correction'):GetInt() == 1 and 0 or 1,
        CVar.FindVar('cl_clock_correction_force_server_tick') == 999 and 0 or 1
    }

    local pflags = {
        ClientState.m_choked_commands > 1 and 1 or 0,
        EntityList.GetLocalPlayer():GetProp('m_flVelocityModifier') < 1.00 and 1 or 0,
        (EntityList.GetLocalPlayer():GetRenderOrigin().z <= EntityList.GetClientEntity(shot.target_index):GetPlayer():GetRenderOrigin().z) and 1 or 0
    }

    local correction = Menu.FindVar('Aimbot', 'Ragebot', 'Main', 'Override Resolver'):GetBool()
  
    if shot.reason == 0 then
        text = string.format('Registered %s shot in %s\'s %s for %d damage [angle: %.2f° | %d:%d°] ( hitchance: %s%% | safety: %s | history(Δ): %d | flags: %s%s )',
        shot_id, name, hgroup, shot.damage, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, hit_chance, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags), visuals._verification(shot))
        textc = string.format('Registered %s shot in %s\'s %s for %d damage [angle: %.2f° | %d:%d°] ( hitchance: %s | safety: %s | history(Δ): %d | flags: %s%s )',
        shot_id, name, hgroup, shot.damage, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, hit_chance .. '%%', safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags), visuals._verification(shot))
    elseif shot.reason == 1 then
        shot_reason = (shot.reason == 1 and total_hits ~= EntityList.GetLocalPlayer():GetProp('m_totalHitsOnServer')) and 'damage rejection' or string.format('unknown [angle: %.2f° | %d:%d°]', shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw)
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to %s ( dmg: %d | safety: %d | history(Δ): %d | flags: %s )',
        shot_id, name, miss_hitbox, hit_chance, shot_reason, shot.wanted_damage, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags))
    elseif shot.reason == 2 then
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to spread [angle: %.2f° | %d:%d°] ( dmg: %d | safety: %d | history(Δ): %d | flags: %s )',
        shot_id, name, miss_hitbox, hit_chance, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, shot.wanted_damage, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags))
    elseif shot.reason == 3 then
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to occlusion [angle: %.2f° | %d:%d°] ( dmg: %d | safety: %d | history(Δ): %d | flags: %s )',
        shot_id, name, miss_hitbox, hit_chance, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, shot.wanted_damage, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags))
    elseif shot.reason == 4 then
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to prediction error [%s] [vel_modifier: %.1f | history(Δ): %d | error: %s]',
        shot_id, name, miss_hitbox, hit_chance, net_state, EntityList.GetLocalPlayer():GetProp('m_flVelocityModifier'), backtrack, table.concat(uflags))
    end
    if ui.visuals.log_type:Get(3) then

        if shot.reason == 0 then
            ffi_functions.color_print1(Color.RGBA(255, 162, 163, 255), '[psycho] ')
            ffi_functions.color_print1(Color.RGBA(216, 216, 216, 255), textc..'\n')
        else
            ffi_functions.color_print1(Color.RGBA(255, 162, 163, 255), '[psycho] ')
            ffi_functions.color_print1(Color.RGBA(216, 216, 216, 200), text1..'\n')
        end

        table.insert(hitlogs, {text = text, time = GlobalVars.realtime})
    end

end

-- @endregion

-- @region: world
local world = {}
world.sun_set = function()
    if not ui.world.world_enable:GetBool() then return end
    local CCascadeLights = EntityList.GetEntitiesByName('CCascadeLight')
    if not CCascadeLights == nil then return end
    for i=1, #CCascadeLights do
        local CCascadeLight = CCascadeLights[i]
        if ui.world.sunset:GetBool() then
            if CCascadeLight:GetProp('m_shadowDirection') ~= Vector.new(ui.world.shadow_x:Get(), ui.world.shadow_y:Get(), ui.world.shadow_z:Get()) then
                CCascadeLight:SetProp('m_shadowDirection', Vector.new(ui.world.shadow_x:Get(), ui.world.shadow_y:Get(), ui.world.shadow_z:Get()))
                CCascadeLight:SetProp('m_envLightShadowDirection', Vector.new(ui.world.shadow_x:Get(), ui.world.shadow_y:Get(), ui.world.shadow_z:Get()))
            end
            if CCascadeLight:GetProp('m_flMaxShadowDist') ~= ui.world.shadow_dist:Get() then
                CCascadeLight:SetProp('m_flMaxShadowDist', ui.world.shadow_dist:Get())
            end
        else
            if CCascadeLight:GetProp('m_shadowDirection') ~= Vector.new(0, 0, 0) then
                CCascadeLight:SetProp('m_shadowDirection', Vector.new(0, 0, 0))
                CCascadeLight:SetProp('m_envLightShadowDirection', Vector.new(0, 0, 0))
            end
        end
    end
end

local materials = {
    "particle/fire_burning_character/fire_env_fire_depthblend_oriented", "particle/fire_burning_character/fire_burning_character", "particle/fire_explosion_1/fire_explosion_1_oriented", "particle/fire_explosion_1/fire_explosion_1_bright", "particle/fire_burning_character/fire_burning_character_depthblend", "particle/fire_burning_character/fire_env_fire_depthblend",
}

world.molotov = function()
    for _, v in pairs(materials) do
        local material = MatSystem.FindMaterial(v, "")

        if material ~= nil then
            material:SetMaterialVarFlag(bit.lshift(1, 28), ui.world.molly_conditions:Get(1) and ui.world.world_enable:GetBool())
            material:SetMaterialVarFlag(bit.lshift(1, 15), ui.world.molly_conditions:Get(2) and ui.world.world_enable:GetBool())
        end
    end

end

-- effects
world.effects = function()
    if not ui.world.enable_bloom:Get() and ui.world.world_enable:Get() then return end
    if not EntityList.GetLocalPlayer() then
        return
    end

        local ambient = CVar.FindVar('r_modelAmbientMin')

        local CETC = EntityList.GetEntitiesByName('CEnvTonemapController')

        for idx, entity in pairs(CETC) do
            entity:SetProp('m_bUseCustomAutoExposureMin', true)
            entity:SetProp('m_bUseCustomAutoExposureMax', true)
            entity:SetProp('m_bUseCustomBloomScale', true)
            entity:SetProp('m_flCustomAutoExposureMin', ui.world.exposure:GetFloat() / 10);
            entity:SetProp('m_flCustomAutoExposureMax', ui.world.exposure:GetFloat() / 10);
            entity:SetProp('m_flCustomBloomScale', ui.world.bloom:GetFloat() / 10);
        end

        ambient:SetFloat(ui.world.model_ambient:GetFloat() / 10)

end

world.custom_skybox = function()
    if ui.world.custom_skybox:GetBool() and ui.world.world_enable:GetBool() then
        skybox_color = ui.world.custom_skybox:GetColor()
        skyboxname = ui.world.skybox_choose:GetString()
        cvar = CVar.FindVar("sv_skyname")
        ui.refs.skybox:SetInt(0)
        ui.refs.skybox:SetColor(skybox_color)
        cvar:SetString(skyboxname)
    else
        return 
    end
end
-- @endregion

logs = {
    logs = {},
    draw = function(self)
        local draw_offset = 50

        for _, log in pairs(self.logs) do
            local expired = log.expire_time < GlobalVars.realtime

            if expired then
                log.alpha = helpers:lerp(log.alpha, 0)
                log.pos = helpers:lerp(log.pos, 0)
            else
                log.alpha = helpers:lerp(log.alpha, 1)
                log.pos = helpers:lerp(log.pos, draw_offset)
                draw_offset = draw_offset + 30
            end

            if log.alpha < 0.01 and expired then
                table.remove(self.logs, _)
            else
                local size = Render.CalcTextSize(log.text, 11, fonts.verdana).x
                local pos = Vector2.new((globals.screen_size.x - size) * 0.5 - 5, globals.screen_size.y - log.pos)
                widgets:create_window(pos, pos + Vector2.new(size + 10, 20), log.alpha)
                Render.Text(log.text, pos + Vector2.new(5, 4), Color.new(1, 1, 1, log.alpha), 11, fonts.verdana)
            end
        end
    end,
    add = function(self, text)
        local log = {
            text = text,
            expire_time = GlobalVars.realtime + 5,
            pos = 0,
            alpha = 0,
        }

        table.insert(self.logs, log)
    end
}

-- @region: config system
ffi_functions.VGUI_System = ffi.cast(ffi.typeof('void***'), Utils.CreateInterface('vgui2.dll', 'VGUI_System010'))
ffi_functions.get_clipboard_text_length = ffi.cast('get_clipboard_text_length', ffi_functions.VGUI_System[0][7])
ffi_functions.get_clipboard_text = ffi.cast('get_clipboard_text', ffi_functions.VGUI_System[0][11])
ffi_functions.set_clipboard_text = ffi.cast('set_clipboard_text', ffi_functions.VGUI_System[0][9])

cfg_system.set_clipboard = function(text)
    ffi_functions.set_clipboard_text(ffi_functions.VGUI_System, text, #text)
end

cfg_system.get_clipboard = function()
    local clipboard_text_length = ffi_functions.get_clipboard_text_length(ffi_functions.VGUI_System)

    if (clipboard_text_length > 0) then
        local buffer = ffi.new('char[?]', clipboard_text_length)

        ffi_functions.get_clipboard_text(ffi_functions.VGUI_System, 0, buffer, clipboard_text_length * ffi.sizeof('char[?]', clipboard_text_length))
        return ffi.string(buffer, clipboard_text_length - 1)
    end

    return ''
end

cfg_system.cfg_data = {
    bools = {
        ui.anti_aims.custom[1].enable, ui.anti_aims.custom[2].enable, ui.anti_aims.custom[3].enable, ui.anti_aims.custom[4].enable, ui.anti_aims.custom[5].enable, ui.anti_aims.custom[6].enable,
        ui.anti_aims.custom[1].freestanding_bodyyaw, ui.anti_aims.custom[2].freestanding_bodyyaw, ui.anti_aims.custom[3].freestanding_bodyyaw, ui.anti_aims.custom[4].freestanding_bodyyaw, ui.anti_aims.custom[5].freestanding_bodyyaw, ui.anti_aims.custom[6].freestanding_bodyyaw,
        ui.anti_aims.custom[1].step_abs, ui.anti_aims.custom[2].step_abs, ui.anti_aims.custom[3].step_abs, ui.anti_aims.custom[4].step_abs, ui.anti_aims.custom[5].step_abs, ui.anti_aims.custom[6].step_abs,
        ui.misc.misc_enable,
        ui.misc.slowwalk_c,
        ui.misc.hitsound,
        ui.world.custom_skybox,
        ui.world.world_enable,
        ui.world.sunset,
        ui.visuals.visuals_enable,
        ui.visuals.disable_blur,
        ui.visuals.disable_background,
        ui.visuals.custom_scope,
        ui.visuals.desync_circle,
        ui.visuals.hitmarker,
        ui.anti_aims.antiaim_enable,
        ui.misc.menu_glow,
        ui.misc.glow_pulse,
        ui.misc.menu_dim,
        ui.misc.menu_blur,
        ui.misc.menu_customize,
        ui.misc.thirdperson,
        ui.ragebot.maxmissed,
        ui.misc.thirdperson_anim,
        ui.world.enable_bloom,
        ui.misc.clantag,
        ui.ragebot.dormant_aimbot,
        ui.ragebot.doubletap_recharge,
        ui.ragebot.override_doubletap,
        ui.ragebot.Teleport_In_Air,
        ui.visuals.gamesense,
        ui.ragebot.bodyaims,
        ui.misc.color_override,
        ui.misc.autopeek,
        ui.misc.quick_peek

    },
    ints = {
        ui.anti_aims.custom[1].yaw_mode, ui.anti_aims.custom[2].yaw_mode, ui.anti_aims.custom[3].yaw_mode, ui.anti_aims.custom[4].yaw_mode, ui.anti_aims.custom[5].yaw_mode, ui.anti_aims.custom[6].yaw_mode,
        ui.anti_aims.custom[1].static_yaw, ui.anti_aims.custom[2].static_yaw, ui.anti_aims.custom[3].static_yaw, ui.anti_aims.custom[4].static_yaw, ui.anti_aims.custom[5].static_yaw, ui.anti_aims.custom[6].static_yaw,
        ui.anti_aims.custom[1].tick_yaw_left, ui.anti_aims.custom[2].tick_yaw_left, ui.anti_aims.custom[3].tick_yaw_left, ui.anti_aims.custom[4].tick_yaw_left, ui.anti_aims.custom[5].tick_yaw_left, ui.anti_aims.custom[6].tick_yaw_left,
        ui.anti_aims.custom[1].tick_yaw_right, ui.anti_aims.custom[2].tick_yaw_right, ui.anti_aims.custom[3].tick_yaw_right, ui.anti_aims.custom[4].tick_yaw_right, ui.anti_aims.custom[5].tick_yaw_right, ui.anti_aims.custom[6].tick_yaw_right,
        ui.anti_aims.custom[1].choke_yaw_left, ui.anti_aims.custom[2].choke_yaw_left, ui.anti_aims.custom[3].choke_yaw_left, ui.anti_aims.custom[4].choke_yaw_left, ui.anti_aims.custom[5].choke_yaw_left, ui.anti_aims.custom[6].choke_yaw_left,
        ui.anti_aims.custom[1].choke_yaw_right, ui.anti_aims.custom[2].choke_yaw_right, ui.anti_aims.custom[3].choke_yaw_right, ui.anti_aims.custom[4].choke_yaw_right, ui.anti_aims.custom[5].choke_yaw_right, ui.anti_aims.custom[6].choke_yaw_right,
        ui.anti_aims.custom[1].desync_yaw_left, ui.anti_aims.custom[2].desync_yaw_left, ui.anti_aims.custom[3].desync_yaw_left, ui.anti_aims.custom[4].desync_yaw_left, ui.anti_aims.custom[5].desync_yaw_left, ui.anti_aims.custom[6].desync_yaw_left,
        ui.anti_aims.custom[1].desync_yaw_right, ui.anti_aims.custom[2].desync_yaw_right, ui.anti_aims.custom[3].desync_yaw_right, ui.anti_aims.custom[4].desync_yaw_right, ui.anti_aims.custom[5].desync_yaw_right, ui.anti_aims.custom[6].desync_yaw_right,
        ui.anti_aims.custom[1].yaw_jitter, ui.anti_aims.custom[2].yaw_jitter, ui.anti_aims.custom[3].yaw_jitter, ui.anti_aims.custom[4].yaw_jitter, ui.anti_aims.custom[5].yaw_jitter, ui.anti_aims.custom[6].yaw_jitter,
        ui.anti_aims.custom[1].yaw_jitter_degree, ui.anti_aims.custom[2].yaw_jitter_degree, ui.anti_aims.custom[3].yaw_jitter_degree, ui.anti_aims.custom[4].yaw_jitter_degree, ui.anti_aims.custom[5].yaw_jitter_degree, ui.anti_aims.custom[6].yaw_jitter_degree,
        ui.anti_aims.custom[1].yaw_jitter_degree, ui.anti_aims.custom[2].yaw_jitter_degree2, ui.anti_aims.custom[3].yaw_jitter_degree2, ui.anti_aims.custom[4].yaw_jitter_degree2, ui.anti_aims.custom[5].yaw_jitter_degree2, ui.anti_aims.custom[6].yaw_jitter_degree2,
    
        ui.anti_aims.custom[1].self_bodyyaw_mode, ui.anti_aims.custom[2].self_bodyyaw_mode, ui.anti_aims.custom[3].self_bodyyaw_mode, ui.anti_aims.custom[4].self_bodyyaw_mode, ui.anti_aims.custom[5].self_bodyyaw_mode, ui.anti_aims.custom[6].self_bodyyaw_mode,
        ui.anti_aims.custom[1].bodyyaw_mode, ui.anti_aims.custom[2].bodyyaw_mode, ui.anti_aims.custom[3].bodyyaw_mode, ui.anti_aims.custom[4].bodyyaw_mode, ui.anti_aims.custom[5].bodyyaw_mode, ui.anti_aims.custom[6].bodyyaw_mode,
        ui.anti_aims.custom[1].bodyyaw_degree, ui.anti_aims.custom[2].bodyyaw_degree, ui.anti_aims.custom[3].bodyyaw_degree, ui.anti_aims.custom[4].bodyyaw_degree, ui.anti_aims.custom[5].bodyyaw_degree, ui.anti_aims.custom[6].bodyyaw_degree,
        ui.anti_aims.custom[1].jitter_bodyyaw_degree_left, ui.anti_aims.custom[2].jitter_bodyyaw_degree_left, ui.anti_aims.custom[3].jitter_bodyyaw_degree_left, ui.anti_aims.custom[4].jitter_bodyyaw_degree_left, ui.anti_aims.custom[5].jitter_bodyyaw_degree_left, ui.anti_aims.custom[6].jitter_bodyyaw_degree_left,
        ui.anti_aims.custom[1].jitter_bodyyaw_degree_right, ui.anti_aims.custom[2].jitter_bodyyaw_degree_right, ui.anti_aims.custom[3].jitter_bodyyaw_degree_right, ui.anti_aims.custom[4].jitter_bodyyaw_degree_right, ui.anti_aims.custom[5].jitter_bodyyaw_degree_right, ui.anti_aims.custom[6].jitter_bodyyaw_degree_right,
        ui.anti_aims.custom[1].step_bodyyaw_degree_left, ui.anti_aims.custom[2].step_bodyyaw_degree_left, ui.anti_aims.custom[3].step_bodyyaw_degree_left, ui.anti_aims.custom[4].step_bodyyaw_degree_left, ui.anti_aims.custom[5].step_bodyyaw_degree_left, ui.anti_aims.custom[6].step_bodyyaw_degree_left,
        ui.anti_aims.custom[1].step_bodyyaw_degree_right, ui.anti_aims.custom[2].step_bodyyaw_degree_right, ui.anti_aims.custom[3].step_bodyyaw_degree_right, ui.anti_aims.custom[4].step_bodyyaw_degree_right, ui.anti_aims.custom[5].step_bodyyaw_degree_right, ui.anti_aims.custom[6].step_bodyyaw_degree_right,
        ui.anti_aims.custom[1].body_yaw_step_ticks, ui.anti_aims.custom[2].body_yaw_step_ticks, ui.anti_aims.custom[3].body_yaw_step_ticks, ui.anti_aims.custom[4].body_yaw_step_ticks, ui.anti_aims.custom[5].body_yaw_step_ticks, ui.anti_aims.custom[6].body_yaw_step_ticks,
        ui.anti_aims.custom[1].body_yaw_step_value, ui.anti_aims.custom[2].body_yaw_step_value, ui.anti_aims.custom[3].body_yaw_step_value, ui.anti_aims.custom[4].body_yaw_step_value, ui.anti_aims.custom[5].body_yaw_step_value, ui.anti_aims.custom[6].body_yaw_step_value,

        ui.anti_aims.custom[1].fake_yaw_mode, ui.anti_aims.custom[2].fake_yaw_mode, ui.anti_aims.custom[3].fake_yaw_mode, ui.anti_aims.custom[4].fake_yaw_mode, ui.anti_aims.custom[5].fake_yaw_mode, ui.anti_aims.custom[6].fake_yaw_mode,
        ui.anti_aims.custom[1].static_fakeyaw, ui.anti_aims.custom[2].static_fakeyaw, ui.anti_aims.custom[3].static_fakeyaw, ui.anti_aims.custom[4].static_fakeyaw, ui.anti_aims.custom[5].static_fakeyaw, ui.anti_aims.custom[6].static_fakeyaw,
        ui.anti_aims.custom[1].jitter_fakeyaw_left, ui.anti_aims.custom[2].jitter_fakeyaw_left, ui.anti_aims.custom[3].jitter_fakeyaw_left, ui.anti_aims.custom[4].jitter_fakeyaw_left, ui.anti_aims.custom[5].jitter_fakeyaw_left, ui.anti_aims.custom[6].jitter_fakeyaw_left,
        ui.anti_aims.custom[1].jitter_fakeyaw_right, ui.anti_aims.custom[2].jitter_fakeyaw_right, ui.anti_aims.custom[3].jitter_fakeyaw_right, ui.anti_aims.custom[4].jitter_fakeyaw_right, ui.anti_aims.custom[5].jitter_fakeyaw_right, ui.anti_aims.custom[6].jitter_fakeyaw_right,
        ui.anti_aims.custom[1].step_ticks, ui.anti_aims.custom[2].step_ticks, ui.anti_aims.custom[3].step_ticks, ui.anti_aims.custom[4].step_ticks, ui.anti_aims.custom[5].step_ticks, ui.anti_aims.custom[6].step_ticks,
        ui.anti_aims.custom[1].step_value, ui.anti_aims.custom[2].step_value, ui.anti_aims.custom[3].step_value, ui.anti_aims.custom[4].step_value, ui.anti_aims.custom[5].step_value, ui.anti_aims.custom[6].step_value,
        ui.anti_aims.custom[1].step_fake_min, ui.anti_aims.custom[2].step_fake_min, ui.anti_aims.custom[3].step_fake_min, ui.anti_aims.custom[4].step_fake_min, ui.anti_aims.custom[5].step_fake_min, ui.anti_aims.custom[6].step_fake_min,
        ui.anti_aims.custom[1].step_fake_max, ui.anti_aims.custom[2].step_fake_max, ui.anti_aims.custom[3].step_fake_max, ui.anti_aims.custom[4].step_fake_max, ui.anti_aims.custom[5].step_fake_max, ui.anti_aims.custom[6].step_fake_max,
        ui.anti_aims.custom[1].extra_options, ui.anti_aims.custom[2].extra_options, ui.anti_aims.custom[3].extra_options, ui.anti_aims.custom[4].extra_options, ui.anti_aims.custom[5].extra_options, ui.anti_aims.custom[6].extra_options,
        ui.misc.slowwalk_slider,
        ui.world.shadow_dist,
        ui.world.molly_conditions,
        ui.visuals.widgets,
        ui.visuals.watermark_info,
        ui.visuals.statepanel_image,
        ui.visuals.log_type,
        ui.visuals.indicator_type,
        ui.visuals.arrows,
        ui.visuals.arrows_x,
        ui.visuals.scope_width,
        ui.visuals.scope_offset,
        ui.visuals.scope_conditions,
        ui.visuals.desync_circle_conditions,
        ui.visuals.hitmarker_length,
      
        ui.anti_aims.antiaim_helpers,
        ui.ragebot.tp_in_air,
        ui.anti_aims.animbreakers,
        ui.misc.thirdperson_distance,
        ui.ragebot.maxmissed_c,
        ui.ragebot.dormant_aimbot_damage,
        ui.ragebot.doubletap_speed,
        ui.visuals.gamesense_choose,
        ui.ragebot.baimhp,
        ui.ragebot.baimmode,
        ui.ragebot.hitchances,
        ui.ragebot.air_hitchance,
        ui.ragebot.noscope_hitchance,

    },

    floats = {
        ui.misc.hitsound_volume,
        ui.world.shadow_x,
        ui.world.shadow_y,
        ui.world.shadow_z,
        ui.misc.blur_slider,
        ui.misc.dim_slider,
        ui.world.exposure,
        ui.world.bloom,
        ui.world.model_ambient,

    },

    strings = {
        ui.misc.hitsound_direction,
        ui.world.skybox_choose,
        ui.visuals.custom_username
    },

    colors = {
        ui.visuals.ghosty_color,
        ui.visuals.ind_name_color,
        ui.visuals.ind_state_color,
        ui.visuals.ind_color,
        ui.visuals.arrows_color,
        ui.visuals.theme,
        ui.world.custom_skybox,
        ui.visuals.custom_scope,
        ui.visuals.desync_circle,
        ui.visuals.hitmarker,
        ui.misc.color_edit,
        ui.misc.color_override,
        ui.misc.autopeek
    }
}

de_en_coding = 'pl3KmT/U1Djka4d7xA9WHXfNvngIbe56PSRFZGLOwrq2Ms8QEytVYhBJoC0i+czu'

cfg_system.encode = function(data)
    return ((data:gsub('.', function(x)
        local r,de_en_coding= '', x:byte()
        for i=8,1,-1 do r=r..(de_en_coding%2^i-de_en_coding%2^(i-1)>0 and '1' or '0') end
        return r;
    end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then return '' end
        local c=0
        for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
        return de_en_coding:sub(c+1,c+1)
    end)..({ '', '==', '=' })[#data%3+1])
end

cfg_system.decode = function(data)
    data = string.gsub(data, '[^'..de_en_coding..'=]', '')
    return (data:gsub('.', function(x)
        if (x == '=') then return '' end
        local r,f='',(de_en_coding:find(x)-1)
        for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end
        return r;
    end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if (#x ~= 8) then return '' end
        local c=0
        for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end
            return string.char(c)
    end))
end
ui.global.export_cfg:RegisterCallback(function()
    local code = {{}, {}, {}, {}, {}}

    for _, bools in pairs(cfg_system.cfg_data.bools) do
        table.insert(code[1], bools:GetBool())
    end

    for _, ints in pairs(cfg_system.cfg_data.ints) do
        table.insert(code[2], ints:GetInt())
    end

    for _, floats in pairs(cfg_system.cfg_data.floats) do
        table.insert(code[3], floats:GetFloat())
    end

    for _, strings in pairs(cfg_system.cfg_data.strings) do
        table.insert(code[4], strings:GetString())
    end

    for _, colors in pairs(cfg_system.cfg_data.colors) do
        local clr = colors:GetColor()
        table.insert(code[5], string.format('%02X%02X%02X%02X', math.floor(clr.r * 255), math.floor(clr.g * 255), math.floor(clr.b * 255), math.floor(clr.a * 255)))
    end
  
    cfg_system.set_clipboard(cfg_system.encode(json.stringify(code)))
    logs:add('Config exported to clipboard.')
end)

cfg_system.config_load = function(text)
    local decode_cfg = json.parse(cfg_system.decode(text))
    if decode_cfg == nil then
        logs:add('Failed to load config.')
    else
        for k, v in pairs(decode_cfg) do
            k = ({[1] = 'bools', [2] = 'ints', [3] = 'floats', [4] = 'strings', [5] = 'colors'})[k]

            for k2, v2 in pairs(v) do
                if (k == 'bools') then
                    cfg_system.cfg_data[k][k2]:SetBool(v2)
                end

                if (k == 'ints') then
                    cfg_system.cfg_data[k][k2]:SetInt(v2)
                end

                if (k == 'floats') then
                    cfg_system.cfg_data[k][k2]:SetFloat(v2)
                end

                if (k == 'strings') then
                    cfg_system.cfg_data[k][k2]:SetString(v2)
                end

                if (k == 'colors') then
                    cfg_system.cfg_data[k][k2]:SetColor(Color.new(tonumber('0x'..v2:sub(1, 2))/255, tonumber('0x'..v2:sub(3, 4))/255, tonumber('0x'..v2:sub(5, 6))/255, tonumber('0x'..v2:sub(7, 8))/255))
                end
            end
        end
      
        logs:add("Applied imported config.")
    end
end
ui.global.import_cfg:RegisterCallback(function()
    cfg_system.config_load(cfg_system.get_clipboard())
end)

ui.global.default_cfg:RegisterCallback(function()
    cfg_system.config_load("5t1y1Fri1FmRdOAtefHM1F1RdOAtefHM1FaRdLnSIU4Gk31Y1FrYbOXGk31h1FrYbOXGk31B1FrYbOXGk31J1FrYbOXGk31o1FrLvfyVn9ERd910eUDhn9ERaWpRdOAtefHM1Fmy1FrLvfyVn9ERaW1RdLnSIU4Gk31yat10nLTMbBHM1FmY1FrLvfyVn9ERaWHRdLnSIU4Gk31y4R10nLTMbBHM1FmJ1FrLvfyVn9ERaWPRdLnSIU4Gk31yd910eUDhn9ERaFpRdLnSIU4Gk31ta910eUDhn9ERaF1RdOAtefHM1F1V1FrYbOXGk31t4310eUDhn9ERaFHRdOAtefHM1F1B1FrLvfyVn9ERaFbRdLnSIU4Gk31td310eUDhn9ERaFZRdOAtefHM1FaE1FrYbOXGk31Va910eUDhn9ERaV1RdOAtefHM1FaV1FrYbOXGk31V4310eUDhn9ERaVHRdLnSIU4Gk31V4R10eUDhn9ERaVbRdOAtefHM1Fao1FrYbOXGk31Vd910eUDhn9ER4KpRdLnSIU4Gk31Ya910eUDhn9ER4K1RdOAtefHM1FxV1FrLvfyVn9ER4KxRdOAtefHM1Fxh1FrYbOXGk31Y4R10eUDhnNYM1F1RdOMRa910a9ERaR10aRERat10a3ER4310a3ER4910a9ER4R10aRER4t10a3ERd310a3ERd910a3ERaWpRdFpM1Fmy1Fwoa3ERaW1RdFpM1FmV1FwsaRERaWxRdFpM1Fmh1FwEk31y4R10a3ERaWbRdRYtk31yd310a3ERaWZRdF1M1F1E1FwEk31ta910a3ERaF1RdFpM1F1V1Fwtk31t4310a3ERaFHRdFpM1F1B1FwsaRERaFbRdFpM1F1o1FwEk31td910a3ERaVpRdRYtk31Va910a3ERaV1RdF1M1FaV1FwEk31V4310a3ERaVHRdFpM1FaB1Fwtk31V4t10a3ERaVPRdFpM1FaC1FwEk31Ya310a3ER4KmRdFpM1Fxt1FwEk31Yat10a3ER4KxRdFpM1Fxh1FwEk31Y4R10a3ER4KbRdFpM1Fxo1FwEk31Yd910a9ER4WpRdFmM1FHy1Fwyk31haR10a9ER4WaRdFmM1FHY1Fwyk31h49104FvM1FHB1FwJa9ER4WbRdFbJk31hd310aW1M1FHC1FwBa9ER4FpRdFvtk31Ba9104FvM1Fvt1FwJatER4FaRdFPyk31B4310a3ER4FHRdFvhk31B4R104FbM1FvJ1Fwtk31Bd310aRER4FZRdF1M1FbE1FwVk31Ja910aRER4V1RdF1M1FbV1Fwtk31J4310aRER4VHRdFpM1FbB1FwEk31J4t10a9ER4VPRdF1M1FbC1Fwhd3ERdKpRdFHok31oa9104FpM1FPt1FwBa3ERdKaRdFHok31o43104WPM1FPh1FwVa3ERdKvRdFaEk31o4t10aVpM1FPo1FwVa3ERdKZRdFHtk31Ca310aVpM1FZy1FwVa3ERdW1RdFaEk31Cat10aVpM1FZY1FwVa3ERdWHRdFvEk31C4R10aVpM1FZJ1FwYk31Cd31049ERdWZRdFPM1FmEa310d3ERaWpy1Fwok31yaK1RdFxM1FmEat10aRERaWpY1Fwtk31yaKHRdFHM1FmE4R1049ERaWpJ1Fwhk31yaKPRdFmM1FmEd9104WpM1Fmya3104WpM1Fmya9104WPM1FmyaR104WPM1Fmyat104WPM1Fmy43104WpM1Fmy49104FpM1Fmy4R104FpM1Fmy4t104WPM1Fmyd3104WPM1Fmyd9104WPM1Fmta3104FpM1Fmta910a3ERaW1t1FwEk31yaFaRdFpM1Fmt4310a3ERaW1h1FwEk31yaFvRdFpM1Fmt4t104WpM1Fmtd310aWpEa3ERaW1C1FwVk31yaVpRdFvVk31yaVmRdF1Ck31yaV1RdFaM1FmVat1049ERaWaY1Fwyk31yaVHRdF1M1FmV4R10a3ERaWaJ1Fwod9ERaWao1FwtaRERaWaC1Fwy43ERaWxE1Fwtk31y4KmRdFvM1FmYaR10aWmM1FmYat1043ERaWxY1FwJk31y4KHRdFvhk31y4KvRdF1M1FmY4t10a9ERaWxo1Fwy4tERaWxC1FwtaKxJ69ERat105t1y1Fwyk31t1FwBa3ERat104FpM1FxRdFmEa3ER4910a9ER4R10a3oVaKpEaKpEaWmCaFpCaFPC4RER4t10a3ERd310a3ERd910aUYM1FxRdOMRa9101O4EvND2I/H8eBTB1RERaR101G4Evf4GAfCOgfCGkYCGvOXMvX+E431M1FaRdRDEgfCO5LXYn9Dck31h1Fri1FmRdRD3xHmYAZnKd31M1F1RdRD/AZn/AZn/AR1M1FaRdRD/AZn/AZn/AR1M1FxRdRD/AZn/AZn/AR1M1FHRdRD3xFG3AZnKd31M1FvRdRD34KS3AZvEa31M1FbRdRD/AZnTAZX/AR1M1FPRdRD3AWG3AZnKd31M1FZRdRDlaVZyAZn/AR1M1FmE1FwRdWPJAZHoxVPRk31ya9101FPB4ZD/AFxY1Ohc")
end)
-- @endregion

function ui_set_visible(vis, bool)
    vis:SetVisible(bool)
end

local function ui_callbacks()
    --ragebot
    ui.ragebot.maxmissed:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.maxmissed_c:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.maxmissed:GetBool())
    ui.ragebot.dormant_aimbot:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.dormant_aimbot_damage:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.dormant_aimbot:GetBool())
    ui.ragebot.override_doubletap:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.doubletap_speed:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.override_doubletap:GetBool())
    ui.ragebot.doubletap_recharge:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.override_doubletap:GetBool())
    ui.ragebot.Teleport_In_Air:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.tp_in_air:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.Teleport_In_Air:Get())
    ui.ragebot.bodyaims:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.baimmode:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.bodyaims:Get())
    ui.ragebot.baimhp:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.bodyaims:Get())
    ui.ragebot.hitchances:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.air_hitchance:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.hitchances:Get(1))
    ui.ragebot.noscope_hitchance:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.hitchances:Get(2))


    --widgets
    ui.visuals.widgets:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.watermark_info:SetVisible(ui.visuals.widgets:Get(3) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.statepanel_image:SetVisible(ui.visuals.widgets:Get(4) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.custom_username:SetVisible(ui.visuals.watermark_info:Get(1) and ui.visuals.widgets:Get(3) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.theme:SetVisible(ui.visuals.visuals_enable:GetBool() and (ui.visuals.widgets:Get(1) or ui.visuals.widgets:Get(2) or ui.visuals.widgets:Get(3) or ui.visuals.widgets:Get(4) or ui.visuals.widgets:Get(6)))
    ui.visuals.disable_blur:SetVisible(ui.visuals.visuals_enable:GetBool() and (ui.visuals.widgets:Get(1) or ui.visuals.widgets:Get(2) or ui.visuals.widgets:Get(3) or ui.visuals.widgets:Get(4) or ui.visuals.widgets:Get(6)))
    ui.visuals.disable_background:SetVisible(ui.visuals.visuals_enable:GetBool() and ui.visuals.widgets:Get(5))
    ui.visuals.indicator_type:SetVisible(ui.visuals.visuals_enable:GetBool() and ui.visuals.widgets:Get(5))
    ui.visuals.arrows:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.arrows_x:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.arrows:Get() ~= 0 and ui.visuals.visuals_enable:GetBool())
    ui.visuals.arrows_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.arrows:Get() ~= 0 and ui.visuals.visuals_enable:GetBool())
    ui.visuals.ghosty_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 1)
    ui.visuals.ind_name_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 0)
    ui.visuals.ind_state_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 0)
    ui.visuals.ind_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 0)

    --visuals micellaneous
    ui.visuals.custom_scope:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.scope_width:SetVisible(ui.visuals.custom_scope:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.scope_offset:SetVisible(ui.visuals.custom_scope:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.scope_conditions:SetVisible(ui.visuals.custom_scope:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.desync_circle:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.desync_circle_conditions:SetVisible(ui.visuals.desync_circle:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.hitmarker:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.hitmarker_length:SetVisible(ui.visuals.hitmarker:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.log_type:SetVisible(ui.visuals.visuals_enable:GetBool() and ui.visuals.widgets:Get(6))
    ui.visuals.gamesense:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.gamesense_choose:SetVisible(ui.visuals.gamesense:GetBool() and ui.visuals.visuals_enable:GetBool())
    -- world
    ui.world.sunset:SetVisible(ui.world.world_enable:GetBool())
    ui.world.shadow_x:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.shadow_y:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.shadow_z:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.shadow_dist:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.molly_conditions:SetVisible(ui.world.world_enable:GetBool())
    ui.world.custom_skybox:SetVisible(ui.world.world_enable:GetBool())
    ui.world.skybox_choose:SetVisible(ui.world.world_enable:GetBool() and ui.world.custom_skybox:GetBool())
    ui.world.enable_bloom:SetVisible(ui.world.world_enable:GetBool())
    ui.world.model_ambient:SetVisible(ui.world.enable_bloom:GetBool() and ui.world.world_enable:GetBool())
    ui.world.bloom:SetVisible(ui.world.enable_bloom:GetBool() and ui.world.world_enable:GetBool())
    ui.world.exposure:SetVisible(ui.world.enable_bloom:GetBool() and ui.world.world_enable:GetBool())

    --antiaim
    ui.anti_aims.antiaim_helpers:SetVisible(ui.anti_aims.antiaim_enable:GetBool())
    ui.anti_aims.animbreakers:SetVisible(ui.anti_aims.antiaim_enable:GetBool() and ui.anti_aims.antiaim_helpers:Get(2))

    --misc
    ui.misc.slowwalk_c:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.slowwalk_slider:SetVisible(ui.misc.slowwalk_c:GetBool() and ui.misc.misc_enable:GetBool())
    ui.misc.hitsound:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.hitsound_direction:SetVisible(ui.misc.hitsound:GetBool() and ui.misc.misc_enable:GetBool())
    ui.misc.hitsound_volume:SetVisible(ui.misc.hitsound:GetBool() and ui.misc.misc_enable:GetBool())
    ui.misc.thirdperson:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.thirdperson_distance:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.thirdperson:GetBool())
    ui.misc.thirdperson_anim:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.thirdperson:GetBool())
    ui.misc.clantag:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.autopeek:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.color_override:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.autopeek:GetBool())
    ui.misc.quick_peek:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.autopeek:GetBool())

    --main
    ui.misc.menu_glow:SetVisible(ui.misc.menu_customize:Get())
    ui.misc.glow_pulse:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_glow:Get())
    ui.misc.color_edit:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_glow:Get())
    ui.misc.menu_dim:SetVisible(ui.misc.menu_customize:Get())
    ui.misc.dim_slider:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_dim:Get())
    ui.misc.menu_blur:SetVisible(ui.misc.menu_customize:Get())
    ui.misc.blur_slider:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_blur:Get())

    --aa buider
  
    local m = ui.anti_aims
    for i = 1,#_state do
        local selects = ui.anti_aims.states_selection:Get()+1
        local cswitch = m.custom[i].enable:Get()
        local show = selects == i and cswitch and ui.anti_aims.antiaim_enable:GetBool()
        ui.anti_aims.states_selection:SetVisible(ui.anti_aims.antiaim_enable:GetBool())
        m.custom[i].enable:SetVisible(selects == i and ui.anti_aims.antiaim_enable:GetBool())
        m.custom[i].extra_options:SetVisible(show)
        ui_set_visible(m.custom[i].yaw_mode,show)
        ---- {"Static","Period jitter \aC08A8AFF[Tick]","Period jitter \aC08A8AFF[Choke]","Period jitter \aC08A8AFF[Desync]"}
        ui_set_visible(m.custom[i].static_yaw,show and m.custom[i].yaw_mode:Get() == 0)
        ui_set_visible(m.custom[i].tick_yaw_left,show and m.custom[i].yaw_mode:Get() == 1)
        ui_set_visible(m.custom[i].tick_yaw_right,show and m.custom[i].yaw_mode:Get() == 1)
        ui_set_visible(m.custom[i].choke_yaw_left,show and m.custom[i].yaw_mode:Get() == 2)
        ui_set_visible(m.custom[i].choke_yaw_right,show and m.custom[i].yaw_mode:Get() == 2)
        ui_set_visible(m.custom[i].desync_yaw_left,show and m.custom[i].yaw_mode:Get() == 3)
        ui_set_visible(m.custom[i].desync_yaw_right,show and m.custom[i].yaw_mode:Get() == 3)
        ui_set_visible(m.custom[i].yaw_jitter,show)
        ui_set_visible(m.custom[i].yaw_jitter_mode,show and m.custom[i].yaw_jitter:Get() ~= 0)
        ui_set_visible(m.custom[i].yaw_jitter_degree,show and m.custom[i].yaw_jitter:Get() ~= 0)
        ui_set_visible(m.custom[i].yaw_jitter_degree2,show and m.custom[i].yaw_jitter:Get() ~= 0 and m.custom[i].yaw_jitter_mode:Get() == 1)

        ui_set_visible(m.custom[i].self_bodyyaw_mode,show)
        ui_set_visible(m.custom[i].bodyyaw_mode,show and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)   
        ui_set_visible(m.custom[i].bodyyaw_degree,show and m.custom[i].bodyyaw_mode:Get() == 1 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1 )
        ui_set_visible(m.custom[i].jitter_bodyyaw_degree_left,show and m.custom[i].bodyyaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].jitter_bodyyaw_degree_right,show and m.custom[i].bodyyaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].step_bodyyaw_degree_left,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].step_bodyyaw_degree_right,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].body_yaw_step_ticks,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].body_yaw_step_value,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)

        ui_set_visible(m.custom[i].fake_yaw_mode,show and m.custom[i].self_bodyyaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].static_fakeyaw,show and m.custom[i].fake_yaw_mode:Get() == 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].jitter_fakeyaw_left,show and m.custom[i].fake_yaw_mode:Get() == 1 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].jitter_fakeyaw_right,show and m.custom[i].fake_yaw_mode:Get() == 1 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].step_ticks,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].step_value,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].step_ticks,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
--
        ui_set_visible(m.custom[i].step_abs,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].step_fake_min,show  and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].step_fake_max,show  and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].freestanding_bodyyaw,show and m.custom[i].self_bodyyaw_mode:Get() ~= 0)
    end

end
local time_to_ticks = function(t) return math.floor(0.5 + (t / GlobalVars.interval_per_tick)) end
local callbacks = {

    on_draw = function()
        if Cheat.IsMenuVisible() then
            ui_callbacks()
        end

        globals.local_player = EntityList.GetLocalPlayer()

        visuals.glowmenu()
      
        misc.clantag()
        autopeek:paint_function()
      if ui.visuals.visuals_enable:Get() then
        widgets.lua_panel:draw()
        widgets.indicators:draw()
        widgets.watermark:draw()
        widgets.keybinds:draw()
        widgets.spectators:draw()
        widgets.gamesense:draw()
        visuals.scope()
        visuals.hitmarker()
        visuals.circle_desync()
        logs:draw()

        local x, y = 5, 5
        if(ui.visuals.log_type:Get(2)) then
            for i, hitlog in ipairs(hitlogs) do
                    Render.Text(hitlog.text, Vector2.new(x+1, y+1), Color.RGBA(0, 0, 0, math.floor((hitlog.time + 10 - GlobalVars.realtime)*500)-105), 10, fonts.lucida_console)
                    Render.Text(hitlog.text, Vector2.new(x, y), Color.RGBA(255, 255, 255, math.floor((hitlog.time + 10 - GlobalVars.realtime)*500)), 10, fonts.lucida_console)
                y = y + 15
                if #hitlogs > 15 then table.remove(hitlogs,1) end
                if hitlog.time + 10 < GlobalVars.realtime then table.remove(hitlogs, i) end
            end
        end
      end

        world.sun_set()
        world.molotov()
        world.custom_skybox()
        world.effects()
        visuals.thirdperson()
    end,

    on_player_connect_full = function()
        t = {}
    end,

    on_prediction = function(cmd)
        anti_aims.avoid_backstab()
        anti_aims.exploit_teleport()
        anti_aims.disable_aa_warmup()
        rage.ragebot(cmd)
        anti_aims.antiaim_helpers()
        AntiAim.run_custom(cmd)
        anti_aims.edge_yaw()
        misc.slowwalk(cmd)
        rage.on_prediction()
        rage.dormant_aim(cmd)
        autopeek:autopeek_main(cmd)
    end,

    on_createmove = function(cmd)
        rage.baim()
    end,

    on_ragebot_shot = function(shot)
        if EntityList.GetLocalPlayer() == nil then return end
        total_hits = EntityList.GetLocalPlayer():GetProp('m_totalHitsOnServer')
        if total_hits == nil then return end
        miss_hitbox = missgroup_names[shot.hitgroup] or '?'
        self_choke = ClientState.m_choked_commands
        choke = time_to_ticks(GlobalVars.curtime - EntityList.GetClientEntity(shot.index):GetPlayer():GetProp('m_flSimulationTime')) + 1;
        if choke < 0 then
            choke = 0
        elseif choke > 14 then
            choke = 14
        end
        visuals.ragebot_shot(shot)
        autopeek.ragebot_shot(shot)
    end,

    on_pre_prediction = function(cmd)
        rage.hitchances()
    end,

    registered_shot = function(shot)
        rage.on_registered_shot(shot)
        visuals.registered_shot(shot)

        if ui.visuals.widgets:Get(6) and ui.visuals.log_type:Get(2) and shot.reason ~= 0 then
            local name = EntityList.GetPlayer(shot.target_index):GetName()
            local hitgroup_names = {
                [0] = "generic",
                [1] = "head",
                [2] = "chest",
                [3] = "stomach",
                [4] = "left arm",
                [5] = "right arm",
                [6] = "left leg",
                [7] = "right leg",
                [10] = "gear"
            }
            local miss_reasons = {"animation desync", "spread", "occlusion", "prediction error"}
            logs:add(string.format("Missed %s's %s due to %s", name, hitgroup_names[shot.wanted_hitgroup], miss_reasons[shot.reason]))
        end

    end,

    on_events = function(event)
        rage.reset_data(event)
        rage.resetter(event)
        visuals.events(event)
        indicators.bomb(event)
    end,
}

Cheat.RegisterCallback("draw", callbacks.on_draw)
Cheat.RegisterCallback("prediction", callbacks.on_prediction)
Cheat.RegisterCallback("createmove", callbacks.on_createmove)
Cheat.RegisterCallback("pre_prediction", callbacks.on_pre_prediction)
Cheat.RegisterCallback("registered_shot", callbacks.registered_shot)
Cheat.RegisterCallback("ragebot_shot", callbacks.on_ragebot_shot)
Cheat.RegisterCallback("events", callbacks.on_events)
logs:add("Welcome to psycho, " ..globals.username)
Ещё один
 
Забаненный
Статус
Оффлайн
Регистрация
4 Авг 2022
Сообщения
101
Реакции[?]
47
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
31 Дек 2018
Сообщения
442
Реакции[?]
212
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
4 Авг 2022
Сообщения
101
Реакции[?]
47
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ну и что тебе тут не понравилось
ну во первых "Ragebot", "Helpers", "Baim if Enemy hp <" , думаю очевидно, что поставив например значение 91, чит не будет стрелять на большой дистанции ввиду того, что такой дамаг выбить нельзя

local math_lua = { dist_to = function
зачем несколько раз прописывать одно и то же, если в самом чите в апи уже есть все нужное
 
Эксперт
Статус
Оффлайн
Регистрация
24 Апр 2018
Сообщения
1,488
Реакции[?]
928
Поинты[?]
67K
ну во первых "Ragebot", "Helpers", "Baim if Enemy hp <" , думаю очевидно, что поставив например значение 91, чит не будет стрелять на большой дистанции ввиду того, что такой дамаг выбить нельзя

local math_lua = { dist_to = function
зачем несколько раз прописывать одно и то же, если в самом чите в апи уже есть все нужное
хорошо, а теперь посмотри кого я цитировал
 
Забаненный
Статус
Оффлайн
Регистрация
4 Авг 2022
Сообщения
101
Реакции[?]
47
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
9 Авг 2022
Сообщения
6
Реакции[?]
0
Поинты[?]
0
Credits: Hellfish#9343
смертрет
code_language.lua:
EngineClient.ExecuteClientCmd("clear")

--██╗░░██╗███████╗██╗░░░░░██╗░░░░░███████╗██╗░██████╗██╗░░██╗░░░██╗░██╗░░█████╗░██████╗░░░██╗██╗██████╗░
--██║░░██║██╔════╝██║░░░░░██║░░░░░██╔════╝██║██╔════╝██║░░██║██████████╗██╔══██╗╚════██╗░██╔╝██║╚════██╗
--███████║█████╗░░██║░░░░░██║░░░░░█████╗░░██║╚█████╗░███████║╚═██╔═██╔═╝╚██████║░█████╔╝██╔╝░██║░█████╔╝
--██╔══██║██╔══╝░░██║░░░░░██║░░░░░██╔══╝░░██║░╚═══██╗██╔══██║██████████╗░╚═══██║░╚═══██╗███████║░╚═══██╗
--██║░░██║███████╗███████╗███████╗██║░░░░░██║██████╔╝██║░░██║╚██╔═██╔══╝░█████╔╝██████╔╝╚════██║██████╔╝
--╚═╝░░╚═╝╚══════╝╚══════╝╚══════╝╚═╝░░░░░╚═╝╚═════╝░╚═╝░░╚═╝░╚═╝░╚═╝░░░░╚════╝░╚═════╝░░░░░░╚═╝╚═════╝░

ffi.cdef[[
    typedef struct
    {
        uint8_t r;
        uint8_t g;
        uint8_t b;
        uint8_t a;
    } uint_colors_t;


    typedef void*(__thiscall* c_entity_list_get_client_entity_t)(void*, int);
    typedef void (__cdecl* console_color_print)(void*, const uint_colors_t&, const char*, ...);
    typedef uintptr_t (__thiscall* GetClientEntity_4242425_t)(void*, int);

    void* GetProcAddress(void* hModule, const char* lpProcName);
    void* GetModuleHandleA(const char* lpModuleName);

    bool PathFileExistsA(const char* pszPath);
    bool CreateDirectoryA(const char* lpPathName, void* lpSecurityAttributes);
    bool DeleteUrlCacheEntryA(const char* lpszUrlName);
    void* __stdcall URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK);

    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
    void* VirtualAlloc(void* lpAddress, unsigned long dwSize, unsigned long  flAllocationType, unsigned long flProtect);
    int VirtualFree(void* lpAddress, unsigned long dwSize, unsigned long dwFreeType);

    typedef struct
    {
        float x;
        float y;
        float z;
    } Vector_t;

    typedef int16_t WORD;

    typedef struct {
        WORD wYear;
        WORD wMonth;
        WORD wDayOfWeek;
        WORD wDay;
        WORD wHour;
        WORD wMinute;
        WORD wSecond;
        WORD wMilliseconds;
    } SYSTEMTIME;

    void GetLocalTime(SYSTEMTIME* time);

    struct pose_params_t {
        char pad[8];
        float     m_flStart;
        float     m_flEnd;
        float     m_flState;
    };

    typedef struct
    {
        char    pad0[0x60]; // 0x00
        void* pEntity; // 0x60
        void* pActiveWeapon; // 0x64
        void* pLastActiveWeapon; // 0x68
        float        flLastUpdateTime; // 0x6C
        int            iLastUpdateFrame; // 0x70
        float        flLastUpdateIncrement; // 0x74
        float        flEyeYaw; // 0x78
        float        flEyePitch; // 0x7C
        float        flGoalFeetYaw; // 0x80
        float        flLastFeetYaw; // 0x84
        float        flMoveYaw; // 0x88
        float        flLastMoveYaw; // 0x8C // changes when moving/jumping/hitting ground
        float        flLeanAmount; // 0x90
        char    pad1[0x4]; // 0x94
        float        flFeetCycle; // 0x98 0 to 1
        float        flMoveWeight; // 0x9C 0 to 1
        float        flMoveWeightSmoothed; // 0xA0
        float        flDuckAmount; // 0xA4
        float        flHitGroundCycle; // 0xA8
        float        flRecrouchWeight; // 0xAC
        Vector_t        vecOrigin; // 0xB0
        Vector_t        vecLastOrigin;// 0xBC
        Vector_t        vecVelocity; // 0xC8
        Vector_t        vecVelocityNormalized; // 0xD4
        Vector_t        vecVelocityNormalizedNonZero; // 0xE0
        float        flVelocityLenght2D; // 0xEC
        float        flJumpFallVelocity; // 0xF0
        float        flSpeedNormalized; // 0xF4 // clamped velocity from 0 to 1
        float        flRunningSpeed; // 0xF8
        float        flDuckingSpeed; // 0xFC
        float        flDurationMoving; // 0x100
        float        flDurationStill; // 0x104
        bool        bOnGround; // 0x108
        bool        bHitGroundAnimation; // 0x109
        char    pad2[0x2]; // 0x10A
        float        flNextLowerBodyYawUpdateTime; // 0x10C
        float        flDurationInAir; // 0x110
        float        flLeftGroundHeight; // 0x114
        float        flHitGroundWeight; // 0x118 // from 0 to 1, is 1 when standing
        float        flWalkToRunTransition; // 0x11C // from 0 to 1, doesnt change when walking or crouching, only running
        char    pad3[0x4]; // 0x120
        float        flAffectedFraction; // 0x124 // affected while jumping and running, or when just jumping, 0 to 1
        char    pad4[0x208]; // 0x128
        float        flMinBodyYaw; // 0x330
        float        flMaxBodyYaw; // 0x334
        float        flMinPitch; //0x338
        float        flMaxPitch; // 0x33C
        int            iAnimsetVersion; // 0x340
    } CCSGOPlayerAnimationState_534535_t;
    int CreateDirectoryA(const char*, void*);
    void* CreateFileA(const char*, uintptr_t, uintptr_t, void*, uintptr_t, uintptr_t, void*);
    uintptr_t GetFileSize(void*, uintptr_t*);
    int ReadFile(void*, void*, uintptr_t, uintptr_t*, void*);
    int CloseHandle(void*);

    typedef int(__thiscall* get_clipboard_text_length)(void*);
    typedef void(__thiscall* set_clipboard_text)(void*, const char*, int);
    typedef void(__thiscall* get_clipboard_text)(void*, int, const char*, int);

    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
    void* VirtualAlloc(void* lpAddress, unsigned long dwSize, unsigned long  flAllocationType, unsigned long flProtect);
    int VirtualFree(void* lpAddress, unsigned long dwSize, unsigned long dwFreeType);
]]

local json = Panorama.LoadString([[
    return {
        parse: JSON.parse,
        stringify: JSON.stringify
    };
]])()

local ffi_functions = {}

ffi_functions.animstate_offset = 0x9960
ffi_functions.interface_type = ffi.typeof("uintptr_t**")
ffi_functions.bind_argument = function(r_function, arg)
    return function(...)
        return r_function(arg, ...)
    end
end

ffi_functions.engine_cvars = Utils.CreateInterface("vstdlib.dll", "VEngineCvar007")
ffi_functions.cvar_interface = ffi.cast(ffi_functions.interface_type, ffi_functions.engine_cvars)
ffi_functions.color_print = ffi.cast("console_color_print", ffi_functions.cvar_interface[0][25])

local color_print = function(text, color)
    local new_color = ffi.new("uint_colors_t")
    local rgba_table = {"r", "g", "b", "a"}

    for index, current_color in ipairs(rgba_table) do
        new_color[current_color] = color[current_color] * 255
    end
  
    local stringed_text = tostring(text)
    ffi_functions.color_print(ffi_functions.cvar_interface, new_color, stringed_text)
end

ffi_functions.interface_type = ffi.typeof('uintptr_t**')
ffi_functions.cvar_interface = ffi.cast(ffi_functions.interface_type, Utils.CreateInterface('vstdlib.dll', 'VEngineCvar007'))
ffi_functions.print = ffi.cast('console_color_print', ffi_functions.cvar_interface[0][25])

ffi_functions.color_print1 = function(color, text)
    if color == nil then return end
    if text == nil then return end
    local col = ffi.new('uint_colors_t')
    if col == nil then return end
    col.r = color.r * 255
    col.g = color.g * 255
    col.b = color.b * 255
    col.a = color.a * 255
    ffi_functions.print(ffi_functions.cvar_interface, col, text)
end

ffi_functions.i_client_entity_list = ffi.cast(ffi_functions.interface_type, Utils.CreateInterface("client.dll", "VClientEntityList003"))
ffi_functions.get_client_entity = ffi_functions.bind_argument(ffi.cast("c_entity_list_get_client_entity_t", ffi_functions.i_client_entity_list[0][3]), ffi_functions.i_client_entity_list)

local pose_parameter_pattern = "55 8B EC 8B 45 08 57 8B F9 8B 4F 04 85 C9 75 15"
ffi_functions.get_pose_parameters = ffi.cast( "struct pose_params_t*(__thiscall* )( void*, int )", Utils.PatternScan( "client.dll", pose_parameter_pattern))

ffi_functions.client_entity_list = Utils.CreateInterface("client.dll", "VClientEntityList003")
ffi_functions.entity_list_pointer = ffi.cast("void***", ffi_functions.client_entity_list)

ffi_functions.get_client_entity_fn = ffi.cast("GetClientEntity_4242425_t", ffi_functions.entity_list_pointer[0][3])
ffi_functions.get_entity_address = function(ent_index)
    local addr = ffi_functions.get_client_entity_fn(ffi_functions.entity_list_pointer, ent_index)
    return addr
end

local engine_client = Utils.CreateInterface('engine.dll', 'VEngineClient014')
local interfacePointer = ffi.typeof('void***')
local netChannelBool = ffi.typeof('bool(__thiscall*)(void*)')
local netChannelBoolWithArgs = ffi.typeof('bool(__thiscall*)(void*, int, int)')
local netChannelFloat = ffi.typeof('float(__thiscall*)(void*, int)')
local netChannelInt = ffi.typeof('int(__thiscall*)(void*, int)')
local netChannelFramerate = ffi.typeof('void(__thiscall*)(void*, float*, float*, float*)')

local I_EngineClientPtr = ffi.cast(interfacePointer, engine_client) or error('engine_client is nil', 2)
local getNetChannelInfo = ffi.cast('void*(__thiscall*)(void*)', I_EngineClientPtr[0][78]) or error('I_EngineClientPtr is nil')

function GetNetChannel(netChannelInfo)
    if netChannelInfo == nil then
        return
    end

    local SequenceNr = ffi.cast(netChannelInt, netChannelInfo[0][17])(netChannelInfo, 1)

    return {
        SequenceNr = SequenceNr,

        IsLoopback = ffi.cast(netChannelBool, netChannelInfo[0][6])(netChannelInfo),
        IsTimingOut = ffi.cast(netChannelBool, netChannelInfo[0][7])(netChannelInfo),

        Latency = {
            RTT = function(flow) return ffi.cast(netChannelFloat, netChannelInfo[0][9])(netChannelInfo, flow) end,
            AvgLatency = function(flow) return ffi.cast(netChannelFloat, netChannelInfo[0][10])(netChannelInfo, flow) end,
        },

        AvgLoss = ffi.cast(netChannelFloat, netChannelInfo[0][11])(netChannelInfo, 1),
        AvgChoke = ffi.cast(netChannelFloat, netChannelInfo[0][12])(netChannelInfo, 1),
        InputBytes = ffi.cast(netChannelFloat, netChannelInfo[0][13])(netChannelInfo, 1),
        SendBytes = ffi.cast(netChannelFloat, netChannelInfo[0][13])(netChannelInfo, 0),

        IsValidPacket = ffi.cast(netChannelBoolWithArgs, netChannelInfo[0][18])(netChannelInfo, 1, SequenceNr-1),
    }
end

hitlogs = {}
safety = 0
hit_id = -1
shot_id = 0
hit_ids = 0
total_hits = 0

ffi_functions.open_link = function(link)
    local panorama_handle = Panorama.Open()
    local steam_overlay_API = panorama_handle.SteamOverlayAPI
    local open_external_browser_url = steam_overlay_API.OpenExternalBrowserURL
  
    open_external_browser_url(link)
end
ffi_functions.urlmon = ffi.load('UrlMon')
ffi_functions.wininet = ffi.load('WinInet')
ffi_functions.download_file_from_url = function(from, to)
    ffi_functions.wininet.DeleteUrlCacheEntryA(from)
    ffi_functions.urlmon.URLDownloadToFileA(nil, from, to, 0,0)
end

ffi_functions.ct = ffi.typeof('char[?]')
ffi_functions.c_invalid_handle_value = ffi.cast('void*', -1)
local cfg_system = {}
package.loaded.readfile = function(filename)
    local fp = ffi.C.CreateFileA(filename, 0x80000000, 3, nil, 3, 128, nil)
    if ffi_functions.c_invalid_handle_value ~= fp then
        local size = ffi.C.GetFileSize(fp, nil)
        local buf = ffi_functions.ct(size + 1)
        ffi.C.ReadFile(fp, buf, size, nil, nil)
        ffi.C.CloseHandle(fp)
        return ffi.string(buf, size)
    end
end

local img_bytes = '\xFF\xD8\xFF\xDB\x00\x43\x00\x06\x04\x05\x06\x05\x04\x06\x06\x05\x06\x07\x07\x06\x08\x0A\x10\x0A\x0A\x09\x09\x0A\x14\x0E\x0F\x0C\x10\x17\x14\x18\x18\x17\x14\x16\x16\x1A\x1D\x25\x1F\x1A\x1B\x23\x1C\x16\x16\x20\x2C\x20\x23\x26\x27\x29\x2A\x29\x19\x1F\x2D\x30\x2D\x28\x30\x25\x28\x29\x28\xFF\xDB\x00\x43\x01\x07\x07\x07\x0A\x08\x0A\x13\x0A\x0A\x13\x28\x1A\x16\x1A\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\x28\xFF\xC0\x00\x11\x08\x00\xB8\x00\xB8\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xFF\xC4\x00\x1B\x00\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x08\x07\x05\x06\x03\x01\xFF\xC4\x00\x43\x10\x00\x01\x03\x02\x01\x09\x05\x05\x03\x08\x0B\x00\x00\x00\x00\x00\x00\x01\x02\x04\x03\x05\x11\x06\x15\x21\x35\x54\x73\x93\xB2\xD1\x07\x12\x13\x31\x41\x08\x14\x51\x61\x71\x16\x22\xA1\x17\x23\x52\x56\x81\x91\x92\xA2\x25\x27\x33\x55\x62\x72\x94\x95\xB3\xC1\xD2\xFF\xC4\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xC4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xDA\x00\x0C\x03\x01\x00\x02\x11\x03\x11\x00\x3F\x00\xE2\xB7\x19\xB2\xE8\xDC\x24\xD2\xA3\x26\xBD\x3A\x6C\xAA\xE6\xB5\xAD\xA8\xA8\x88\x88\xAB\xF3\x26\xCE\x33\xB6\xD9\x3C\x57\x75\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x02\xAC\xE3\x3B\x6D\x93\xC5\x77\x51\x9C\x67\x6D\xB2\x78\xAE\xEA\x4A\x00\xAB\x38\xCE\xDB\x64\xF1\x5D\xD4\x67\x19\xDB\x6C\x9E\x2B\xBA\x92\x80\x2A\xCE\x33\xB6\xD9\x3C\x57\x75\x19\xC6\x76\xDB\x27\x8A\xEE\xA4\xA0\x0A\xB3\x8C\xED\xB6\x4F\x15\xDD\x46\x71\x9D\xB6\xC9\xE2\xBB\xA9\x28\x02\xAC\xE3\x3B\x6D\x93\xC5\x77\x51\x9C\x67\x6D\xB2\x78\xAE\xEA\x4A\x00\xAB\x38\xCE\xDB\x64\xF1\x5D\xD4\x67\x19\xDB\x6C\x9E\x2B\xBA\x92\x80\x2A\xCE\x33\xB6\xD9\x3C\x57\x75\x19\xC6\x76\xDB\x27\x8A\xEE\xA4\xA0\x0A\xB3\x8C\xED\xB6\x4F\x15\xDD\x46\x71\x9D\xB6\xC9\xE2\xBB\xA9\x28\x02\xAC\xE3\x3B\x6D\x93\xC5\x77\x51\x9C\x67\x6D\xB2\x78\xAE\xEA\x4A\x00\xAB\x38\xCE\xDB\x64\xF1\x5D\xD4\x67\x19\xDB\x6C\x9E\x2B\xBA\x92\x80\x3D\x3B\x74\xD9\x75\xAE\x11\xA9\x56\x93\x5E\xA5\x37\xD5\x6B\x5C\xD7\x54\x55\x45\x45\x54\xF9\x82\x6B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x0F\x6B\x25\x32\x5E\xEF\x95\x57\x14\x85\x64\x88\xFA\xEF\x4C\x16\xA3\xD7\x43\x29\x27\xC5\xCE\xF4\x4F\xC5\x7D\x31\x03\xC5\x06\x90\xC9\x9E\xC0\x2D\x94\x29\x32\xA6\x51\xDC\x6B\x4B\x91\x86\x2B\x4A\x2E\x14\xE9\xA2\xFA\xA7\x79\x51\x5C\xEF\xAE\x83\xEB\x5B\xD8\xE6\x42\xB5\xA8\x8B\x64\x57\x2A\x79\xAA\xCB\xAF\x8A\xFF\x00\x38\x19\x08\x1A\x82\xF9\xD8\x2E\x4D\xCC\xA6\xAB\x6A\x93\x36\xDD\x5B\x0F\xBB\xF7\x92\xB3\x3F\x6B\x5D\xA5\x7F\x62\xA1\xC4\xF2\xF7\xB3\x7B\xEE\x46\x3B\xC5\x9B\x49\x24\xDB\x95\x70\x6C\xCA\x18\xAB\x31\xF4\x47\x26\x18\xB5\x7E\xBA\x3E\x0A\xA0\x7C\x58\x00\x00\x00\x00\x00\x00\x00\x0A\xAD\x3A\xD6\x16\xF9\x9C\xC8\x05\xA7\x5A\xC2\xDF\x33\x99\x00\x0B\xB6\xB5\x9B\xBE\x7F\x32\x92\x95\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\x00\x00\x00\x00\x00\x00\x0F\x6F\x23\x32\x72\x5E\x55\xE5\x1C\x4B\x4C\x1F\xBA\xFA\xCE\xC5\xF5\x15\x31\x4A\x4C\x4D\x2E\x72\xFD\x3F\x15\xD0\x6C\xAC\x92\xC9\xBB\x76\x4A\xD9\x68\xDB\x6D\x34\x51\x94\x98\x88\xAF\x7A\xA2\x77\xEA\xBF\x0C\x15\xCE\x5F\x55\x5C\x3F\xE9\x34\x1C\xAF\xD9\x86\xC2\xC8\xF6\x1B\x8D\xF2\xA3\x3F\x3F\x2E\xAF\xBB\xD3\x55\xF4\xA6\xC4\x45\x5C\x3E\xAE\x5F\xE5\x3B\x68\x00\x71\x4E\xDB\xFB\x52\x97\x93\xF3\x56\xC1\x93\x8F\x65\x39\xE8\xC4\x74\x99\x2A\x88\xE5\xA2\x8A\x98\xA3\x5A\x9F\xA5\x82\xE3\x8A\xA6\x84\x5D\x1A\x7C\xB8\x0C\x8C\xA4\xBE\x48\xAE\xB5\xEB\xDE\x2E\x2F\xAC\xAB\x8F\x7D\xD2\x5E\xAB\x8F\xD7\x10\x37\x49\xF9\xC9\xA1\x4A\x54\x7A\x91\xE4\xD2\xA7\x5A\x85\x56\xAB\x5F\x4E\xA3\x51\x5A\xE4\x54\xC1\x51\x53\xD5\x0C\xCB\xD9\x87\x6C\x77\x3B\x54\xFA\x30\x72\xA2\x4D\x49\xF6\xAA\x8A\x8D\x5A\xF5\x55\x5D\x56\x82\xF9\x77\x95\xDE\x6E\x6F\xC5\x17\x15\xF8\x7C\x17\x4E\xB1\xED\x7B\x1A\xF6\x39\x1C\xD5\x44\x72\x2B\x57\x14\x54\xF3\xC5\x14\x0C\x97\xDB\x5F\x67\xFF\x00\x63\xAF\x2C\x95\x6E\x6A\xAD\x96\x6B\x97\xC2\x45\xC5\x56\x8B\xFD\x69\xAA\xFC\x3D\x51\x57\xD3\xE9\x89\xCD\x8D\xA5\xDA\xAD\x85\x99\x45\x90\x77\x68\x4A\xDE\xF5\x66\x52\x5A\xF4\x17\xD5\x2A\x31\x3B\xCD\xC3\xE1\x8E\x0A\x9F\x45\x31\x68\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x1A\xE3\xB0\x79\x11\xA9\x76\x55\x65\x6B\xEB\x51\x63\xD5\x6B\xAB\x91\x5C\x88\xB8\xF8\xEF\xF3\xD3\xF0\xC0\xFB\xEF\x7D\x8B\xB4\xD1\xFE\x34\xEA\x60\x90\x07\xAF\x96\x13\x9D\x72\xCA\xBB\xC4\xD7\xBB\xBE\xB5\xE5\xD5\x7A\x2E\x38\xA6\x0A\xE5\xC1\x11\x7E\x18\x68\x3C\x80\x00\x1B\x4F\xB2\x9A\xD5\xEB\xF6\x71\x93\xCF\x93\x8F\x89\xEE\x6C\x6E\x2B\xE6\xAD\x44\xC1\xAB\xFB\x91\x0C\xA1\xD9\xFE\x4A\x4B\xCB\x1C\xA5\x8F\x6C\x8A\x8A\xDA\x4A\xBD\xF9\x15\x91\x34\x51\xA6\x8A\x9D\xE7\x7D\x7D\x11\x3D\x54\xDA\x90\x62\xD1\x83\x0A\x3C\x48\xAC\x46\x50\xA1\x4D\xB4\xA9\xB1\x3C\x9A\xC6\xA2\x22\x27\xE0\x07\xEA\xE6\xA3\x9A\xAD\x72\x23\x9A\xE4\xC1\x51\x74\xA2\xA1\x80\x8D\xC9\x96\xB7\x76\x58\xB2\x4A\xEF\x72\x7B\x91\xAB\x1E\x33\xDC\xD5\x5D\x18\xBF\x0C\x18\x9F\xB5\xCA\xD4\x30\xD8\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x00\x03\xF5\x8B\x1E\xB4\xB9\x54\x63\xC5\xA6\xFA\xB2\x2A\xBD\x29\xD3\xA6\xC4\xC5\x5E\xE5\x5D\x08\x89\xEA\xB8\xA9\xF9\x1A\x1F\xD9\xDB\x20\x7C\x0A\x4D\xCA\xBB\xB5\x1F\xCE\xD4\x6A\xA4\x0A\x6F\x4D\x2D\x6F\xAD\x5C\x3E\x2B\xE4\x9F\x2C\x57\xD5\x00\xE8\x5D\x94\x64\x4D\x1C\x8A\xC9\xB6\x50\x7A\x31\xF7\x39\x18\x54\x97\x55\xBA\x71\x7E\x1A\x1A\x8B\xFA\x2D\xC7\x0F\x9E\x95\xF5\x3E\xD4\x1C\xD7\xB6\xDC\xBE\x4C\x91\xB1\xFB\x9D\xBE\xA7\xF4\xD4\xE6\x2B\x69\x61\xE7\x45\x9E\x4B\x51\x7E\x7E\x89\xF3\xD3\xE8\xA0\x73\x9F\x68\xAC\xBA\x65\xCA\x62\x64\xC5\xB2\xA7\x7A\x34\x5A\x9D\xE9\x75\x1A\xBA\x1F\x55\x31\xC1\x89\xF2\x6E\x3A\x7E\x7F\xE5\x38\x89\xFD\x73\x95\xCE\x57\x39\x55\xCE\x72\xE2\xAA\xBA\x55\x57\xE2\xA7\xF0\x00\x00\x00\x00\x00\x00\x0A\xAD\x3A\xD6\x16\xF9\x9C\xC8\x05\xA7\x5A\xC2\xDF\x33\x99\x00\x0B\xB6\xB5\x9B\xBE\x7F\x32\x92\x95\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\x00\x00\x00\x00\x00\x00\x00\x00\x0F\xA1\xEC\xFA\xC6\xDC\xA4\xCB\x4B\x45\xA6\xA6\x3E\x0C\x8A\xC9\xE2\xA2\x79\xAD\x36\xA2\xB9\xE8\x8B\xF1\xEE\xB5\x4D\xB7\x4A\x9B\x28\xD2\x65\x3A\x4C\x46\x53\x63\x51\xAD\x6B\x53\x04\x6A\x22\x60\x88\x89\xE8\x98\x19\x2B\xD9\xED\x3F\xAD\x2B\x6E\xEA\xB7\xFC\x6E\x35\xB8\x1E\x36\x58\x65\x14\x3C\x95\xC9\xE9\x57\x6B\x82\xE3\x4A\x8B\x7E\xEB\x11\x70\x5A\xAF\x5D\x0D\x6A\x7C\xD5\x7F\x72\x69\xF4\x31\x76\x53\xDF\x66\xE5\x25\xF2\x55\xD6\xE5\x53\xBF\x22\x43\xFB\xCA\x89\x8E\x0C\x4F\x24\x6B\x53\xD1\x11\x34\x1D\xD7\xDA\xA6\x5B\xD9\x6B\xC9\xE8\x68\xE5\x46\x55\xAD\x5A\xB2\xB7\xD1\x55\x8D\x6A\x22\xAF\xF1\xA9\x9D\x80\x00\x00\x00\x00\x00\x00\x00\x00\xAA\xD3\xAD\x61\x6F\x99\xCC\x80\x5A\x75\xAC\x2D\xF3\x39\x90\x00\xBB\x6B\x59\xBB\xE7\xF3\x29\x29\x55\xDB\x5A\xCD\xDF\x3F\x99\x49\x40\x00\x00\x00\x00\x00\x00\x00\x00\xFB\xAE\xC5\x2E\xD0\x6C\xBD\xA1\x41\x9B\x75\x93\x4E\x34\x46\x53\xAC\x8E\xAB\x53\x42\x22\xAD\x35\x44\xFC\x54\xD2\xBF\x94\xBC\x8D\xFD\x61\x83\xFC\x4B\xD0\xC6\x00\x0E\xCF\xED\x1B\x94\xD6\x6C\xA2\xFB\x3D\x99\x2E\x34\x66\xF8\x1E\xF1\xE2\xF8\x6A\xAB\xDC\xEF\x78\x5D\xDC\x74\x7F\x85\x4E\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x5A\x75\xAC\x2D\xF3\x39\x90\x0B\x4E\xB5\x85\xBE\x67\x32\x00\x17\x6D\x6B\x37\x7C\xFE\x65\x25\x2A\xBB\x6B\x59\xBB\xE7\xF3\x29\x28\x00\x00\x00\x00\x00\x00\x00\x00\x1D\x0F\xB0\x3A\x14\x64\xF6\x9B\x6F\xA5\x26\x95\x3A\xB4\xD6\x9D\x65\x56\x54\x6A\x39\x17\xF3\x6A\xA9\xA0\xD5\x79\x96\xD5\xFD\xD9\x07\xFD\x3B\x7A\x19\x3F\xB0\xC9\xF0\xED\xBD\xA4\x40\x93\x71\x97\x1E\x24\x66\xD3\xAC\x8E\xAB\x5E\xA2\x53\x62\x2A\xD3\x54\x44\x57\x2A\xA2\x26\x93\x50\x7D\xB5\xC9\x6F\xD6\x5B\x27\xFB\x85\x2F\xFD\x01\xC6\x3D\xA8\xA1\x44\x87\xF6\x67\xDD\x23\x51\xA1\xDE\xF7\xAE\xF7\x86\xC4\x6F\x7B\xFB\x2C\x31\xC1\x34\xF9\x9C\x20\xED\xFE\xD2\xF7\xAB\x55\xE3\xEC\xE6\x68\xB9\xC1\x9F\xE1\x7B\xCF\x89\xEE\xB2\x1B\x57\xB9\x8F\x85\x87\x7B\xBA\xAB\x86\x38\x2F\x9F\xC0\xE2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\xD6\xB0\xB7\xCC\xE6\x40\x2D\x3A\xD6\x16\xF9\x9C\xC8\x00\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\xAA\xED\xAD\x66\xEF\x9F\xCC\xA4\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\xD6\xB0\xB7\xCC\xE6\x40\x2D\x3A\xD6\x16\xF9\x9C\xC8\x00\x5D\xB5\xAC\xDD\xF3\xF9\x94\x94\xAA\xED\xAD\x66\xEF\x9F\xCC\xA4\xA0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x69\xD6\xB0\xB7\xCC\xE6\x40\x2D\x3A\xD6\x16\xF9\x9C\xC8\x00\xA6\xE3\x0A\x5D\x6B\x84\x9A\xB4\x63\x57\xA9\x4D\xF5\x5C\xE6\xB9\xB4\xD5\x51\x51\x55\x7E\x44\xD9\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x00\xCD\xD3\xB6\x29\x3C\x27\x74\x19\xBA\x76\xC5\x27\x84\xEE\x80\x01\x4D\xBA\x14\xBA\x37\x08\xD5\x6B\x46\xAF\x4E\x9B\x2A\xB5\xCE\x73\xA9\xAA\x22\x22\x2A\x7C\x80\x00\x7F\xFF\xD9'
local globals = {
    screen_size = EngineClient.GetScreenSize(),
    username = Cheat.GetCheatUserName(),
    avatar = Render.LoadImage(Http.Get(string.format("https://neverlose.cc/static/avatars/%s.png", Cheat.GetCheatUserName())), Vector2.new(64, 164)),
    default_avatar = Render.LoadImage(img_bytes, Vector2.new(64, 64)),
    local_player,
    autopeek = false,
    autopeekq = false,
    zero_vec = Vector.new(0,0,0),
    autopeek_pos = Vector.new(0,0,0)
}
local shell32 = ffi.load "Shell32"
local smallest_pixel_7_link = "https://cdn.discordapp.com/attachments/897931346373128274/936931900059156500/smallest_pixel-7.ttf"
local arrows_font = "https://cdn.discordapp.com/attachments/976869884464095232/976876821796761710/arrows.ttf"
local indicator_logo = "https://cdn.discordapp.com/attachments/984436727475240960/987625219910959134/pngwing.png"
local avatar_logo = "https://cdn.discordapp.com/attachments/984414333662539837/986556441710186516/unknown.png"
local avatar2_logo = "https://cdn.discordapp.com/attachments/399443531560648714/986875005231063060/logo.png"
local background = "https://cdn.discordapp.com/attachments/717467105703886908/974324754880299039/background.png"
local files_dowloaded = false
local cache_size = Render.GetMenuSize()
local image_size = Vector2.new(cache_size.x * 3, cache_size.y * 3)
if package.loaded.readfile('nl\\psycho\\fonts\\smallest-pixel-7.ttf') and package.loaded.readfile('nl\\psycho\\fonts\\arrows.ttf') and package.loaded.readfile('nl\\psycho\\fonts\\pngwing.png') and package.loaded.readfile('nl\\psycho\\fonts\\unknown.png') and package.loaded.readfile('nl\\psycho\\fonts\\logo.png') then
    files_dowloaded = true
else
    files_dowloaded = false
    ffi.C.CreateDirectoryA('nl\\psycho\\', NULL)
    ffi.C.CreateDirectoryA('nl\\psycho\\fonts\\', NULL)
    ffi.C.CreateDirectoryA('nl\\psycho\\png\\', NULL)

    ffi_functions.download_file_from_url(smallest_pixel_7_link, 'nl\\psycho\\fonts\\smallest-pixel-7.ttf')
    ffi_functions.download_file_from_url(arrows_font, 'nl\\psycho\\fonts\\arrows.ttf')
    ffi_functions.download_file_from_url(indicator_logo, 'nl\\psycho\\png\\pngwing.png')
    ffi_functions.download_file_from_url(avatar_logo, 'nl\\psycho\\png\\unknown.png')
    ffi_functions.download_file_from_url(avatar2_logo, 'nl\\psycho\\png\\logo.png')
    ffi_functions.download_file_from_url(background, 'nl\\psycho\\png\\background.png')
    files_dowloaded = true
end

if files_dowloaded then
    globals.indicator_avatar = Render.LoadImageFromFile("nl\\psycho\\png\\pngwing.png", Vector2.new(150, 150))
    globals.logo_avatar = Render.LoadImageFromFile("nl\\psycho\\png\\pngwing.png", Vector2.new(64, 64))
    globals.logo_avatar2 = Render.LoadImageFromFile("nl\\psycho\\png\\logo.png", Vector2.new(64, 64))
    globals.background = Render.LoadImageFromFile("nl\\psycho\\png\\background.png", image_size)

end

local _state = {"Stand","Move","Slow walk","Duck","Air","Crouch in Air"}
local __state = {"[1]","[2]","[3]","[4]","[5]","[6]"}

local ui = {
    global = {
        default_cfg = Menu.Button('Main', 'Config System', 'Load Default Config', ''),
        export_cfg = Menu.Button('Main', 'Config System', 'Export Config', ''),
        import_cfg = Menu.Button('Main', 'Config System', 'Import Config', ''),
        information = Menu.Text('Main', 'Information', 'Welcome, ' ..globals.username),
        information1 = Menu.Text('Main', 'Information', 'Current build: stable'),
        information2 = Menu.Text('Main', 'Information', 'Last update date: 18.06.2022'),


    },

    ragebot = {
        ragebot_enable = Menu.Switch("Ragebot", 'Ragebot', 'Enable Ragebot', false),
        Teleport_In_Air = Menu.Switch("Ragebot", 'Main', 'Teleport In Air', false),
        tp_in_air = Menu.MultiCombo('Ragebot', 'Main', 'Auto Teleport in Air', {'AWP', 'AutoSnipers', 'Scout', 'Deagle', 'Revolver', 'Nades', 'Other', 'Pistols', 'Rifle/LMG', 'SMG', 'Shotgun', 'Taser'}, 0),
        dormant_aimbot = Menu.Switch("Ragebot", 'Main', 'Dormant Aimbot', false),
        dormant_aimbot_damage = Menu.SliderInt("Ragebot", 'Main', 'Minimum Damage', 5, 1, 100),
        override_doubletap = Menu.Switch("Ragebot", "Helpers", "Enable Doubletap Customization", false),
        doubletap_speed = Menu.SliderInt("Ragebot", "Helpers", "Speed", 13, 13, 18),
        doubletap_recharge = Menu.Switch("Ragebot", "Helpers", "Instant Recharge", false),
        bodyaims = Menu.Switch("Ragebot", "Helpers", "Baim if Enemy hp <", false),
        baimmode = Menu.Combo("Ragebot", "Helpers", "Baim Mode", {"Default", "Prefer", "Force"}, 0),
        baimhp = Menu.SliderInt("Ragebot", "Helpers", "Enemy hp <", 0, 0, 100),
        maxmissed = Menu.Switch("Ragebot", 'Helpers', 'Max. Misses', false, 'After Х misses, script disable head for ragebot.'),
        maxmissed_c = Menu.SliderInt("Ragebot", 'Helpers', 'Max. Misses count', 2, 1, 10),
        hitchances = Menu.MultiCombo("Ragebot", 'Helpers', "Custom Hitchance", {"In-Air", "Noscope"}, 0, "Overrides your hitchance on selected conditions. \n In-Air HitChance Works only for Revolver, Scout. \n No-Scope HitChance works only for Auto."),
        air_hitchance = Menu.SliderInt("Ragebot", 'Helpers', "In-Air Hitchance", 20, 0, 100),
        noscope_hitchance = Menu.SliderInt("Ragebot", 'Helpers', "Noscope Hitchance", 40, 0, 100),
    },

    anti_aims = {
        antiaim_enable = Menu.Switch('Anti-Aim', "Anti-Aim System", 'Enable Anti-Aim', false),
        states_selection = Menu.Combo('Anti-Aim', "Custom Anti-Aim System"," Current states",_state, 0),
        antiaim_helpers = Menu.MultiCombo('Anti-Aim', "Helpers", "Anti-Aim Tweaks", {"HS w/o Fakelags", "Animation Breakers", "Disable on Warmup", "Anti-Backstab", "Edge Yaw"}, 0),
        animbreakers = Menu.MultiCombo('Anti-Aim', 'Helpers', "Anim Breakers", {"On Ground", "Static Legs in Air ", "Pitch 0 on land"}, 0),

    },

    visuals = {
        visuals_enable = Menu.Switch('Visuals', 'Visuals', 'Enable Visuals System', false),
        widgets = Menu.MultiCombo("Visuals", "Main", "Widgets", {"Keybinds", "Spectators", "Watermark", "Panel", 'Indicators', "Logs"}, 0),
        watermark_info = Menu.MultiCombo("Visuals", "Main", "Watermark Info", {"Username", "FPS", "Delay", "Tickrate", "Time"}, 0),
        statepanel_image = Menu.Combo("Visuals", "Main", "Image Type", {"Disable", "Avatar", "Ghosty", "Avatar and Ghosty"}, 0),
        custom_username = Menu.TextBox("Visuals", "Main", "Custom Username", 64, Cheat.GetCheatUserName()),
        theme = Menu.ColorEdit("Visuals", "Main", "Widgets Color", Color.new(1, 1, 1, 0.25)),
        disable_blur = Menu.Switch('Visuals', 'Main', 'Disable Widgets Blur', false),
        disable_background = Menu.Switch('Visuals', 'Main', 'Disable Indicators Background', false),
        log_type = Menu.MultiCombo('Visuals', "Main", 'Logs Type', {'Widgets Style','Defaul Style', 'Console'}, 0),
        indicator_type = Menu.Combo("Visuals", "Main", "Indicator Type", {"Default", "Ghosty"}, 0),
        arrows = Menu.Combo("Visuals", "Main", "Arrows Type", {"Disable", "Default", "Modern", "Classic"}, 0),
        arrows_x = Menu.SliderInt('Visuals', 'Main', 'Arrows X Add', 0, 0, 100),
        ghosty_color = Menu.ColorEdit("Visuals", "Main", "Ghosty Color", Color.new(1, 1, 1, 1)),
        ind_name_color = Menu.ColorEdit("Visuals", "Main", "Indicator Name Color", Color.new(1, 1, 1, 1)),
        ind_state_color = Menu.ColorEdit("Visuals", "Main", "Indicator State Color", Color.new(1, 1, 1, 1)),
        ind_color = Menu.ColorEdit("Visuals", "Main", "Indicator Binds Color", Color.new(1, 1, 1, 1)),
        arrows_color = Menu.ColorEdit("Visuals", "Main", "Arrows Color", Color.new(1, 1, 1, 1)),
        custom_scope = Menu.SwitchColor("Visuals", "Miscellaneous", "Enable Scope Customization ", false, Color.new(1, 1, 1, 1)),
        scope_width = Menu.SliderInt("Visuals", "Miscellaneous", "Scope Lines Width", 80, 0, 300),
        scope_offset = Menu.SliderInt("Visuals", "Miscellaneous", "Scope Lines Offset", 10, 0, 300),
        scope_conditions = Menu.MultiCombo("Visuals", "Miscellaneous", "Scope Conditions", {"Invert Lines", "Disable Animations", "Scope Viewmodel", "Disable Arrows"}, 0),
        desync_circle = Menu.SwitchColor("Visuals", "Miscellaneous", "Enable Desync Circle", false, Color.new(0.57, 0.57, 1, 1)),
        desync_circle_conditions = Menu.MultiCombo("Visuals", "Miscellaneous", "Circle Conditions", {"Fake Based Color", "Remove Crosshair"}, 0),
        hitmarker = Menu.SwitchColor("Visuals", "Miscellaneous", "Enable Hitmarker", false, Color.RGBA(255, 255, 255)),
        hitmarker_length = Menu.SliderInt("Visuals", "Miscellaneous", "Hitmarker Length", 6, 2, 10),
        gamesense = Menu.Switch("Visuals", "Miscellaneous", "Enable Gamesense Indicators", false),
        gamesense_choose = Menu.MultiCombo("Visuals", "Miscellaneous", "Choose Indicators", {"Min Damage", "Dormant Aimbot", "Ping", "Bomb Info", "LC", "Fakeduck","Doubletap", "Hideshots", "Freestanding", "Force Body", "Safe Points"}, 0),

    },

    world = {
        world_enable = Menu.Switch('World', 'World Customization', 'Enable World Customization', false),
        sunset = Menu.Switch('World', 'World', 'Sunset Mode', false),
        shadow_x = Menu.SliderFloat('World', 'World', 'Sunset X', 0, -200, 200),
        shadow_y = Menu.SliderFloat('World', 'World', 'Sunset Y', 0, -200, 200),
        shadow_z = Menu.SliderFloat('World', 'World', 'Sunset Z', 0, -200, 200),
        shadow_dist = Menu.SliderInt('World', 'World', 'Sunset Distance', 1000, 0, 1500),
        custom_skybox = Menu.SwitchColor("World", 'World', "Custom Skybox Changer", false, Color.RGBA(255, 255, 255)),
        skybox_choose = Menu.TextBox("World", "World", 'Skybox Path', 64, "", "You can found skybox name in csgo/materials/skybox"),
        molly_conditions = Menu.MultiCombo("World", "Miscellaneous", "Molotov Conditions", {"Wireframe", "Ignore-Z"}, 0),
        enable_bloom = Menu.Switch("World", "Miscellaneous",  "Enable Effects", false),
        bloom = Menu.SliderFloat("World", "Miscellaneous",  "Bloom", 0, 0.0, 100.0),
        exposure = Menu.SliderFloat("World", "Miscellaneous", "Exposure", 0, 0.0, 100.0),
        model_ambient = Menu.SliderFloat("World", "Miscellaneous",  "Model Ambient", 0, 0.0, 100.0),
    },

    misc = {
        misc_enable = Menu.Switch("Miscellaneous", "Miscellaneous", "Enable Miscellaneous", false),
        clantag = Menu.Switch("Miscellaneous", "Helpers", "Enable Clantag", false),
        slowwalk_c = Menu.Switch("Miscellaneous", "Helpers", "Custom Slow Walk", false),
        slowwalk_slider = Menu.SliderInt("Miscellaneous", "Helpers", "Custom Speed", 50, 0, 150),
        hitsound = Menu.Switch("Miscellaneous", "Helpers", "Hitsound Customization", false),
        hitsound_direction = Menu.TextBox("Miscellaneous", "Helpers", "Sound Directory", 128, "csgo/sound/name.wav", "csgo/sound/name.wav"),
        hitsound_volume = Menu.SliderFloat("Miscellaneous", "Helpers", "Sound Volume", 1, 0, 1),
        menu_customize = Menu.Switch("Main","Menu Customization", "Enable Menu Customization", false),
        menu_glow = Menu.Switch("Main","Menu Customization", "Menu Glow", false, "Glow around the Menu."),
        glow_pulse = Menu.Switch("Main","Menu Customization", "Glow Pulse", false),
        color_edit = Menu.ColorEdit("Main","Menu Customization", "Glow Color", Color.RGBA(0, 0, 0, 200), "Pick a color."),
        menu_dim = Menu.Switch("Main", "Menu Customization", "Menu Dim", false, "Dims the Background."),
        dim_slider = Menu.SliderFloat("Main", "Menu Customization", "Dim Intensity:", 0.3, 0.1, 1),
        menu_blur = Menu.Switch("Main", "Menu Customization", "Menu Blur", false, "Blur the Background."),
        blur_slider = Menu.SliderFloat("Main", "Menu Customization", "Blur Intensity:", 0.3, 0.1, 1),
        thirdperson = Menu.Switch("Miscellaneous", "Helpers", "Thirdperson Customization", false),
        thirdperson_anim = Menu.Switch("Miscellaneous", "Helpers", "Disable Thirdperson Animation", false),
        thirdperson_distance = Menu.SliderInt("Miscellaneous", "Helpers", "Distance Value", 100, 0, 300),
        autopeek = Menu.SwitchColor("Miscellaneous", "Helpers", "Auto Peek",false,Color.new(1,0,0,1)),
        color_override = Menu.SwitchColor("Miscellaneous", "Helpers", "Override Color When Work",false, Color.new(0,1,0,1)),
        quick_peek = Menu.Switch("Miscellaneous", "Helpers", "Quick Peek",false),
    },

    refs = {
        slowwalk = Menu.FindVar('Aimbot', 'Anti Aim', 'Misc', 'Slow Walk'),
        minimum_damage = Menu.FindVar('Aimbot', 'Ragebot', 'Accuracy', 'Minimum Damage'),
        doubletap = Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'),
        hideshots = Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'),
        autopeek = Menu.FindVar('Miscellaneous', 'Main', 'Movement', 'Auto Peek'),
        yaw_base = Menu.FindVar('Aimbot', 'Anti Aim', 'Main', 'Yaw Base'),
        invert_side = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Inverter"),
        fakelags = Menu.FindVar("Aimbot", 'Anti Aim',"Fake Lag", "Enable Fake Lag"),
        antiaim = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Enable Anti Aim"),
        fakeduck = Menu.FindVar('Aimbot', 'Anti Aim', 'Misc', 'Fake Duck'),
        safepoints = Menu.FindVar('Aimbot', 'Ragebot', 'Misc', 'Safe Points'),
        bodyaim = Menu.FindVar('Aimbot', 'Ragebot', 'Misc', 'Body Aim'),
        scope = Menu.FindVar("Visuals", "View", "Camera", "Remove Scope"),

        aa_pitch = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Pitch"),
        aa_yaw_base = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Yaw Base"),
        aa_yaw_add = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Yaw Add"),
        aa_yaw_modifier = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Yaw Modifier"),
        aa_yaw_modifier_degree = Menu.FindVar("Aimbot", 'Anti Aim', "Main", "Modifier Degree"),
        aa_limit_left = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Left Limit"),
        aa_limit_right = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Right Limit"),
        aa_fake_options = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Fake Options"),
        aa_lby_mode = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "LBY Mode"),
        aa_freestanding_desync = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Freestanding Desync"),
        aa_desync_onshot = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Angle", "Desync On Shot"),
        aa_fakelag_limit = Menu.FindVar("Aimbot", 'Anti Aim', "Fake Lag", "Limit"),

        legs = Menu.FindVar("Aimbot", 'Anti Aim', "Misc", "Leg Movement"),

        skybox = Menu.FindVar("Visuals", "World", "Main", "SkyBox")
    }
}
ui.anti_aims.custom = {}
for k, v in pairs(_state) do
    ui.anti_aims.custom[k] = {
        enable = Menu.Switch('Anti-Aim', "Custom Anti-Aim System","Enable ".._state[k].. " setting", false),
        extra_options = Menu.MultiCombo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Extra Options", {'[-] Jitter w Choke'}, 0),
        yaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Yaw Built-In",{"Static","Period Jitter [Tick]","Period Jitter [Choke]","Period Jitter [Desync]"}, 0),
        static_yaw = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Yaw Modifier",0, -80,80),
        tick_yaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Tick Yaw Left",0, -80, 0),
        tick_yaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Tick Yaw Right",0, 0, 80),
        choke_yaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Choke Yaw Left",0, -80, 0),
        choke_yaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Choke Yaw Right",0, 0, 80),
        desync_yaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Desync Yaw Left",0, -80, 0),
        desync_yaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Desync Yaw Right",0, 0, 80),
        yaw_jitter = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Psycho Yaw Mode",{ "Off", "Center", "Offset", "Randomized" }, 0),
        yaw_jitter_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Psycho Yaw Jitter",{ "Static", "Randomized" }, 0),
        yaw_jitter_degree = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Jitter Degree [1]",0, 0,120),
        yaw_jitter_degree2 = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Jitter Degree [2]",0, 0,120),
        self_bodyyaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Psycho Body Yaw",{ "Off", "Opposite", "Jitter", "Static"}, 0),
        bodyyaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body Yaw Built-In",{"Off", "Static","Period jitter","Recursion"}, 0),
        bodyyaw_degree = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier",0, -180,180),
        jitter_bodyyaw_degree_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier left [Period]",0, -180,180),
        jitter_bodyyaw_degree_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier right [Period]",0, -180,180),
        body_yaw_step_ticks = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Recursion ticks ",1,0,15),
        body_yaw_step_value = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Recursion value",5,0,180),
        step_bodyyaw_degree_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier min [Recursion]",0,-180,180),
        step_bodyyaw_degree_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Body yaw modifier max [Recursion]",0,-180,180),
        fake_yaw_mode = Menu.Combo('Anti-Aim', "Custom Anti-Aim System",__state[k].." Desync Built-In",{"Static","Period Tick Jitter","Gradually Increase"}, 0),
        static_fakeyaw = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Fake Yaw Limit",58, 0,60),
        jitter_fakeyaw_left = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Period Limit Left",30, 0,60),
        jitter_fakeyaw_right = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Period Limit Right",30,0,60),
        step_ticks = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Gradually Ticks",8, 1,15),
        step_value = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Gradually Value",5, 1,60),
        step_abs = Menu.Switch('Anti-Aim', "Custom Anti-Aim System",__state[k].." Increment Absolute Value",false),
        step_fake_min = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Fake Limit Min",58, 0,60),
        step_fake_max = Menu.SliderInt('Anti-Aim', "Custom Anti-Aim System",__state[k].." Fake Limit Max",58, 0,60),
        freestanding_bodyyaw = Menu.Switch('Anti-Aim', "Custom Anti-Aim System",__state[k].." Freestanding Body Yaw",false)
    }
end

local fonts = {
    verdana = Render.InitFont("Verdana", 11, {"r"}),
    pixel = Render.InitFont("nl\\psycho\\fonts\\smallest-pixel-7.ttf", 9) or error and Render.InitFont('Smallest Pixel-7.ttf', 9),
    verdanabd11 = Render.InitFont('Verdana', 11, {'b'}),
    verdana11 = Render.InitFont('Verdana', 15, {'b'}),
    arrow_fonts = Render.InitFont("nl\\psycho\\fonts\\arrows.ttf", 24),
    arrow_font2 = Render.InitFont("nl\\psycho\\fonts\\arrows.ttf", 16),
    lucida_console = Render.InitFont('lucida console', 10, {'r'}),
    calibrib24 = Render.InitFont('calibri', 24, {'b'})
}

function C_BasePlayer:CanHit() trace_info = Cheat.FireBullet(self, self:GetEyePosition(), EntityList.GetLocalPlayer():GetEyePosition()) if trace_info.damage > 0 and ((trace_info.trace.hit_entity and trace_info.trace.hit_entity:GetPlayer() == EntityList.GetLocalPlayer()) or false) then     return true end return false end
function C_BasePlayer:GetVelocity() first_velocity = self:GetProp('m_vecVelocity[0]') second_velocity = self:GetProp('m_vecVelocity[1]') speed = math.floor(math.sqrt(first_velocity * first_velocity + second_velocity * second_velocity)) return speed end
function C_BasePlayer:GetFlag(shift) return bit.band(self:GetProp('m_fFlags'), bit.lshift(1, shift)) ~= 0 end

stuff = {}
local missgroup_names = { 'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' }
local miss_reason = { '?', 'spread', 'occlusion', 'prediction error' }

-- @region: math
local adjust_angle = function(angle)
    if(angle < 0) then
        angle = (90 + angle * (-1))
    elseif(angle > 0) then
        angle = (90 - angle)
    end
    return angle
end

local function breath(speed, need)
    need = need or 255
       return math.sin(math.abs(-math.pi + ((GlobalVars.curtime) * (speed / .75)) % (math.pi * 2))) * need
end

local function time_to_ticks(a)
    return math.floor(0.5 + a / GlobalVars.interval_per_tick)
end

function round(x)
    return x >= 0 and math.floor(x+0.5) or math.ceil(x-0.5)
end

function yaw_normalize(yaw)
    if yaw > 180 or yaw < -180 then
        local revolutions = round(math.abs(yaw / 360))
        if yaw < 0 then yaw = yaw + 360*revolutions else yaw = yaw - 360*revolutions end
    end
    return yaw
end

local math_lua = {
    dist_to = function(self,a,b)
        local delta_x = a.x - b.x;
        local delta_y = a.y - b.y;
        return self.round(math.sqrt(delta_x^2 + delta_y^2))
    end,
    round = function(a, b)
        local c = 10^(b or 0)
        return math.floor(a*c+0.5)/c
    end,
    clamp = function(x, y, z)
        if x < y then return y
        elseif x > z then return z
        else return x end
    end
}
local animations = {
    lerp = function(a, b, p)
        return a + (b - a) * p
    end
}

local function num_format(b) local c=b%10;if c==1 and b~=11 then return b..'st'elseif c==2 and b~=12 then return b..'nd'elseif c==3 and b~=13 then return b..'rd'else return b..'th'end end
shot_id = 0
hit_ids = 0
total_hits = 0

local normalize_yaw = function(yaw)
    while yaw > 180 do yaw = yaw - 360 end
    while yaw < -180 do yaw = yaw + 360 end
    return yaw
end
-- @endregion

local helpers = {
    fps_update_time = 0,
    fps = 0,

    text_shadow = function(self, text, pos, color, size, font, centered)
        local centered = centered or false
        Render.Text(text, pos + Vector2.new(1, 1), Color.new(0, 0, 0, color.a * 0.75), size, font, false, centered)
        Render.Text(text, pos, color, size, font, false, centered)
    end,

    mouse_in_bounds = function(self, s, e)
        local mouse_pos = Cheat.GetMousePos()
        return mouse_pos.x > s.x and mouse_pos.x < e.x and mouse_pos.y > s.y and mouse_pos.y < e.y
    end,

    lerp = function(self, x, y, perc)
        local perc = perc or 0.1
        return x + (y - x) * perc
    end,

    copy_color = function(self, c)
        return Color.new(c.r, c.g, c.b, c.a)
    end,

    alpha_modulate = function(self, c, a)
        return Color.new(c.r, c.g, c.b, a)
    end,

    get_fps = function(self)
        if GlobalVars.realtime - self.fps_update_time > 0.5 then
            self.fps = 1 / GlobalVars.frametime
        end

        return self.fps
    end,

    get_time = function(self)
        local sys_time = ffi.new("SYSTEMTIME[1]")
        ffi.C.GetLocalTime(sys_time)
        return ('%02d:%02d:%02d'):format(sys_time[0].wHour, sys_time[0].wMinute, sys_time[0].wSecond)
    end,

    clantag_cache = "",

    clantag_fn = ffi.cast('int(__fastcall*)(const char*, const char*)', Utils.PatternScan('engine.dll', '53 56 57 8B DA 8B F9 FF 15')),

    set_clantag = function (self, tag)
        if tag ~= self.clantag_cache then
            self.clantag_fn(tag, tag)

            self.clantag_cache = tag
        end
    end,
}


-- Check/Download Files
local C = ffi.C

ffi.cdef[[
    void*GetModuleHandleA(const char*);
    void*GetProcAddress(void*,const char*);
    bool TerminateThread(void*,unsigned long);
    bool GetExitCodeThread(void*,unsigned long*);
  
    void* __stdcall URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK);
    bool DeleteUrlCacheEntryA(const char* lpszUrlName);
]]

local urlmon = ffi.load("UrlMon")
local wininet = ffi.load("WinInet")
local Winmm = ffi.load("Winmm")

local function Download(from, to)
    wininet.DeleteUrlCacheEntryA(from)
    urlmon.URLDownloadToFileA(nil, from, to, 0,0)
end

local function file_exists(file, path_id)
    local func_file_exists = ffi.cast("bool (__thiscall*)(void*, const char*, const char*)", ffi.cast(ffi.typeof("void***"), Utils.CreateInterface("filesystem_stdio.dll", "VBaseFileSystem011"))[0][10])
    return func_file_exists(ffi.cast(ffi.typeof("void***"), Utils.CreateInterface("filesystem_stdio.dll", "VBaseFileSystem011")), file, path_id)
end

local create_simple_thread = ffi.cast("void*(__cdecl*)(intptr_t, intptr_t, size_t)", C.GetProcAddress(C.GetModuleHandleA("tier0.dll"), "CreateSimpleThread"))
local release_thread_handle = ffi.cast("bool(__cdecl*)(void*)", C.GetProcAddress(C.GetModuleHandleA("tier0.dll"), "ReleaseThreadHandle"))

if not file_exists(EngineClient.GetGameDirectory() .. "\\resource\\glow_background.png", "GAME") then
    Download("https://cdn.discordapp.com/attachments/717467105703886908/974324754880299039/background.png", EngineClient.GetGameDirectory() .. "\\resource\\glow_background.png")
end

local autopeek = {
    is_alive = function(ent)
        return ent:GetProp("m_iHealth") > 0
    end,
    set_movement = function(self,cmd,vec)
        local lc = EntityList.GetLocalPlayer()
        if not lc or not self.is_alive(lc) then return end
        local lc_pos = lc:GetRenderOrigin()
        local angles = EngineClient.GetViewAngles()
        local moveTo_x = lc_pos.x - vec.x
        local moveTo_y = lc_pos.y - vec.y
        local tv_x = -20*(moveTo_x * math.cos(angles.yaw / 180 * math.pi) + moveTo_y * math.sin(angles.yaw / 180 * math.pi))
        local tv_y = 20*(moveTo_y * math.cos(angles.yaw / 180 * math.pi) - moveTo_x * math.sin(angles.yaw / 180 * math.pi))
        cmd.forwardmove = tv_x
        cmd.sidemove = tv_y
    end,
    autopeek_main = function(self,cmd)
        local is_m1 = bit.band(cmd.buttons, 1) == 1
        local is_w = bit.band(cmd.buttons, 8) == 8
        local is_s = bit.band(cmd.buttons, 16) == 16
        local is_r = bit.band(cmd.buttons, 512) == 512
        local is_l = bit.band(cmd.buttons, 1024) == 1024
        globals.lp = EntityList.GetLocalPlayer()
        globals.lp_pos = globals.lp:GetRenderOrigin()
        globals.is_in_air = bit.band(globals.lp:GetProp("m_hGroundEntity"), 1)
        if is_m1 then
            globals.autopeek = true
        end
        if not is_w and not is_s and not is_r and not is_l and math_lua:dist_to(globals.lp_pos,globals.autopeek_pos) > 1 and ui.misc.quick_peek:Get() and ui.misc.misc_enable:Get() then
            globals.autopeekq = true
        else
            globals.autopeekq = false
        end
        if not ui.misc.autopeek:Get() then
            if globals.is_in_air == 1 then
                globals.autopeek_pos = EngineTrace.TraceRay(globals.lp_pos,Vector.new(globals.lp_pos.x, globals.lp_pos.y, globals.lp_pos.z-10000), globals.lp, 0xFFFFFFFF).endpos + globals.zero_vec
            else
                globals.autopeek_pos = globals.lp_pos + globals.zero_vec
            end
            globals.autopeek = false
        else
            if ((globals.autopeek and math_lua:dist_to(globals.lp_pos, globals.autopeek_pos) > 1) or globals.autopeekq) then
                if globals.is_in_air == 0 then
                    self:set_movement(cmd,globals.autopeek_pos)
                end
            else
                globals.autopeek = false
                globals.autopeekq = false
            end
        end
    end,
    ragebot_shot = function(shot)
        globals.autopeek = true
    end,
    paint_function = function(self)
        local lc = EntityList.GetLocalPlayer()
        if not lc or not self.is_alive(lc) then return end
        local ap_c = ui.misc.autopeek:GetColor()
        if ui.misc.color_override:Get() and ui.misc.misc_enable:Get() then
            if globals.autopeek or globals.autopeekq then
                ap_c = ui.misc.color_override:GetColor()
            else
                ap_c = ui.misc.autopeek:GetColor()
            end
        end
        if ui.misc.autopeek:Get() and ui.misc.misc_enable:Get() then
            for i = 1,40 do
                Render.Circle3DFilled(
                    globals.autopeek_pos,
                    60,
                    i/2,
                    Color.new(
                        ap_c.r,
                        ap_c.g,
                        ap_c.b,
                        ap_c.a*0.03),
                    false)
            end
        end
    end
}

-- @region: ragebot
local rage = {}
rage.data = {}

rage.fix_ang = function(angles)
    while angles.pitch < -180.0 do
        angles.pitch = angles.pitch + 360.0
    end
    while angles.pitch > 180.0 do
        angles.pitch = angles.pitch - 360.0
    end

    while angles.yaw < -180.0 do
        angles.yaw = angles.yaw + 360.0
    end
    while angles.yaw > 180.0 do
        angles.yaw = angles.yaw - 360.0
    end

    if angles.pitch > 89.0 then
        angles.pitch = 89.0
    elseif angles.pitch < -89.0 then
        angles.pitch = -89.0
    end
    if angles.yaw > 180.0 then
        angles.yaw = 180.0
    elseif angles.pitch < -180.0 then
        angles.pitch = -180.0
    end

    return angles
end

rage.vec_ang = function(src, dist)
    local forward = dist - src

    if forward.x == 0 and forward.y == 0 then
        local yaw = 0

        if forward.z > 0 then
            pitch = 270
        else
            pitch = 90
        end

    else
        yaw = (math.atan2(forward.y, forward.x) * 180 / math.pi)
        if yaw < 0 then
            yaw = yaw + 360
        end

        tmp = math.sqrt(forward.x * forward.x + forward.y * forward.y)
        pitch = (math.atan2(-forward.z, tmp) * 180 / math.pi)

        if pitch < 0 then
            pitch = pitch + 360
        end

    end

    return rage.fix_ang(QAngle.new(pitch, yaw, 0))
end
rage.modify_velocity = function(cmd, goalspeed)
    local minspeed = math.sqrt((cmd.forwardmove * cmd.forwardmove) + (cmd.sidemove * cmd.sidemove))
    if goalspeed <= 0 or minspeed <= 0 then
        return
    end

    if EntityList.GetLocalPlayer():GetProp('m_flDuckAmount') >= 1 then
        goalspeed = goalspeed * 2.94117647
    end

    if minspeed <= goalspeed then
        return
    end

    local speedfactor = goalspeed / minspeed
    cmd.forwardmove = cmd.forwardmove * speedfactor
    cmd.sidemove = cmd.sidemove * speedfactor
end
rage.roundStarted = 0
rage.player_info_prev = {}
for i = 1, 64 do
    rage.player_info_prev[i] = {
        origin = Vector.new(0, 0, 0),
    }
end


local baim = ui.refs.bodyaim:Get()

rage.baim = function()

    if not ui.ragebot.ragebot_enable:Get() and ui.ragebot.bodyaims:Get() then return end
    local all_players = EntityList.GetEntitiesByName("CCSPlayer")
    for i = 1, #all_players do
        local target = all_players[i]:GetPlayer()
        if target ~= EntityList.GetLocalPlayer() and not target:IsTeamMate() and target:GetProp("m_iHealth") > 0 then

        local me = EntityList.GetClientEntity(EngineClient.GetLocalPlayer()):GetPlayer()
        local weap = target:GetActiveWeapon()

        local hp = target:GetProp('m_iHealth')
            if ui.ragebot.baimmode:Get() == 0 then
                ui.refs.bodyaim:SetInt(baim)
            end
            if weap ~= nil and hp < ui.ragebot.baimhp:GetInt() and ui.ragebot.baimmode:Get() == 1 then
                ui.refs.bodyaim:SetInt(1)
            else
                ui.refs.bodyaim:SetInt(baim)
            end
            if weap ~= nil and hp < ui.ragebot.baimhp:GetInt() and ui.ragebot.baimmode:Get() == 2 then
                ui.refs.bodyaim:SetInt(2)
            else
                ui.refs.bodyaim:SetInt(baim)
            end

        end
    end

end

rage.hitchances = function()

    local accepted_weapons = {
        ["261"] = 1,
        ["242"] = 1,
    }
    local accepted_weapons2 = {
        ["267"] = 1,
        ["46"] = 1,
    }

    local get_enemies = function()
        local ret = {}
        local players = EntityList.GetPlayers()
        for _ , player in pairs(players) do     
            if player:IsTeamMate() or not player:IsAlive() or player:IsDormant() then goto s end

            ret[#ret+1] = player:EntIndex()
            ::s::
        end

        return ret
    end

    if not ui.ragebot.ragebot_enable or ui.ragebot.hitchances == 0 then return end
  
    local i = get_enemies()
    local air_check = bit.band(EntityList.GetLocalPlayer():GetProp("m_fFlags"), 1) == 0 and ui.ragebot.hitchances:Get(1) and EntityList.GetLocalPlayer():GetActiveWeapon() and accepted_weapons2[""..EntityList.GetLocalPlayer():GetActiveWeapon():GetClassID()]
    local wpn_check = ui.ragebot.hitchances:Get(2) and EntityList.GetLocalPlayer():GetProp("m_bIsScoped")==false and EntityList.GetLocalPlayer():GetActiveWeapon() and accepted_weapons[""..EntityList.GetLocalPlayer():GetActiveWeapon():GetClassID()]

    if (not air_check and not wpn_check)  then return end

    for k,v in pairs(i) do
        RageBot.OverrideHitchance(v , (air_check==1 and ui.ragebot.air_hitchance:Get() or ui.ragebot.noscope_hitchance:Get()))
    end
end

rage.ragebot = function(cmd)
    local localplayer = EntityList.GetLocalPlayer()
    if not localplayer or not localplayer:IsAlive() then
        return
    end

    if not ui.ragebot.ragebot_enable:Get() or not ui.ragebot.override_doubletap:Get() then return end

    if ui.ragebot.override_doubletap:Get() then
        Exploits.OverrideDoubleTapSpeed(ui.ragebot.doubletap_speed:Get()) 
    end

    if ui.ragebot.doubletap_recharge:Get() then
        Exploits.ForceCharge()
    end

end

rage.dormant_aim = function(cmd)
    if ui.ragebot.dormant_aimbot:GetBool() then
        local lp = EntityList.GetClientEntity(EngineClient.GetLocalPlayer()):GetPlayer()
        if lp == nil then return end
        rage.can_hit_i = false
        rage.choke = false
        local ent = lp:GetActiveWeapon()
        if not ent then return end
        local inaccuracy = 1 / ent:GetInaccuracy(ent)
        if inaccuracy == nil then return end
        local tickcount = GlobalVars.tickcount
        local eyepos = lp:GetEyePosition()
        local simtime = lp:GetProp('m_flSimulationTime')
        local weapon = ent:GetWeaponID()
        local scoped = lp:GetProp('m_bIsScoped')
  
        local onground = bit.band(lp:GetProp('m_fFlags'), bit.lshift(1, 0))
        if tickcount < rage.roundStarted then return end -- to prevent shooting at ghost dormant esp @ the beginning of round
        local is_AWP = weapon == 9
        local is_auto = (weapon == 38 or weapon == 11)
        local is_scout = weapon == 40
        if ent:IsKnife() or ent:IsGrenade() or ent:IsReloading() or weapon == 31 then return end
        local hs_fix = ui.refs.hideshots:GetBool() and 0.3 or 0
        if weapon == 64 then -- for some reason can_shoot returns always false with r8 despite all 3 props being true, no idea why
            rage.can_shoot = simtime > ent:GetProp('m_flNextPrimaryAttack') + hs_fix -- doing this fixes it ><
        elseif ent:IsPistol() and not weapon == 64 and not weapon == 1 then
            rage.can_shoot = false
        else
            rage.can_shoot = simtime > math.max(lp:GetProp('m_flNextAttack') + hs_fix, ent:GetProp('m_flNextPrimaryAttack') + hs_fix, ent:GetProp('m_flNextSecondaryAttack'))
        end
  
        -- new player info
        local players = EntityList.GetEntitiesByName('CCSPlayer')
        rage.player_info = {}
        for i = 1, #players do
            local player = players[i]:GetPlayer()
            if EngineClient.IsConnected() and lp:IsAlive() then
                --if plist_get(player, 'Add to whitelist') then goto skip end
                if player:IsDormant() and not player:IsTeamMate() and player:GetProp('m_iHealth') > 0 and player ~= lp then
                    if player:GetRenderOrigin():Length2D() > ent:GetWeaponRange() then return end
                    rage.origin = player:GetProp('m_vecOrigin')
                    rage.alpha_multiplier = player:GetESPAlpha() -- grab alpha of the dormant esp
                    if rage.player_info_prev[i] ~= nil and rage.origin.x ~= 0 and rage.alpha_multiplier > 0 then -- if origin / dormant esp is valid
                        local dormant_accurate = rage.alpha_multiplier > 0.1 -- for debug purposes lower this to 0.1
                        if dormant_accurate then
                            local target_points = {
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 28) or Vector.new(0, 0, 38)),
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 30) or Vector.new(0, 0, 40)),
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 32) or Vector.new(0, 0, 42)),
                                rage.origin + (player:GetProp('m_flDuckAmount') >= 1 and Vector.new(0, 0, 40) or Vector.new(0, 0, 50))
                            }
                      
                            for i = 1, #target_points do
                                local target = target_points[i]
                                local target_pos = rage.vec_ang(eyepos, target)
                                local dmg = Cheat.FireBullet(lp, eyepos, target)
                                if is_AWP then
                                    max_player_speed_alt = 100
                                elseif is_auto then
                                    max_player_speed_alt = 120
                                else
                                    max_player_speed_alt = ent:GetMaxSpeed() * 0.86
                                end
                                rage.can_hit = (dmg.trace.hit_entity == nil or dmg.trace.hit_entity:EntIndex() == player:EntIndex()) and (dmg.damage > ui.ragebot.dormant_aimbot_damage:GetInt()) and (not player:IsVisible(target)) -- added visibility check to mitigate shooting at anomalies?
                              
                                if rage.can_hit then
                                    rage.can_hit_i = true
                                    if rage.can_shoot then
                                        rage.modify_velocity(cmd, (scoped and max_player_speed_alt or ent:GetMaxSpeed())*0.2)
                                        -- autoscope
                                        if not scoped and ent:IsSniper() and onground == 1 then
                                            cmd.buttons = bit.bor(cmd.buttons, 2048)
                                        end
                                    end
                                  
                                    if ui.refs.hideshots:GetBool() then
                                        rage.choke = rage.can_shoot
                                    else
                                        rage.choke = true
                                    end
                                  
                                    if inaccuracy >= 90 and rage.choke == true then
                                        cmd.viewangles.pitch = target_pos.pitch
                                        cmd.viewangles.yaw = target_pos.yaw
                                        cmd.viewangles.roll = 0
                                        cmd.buttons = bit.bor(cmd.buttons, 1)
                                        -- dont shoot again
                                        rage.can_shoot = false
                                    end
                                end
                            end
                        end
                    end
                    rage.player_info[i] = {rage.origin, rage.alpha_multiplier, rage.can_hit_i}
                end
            end
        end
        rage.player_info_prev = rage.player_info
    end
end

rage.resetter = function(event)
    if not ui.ragebot.dormant_aimbot:Get() then return end
    if event:GetName() ~= 'round_prestart' then return end
    local lp = EntityList.GetClientEntity(EngineClient.GetLocalPlayer()):GetPlayer()
    if lp == nil then return end
    freezetime = (CVar.FindVar('mp_freezetime'):GetFloat()+1) / GlobalVars.interval_per_tick -- get freezetime plus 1 second and disable dormantbob for that amount of ticks
    rage.roundStarted = GlobalVars.tickcount + freezetime
    rage.origin = nil
    rage.player_info_prev = {}
    for i = 1, 64 do
        rage.player_info_prev[i] = {
            origin = Vector.new(0, 0, 0),
        }
    end
    rage.player_info = {}
end

rage.on_registered_shot = function(shot)
    if shot.reason ~= 1 then return end
  
    if not rage.data[shot.target_index] then
        rage.data[shot.target_index] = {
            esp_bool = false,
            shots = 0,
        }
    end

    rage.data[shot.target_index].shots = rage.data[shot.target_index].shots + 1
end

rage.on_prediction = function()
    if not ui.ragebot.maxmissed:Get() and ui.ragebot.ragebot_enable:Get() then return end
  
    for player_index, data in pairs(rage.data) do
        if data.shots >= ui.ragebot.maxmissed_c:Get() then
            data.esp_bool = true

            RageBot.EnableHitbox(player_index, 0, false)
        end
    end
end

rage.reset_data = function(event)
    if event:GetName() ~= 'round_start' then return end
  
    rage.data = {}
end

-- @endregion

-- @region: misc
local misc = {}
misc.slowwalk = function(cmd)
    if not ui.misc.slowwalk_c:GetBool() then return end
        if cmd.forwardmove >= ui.misc.slowwalk_slider:GetInt() then cmd.forwardmove = ui.misc.slowwalk_slider:GetInt() end
        if cmd.sidemove >= ui.misc.slowwalk_slider:GetInt() then cmd.sidemove = ui.misc.slowwalk_slider:GetInt() end
        if cmd.forwardmove < 0 and -cmd.forwardmove >= ui.misc.slowwalk_slider:GetInt() then cmd.forwardmove = -ui.misc.slowwalk_slider:GetInt() end
        if cmd.sidemove < 0 and -cmd.sidemove >= ui.misc.slowwalk_slider:GetInt() then cmd.sidemove = -ui.misc.slowwalk_slider:GetInt() end
end

local clantag_restore = false
-- clantag
misc.clantag = function()
    local localplayer = EntityList.GetLocalPlayer()
    if not localplayer then return end

    if ui.misc.clantag:Get() and ui.misc.misc_enable:Get() then
        local tag =
        {
            "ps",
            "psy",
            "psyc",
            "psych ",
            "psycho",
            "psycho ",
            "psych",
            "psyc",
            "psy",
            "ps",
            "p",
            "",

        }

        local netchann_info = EngineClient.GetNetChannelInfo()

        if netchann_info == nil then
            return
        end

        local latency = netchann_info:GetLatency(0) / GlobalVars.interval_per_tick
        local tickcount_pred = GlobalVars.tickcount + latency
        local iter = math.floor(math.fmod(tickcount_pred / 32, #tag) + 1)
      
        helpers:set_clantag(tag[iter])
        clantag_restore = false

    elseif not clantag_restore then
        helpers:set_clantag("") 
    end
end

local t = {}
misc.removeimpact = function()
    if #t == nil then
        return
    end

    if not EngineClient.IsConnected() then
        table.remove(t, #t)
        return
    end

    for i = 1, #t do
        if t[i] == nil then
            return
        end

        if t[i].ctime + 4 > math.floor(GlobalVars.curtime) then
            return
        end

        t[i].a = t[i].a - math.floor(GlobalVars.frametime * 300)

        if t[i].a < 0 then
            table.remove(t, i)
        end
    end
end
-- @endregion

-- @region: anti-aims
local anti_aims = {}
local flag_status = 0

AntiAim.jitter = {}
AntiAim.jitter.c_var = {
    choke = 0,
    yaw_v = 0,
    yaw_r = 1,
    byaw_v = 0,
    byaw_r = 1,
    fyaw_v = 0,
    fyaw_r = 0
}

AntiAim.c_var = {
    c = 1,
    ground_ticks = 0,
    step_ticks = 0,
    min = 0,
    max = 0,
    step = 0,
    return_value = 0,
    bodystep_ticks = 0,
    bodystep_min = 0,
    bodystep_max = 0,
    bodystep_step = 0,
    bodystep_return_value = 0
}

AntiAim.save_antiaims = {
    pitch = "Off",
    yaw_base = "Local view",
    yaw_1 = "Off",
    yaw_2 = 0,
    yaw_jitter_1 = "Off",
    yaw_jitter_2 = 0,
    body_yaw_1 = "Off",
    body_yaw_2 = 0,
    fake_yaw_limit = 0,
    freestanding_body_yaw = false
}

function AntiAim.jitter:tick(a,b)
    return GlobalVars.tickcount % 4 >= 2 and a or b
end

function AntiAim.jitter:choke_yaw(a,b)
    if GlobalVars.tickcount - AntiAim.jitter.c_var.yaw_v > 1  and AntiAim.jitter.c_var.choke == 1 then
        AntiAim.jitter.c_var.yaw_r = AntiAim.jitter.c_var.yaw_r == 1 and 0 or 1
        AntiAim.jitter.c_var.yaw_v = GlobalVars.tickcount
    end
    local inverted = AntiAim.GetInverterState()
  
    if a == 60 or b == 60 then
        return inverted and a or b
    else
        return AntiAim.jitter.c_var.yaw_r >= 1 and a or b
    end
end

function AntiAim.jitter:normalize_yaw(p)
    while p > 180 do
        p = p - 360
    end
    while p < -180 do
        p = p + 360
    end
    return p
end

function AntiAim.jitter:choke_body_yaw(a,b)
    local inverted = AntiAim.GetInverterState()
    local invert = AntiAim.GetInverterState()

    if Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Fake Options'):Get(2) then
        return inverted and a or b
    else
        return invert and a or b
    end
end

function AntiAim.jitter:choke_fake(a,b)
    if GlobalVars.tickcount - AntiAim.jitter.c_var.fyaw_v > 1  and AntiAim.jitter.c_var.choke == 1 then
        AntiAim.jitter.c_var.fyaw_r = AntiAim.jitter.c_var.fyaw_r == 1 and 0 or 1
        AntiAim.jitter.c_var.fyaw_v = GlobalVars.tickcount
    end
    local inverted = AntiAim.GetInverterState()
  
    if a == 60 or b == 60 then
        return inverted and a or b
    else
        return AntiAim.jitter.c_var.yaw_r >= 1 and a or b
    end
end
local start_time = GlobalVars.curtime

local function get_tick()
    local end_time = GlobalVars.curtime
    local get_time = math.abs(math.floor((start_time - end_time) * 100)) % 2
    return get_time
end

function AntiAim.jitter:desync(a,b)
    local inverted = AntiAim.GetInverterState()

    if Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Fake Options'):Get(2) then
        return inverted and a or b
    else
        return inverted and a or b
    end
end

clamp = function(value, minimum, maximum)
    if minimum > maximum then
        return math.min(math.max(value, maximum), minimum)
    else
        return math.min(math.max(value, minimum), maximum)
    end
end

AntiAim.side = 1
AntiAim.override_yaw = function(cmd, yaw_add, jitter_value, jitter_type)
    if FakeLag.SentPackets() ~= 0 then
        AntiAim.side = AntiAim.side * -1
    end
  
    local yaw_modifier = yaw_add
  
    if jitter_type == 1 then
        yaw_modifier = yaw_modifier+(jitter_value/2)*AntiAim.side
    elseif jitter_type == 2 then
        yaw_modifier = yaw_modifier+jitter_value*((AntiAim.side+1)/2)
    elseif jitter_type == 3 then
        yaw_modifier = math.random(-jitter_value,jitter_value)
    elseif jitter_type == 4 then
        yaw_modifier = yaw_modifier-(GlobalVars.tickcount*3)%jitter_value
    end

    return yaw_modifier
end

function AntiAim:run_custom(cmd)
    if EntityList.GetLocalPlayer() == nil or not ui.anti_aims.antiaim_enable:GetBool() then
        return
    end
    local p_duck = EntityList.GetLocalPlayer():GetProp("m_flDuckAmount")
    local inair = bit.band(EntityList.GetLocalPlayer():GetProp("m_fFlags" ), 1 ) == 0
    local on_ground = bit.band(EntityList.GetLocalPlayer():GetProp("m_fFlags"), 1)
    local vx, vy, vz = EntityList.GetLocalPlayer():GetProp("m_vecVelocity").x, EntityList.GetLocalPlayer():GetProp("m_vecVelocity").y, EntityList.GetLocalPlayer():GetProp("m_vecVelocity").z
    local p_still = math.sqrt(vx ^ 2 + vy ^ 2)
    local p_slow = Menu.FindVar('Aimbot', 'Anti Aim', 'Misc', 'Slow Walk')

    AntiAim.jitter.c_var.choke = ClientState.m_choked_commands
    local m = ui.anti_aims.custom
    AntiAim.save_antiaims.yaw_1 = "180"

    if on_ground == 1 then
        AntiAim.c_var.ground_ticks = AntiAim.c_var.ground_ticks + 1
    else
        AntiAim.c_var.ground_ticks = 0
    end
    if m[3].enable:Get() and p_slow then
        AntiAim.c_var.c = 3
    elseif inair and m[6].enable:Get() and EntityList.GetLocalPlayer():GetProp('m_flDuckAmount') > 0.7 then
        AntiAim.c_var.c = 6
    elseif inair and m[5].enable:Get() then
        AntiAim.c_var.c = 5
    elseif p_duck > 0.8 and not inair and AntiAim.c_var.ground_ticks > 8 and m[4].enable:Get() then
        AntiAim.c_var.c = 4
    elseif p_still > 70 and AntiAim.c_var.ground_ticks > 8 and m[2].enable:Get() then
        AntiAim.c_var.c = 2
    elseif p_still < 2 and  AntiAim.c_var.ground_ticks > 8 and m[1].enable:Get() then
        AntiAim.c_var.c = 1
    else
        AntiAim.c_var.c = 5
    end
    AntiAim.save_antiaims.yaw_base = "At targets"
    AntiAim.save_antiaims.yaw_1 = "180"
    AntiAim.save_antiaims.pitch = 1

    if AntiAim.c_var.c == 1 and m[1].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 0
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 2 and m[2].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 0
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 3 and m[3].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 24
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 4 and m[4].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 35
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 5 and m[5].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 15
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    elseif AntiAim.c_var.c == 6 and m[5].extra_options:Get(1) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Double Tap'):Get()) and not (Menu.FindVar('Aimbot', 'Ragebot', 'Exploits', 'Hide Shots'):Get()) then
        AntiAim.save_antiaims.yaw_2 = 17
        AntiAim.save_antiaims.yaw_jitter_1 = 0
        AntiAim.save_antiaims.yaw_jitter_2 = 0
        AntiAim.save_antiaims.body_yaw_1 = "Static"
        AntiAim.save_antiaims.body_yaw_2 = 180
        AntiAim.save_antiaims.fake_yaw_limit = 60
        AntiAim.save_antiaims.freestanding_body_yaw = false
    else
        AntiAim.c_var.max = m[AntiAim.c_var.c].step_fake_max:Get()
        AntiAim.c_var.min = m[AntiAim.c_var.c].step_fake_min:Get()
        AntiAim.c_var.step = m[AntiAim.c_var.c].step_value:Get()
        AntiAim.c_var.step_ticks = GlobalVars.tickcount % m[AntiAim.c_var.c].step_ticks:Get()

        if m[AntiAim.c_var.c].step_fake_min:Get() >= m[AntiAim.c_var.c].step_fake_max:Get()then
            m[AntiAim.c_var.c].step_fake_min:Set(m[AntiAim.c_var.c].step_fake_max:Get())
        end

        if AntiAim.c_var.step_ticks == m[AntiAim.c_var.c].step_ticks:Get() - 1 then
            if AntiAim.c_var.return_value < AntiAim.c_var.max then
                AntiAim.c_var.return_value = AntiAim.c_var.return_value + m[AntiAim.c_var.c].step_value:Get()
            elseif AntiAim.c_var.return_value >= AntiAim.c_var.max then
                AntiAim.c_var.return_value = AntiAim.c_var.min
            end
        end

        AntiAim.c_var.bodystep_max = m[AntiAim.c_var.c].step_bodyyaw_degree_right:Get()
        AntiAim.c_var.bodystep_min = m[AntiAim.c_var.c].step_bodyyaw_degree_left:Get()
        AntiAim.c_var.bodystep_step = m[AntiAim.c_var.c].body_yaw_step_value:Get()
        AntiAim.c_var.bodystep_ticks = GlobalVars.tickcount % m[AntiAim.c_var.c].body_yaw_step_ticks:Get()

        if m[AntiAim.c_var.c].step_bodyyaw_degree_left:Get() >= m[AntiAim.c_var.c].step_bodyyaw_degree_right:Get() then
            m[AntiAim.c_var.c].step_bodyyaw_degree_left:Set(m[AntiAim.c_var.c].step_bodyyaw_degree_right:Get())
          
        end
        if AntiAim.c_var.bodystep_ticks == m[AntiAim.c_var.c].body_yaw_step_ticks:Get() - 1 then
            if AntiAim.c_var.bodystep_return_value < AntiAim.c_var.bodystep_max then
                AntiAim.c_var.bodystep_return_value = AntiAim.c_var.bodystep_return_value + AntiAim.c_var.bodystep_step
            elseif AntiAim.c_var.bodystep_return_value >= AntiAim.c_var.bodystep_max then
                AntiAim.c_var.bodystep_return_value = AntiAim.c_var.bodystep_min
            end
        end

        if m[AntiAim.c_var.c].yaw_mode:Get() == 0 then
            AntiAim.save_antiaims.yaw_2 = m[AntiAim.c_var.c].static_yaw:Get()
        elseif m[AntiAim.c_var.c].yaw_mode:Get() == 1 then
            AntiAim.save_antiaims.yaw_2 = AntiAim.jitter:tick(m[AntiAim.c_var.c].tick_yaw_left:Get(),m[AntiAim.c_var.c].tick_yaw_right:Get())
        elseif m[AntiAim.c_var.c].yaw_mode:Get() == 2 then
            AntiAim.save_antiaims.yaw_2 = AntiAim.jitter:choke_yaw(m[AntiAim.c_var.c].choke_yaw_left:Get(),m[AntiAim.c_var.c].choke_yaw_right:Get())
        elseif m[AntiAim.c_var.c].yaw_mode:Get() == 3 then
            AntiAim.save_antiaims.yaw_2 = AntiAim.jitter:desync(m[AntiAim.c_var.c].desync_yaw_left:Get(),m[AntiAim.c_var.c].desync_yaw_right:Get())
        end

        if m[AntiAim.c_var.c].yaw_jitter_mode:Get() == 1 then
            if m[AntiAim.c_var.c].yaw_jitter_degree:Get() >= m[AntiAim.c_var.c].yaw_jitter_degree2:Get() then
                m[AntiAim.c_var.c].yaw_jitter_degree:Set(m[AntiAim.c_var.c].yaw_jitter_degree2:Get())
            end
        end

        AntiAim.save_antiaims.yaw_jitter_1 = m[AntiAim.c_var.c].yaw_jitter:Get()
        AntiAim.save_antiaims.yaw_jitter_2 = m[AntiAim.c_var.c].yaw_jitter_mode:Get() == 0 and m[AntiAim.c_var.c].yaw_jitter_degree:Get() or math.random(m[AntiAim.c_var.c].yaw_jitter_degree:Get(), m[AntiAim.c_var.c].yaw_jitter_degree2:Get())
        AntiAim.save_antiaims.body_yaw_1 = m[AntiAim.c_var.c].self_bodyyaw_mode:Get()

        if m[AntiAim.c_var.c].bodyyaw_mode:Get() == 1 then
            AntiAim.save_antiaims.body_yaw_2 = m[AntiAim.c_var.c].bodyyaw_degree:Get()
        elseif m[AntiAim.c_var.c].bodyyaw_mode:Get() == 2 then
            AntiAim.save_antiaims.body_yaw_2 = AntiAim.jitter:choke_body_yaw(m[AntiAim.c_var.c].jitter_bodyyaw_degree_left:Get(), m[AntiAim.c_var.c].jitter_bodyyaw_degree_right:Get())
        elseif m[AntiAim.c_var.c].bodyyaw_mode:Get() == 3 then
            AntiAim.save_antiaims.body_yaw_2 = clamp(AntiAim.c_var.bodystep_return_value, AntiAim.c_var.bodystep_min, AntiAim.c_var.bodystep_max)
        end

        if m[AntiAim.c_var.c].fake_yaw_mode:Get() == 0 then
            AntiAim.save_antiaims.fake_yaw_limit = m[AntiAim.c_var.c].static_fakeyaw:Get()
        elseif m[AntiAim.c_var.c].fake_yaw_mode:Get() == 1 then
            AntiAim.save_antiaims.fake_yaw_limit = AntiAim.jitter:choke_fake(m[AntiAim.c_var.c].jitter_fakeyaw_left:Get(),m[AntiAim.c_var.c].jitter_fakeyaw_right:Get())
        elseif m[AntiAim.c_var.c].fake_yaw_mode:Get() == 2 then
            if m[AntiAim.c_var.c].step_abs:Get() then
                AntiAim.save_antiaims.fake_yaw_limit = math.abs(clamp(AntiAim.c_var.return_value,AntiAim.c_var.min,AntiAim.c_var.max))
            else
                AntiAim.save_antiaims.fake_yaw_limit = clamp(AntiAim.c_var.return_value,AntiAim.c_var.min,AntiAim.c_var.max)
            end
        end
        AntiAim.save_antiaims.freestanding_body_yaw = m[AntiAim.c_var.c].freestanding_bodyyaw:Get()
    end
    Menu.FindVar('Aimbot', 'Anti Aim', 'Main', 'Pitch'):Set(AntiAim.save_antiaims.pitch)

    AntiAim.OverrideYawOffset(AntiAim.override_yaw(cmd, AntiAim.save_antiaims.yaw_2, AntiAim.save_antiaims.yaw_jitter_2, AntiAim.save_antiaims.yaw_jitter_1))
    AntiAim.OverrideLimit(AntiAim.save_antiaims.fake_yaw_limit)

    if AntiAim.save_antiaims.body_yaw_1 == 0 then -- off
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(0)
        AntiAim.OverrideInverter(Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Inverter'):Get() and true or false)
    elseif AntiAim.save_antiaims.body_yaw_1 == 1 then -- opposite
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(1)
        AntiAim.OverrideInverter(Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Inverter'):Get() and true or false)
    elseif AntiAim.save_antiaims.body_yaw_1 == 2 then -- jitter
        AntiAim.OverrideInverter(AntiAim.side ~= 1)
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(1)
    else -- static
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Fake Options'):Set(2, false)
        AntiAim.OverrideInverter(Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Inverter'):Get() and true or false)
        Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'LBY Mode'):Set(0)
    end
  
    Menu.FindVar('Aimbot', 'Anti Aim', 'Main', 'Yaw Add'):Set(0)
  
    Menu.FindVar('Aimbot', 'Anti Aim', 'Fake Angle', 'Freestanding Desync'):Set(AntiAim.save_antiaims.freestanding_body_yaw and 1 or 0)
end

vector_lerp = function(vecSource, vecDestination, flPercentage) return vecSource + (vecDestination - vecSource) * flPercentage end
anti_aims.vecnew = Vector.new()
anti_aims.edge_yaw = function()
    if not ui.anti_aims.antiaim_enable:Get() then return end
    if ui.anti_aims.antiaim_helpers:Get(5) then
        local local_player = EntityList.GetLocalPlayer()
        if local_player == nil then return end
        local flag = EntityList.GetLocalPlayer():GetProp("m_fFlags")
        if (flag == 256 or flag == 262) then -- air
            return
        end
        --if local_player:GetState() == 'Air' then return end
        if ClientState.m_choked_commands == 0 then
            anti_aims.vecnew = local_player:GetEyePosition()
        end
        local trace_end = {}
        local ang_view_angles = EngineClient.GetViewAngles()
        for yaww = 18, 360, 18 do
            local yaww = normalize_yaw(yaww)
            local edge_angle = QAngle.new(0, yaww, 0)
            local vec_trace_end = anti_aims.vecnew + Cheat.AngleToForward(edge_angle) * 0x60
            local traceInfo = EngineTrace.TraceRay(anti_aims.vecnew, vec_trace_end, local_player, 0x200400B)
            if traceInfo.hit_entity and traceInfo.hit_entity:GetClassName() == 'CWorld' and traceInfo.fraction < 0.3 then
                trace_end[#trace_end + 1] = {
                    vec_trace_end = traceInfo.endpos,
                    yaww = yaww
                }
            end
        end
        table.sort(trace_end, function(a, b)
            return a.yaww < b.yaww
        end)
        local edge_angle
        if #trace_end >= 2 then
            local vec_trace_center = vector_lerp(trace_end[1].vec_trace_end, trace_end[#trace_end].vec_trace_end, 0.5)
            edge_angle = Cheat.VectorToAngle(anti_aims.vecnew - vec_trace_center)
        end

        if edge_angle then
            local yaww = ang_view_angles.yaw
            local edgee_yaw = edge_angle.yaw
            local difff = normalize_yaw(edgee_yaw - yaww)
            if math.abs(difff) < 90 then
                difff = 0
                yaww = normalize_yaw(edgee_yaw + 180)
            end
            local new_yaw = -yaww
            new_yaw = normalize_yaw(new_yaw + edgee_yaw + 180)
            new_yaw = normalize_yaw(new_yaw + difff)
            AntiAim.OverrideYawOffset(new_yaw)
        end
    end
end

anti_aims.avoid_backstab = function()
    if ui.anti_aims.antiaim_enable:Get() and ui.anti_aims.antiaim_helpers:Get(4) then
        local all_players = EntityList.GetEntitiesByName('CCSPlayer')
        for i = 1, #all_players do
            local enemy = all_players[i]:GetPlayer()
            if enemy ~= EntityList.GetLocalPlayer() and not enemy:IsTeamMate() and not enemy:IsDormant() and enemy:IsAlive() and enemy:GetActiveWeapon() ~= nil and enemy:GetActiveWeapon():IsKnife() then
                if EntityList.GetLocalPlayer():GetRenderOrigin():DistTo(enemy:GetProp('m_vecOrigin')) <= 300 then
                    AntiAim.OverrideYawOffset(180)
                end
            end
        end
    end
end

anti_aims.antiaim_helpers = function()

    if not ui.anti_aims.antiaim_enable:Get() then return end

        if ui.anti_aims.antiaim_helpers:Get(1) then

            if ui.refs.hideshots:Get() then
                    ui.refs.fakelags:Set(false)
                else
                    ui.refs.fakelags:Set(true)
            end
        end
end

anti_aims.disable_aa_warmup = function()

    local warmup_period = EntityList.GetGameRules():GetProp("m_bWarmupPeriod")

    if  ui.anti_aims.antiaim_enable:Get() and ui.anti_aims.antiaim_helpers:Get(3) then

        if warmup_period == true then
            ui.refs.antiaim:Set(false)
        else
            ui.refs.antiaim:Set(true)
        end

    end

end

anti_aims.exploit_teleport = function()
    if ui.ragebot.tp_in_air:Get() ~= 0 and ui.anti_aims.antiaim_enable:Get() and ui.refs.doubletap:Get() and ui.ragebot.Teleport_In_Air:Get() then
        local allow_teleport = false
        local enable_teleport = false

        local active_weapon = EntityList.GetLocalPlayer():GetActiveWeapon()
        if active_weapon == nil then return end
        local weapon_id = active_weapon:GetWeaponID()

        local guns = {
            is_AWP = weapon_id == 9,
            is_auto = (weapon_id == 38 or weapon_id == 11),
            is_scout = weapon_id == 40,
            is_deagle = weapon_id == 1,
            is_r8 = weapon_id == 64,
            is_nades = active_weapon:IsGrenade(),
            is_pistols = active_weapon:IsPistol() and not is_deagle and not is_r8,
            is_smg = (weapon_id == 34 or weapon_id == 23 or weapon_id == 24 or weapon_id == 19 or weapon_id == 26 or weapon_id == 33 or weapon_id == 17),
            is_shotguns = (weapon_id == 35 or weapon_id == 25 or weapon_id == 27 or weapon_id == 29),
            is_rifle = active_weapon:IsRifle() and not is_smg and not is_shotguns,
            is_taser = weapon_id == 31,
        }
      
        for _, weapons in pairs({
            {Value = 1, active_weapon = guns.is_AWP},
            {Value = 2, active_weapon = guns.is_auto},
            {Value = 3, active_weapon = guns.is_scout},
            {Value = 4, active_weapon = guns.is_deagle},
            {Value = 5, active_weapon = guns.is_r8},
            {Value = 6, active_weapon = guns.is_nades},
            {Value = 7, active_weapon = not (guns.is_AWP or guns.is_auto or guns.is_scout or guns.is_deagle or guns.is_r8 or guns.is_nades or guns.is_pistols or guns.is_rifle or guns.is_smg or guns.is_shotguns or guns.is_taser)},
            {Value = 8, active_weapon = guns.is_pistols},
            {Value = 9, active_weapon = guns.is_rifle},
            {Value = 10, active_weapon = guns.is_smg},
            {Value = 11, active_weapon = guns.is_shotguns},
            {Value = 12, active_weapon = guns.is_taser}
        }) do
            if ui.ragebot.tp_in_air:Get(weapons.Value) and weapons.active_weapon then
                allow_teleport = true
            end
        end

        if allow_teleport then
            all_players = EntityList.GetEntitiesByName('CCSPlayer')
            for i = 1, #all_players do
                enemy = all_players[i]:GetPlayer()
                if not enemy:IsTeamMate() and enemy:IsAlive() and not enemy:IsDormant() and enemy:CanHit() then
                    enable_teleport = true
                end
            end
        end
      
        if enable_teleport and not EntityList.GetLocalPlayer():GetFlag(0) and EntityList.GetLocalPlayer():GetVelocity() > 25 then
            Exploits.ForceTeleport()
        end
    end
end

ffi_functions.ENTITY_LIST_POINTER = ffi.cast('void***', Utils.CreateInterface('client.dll', 'VClientEntityList003')) or error('Failed to find VClientEntityList003!')
ffi_functions.GET_CLIENT_ENTITY_FN = ffi.cast('uintptr_t (__thiscall*)(void*, int)', ffi_functions.ENTITY_LIST_POINTER[0][3])

ffi_functions.get_entity_address = function(entity_index)
    local addr = ffi_functions.GET_CLIENT_ENTITY_FN(ffi_functions.ENTITY_LIST_POINTER, entity_index)
    return addr
end

ffi_functions.hook = {hooks = {}}
ffi_functions.hook.new = function(cast, callback, hook_addr, size, trampoline, org_bytes_tramp)
    local size = size or 5
    local trampoline = trampoline or false
    local new_hook, mt = {}, {}
    local detour_addr = tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, callback))))
    local void_addr = ffi.cast('void*', hook_addr)
    local old_prot = ffi.new('unsigned long[1]')
    local org_bytes = ffi.new('uint8_t[?]', size)
    ffi.copy(org_bytes, void_addr, size)
    if trampoline then
        local alloc_addr = ffi.gc(ffi.C.VirtualAlloc(nil, size + 5, 0x1000, 0x40), function(addr) ffi.C.VirtualFree(addr, 0, 0x8000) end)
        local trampoline_bytes = ffi.new('uint8_t[?]', size + 5, 0x90)
        if org_bytes_tramp then
            local bytes = {}
            for byte in org_bytes_tramp:gmatch('(%x%x)') do
                table.insert(bytes, tonumber(byte, 16))
            end
            trampoline_bytes = ffi.new('uint8_t[?]', size + 5, bytes)
        else
            ffi.copy(trampoline_bytes, org_bytes, size)
        end
        trampoline_bytes[size] = 0xE9
        ffi.cast('uint32_t*', trampoline_bytes + size + 1)[0] = hook_addr - tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, alloc_addr)))) - size
        ffi.copy(alloc_addr, trampoline_bytes, size + 5)
        new_hook.call = ffi.cast(cast, alloc_addr)
        mt = {__call = function(self, ...)
            return self.call(...)
        end}
    else
        new_hook.call = ffi.cast(cast, hook_addr)
        mt = {__call = function(self, ...)
            self.stop()
            local res = self.call(...)
            self.start()
            return res
        end}
    end
    local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
    hook_bytes[0] = 0xE9
    ffi.cast('uint32_t*', hook_bytes + 1)[0] = detour_addr - hook_addr - 5
    new_hook.status = false
    local function set_status(bool)
        new_hook.status = bool
        ffi.C.VirtualProtect(void_addr, size, 0x40, old_prot)
        ffi.copy(void_addr, bool and hook_bytes or org_bytes, size)
        ffi.C.VirtualProtect(void_addr, size, old_prot[0], old_prot)
    end
    new_hook.stop = function() set_status(false) end
    new_hook.start = function() set_status(true) end
    new_hook.start()

    table.insert(ffi_functions.hook.hooks, new_hook)
    return setmetatable(new_hook, mt)
end

anti_aims.is_jumping = false
anti_aims.ground_ticks, anti_aims.end_time = 1, 0
anti_aims.updateCSA_hk = function(thisptr, edx)
    local localplayer = EntityList.GetClientEntity(EngineClient.GetLocalPlayer())
    if localplayer == nil then return anti_aims.updateCSA_fn(thisptr, edx) end
    local lp_ptr = ffi_functions.get_entity_address(EngineClient.GetLocalPlayer())

    if ui.anti_aims.animbreakers:Get(1) then ui.refs.legs:Set(1) end

    if ui.anti_aims.animbreakers:Get() == 0 or not ui.anti_aims.antiaim_enable:Get() then anti_aims.updateCSA_fn(thisptr, edx) return end

    if ui.anti_aims.animbreakers:Get(1) then
        ffi.cast('float*' , lp_ptr+10104)[6] = 1
    end

    if ui.anti_aims.animbreakers:Get(2) then
        ffi.cast('float*' , lp_ptr+10104)[0] = 1
    end

    if ui.anti_aims.animbreakers:Get(3) then
        ffi.cast('float*' , lp_ptr+10104)[12] = 0
    end

    anti_aims.updateCSA_fn(thisptr, edx)

    if ui.anti_aims.animbreakers:Get(1) then
        ffi.cast('float*' , lp_ptr+10104)[6] = 1
    end
  
    if ui.anti_aims.animbreakers:Get(3) then
        if bit.band(EntityList.GetLocalPlayer():GetProp('m_fFlags'), 1) == 1 then
            anti_aims.ground_ticks = anti_aims.ground_ticks + 1
        else
            anti_aims.ground_ticks = 0
            anti_aims.end_time = GlobalVars.curtime + 1
        end
        if not anti_aims.is_jumping and anti_aims.ground_ticks > 1 and anti_aims.end_time > GlobalVars.curtime then
            ffi.cast('float*' , lp_ptr+10104)[12] = 0.5
        end
    end
end

Cheat.RegisterCallback('destroy', function()
    for i, v in ipairs(ffi_functions.hook.hooks) do
        if v.status then
            v.stop()
        end
    end
end)

anti_aims.updateCSA_fn = ffi_functions.hook.new('void(__fastcall*)(void*, void*)', anti_aims.updateCSA_hk, ffi.cast('uintptr_t', Utils.PatternScan('client.dll', '8B F1 80 BE ? ? ? ? ? 74 36', -5))) or error("updateCSA_fn can't hook")
-- @endregion

local draggable = {}
function draggable:new(name, size, init_pos)
    local drag = {}
    local init_pos = init_pos or Vector2.new(100, 100)
    drag.size = size
    drag.x = Menu.SliderInt('Visuals', "draggable elements", name .. "_x", init_pos.x, 0, globals.screen_size.x)
    drag.y = Menu.SliderInt('Visuals', "draggable elements", name .. "_y", init_pos.y, 0, globals.screen_size.y)
    drag.x:SetVisible(false)
    drag.y:SetVisible(false)
    drag.captured = false
    drag.clicked = false
    drag.mouse_offset = Vector2.new(0, 0)

    setmetatable(drag, self)
    self.__index = self
  
    return drag
end

function draggable:get()
    return Vector2.new(self.x:Get(), self.y:Get())
end

function draggable:update()
    if not Cheat.IsMenuVisible() then
        return
    end

    local mouse_pos = Cheat.GetMousePos()
    local mouse_hold = Cheat.IsKeyDown(1)

    if not self.clicked and mouse_hold then
        self.clicked = true
        if not self.captured and mouse_hold and helpers:mouse_in_bounds(self:get(), self:get() + self.size) then
            self.captured = true
            self.mouse_offset = mouse_pos - self:get()
        end
    end

    if not mouse_hold then
        self.captured = false
        self.clicked = false
    end

    if self.captured then
        self.x:Set(mouse_pos.x - self.mouse_offset.x)
        self.y:Set(mouse_pos.y - self.mouse_offset.y)
    end
end

function draggable:set_size(size)
    self.size = size
end

-- @region: widgets
local indicators = {}
indicators.on_plant_time, indicators.fill, indicators.planting_site, indicators.planting = 0, 0, '', false
indicators.Render_Shadow = function(start_pos, endpos, color)
    Render.GradientBoxFilled(start_pos, Vector2.new(start_pos.x + ((endpos.x - start_pos.x) / 2), endpos.y), Color.RGBA(0.0, 0.0, 0.0, 0.0), color, Color.RGBA(0.0, 0.0, 0.0, 0.0), color)
    Render.GradientBoxFilled(Vector2.new(start_pos.x + ((endpos.x - start_pos.x) / 2), start_pos.y), endpos, color, Color.RGBA(0.0, 0.0, 0.0, 0.0), color, Color.RGBA(0.0, 0.0, 0.0, 0.0))
end

indicators.contains = function(table, val)
    for i=1, #table do
        if table[i] == val then
            return true
        end
    end
    return false
end

indicators.clear_planting_info = function()
    planting = false
    fill = 0
    on_plant_time = 0
    planting_site = ''
end

indicators.bomb = function(event)
    typese = {
        'bomb_abortplant', 'bomb_defused', 'bomb_planted', 'round_prestart'
    }
  
    if indicators.contains(typese, event:GetName()) then indicators.clear_planting_info() end
  
    if event:GetName() == 'bomb_beginplant' then
        on_plant_time = GlobalVars.curtime
        planting = true
        bombsite = event:GetInt('site');
        APlants = (454 or 372 or 102 or 276 or 174 or 121 or 301 or 142 or 408 or 97 or 213 or 216)
        if bombsite == APlants then
            planting_site = 'Bombsite A'
        else
            planting_site = 'Bombsite B'
        end
    end
end

indicators.Render_Indicator = function(text, col, cur)
    local position = Vector2.new(20, (globals.screen_size.y / 1.55) + (39 * cur))
    local positionS = Vector2.new(21, (globals.screen_size.y / 1.55 + 1) + (39 * cur))
    local textsize = Render.CalcTextSize(text, 24, fonts.calibrib24)

    indicators.Render_Shadow(Vector2.new(position.x - 10, position.y - 7), Vector2.new(position.x + textsize.x - 10, position.y + textsize.y + 2), Color.RGBA(0, 0, 0, 56 * col.a))

    Render.Text(text, positionS, Color.RGBA(33, 33, 33, 127 * col.a), 24, fonts.calibrib24)
    Render.Text(text, position, col, 24, fonts.calibrib24)
end

widgets = {
    create_window = function(self, s, e, alpha)
        local color = helpers:copy_color(ui.visuals.theme:Get())
        local background_color = Color.new(0, 0, 0, alpha * ui.visuals.theme:Get().a)
        local border_color1 = helpers:alpha_modulate(color, alpha)
        local border_color2 = helpers:alpha_modulate(color, alpha * 0.4)

        Render.Blur(s, e, Color.new(1 - background_color.a, 1 - background_color.a, 1 - background_color.a, alpha), 5)

        if not ui.visuals.disable_blur:Get() then
        Render.Box(s - Vector2.new(6, 6), e + Vector2.new(6, 6), helpers:alpha_modulate(border_color1, alpha * 0.02), 5)
        Render.Box(s - Vector2.new(5, 5), e + Vector2.new(5, 5), helpers:alpha_modulate(border_color1, alpha * 0.03), 5)
        Render.Box(s - Vector2.new(4, 4), e + Vector2.new(4, 4), helpers:alpha_modulate(border_color1, alpha * 0.04), 5)
        Render.Box(s - Vector2.new(3, 3), e + Vector2.new(3, 3), helpers:alpha_modulate(border_color1, alpha * 0.08), 5)
        Render.Box(s - Vector2.new(2, 2), e + Vector2.new(2, 2), helpers:alpha_modulate(border_color1, alpha * 0.13), 5)
        Render.Box(s - Vector2.new(1, 1), e + Vector2.new(1, 1), helpers:alpha_modulate(border_color1, alpha * 0.20), 5)
        end
      
        Render.BoxFilled(s + Vector2.new(5, 0), Vector2.new(e.x - 5, s.y + 1), border_color1)
        Render.BoxFilled(Vector2.new(s.x + 5, e.y - 1), e - Vector2.new(5, 0), border_color2)
        Render.GradientBoxFilled(Vector2.new(s.x, s.y + 5), Vector2.new(s.x + 1, e.y - 5), border_color1, border_color1, border_color2, border_color2)
        Render.GradientBoxFilled(Vector2.new(e.x - 1, s.y + 5), Vector2.new(e.x, e.y - 5), border_color1, border_color1, border_color2, border_color2)
        Render.Circle(s + Vector2.new(5, 5), 5, 8, border_color1, 1, -90, -180)
        Render.Circle(Vector2.new(s.x + 5, e.y - 5), 5, 8, border_color2, 1, 90, 180)
        Render.Circle(e - Vector2.new(5, 5), 5, 8, border_color2, 1, 0, 90)
        Render.Circle(Vector2.new(e.x - 5, s.y + 5), 5, 8, border_color1, 1, -90, 0)
    end,

    keybinds = {
        anims = {},
        drag = draggable:new("keybinds", Vector2.new(150, 20)),
        size = 100,
        alpha = 0,
        draw = function(self)
            if not ui.visuals.widgets:Get(1) then
                return
            end

            self.drag:update()
            local pos = self.drag:get()

            local bind_list = Cheat.GetBinds()
            local render_list = {}
            local opened = Cheat.IsMenuVisible()
            local render_offset = 0
            local raw_size = 100

            for _, bind in pairs(bind_list) do
                local bind_name = bind:GetName()
                if not self.anims[bind_name] then
                    self.anims[bind_name] = 0
                end

                self.anims[bind_name] = helpers:lerp(self.anims[bind_name], bind:IsActive() and 1 or 0)

                if bind:IsActive() then
                    opened = true
                end

                if self.anims[bind_name] > 0.01 then
                    local r_bind = {}

                    r_bind.name = bind_name:lower():gsub("^%l", string.upper)
                    r_bind.value = string.format("[%s]", bind:GetValue())
                    r_bind.alpha = self.anims[bind_name]
                    r_bind.offset = render_offset

                    if r_bind.value == "[on]" or r_bind.value == "[off]" then
                        r_bind.value = bind:GetMode() == 0 and "[toggled]" or "[hold]"
                    end

                    local name_size = Render.CalcTextSize(r_bind.name, 11, fonts.verdana).x + Render.CalcTextSize(r_bind.value, 11, fonts.verdana).x + 15

                    render_offset = render_offset + r_bind.alpha * 16
                    raw_size = math.max(raw_size, name_size)

                    table.insert(render_list, r_bind)
                end
            end

            self.alpha = helpers:lerp(self.alpha, opened and 1 or 0)
            self.size = helpers:lerp(self.size, raw_size)

            if self.alpha < 0.01 then
                return
            end
            widgets:create_window(pos, pos + Vector2.new(self.size, 20), self.alpha)
            helpers:text_shadow("keybinds", pos + Vector2.new(self.size, 20) / 2, Color.new(1, 1, 1, self.alpha), 11, fonts.verdana, true)

            for _, r in pairs(render_list) do
                helpers:text_shadow(r.name, pos + Vector2.new(5, 22 + r.offset), Color.new(1, 1, 1, r.alpha), 11, fonts.verdana)
                helpers:text_shadow(r.value, pos + Vector2.new(self.size - 5 - Render.CalcTextSize(r.value, 11, fonts.verdana).x, 22 + r.offset), Color.new(1, 1, 1, r.alpha), 11, fonts.verdana)
            end
        end
    },
  
    spectators = {
        data = {},
        drag = draggable:new("spectators", Vector2.new(120, 20)),
        size = 100,
        alpha = 0,
        getsteamid64 = function(self, steamid)
            return string.sub(tostring(ffi.new("uint64_t", 76561197960265728) + ffi.new("uint64_t", steamid)), 1, -4)
        end,
        get_list = function(self)
            if not EntityList.GetLocalPlayer() then
                return {}, Cheat.IsMenuVisible()
            end

            local observe_target = EntityList.GetLocalPlayer()

            if EntityList.GetLocalPlayer():GetProp("m_iObserverMode") ~= 0 then
                local ent = EntityList.GetClientEntityFromHandle(EntityList.GetLocalPlayer():GetProp("m_hObserverTarget"))

                if ent and ent:IsPlayer() then
                    observe_target = ent:GetPlayer()
                end
            end

            if not observe_target then
                return {}, Cheat.IsMenuVisible()
            end

            local players = EntityList.GetPlayers()
            local rtn_list = {}
            local opened = Cheat.IsMenuVisible()

            for _, pl in pairs(players) do 
                if pl ~= EntityList.GetLocalPlayer() then
                    local name = pl:GetName()
                    local info = pl:GetPlayerInfo()
                    local steamid = self:getsteamid64(info.iSteamID)

                    if not self.data[steamid] then
                        if not info.fakeplayer then
                            self.data[steamid] = {
                                name = name,
                                alpha = 0,
                            }

                            local player_data = self.data[steamid]

                            player_data.callback1 = function(content)
                                local parsed = json.parse(content).response
                                if not parsed then
                                    return
                                end
                                parsed = parsed.players[0]
                                if not parsed then
                                    return
                                end
                                Http.GetAsync(parsed.avatar, player_data.callback2)
                            end

                            player_data.callback2 = function(content)
                                player_data.avatar = Render.LoadImage(content, Vector2.new(32, 32))
                            end

                            Http.GetAsync("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=E8A1E59F9C119FA9BFB73F29C2A8A109&steamids=" .. steamid, player_data.callback1)
                        else
                            self.data[steamid] = {
                                name = name,
                                alpha = 0,
                                avatar = globals.default_avatar,
                            }
                        end
                    end

                    local data = self.data[steamid]
                    local observer = EntityList.GetClientEntityFromHandle(pl:GetProp("m_hObserverTarget"))
                    local is_observer = (observer and observer:IsPlayer() and observer:GetPlayer() == observe_target)
              
                    if is_observer then
                        opened = true
                    end

                    data.alpha = helpers:lerp(data.alpha, is_observer and 1 or 0)

                    if data.alpha > 0.01 then
                        table.insert(rtn_list, data)
                    end
                end
            end

            return rtn_list, opened
        end,
        draw = function(self)
            if not ui.visuals.widgets:Get(2) then
                return
            end

            self.drag:update()
            local pos = self.drag:get()

            local render_offset = 0
            local raw_size = 100

            local list, opened = self:get_list()

            for _, data in pairs(list) do
                local reneder_pos = pos + Vector2.new(5, 23 + render_offset)

                if not data.avatar then return end
                Render.Image(data.avatar, reneder_pos, Vector2.new(16, 16), Color.new(1, 1, 1, data.alpha))
                helpers:text_shadow(data.name, reneder_pos + Vector2.new(21, 2), Color.new(1, 1, 1, data.alpha), 11, fonts.verdana)

                local size = 30 + Render.CalcTextSize(data.name, 11, fonts.verdana).x

                if size > raw_size then
                    raw_size = size
                end

                render_offset = render_offset + 18 * data.alpha
            end

            self.size = helpers:lerp(self.size, raw_size)
            self.alpha = helpers:lerp(self.alpha, opened and 1 or 0)

            if self.alpha > 0.01 then
                widgets:create_window(pos, pos + Vector2.new(self.size, 20), self.alpha)
                helpers:text_shadow("spectators", pos + Vector2.new(self.size / 2, 10), Color.new(1, 1, 1, self.alpha), 11, fonts.verdana, true)
            end
        end,
    },

    watermark = {
        size = 0,
        draw = function(self)
            if not ui.visuals.widgets:Get(3) then
                return
            end

            local full_text = ""

            if ui.visuals.watermark_info:Get(1) then
                full_text = full_text .. " | " .. ui.visuals.custom_username:Get()
            end

            if ui.visuals.watermark_info:Get(2) then
                full_text = full_text .. " | " .. tostring(math.floor(helpers:get_fps())) .. " fps"
            end

            if ui.visuals.watermark_info:Get(3) then
                local net_channel = EngineClient.GetNetChannelInfo()
                local ping = 0

                if net_channel then
                    ping = net_channel:GetAvgLatency(0)
                end

                full_text = full_text .. " | delay: " .. tostring(math.floor(ping * 1000)) .. "ms"
            end

            if ui.visuals.watermark_info:Get(4) then
                full_text = full_text .. " | " .. tostring(math.floor(1 / GlobalVars.interval_per_tick + 0.5)) .. "tick"
            end

            if ui.visuals.watermark_info:Get(5) then
                full_text = full_text .. " | " .. helpers:get_time()
            end

            local size = Render.CalcTextSize("psycho" .. full_text, 11, fonts.verdana).x + 54
            self.size = helpers:lerp(self.size, size)

            local pos = Vector2.new(globals.screen_size.x - 10 - self.size, 10)
            widgets:create_window(pos, pos + Vector2.new(self.size, 20), 1)
            pos = pos + Vector2.new(6, 3)

            helpers:text_shadow("psy", pos, Color.new(1, 1, 1), 11, fonts.verdana)
            pos.x = pos.x + Render.CalcTextSize("psy", 11, fonts.verdana).x
            helpers:text_shadow("cho", pos, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)
            pos.x = pos.x + Render.CalcTextSize("cho", 11, fonts.verdana).x
            helpers:text_shadow(" [stable]", pos, Color.new(1, 1, 1), 11, fonts.verdana)
            pos.x = pos.x + Render.CalcTextSize(" [stable]", 11, fonts.verdana).x
            helpers:text_shadow(full_text, pos, Color.new(1, 1, 1), 11, fonts.verdana)

        end
    },

    lua_panel = {
        drag = draggable:new("lua_panel", Vector2.new(170, 45), Vector2.new(100, globals.screen_size.y / 2 - 23)),
        draw = function(self)
            if not ui.visuals.widgets:Get(4) then
                return
            end

            self.drag:update()

            local pos = self.drag:get()

            widgets:create_window(pos, pos + Vector2.new(170, 45), 1)

            local cursor = pos + Vector2.new(5, 4)

            helpers:text_shadow("» psycho anti-aim", cursor, Color.new(1, 1, 1), 11, fonts.verdana)
            cursor.x = cursor.x + Render.CalcTextSize("» psycho anti-aim ", 11, fonts.verdana).x
            helpers:text_shadow("technology", cursor, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)
            cursor = Vector2.new(pos.x + 5, cursor.y + 12)

            helpers:text_shadow("» user:", cursor, Color.new(1, 1, 1), 11, fonts.verdana)
            cursor.x = cursor.x + Render.CalcTextSize("» user: ", 11, fonts.verdana).x
            helpers:text_shadow(globals.username, cursor, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)
            cursor = Vector2.new(pos.x + 5, cursor.y + 12)

            helpers:text_shadow("» build: ", cursor, Color.new(1, 1, 1), 11, fonts.verdana)
            cursor.x = cursor.x + Render.CalcTextSize("» build: ", 11, fonts.verdana).x
            helpers:text_shadow("stable", cursor, helpers:alpha_modulate(ui.visuals.theme:Get(), 1), 11, fonts.verdana)

            if ui.visuals.statepanel_image:Get() == 1 then
                Render.Image(globals.avatar, pos + Vector2.new(145, 20), Vector2.new(20, 20))
            elseif ui.visuals.statepanel_image:Get() == 2 then
                Render.Image(globals.logo_avatar2, pos + Vector2.new(134, 15), Vector2.new(30, 30))
            else
                Render.Image(globals.logo_avatar2, pos + Vector2.new(134, 15), Vector2.new(30, 30))
                Render.Image(globals.avatar, pos + Vector2.new(105, 19), Vector2.new(22, 22))
            end

        end
    },

    gamesense = {

        draw = function(self)

            local local_player = EntityList.GetLocalPlayer()
            if not local_player then return end

            if not local_player:IsAlive() then return end
            local cur_dmg = ui.refs.minimum_damage:GetInt()
            if cur_dmg > 100 then cur_dmg = '+'..cur_dmg-100 end
            local isDmg = false
            local isPing = false
            local binds = Cheat.GetBinds()
            for i = 1, #binds do
                bind = binds[i]
                if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                    isDmg = true
                end
                if bind:GetName() == 'Fake Ping' and bind:IsActive() then
                    isPing = true
                end
            end
            local ground = bit.band(local_player:GetProp('m_fFlags'), bit.lshift(1,0)) == 0
            local crouch = local_player:GetProp('m_flDuckAmount')
            local isDmg = false
            local binds = Cheat.GetBinds()
            for i = 1, #binds do
                local bind = binds[i]
                if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                    isDmg = true
                end
            end

            if ui.visuals.gamesense:Get() then
                local current_pos = 1
              
                if ui.visuals.gamesense_choose:Get(1) and isDmg then
                    indicators.Render_Indicator('DMG: '..tostring(cur_dmg), Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
      
                if ui.visuals.gamesense_choose:Get(2) and ui.ragebot.dormant_aimbot:GetBool() then
                    local colors = Color.RGBA(132,196,20,255)
                    for k, v in pairs(rage.player_info_prev) do
                        if k ~= nil then
                            if v[3] == true then
                                colors = Color.RGBA(252,222,30,255)
                                break
                            end
                        end
                    end
                    indicators.Render_Indicator('DA', colors, current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(3) and isPing then
                    local net_channel = EngineClient.GetNetChannelInfo()
                    local outgoing, incoming = net_channel:GetLatency(0), net_channel:GetLatency(1)
                    local ping = math.max(0, (incoming-outgoing)*1000)
                    indicators.Render_Indicator('PING', Color.RGBA(math.floor(255 - ((ping / 189 * 60) * 1.90)), math.floor((ping / 189 * 60) * 3.05), math.floor((ping / 189 * 60) * 0.32), 255), current_pos); current_pos = current_pos - 1;
                end
                local c4 = EntityList.GetEntitiesByClassID(129)[1];
                if ui.visuals.gamesense_choose:Get(4) and c4 ~= nil then
                    local time = c4:GetProp('m_flC4Blow') - GlobalVars.curtime
                    local timer = string.format('%.1f', time)
                    local defused = c4:GetProp('m_bBombDefused')
                    if math.floor(timer) > 0 and not defused then
                        local defusestart = c4:GetProp('m_hBombDefuser') ~= 4294967295
                        local defuselength = c4:GetProp('m_flDefuseLength')
                        local defusetimer = defusestart and (c4:GetProp('m_flDefuseCountDown') - GlobalVars.curtime) / 1 or -1
                        if defusetimer > 0 then
                            local color = math.floor(timer) > defusetimer and Color.RGBA(75, 230, 64, 80) or Color.RGBA(255, 0, 0, 80)
                      
                            local barlength = ((globals.screen_size.y - 50) / defuselength) * (defusetimer)
                            Render.BoxFilled(Vector2.new(0.0, 0.0), Vector2.new(20, globals.screen_size.y), Color.RGBA(32, 32, 32, 50))
                            Render.Box(Vector2.new(0.0, 0.0), Vector2.new(20, globals.screen_size.y), Color.RGBA(32, 32, 32, 50))
                          
                            Render.BoxFilled(Vector2.new(0, globals.screen_size.y - barlength), Vector2.new(19, globals.screen_size.y), color)
                        end
                      
                        local bombsite = c4:GetProp('m_nBombSite') == 0 and 'A' or 'B'
                        local health = EntityList.GetLocalPlayer():GetProp('m_iHealth')
                        local armor = EntityList.GetLocalPlayer():GetProp('m_ArmorValue')
                        local willKill = false
                        local eLoc = c4:GetRenderOrigin()
                        local lLoc = EntityList.GetLocalPlayer():GetRenderOrigin()
                        local distance = eLoc:DistTo(lLoc)
                        local a = 450.7
                        local b = 75.68
                        local c = 789.2
                        local d = (distance - b) / c;
      
                        local damage = a * math.exp(-d * d)
                        if armor > 0 then
                            newDmg = damage * 0.5;
          
                            armorDmg = (damage - newDmg) * 0.5
                            if armorDmg > armor then
                                armor = armor * (1 / .5)
                                newDmg = damage - armorDmg
                            end
                            damage = newDmg;
                        end
                        local dmg = math.ceil(damage)
                        if dmg >= health then
                            willKill = true
                        else
                            willKill = false
                        end
                        indicators.Render_Indicator(bombsite..' - '..string.format('%.1f', timer)..'s', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                        if EntityList.GetLocalPlayer() then
                            if willKill == true then
                                indicators.Render_Indicator('FATAL', Color.RGBA(255, 0, 0, 255), current_pos); current_pos = current_pos - 1;
                            elseif damage > 0.5 then
                                indicators.Render_Indicator('-'..dmg..' HP', Color.RGBA(252, 243, 105, 255), current_pos); current_pos = current_pos - 1;
                            end
                        end
                    end
                end
                if ui.visuals.gamesense_choose:Get(4) and planting then
                    indicators.Render_Indicator(planting_site, Color.RGBA(252, 243, 105, 255), current_pos); current_pos = current_pos - 1;
                    local fill = 3.125 - (3.125 + on_plant_time - GlobalVars.curtime)
                    if fill > 3.125 then
                        fill = 3.125
                    end
                    local ts = Render.CalcTextSize(planting_site, 24, fonts.calibrib24)
                    Render.Circle(Vector2.new(153, globals.screen_size.y / 1.55 + 48 + (39 * current_pos - 1)), 8, 32, Color.RGBA(0, 0, 0, 200), 5)
                    Render.Circle(Vector2.new(153, globals.screen_size.y / 1.55 + 48 + (39 * current_pos - 1)), 8, 32, Color.RGBA(213, 213, 214, 255), 3, -1, (fill/3.3)*375)
                end

                if ui.visuals.gamesense_choose:Get(5) and bit.band(EntityList.GetLocalPlayer():GetProp('m_fFlags'), bit.lshift(1,0)) == 0 then
                    indicators.Render_Indicator('LC', EntityList.GetLocalPlayer():GetVelocity() > 260 and Color.RGBA(132, 196, 20, 255) or Color.RGBA(255, 0, 0, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(6) and ui.refs.fakeduck:Get() then
                    indicators.Render_Indicator('DUCK', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
                if  ui.visuals.gamesense_choose:Get(7) and ui.refs.doubletap:Get() then
                    indicators.Render_Indicator('DT', Exploits.GetCharge() == 1 and Color.RGBA(213, 213, 214, 255) or Color.RGBA(255, 0, 0, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(8) and ui.refs.hideshots:Get() then
                    indicators.Render_Indicator('ONSHOT', Color.RGBA(132, 196, 20, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(9) and ui.refs.yaw_base:Get() == 5 then
                    indicators.Render_Indicator('FS', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
      
                if ui.visuals.gamesense_choose:Get(10) and ui.refs.bodyaim:Get() == 2 then
                    indicators.Render_Indicator('BODY', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
                if ui.visuals.gamesense_choose:Get(11) and ui.refs.safepoints:Get() == 2 then
                    indicators.Render_Indicator('SAFE', Color.RGBA(213, 213, 214, 255), current_pos); current_pos = current_pos - 1;
                end
            end
        end
    },

    indicators = {
        x_add = 0,
        -----------------------
        draw = function(self)
            if not ui.visuals.widgets:Get(5) then return end
                local local_player = EntityList.GetLocalPlayer()
                if not local_player then return end

                if not local_player:IsAlive() then return end
                local cur_dmg = ui.refs.minimum_damage:GetInt()
                if cur_dmg > 100 then cur_dmg = '+'..cur_dmg-100 end
                local isDmg = false
                local isPing = false
                local binds = Cheat.GetBinds()
                for i = 1, #binds do
                    bind = binds[i]
                    if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                        isDmg = true
                    end
                    if bind:GetName() == 'Fake Ping' and bind:IsActive() then
                        isPing = true
                    end
                end
                local ground = bit.band(local_player:GetProp('m_fFlags'), bit.lshift(1,0)) == 0
                local crouch = local_player:GetProp('m_flDuckAmount')
                local isDmg = false
                local binds = Cheat.GetBinds()
                for i = 1, #binds do
                    local bind = binds[i]
                    if bind:GetName() == 'Minimum Damage' and bind:IsActive() then
                        isDmg = true
                    end
                end
                local scope = local_player:GetProp('m_bIsScoped')
                self.x_add = helpers:lerp(self.x_add, scope and 35 or 0, GlobalVars.frametime * 8)

                local alpha = 0
                local y = 0

                if scope then
                    alpha = 0.5
                else
                    alpha = 1
                end
                if globals.indicator_avatar == nil then return end
                if globals.logo_avatar2 == nil then return end
                if fonts.pixel == nil then return end
                if fonts.arrow_fonts == nil then return end
                if fonts.arrow_font2 == nil then return end

                if ui.visuals.indicator_type:Get() == 1 then
                  
                    if not ui.visuals.disable_background:Get() then
                        Render.Image(globals.indicator_avatar, Vector2.new(globals.screen_size.x/2 - 50 +self.x_add, globals.screen_size.y/2 - 2), Vector2.new(100, 75), Color.new(ui.visuals.ghosty_color:GetColor().r, ui.visuals.ghosty_color:GetColor().g, ui.visuals.ghosty_color:GetColor().b, breath(2, ui.visuals.ghosty_color:GetColor().a * 100 / 235)))
                    end

                    Render.Image(globals.logo_avatar2, Vector2.new(globals.screen_size.x/2 - 20 +self.x_add, globals.screen_size.y/2 + 17), Vector2.new(40, 40), Color.new(ui.visuals.ghosty_color:GetColor().r, ui.visuals.ghosty_color:GetColor().g, ui.visuals.ghosty_color:GetColor().b, alpha))
                end
                --if ui.visuals.indicator_type:Get() == 1 then
                --Render.Image(globals.logo_avatar, Vector2.new(globals.screen_size.x/2 - 21 +self.x_add, globals.screen_size.y/2 + 20), Vector2.new(35, 35), Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, alpha))
                --end

                if ui.visuals.indicator_type:Get() == 0 then

                    if not ui.visuals.disable_background:Get() then
                        Render.Image(globals.indicator_avatar, Vector2.new(globals.screen_size.x/2 - 50 +self.x_add, globals.screen_size.y/2 - 8), Vector2.new(100, 75), Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, breath(2, ui.visuals.ind_name_color:GetColor().a * 100 / 235)))
                    end

                    Render.Text('psycho', Vector2.new(globals.screen_size.x/2-17+self.x_add, globals.screen_size.y/2+16), Color.new(0, 0, 0, 0.5), 11, fonts.verdanabd11)
                    Render.Text('psy', Vector2.new(globals.screen_size.x/2-18+self.x_add, globals.screen_size.y/2+15), AntiAim.GetInverterState() and Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, 1) or Color.new(1, 1, 1, 1), 11, fonts.verdanabd11)
                    Render.Text('cho', Vector2.new(globals.screen_size.x/2-1+self.x_add, globals.screen_size.y/2+15), not AntiAim.GetInverterState() and Color.new(ui.visuals.ind_name_color:GetColor().r, ui.visuals.ind_name_color:GetColor().g, ui.visuals.ind_name_color:GetColor().b, 1) or Color.new(1, 1, 1, 1), 11, fonts.verdanabd11)
              
                    if ground then
                        state = 'AIR'
                    elseif crouch >= 1 then
                        state = 'CROUCHING'
                    elseif ui.refs.slowwalk:Get() then
                        state = 'SLOWWALKING'
                    elseif local_player:GetVelocity() > 5 then
                        state = 'MOVING'
                    else
                        state = 'STANDING'
                    end
                    local text_sizes = Render.CalcTextSize(state, 9, fonts.pixel)
                    Render.Text(state, Vector2.new(globals.screen_size.x/2+1-text_sizes.x/2+self.x_add, globals.screen_size.y/2+28), Color.new(ui.visuals.ind_state_color:GetColor().r, ui.visuals.ind_state_color:GetColor().g, ui.visuals.ind_state_color:GetColor().b, 1), 9, fonts.pixel, true)

                    Render.Text('OS', Vector2.new(globals.screen_size.x/2-18+self.x_add, globals.screen_size.y/2+37), ui.refs.hideshots:Get() and Color.new(ui.visuals.ind_color:GetColor().r, ui.visuals.ind_color:GetColor().g, ui.visuals.ind_color:GetColor().b, 1) or Color.new(0.8, 0.8, 0.8, 0.7), 9, fonts.pixel, true)
                    Render.Text('DT', Vector2.new(globals.screen_size.x/2-4+self.x_add, globals.screen_size.y/2+37), ui.refs.doubletap:Get() and (Exploits.GetCharge() >= 0.9 and Color.new(0, 1, 0, 1) or Color.new(1, 0, 0, 1)) or Color.new(0.8, 0.8, 0.8, 0.7), 9, fonts.pixel, true)
                    Render.Text('AP', Vector2.new(globals.screen_size.x/2+9+self.x_add, globals.screen_size.y/2+37), ui.refs.autopeek:Get() and Color.new(ui.visuals.ind_color:GetColor().r, ui.visuals.ind_color:GetColor().g, ui.visuals.ind_color:GetColor().b, 1) or Color.new(0.8, 0.8, 0.8, 0.7), 9, fonts.pixel, true)
                        if isDmg then
                            local text_size = Render.CalcTextSize(('DMG: %s'):format(ui.refs.minimum_damage:Get()), 9, fonts.pixel)
                            Render.Text(('DMG: %s'):format(ui.refs.minimum_damage:Get()), Vector2.new(globals.screen_size.x/2-text_size.x/2+1+self.x_add, globals.screen_size.y/2+46), Color.new(1, 1, 1, 1), 9, fonts.pixel, true)
                        end
                    end
                scope = EntityList.GetLocalPlayer():GetProp("m_bIsScoped")
                alpha = 0.7
      
                if ui.visuals.scope_conditions:Get(4) and scope then
                    alpha = 0
                else
                    if ui.visuals.arrows:GetInt() == 1 then
                        Render.Text('<', Vector2.new(globals.screen_size.x/2-40-ui.visuals.arrows_x:Get(), globals.screen_size.y/2-8), ui.refs.yaw_base:Get() == 3 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 15, fonts.verdana11)
                        Render.Text('>', Vector2.new(globals.screen_size.x/2+31+ui.visuals.arrows_x:Get(), globals.screen_size.y/2-8), ui.refs.yaw_base:Get() == 2 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 15, fonts.verdana11)
                    end

                    if ui.visuals.arrows:GetInt() == 2 then
                        Render.Text('X', Vector2.new(globals.screen_size.x/2-40-ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 3 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                        Render.Text('Z', Vector2.new(globals.screen_size.x/2+31+ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 2 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                    end

                    if ui.visuals.arrows:GetInt() == 3 then
                        Render.Text('w', Vector2.new(globals.screen_size.x/2-40-ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 3 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                        Render.Text('x', Vector2.new(globals.screen_size.x/2+31+ui.visuals.arrows_x:Get(), globals.screen_size.y/2-6), ui.refs.yaw_base:Get() == 2 and Color.new(ui.visuals.arrows_color:GetColor().r, ui.visuals.arrows_color:GetColor().g, ui.visuals.arrows_color:GetColor().b, 1) or Color.new(0.1, 0.1, 0.1, alpha), 16, fonts.arrow_font2)
                    end
                end
            end
        }
}
-- @endregion

-- @region: visuals
local visuals = {}
local scope_anim = 0
visuals.scope = function()
    -- vars
    x,y,w,o = globals.screen_size.x / 2, globals.screen_size.y / 2, ui.visuals.scope_width:GetInt(), ui.visuals.scope_offset:GetInt()
    -- проверки
    local fov_cs_debug = CVar.FindVar("fov_cs_debug")

    if not EngineClient.IsConnected() then return end
    if not EntityList.GetLocalPlayer() then return end
    if not EntityList.GetLocalPlayer():GetProp("m_bIsScoped") then return end
    if ui.visuals.custom_scope:GetBool() then
        ui.refs.scope:SetInt(2)
      
        if scope_anim > 0 then scope_anim = scope_anim - 5
            else scope_anim = 0
        end
        if ui.visuals.scope_conditions:Get(2) then scope_anim = 255 else if scope_anim < 255 then scope_anim = scope_anim + 5 else scope_anim = 255 end end
        if ui.visuals.custom_scope and ui.visuals.scope_conditions:Get(3) and fov_cs_debug:GetInt()~=90 then fov_cs_debug:SetInt(90) end

        if ui.visuals.scope_conditions:Get(1) then
            color1 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, scope_anim / 255)
            color2 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, 0)
        else
            color1 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, 0)
            color2 = Color.new(ui.visuals.custom_scope:GetColor().r, ui.visuals.custom_scope:GetColor().g, ui.visuals.custom_scope:GetColor().b, scope_anim / 255)
        end

        Render.GradientBoxFilled(Vector2.new(x - w - o, y), Vector2.new(x - o, y + 1), color1, color2, color1, color2)
        Render.GradientBoxFilled(Vector2.new(x + w + o, y), Vector2.new(x + o, y + 1), color1, color2, color1, color2)
        Render.GradientBoxFilled(Vector2.new(x, y - o - w), Vector2.new(x + 1, y - o), color1, color1, color2, color2)
        Render.GradientBoxFilled(Vector2.new(x, y + o + w), Vector2.new(x + 1, y + o), color1, color1, color2, color2)
    else
        ui.refs.scope:SetInt(1)
    end
end

visuals.circle_desync = function() 
  
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then return end

     if not local_player:IsAlive() then return end
    if ui.visuals.desync_circle_conditions:Get(2) and ui.visuals.desync_circle:GetBool() then
        CVar.FindVar('crosshair'):SetInt(0)
    else
        CVar.FindVar('crosshair'):SetInt(1)
    end

    if ui.visuals.desync_circle:Get() then

        local color = Color.new(ui.visuals.desync_circle:GetColor().r, ui.visuals.desync_circle:GetColor().g, ui.visuals.desync_circle:GetColor().b, 1)
        local view_angles = EngineClient.GetViewAngles()
        local real_yaw = AntiAim.GetCurrentRealRotation()
        local view_yaw = view_angles.yaw - 180;
        local fake = adjust_angle(real_yaw - view_yaw);
        local delta = math.abs(normalize_yaw(AntiAim.GetCurrentRealRotation() % 360 - AntiAim.GetFakeRotation() % 360)) / 2
        local fake_color = Color.RGBA(math.floor(255 - (delta * 2.29824561404)), math.floor(delta * 3.42105263158), math.floor(delta * 0.22807017543), 255)

        Render.Circle(Vector2.new(globals.screen_size.x/2, globals.screen_size.y/2), 7, 32, Color.new(0, 0, 0, 1), 4, 0, 360)
        Render.Circle(Vector2.new(globals.screen_size.x/2, globals.screen_size.y/2), 7, 32, ui.visuals.desync_circle_conditions:Get(1) and fake_color or color, 4, 90, ui.refs.invert_side == false and -90 or 270)
        Render.Circle(Vector2.new(globals.screen_size.x/2, globals.screen_size.y/2), 15, 32, ui.visuals.desync_circle_conditions:Get(1) and fake_color or color, 4, fake+30, fake-30)
    end
end

visuals.hitmarker = function()
    if not EngineClient.IsConnected() then return end
    if not ui.visuals.hitmarker:Get() then return end

    misc.removeimpact()
    local color = ui.visuals.hitmarker:GetColor()
    local r = color.r local g = color.g local b = color.b local l = ui.visuals.hitmarker_length:Get()

    for i = 1, #t do

        local screen_pos = Render.WorldToScreen(Vector.new(t[i].x, t[i].y, t[i].z))
        local sx,sy = screen_pos.x, screen_pos.y

        Render.BoxFilled(Vector2.new(sx, sy - l), Vector2.new(sx, sy + l), Color.new(r, g, b, (t[i].a / 255)), 1.0)
        Render.BoxFilled(Vector2.new(sx - l, sy), Vector2.new(sx + l, sy), Color.new(r, g, b, (t[i].a / 255)), 1.0)
    end
end

visuals.thirdperson = function()
    if ui.misc.thirdperson:Get() and ui.misc.misc_enable:Get() then
        Menu.FindVar("Visuals", "View", "Thirdperson", "Distance"):Set(ui.misc.thirdperson_distance:Get())
    end
        if ui.misc.thirdperson:Get() and ui.misc.misc_enable:Get() then
            Cheat.SetThirdPersonAnim(not ui.misc.thirdperson_anim:Get())
        else
            Cheat.SetThirdPersonAnim(true)
        end
end
visuals._verification = function(shot)
    local text = ''

    local hg_diff = hgroup ~= aimed_hgroup
    local dmg_diff = shot.damage ~= shot.wanted_damage

    if hg_diff or dmg_diff then
        text = string.format(
            ' | mismatch: [ %s ]', (function()
                local addr = ''

                if dmg_diff then addr = 'dmg: ' .. shot.wanted_damage .. (hg_diff and ' | ' or '') end
                if hg_diff then addr = addr .. (hg_diff and 'hitgroup: ' .. aimed_hgroup or '') end

                return addr
            end)()
        )
    end

    return text
end

local size_changed = false

local text = ''

visuals.glowmenu = function()
    if not ui.misc.menu_customize:Get() then return end
    local menu_pos = Render.GetMenuPos()
    local menu_sz = Render.GetMenuSize()
  
    function force_update()    image_size = Vector2.new(menu_sz.x * 3, menu_sz.y * 3)    end
    if menu_sz.x ~= cache_size.x then force_update() size_changed = true end
    if size_changed == true and cache_size.x == menu_sz.x then force_update() end
    if not Cheat.IsMenuVisible() then return end
  
    if ui.misc.menu_dim:Get() then
        Render.BoxFilled(Vector2.new(0.0, 0.0), Vector2.new(EngineClient.GetScreenSize().x, EngineClient.GetScreenSize().y), Color.new(0, 0, 0, ui.misc.dim_slider:GetFloat()))
    end

    if ui.misc.menu_blur:Get() then

        Render.Blur(Vector2.new(0.0, 0.0), Vector2.new(EngineClient.GetScreenSize().x, EngineClient.GetScreenSize().y), Color.new(1, 1, 1, ui.misc.blur_slider:GetFloat()))
    end
  
    if ui.misc.menu_glow:Get() then
        local alpha = 0
        if ui.misc.glow_pulse:Get() then
                alpha = breath(2, ui.misc.color_edit:GetColor().a * 175 / 235)
            else
                alpha = ui.misc.color_edit:GetColor().a
        end

        Render.Image(globals.background, Vector2.new(menu_pos.x - menu_sz.x, menu_pos.y - menu_sz.y), image_size, Color.new(ui.misc.color_edit:GetColor().r, ui.misc.color_edit:GetColor().g, ui.misc.color_edit:GetColor().b, alpha ))
    end
end

visuals.events = function(event)

    local name = event:GetName()
    if name == "player_hurt" then
        local attacker = event:GetInt("attacker")

        if EntityList.GetPlayerForUserID(attacker) == globals.local_player then
      
            if ui.visuals.widgets:Get(6) and ui.visuals.log_type:Get(1) then
                local player = EntityList.GetPlayerForUserID(event:GetInt("userid"))

                if not player then
                    return
                end

                local hitgroup_names = {
                    [0] = "generic",
                    [1] = "head",
                    [2] = "chest",
                    [3] = "stomach",
                    [4] = "left arm",
                    [5] = "right arm",
                    [6] = "left leg",
                    [7] = "right leg",
                    [10] = "gear"
                }

                logs:add(string.format("Hit %s in the %s for %d damage (%d health remaining)", player:GetName(), hitgroup_names[event:GetInt("hitgroup")] or "?", event:GetInt("dmg_health"), event:GetInt("health")))
            end
        end
    end

    if name == "bullet_impact" then
        local fire_plr = EntityList.GetPlayerForUserID(event:GetInt("userid"))
        local localplayer = EntityList.GetLocalPlayer()
            if fire_plr ~= localplayer then
                return
            end
         table.insert(t, {
            x = event:GetInt("x"),
            y = event:GetInt("y"),
            z = event:GetInt("z"),
            a = 255,
            ctime = GlobalVars.curtime,
         })
    end

    if name == 'player_connect_full' then
        t = {}
    end

    if name == "player_hurt" then
        local localplayer = EntityList.GetLocalPlayer()
        local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker"))
        if ui.misc.hitsound:Get() and ui.misc.misc_enable:Get() then
            if attacker == localplayer then
                EngineClient.ExecuteClientCmd(string.format("playvol %s %s", ui.misc.hitsound_direction:Get(), ui.misc.hitsound_volume:Get()))
            end
        end
    end

    if name == 'player_hurt' then
        local weapon = event:GetString('weapon', '');
        if (weapon == 'hegrenade' or weapon == 'inferno' or weapon == 'knife') then
            if event:GetInt('userid') == nil then return end
            if event:GetInt('attacker') == nil then return end
            local attacker_id = EntityList.GetPlayerForUserID(event:GetInt('attacker'))
            if attacker_id == nil or attacker_id ~= EntityList.GetLocalPlayer() then
                return
            end
          
            local hittype = 'Hit'
            if weapon == 'hegrenade' then
                hittype = 'Naded';
            elseif weapon == 'inferno' then
                hittype = 'Burned';
            elseif weapon == 'knife' then
                hittype = 'Knifed';
            end
            local server_damage = event:GetInt('dmg_health')
            local target_id = EntityList.GetPlayerForUserID(event:GetInt('userid'))
            if target_id == nil then return end
            local target_name = string.lower(target_id:GetName())
            local health = target_id:GetProp('m_iHealth')-server_damage
            if health < 0 then health = 0 end
            text = string.format('%s %s for %i damage (%i remaining)', hittype, target_name, server_damage, health)
            if ui.visuals.log_type:Get(3) then
                ffi_functions.color_print1(Color.RGBA(255, 162, 163, 255), '[psycho] ')
                ffi_functions.color_print1(Color.RGBA(216, 216, 216, 255), text..'\n')

                table.insert(hitlogs, {text = text, time = GlobalVars.realtime})

            end
        end
    end

end
local hitgroup_names1 = { 'generic', 'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' }

visuals.ragebot_shot = function(shot)
    miss_hitbox = missgroup_names[shot.hitgroup] or '?'
end

visuals.registered_shot = function(shot)

    hit_id = hit_id + 1
    shot_id = num_format((hit_id % 15) + 1)
    local safety = Menu.FindVar('Aimbot', 'Ragebot', 'Misc', 'Safe Points'):Get()
    local name = string.lower(EntityList.GetClientEntity(shot.target_index):GetPlayer():GetName())
    if name == nil then return end
    local hgroup = hitgroup_names1[shot.hitgroup + 1] or '?'
    local hit_chance = tostring(math.floor(shot.hitchance + 0.5))
    local backtrack = shot.backtrack
    local m_iHealth = EntityList.GetClientEntity(shot.target_index):GetPlayer():GetProp('m_iHealth')
    if m_iHealth == nil then return end
    local health = m_iHealth - shot.damage
    if health < 0 then health = 0 end
    local aimed_hgroup = hitgroup_names1[shot.wanted_hitgroup + 1] or '?'
  
    local feet_yaw = math.min(58, math.max(yaw_normalize(EntityList.GetClientEntity(shot.target_index):GetPlayer():GetProp('m_flPoseParameter')[12] * 120 - 60), -58))
    if EntityList.GetClientEntity(shot.target_index):GetPlayer():GetProp('m_flPoseParameter') == nil then return end
    if feet_yaw == nil then return end
    local ping = EngineClient.GetNetChannelInfo():GetLatency(0)*1000
    local avg_ping = EngineClient.GetNetChannelInfo():GetAvgLatency(0)*1000
    --if shot.reason == nil or hit_id == nil or aimed_hgroup == nil or shot_id == nil or feet_yaw == nil or safety == nil or name == nil or hit_chance == nil or ping == nil or avg_ping == nil then return end
    local netChannelInfo = ffi.cast('void***', getNetChannelInfo(I_EngineClientPtr)) or error('netchaninfo is nil')
    local netChannel = GetNetChannel(netChannelInfo)
    local net_state = string.format(
        'delay: %d:%.2f | dropped: %.0f',
        avg_ping, math.abs(avg_ping-ping), (netChannel.AvgLoss*100)
    )
  
    local uflags = {
        math.abs(avg_ping-ping) < 1 and 0 or 1,
        CVar.FindVar('cl_clock_correction'):GetInt() == 1 and 0 or 1,
        CVar.FindVar('cl_clock_correction_force_server_tick') == 999 and 0 or 1
    }

    local pflags = {
        ClientState.m_choked_commands > 1 and 1 or 0,
        EntityList.GetLocalPlayer():GetProp('m_flVelocityModifier') < 1.00 and 1 or 0,
        (EntityList.GetLocalPlayer():GetRenderOrigin().z <= EntityList.GetClientEntity(shot.target_index):GetPlayer():GetRenderOrigin().z) and 1 or 0
    }

    local correction = Menu.FindVar('Aimbot', 'Ragebot', 'Main', 'Override Resolver'):GetBool()
  
    if shot.reason == 0 then
        text = string.format('Registered %s shot in %s\'s %s for %d damage [angle: %.2f° | %d:%d°] ( hitchance: %s%% | safety: %s | history(Δ): %d | flags: %s%s )',
        shot_id, name, hgroup, shot.damage, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, hit_chance, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags), visuals._verification(shot))
        textc = string.format('Registered %s shot in %s\'s %s for %d damage [angle: %.2f° | %d:%d°] ( hitchance: %s | safety: %s | history(Δ): %d | flags: %s%s )',
        shot_id, name, hgroup, shot.damage, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, hit_chance .. '%%', safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags), visuals._verification(shot))
    elseif shot.reason == 1 then
        shot_reason = (shot.reason == 1 and total_hits ~= EntityList.GetLocalPlayer():GetProp('m_totalHitsOnServer')) and 'damage rejection' or string.format('unknown [angle: %.2f° | %d:%d°]', shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw)
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to %s ( dmg: %d | safety: %d | history(Δ): %d | flags: %s )',
        shot_id, name, miss_hitbox, hit_chance, shot_reason, shot.wanted_damage, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags))
    elseif shot.reason == 2 then
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to spread [angle: %.2f° | %d:%d°] ( dmg: %d | safety: %d | history(Δ): %d | flags: %s )',
        shot_id, name, miss_hitbox, hit_chance, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, shot.wanted_damage, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags))
    elseif shot.reason == 3 then
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to occlusion [angle: %.2f° | %d:%d°] ( dmg: %d | safety: %d | history(Δ): %d | flags: %s )',
        shot_id, name, miss_hitbox, hit_chance, shot.spread_degree, correction and 1 or 0, (feet_yaw < 10 and feet_yaw > -10) and 0 or feet_yaw, shot.wanted_damage, safety == 2 and 2 or (safety == 1 and 1 or 0), backtrack, table.concat(pflags))
    elseif shot.reason == 4 then
        text1 = string.format('Missed %s shot at %s\'s %s(%s%%) due to prediction error [%s] [vel_modifier: %.1f | history(Δ): %d | error: %s]',
        shot_id, name, miss_hitbox, hit_chance, net_state, EntityList.GetLocalPlayer():GetProp('m_flVelocityModifier'), backtrack, table.concat(uflags))
    end
    if ui.visuals.log_type:Get(3) then

        if shot.reason == 0 then
            ffi_functions.color_print1(Color.RGBA(255, 162, 163, 255), '[psycho] ')
            ffi_functions.color_print1(Color.RGBA(216, 216, 216, 255), textc..'\n')
        else
            ffi_functions.color_print1(Color.RGBA(255, 162, 163, 255), '[psycho] ')
            ffi_functions.color_print1(Color.RGBA(216, 216, 216, 200), text1..'\n')
        end

        table.insert(hitlogs, {text = text, time = GlobalVars.realtime})
    end

end

-- @endregion

-- @region: world
local world = {}
world.sun_set = function()
    if not ui.world.world_enable:GetBool() then return end
    local CCascadeLights = EntityList.GetEntitiesByName('CCascadeLight')
    if not CCascadeLights == nil then return end
    for i=1, #CCascadeLights do
        local CCascadeLight = CCascadeLights[i]
        if ui.world.sunset:GetBool() then
            if CCascadeLight:GetProp('m_shadowDirection') ~= Vector.new(ui.world.shadow_x:Get(), ui.world.shadow_y:Get(), ui.world.shadow_z:Get()) then
                CCascadeLight:SetProp('m_shadowDirection', Vector.new(ui.world.shadow_x:Get(), ui.world.shadow_y:Get(), ui.world.shadow_z:Get()))
                CCascadeLight:SetProp('m_envLightShadowDirection', Vector.new(ui.world.shadow_x:Get(), ui.world.shadow_y:Get(), ui.world.shadow_z:Get()))
            end
            if CCascadeLight:GetProp('m_flMaxShadowDist') ~= ui.world.shadow_dist:Get() then
                CCascadeLight:SetProp('m_flMaxShadowDist', ui.world.shadow_dist:Get())
            end
        else
            if CCascadeLight:GetProp('m_shadowDirection') ~= Vector.new(0, 0, 0) then
                CCascadeLight:SetProp('m_shadowDirection', Vector.new(0, 0, 0))
                CCascadeLight:SetProp('m_envLightShadowDirection', Vector.new(0, 0, 0))
            end
        end
    end
end

local materials = {
    "particle/fire_burning_character/fire_env_fire_depthblend_oriented", "particle/fire_burning_character/fire_burning_character", "particle/fire_explosion_1/fire_explosion_1_oriented", "particle/fire_explosion_1/fire_explosion_1_bright", "particle/fire_burning_character/fire_burning_character_depthblend", "particle/fire_burning_character/fire_env_fire_depthblend",
}

world.molotov = function()
    for _, v in pairs(materials) do
        local material = MatSystem.FindMaterial(v, "")

        if material ~= nil then
            material:SetMaterialVarFlag(bit.lshift(1, 28), ui.world.molly_conditions:Get(1) and ui.world.world_enable:GetBool())
            material:SetMaterialVarFlag(bit.lshift(1, 15), ui.world.molly_conditions:Get(2) and ui.world.world_enable:GetBool())
        end
    end

end

-- effects
world.effects = function()
    if not ui.world.enable_bloom:Get() and ui.world.world_enable:Get() then return end
    if not EntityList.GetLocalPlayer() then
        return
    end

        local ambient = CVar.FindVar('r_modelAmbientMin')

        local CETC = EntityList.GetEntitiesByName('CEnvTonemapController')

        for idx, entity in pairs(CETC) do
            entity:SetProp('m_bUseCustomAutoExposureMin', true)
            entity:SetProp('m_bUseCustomAutoExposureMax', true)
            entity:SetProp('m_bUseCustomBloomScale', true)
            entity:SetProp('m_flCustomAutoExposureMin', ui.world.exposure:GetFloat() / 10);
            entity:SetProp('m_flCustomAutoExposureMax', ui.world.exposure:GetFloat() / 10);
            entity:SetProp('m_flCustomBloomScale', ui.world.bloom:GetFloat() / 10);
        end

        ambient:SetFloat(ui.world.model_ambient:GetFloat() / 10)

end

world.custom_skybox = function()
    if ui.world.custom_skybox:GetBool() and ui.world.world_enable:GetBool() then
        skybox_color = ui.world.custom_skybox:GetColor()
        skyboxname = ui.world.skybox_choose:GetString()
        cvar = CVar.FindVar("sv_skyname")
        ui.refs.skybox:SetInt(0)
        ui.refs.skybox:SetColor(skybox_color)
        cvar:SetString(skyboxname)
    else
        return 
    end
end
-- @endregion

logs = {
    logs = {},
    draw = function(self)
        local draw_offset = 50

        for _, log in pairs(self.logs) do
            local expired = log.expire_time < GlobalVars.realtime

            if expired then
                log.alpha = helpers:lerp(log.alpha, 0)
                log.pos = helpers:lerp(log.pos, 0)
            else
                log.alpha = helpers:lerp(log.alpha, 1)
                log.pos = helpers:lerp(log.pos, draw_offset)
                draw_offset = draw_offset + 30
            end

            if log.alpha < 0.01 and expired then
                table.remove(self.logs, _)
            else
                local size = Render.CalcTextSize(log.text, 11, fonts.verdana).x
                local pos = Vector2.new((globals.screen_size.x - size) * 0.5 - 5, globals.screen_size.y - log.pos)
                widgets:create_window(pos, pos + Vector2.new(size + 10, 20), log.alpha)
                Render.Text(log.text, pos + Vector2.new(5, 4), Color.new(1, 1, 1, log.alpha), 11, fonts.verdana)
            end
        end
    end,
    add = function(self, text)
        local log = {
            text = text,
            expire_time = GlobalVars.realtime + 5,
            pos = 0,
            alpha = 0,
        }

        table.insert(self.logs, log)
    end
}

-- @region: config system
ffi_functions.VGUI_System = ffi.cast(ffi.typeof('void***'), Utils.CreateInterface('vgui2.dll', 'VGUI_System010'))
ffi_functions.get_clipboard_text_length = ffi.cast('get_clipboard_text_length', ffi_functions.VGUI_System[0][7])
ffi_functions.get_clipboard_text = ffi.cast('get_clipboard_text', ffi_functions.VGUI_System[0][11])
ffi_functions.set_clipboard_text = ffi.cast('set_clipboard_text', ffi_functions.VGUI_System[0][9])

cfg_system.set_clipboard = function(text)
    ffi_functions.set_clipboard_text(ffi_functions.VGUI_System, text, #text)
end

cfg_system.get_clipboard = function()
    local clipboard_text_length = ffi_functions.get_clipboard_text_length(ffi_functions.VGUI_System)

    if (clipboard_text_length > 0) then
        local buffer = ffi.new('char[?]', clipboard_text_length)

        ffi_functions.get_clipboard_text(ffi_functions.VGUI_System, 0, buffer, clipboard_text_length * ffi.sizeof('char[?]', clipboard_text_length))
        return ffi.string(buffer, clipboard_text_length - 1)
    end

    return ''
end

cfg_system.cfg_data = {
    bools = {
        ui.anti_aims.custom[1].enable, ui.anti_aims.custom[2].enable, ui.anti_aims.custom[3].enable, ui.anti_aims.custom[4].enable, ui.anti_aims.custom[5].enable, ui.anti_aims.custom[6].enable,
        ui.anti_aims.custom[1].freestanding_bodyyaw, ui.anti_aims.custom[2].freestanding_bodyyaw, ui.anti_aims.custom[3].freestanding_bodyyaw, ui.anti_aims.custom[4].freestanding_bodyyaw, ui.anti_aims.custom[5].freestanding_bodyyaw, ui.anti_aims.custom[6].freestanding_bodyyaw,
        ui.anti_aims.custom[1].step_abs, ui.anti_aims.custom[2].step_abs, ui.anti_aims.custom[3].step_abs, ui.anti_aims.custom[4].step_abs, ui.anti_aims.custom[5].step_abs, ui.anti_aims.custom[6].step_abs,
        ui.misc.misc_enable,
        ui.misc.slowwalk_c,
        ui.misc.hitsound,
        ui.world.custom_skybox,
        ui.world.world_enable,
        ui.world.sunset,
        ui.visuals.visuals_enable,
        ui.visuals.disable_blur,
        ui.visuals.disable_background,
        ui.visuals.custom_scope,
        ui.visuals.desync_circle,
        ui.visuals.hitmarker,
        ui.anti_aims.antiaim_enable,
        ui.misc.menu_glow,
        ui.misc.glow_pulse,
        ui.misc.menu_dim,
        ui.misc.menu_blur,
        ui.misc.menu_customize,
        ui.misc.thirdperson,
        ui.ragebot.maxmissed,
        ui.misc.thirdperson_anim,
        ui.world.enable_bloom,
        ui.misc.clantag,
        ui.ragebot.dormant_aimbot,
        ui.ragebot.doubletap_recharge,
        ui.ragebot.override_doubletap,
        ui.ragebot.Teleport_In_Air,
        ui.visuals.gamesense,
        ui.ragebot.bodyaims,
        ui.misc.color_override,
        ui.misc.autopeek,
        ui.misc.quick_peek

    },
    ints = {
        ui.anti_aims.custom[1].yaw_mode, ui.anti_aims.custom[2].yaw_mode, ui.anti_aims.custom[3].yaw_mode, ui.anti_aims.custom[4].yaw_mode, ui.anti_aims.custom[5].yaw_mode, ui.anti_aims.custom[6].yaw_mode,
        ui.anti_aims.custom[1].static_yaw, ui.anti_aims.custom[2].static_yaw, ui.anti_aims.custom[3].static_yaw, ui.anti_aims.custom[4].static_yaw, ui.anti_aims.custom[5].static_yaw, ui.anti_aims.custom[6].static_yaw,
        ui.anti_aims.custom[1].tick_yaw_left, ui.anti_aims.custom[2].tick_yaw_left, ui.anti_aims.custom[3].tick_yaw_left, ui.anti_aims.custom[4].tick_yaw_left, ui.anti_aims.custom[5].tick_yaw_left, ui.anti_aims.custom[6].tick_yaw_left,
        ui.anti_aims.custom[1].tick_yaw_right, ui.anti_aims.custom[2].tick_yaw_right, ui.anti_aims.custom[3].tick_yaw_right, ui.anti_aims.custom[4].tick_yaw_right, ui.anti_aims.custom[5].tick_yaw_right, ui.anti_aims.custom[6].tick_yaw_right,
        ui.anti_aims.custom[1].choke_yaw_left, ui.anti_aims.custom[2].choke_yaw_left, ui.anti_aims.custom[3].choke_yaw_left, ui.anti_aims.custom[4].choke_yaw_left, ui.anti_aims.custom[5].choke_yaw_left, ui.anti_aims.custom[6].choke_yaw_left,
        ui.anti_aims.custom[1].choke_yaw_right, ui.anti_aims.custom[2].choke_yaw_right, ui.anti_aims.custom[3].choke_yaw_right, ui.anti_aims.custom[4].choke_yaw_right, ui.anti_aims.custom[5].choke_yaw_right, ui.anti_aims.custom[6].choke_yaw_right,
        ui.anti_aims.custom[1].desync_yaw_left, ui.anti_aims.custom[2].desync_yaw_left, ui.anti_aims.custom[3].desync_yaw_left, ui.anti_aims.custom[4].desync_yaw_left, ui.anti_aims.custom[5].desync_yaw_left, ui.anti_aims.custom[6].desync_yaw_left,
        ui.anti_aims.custom[1].desync_yaw_right, ui.anti_aims.custom[2].desync_yaw_right, ui.anti_aims.custom[3].desync_yaw_right, ui.anti_aims.custom[4].desync_yaw_right, ui.anti_aims.custom[5].desync_yaw_right, ui.anti_aims.custom[6].desync_yaw_right,
        ui.anti_aims.custom[1].yaw_jitter, ui.anti_aims.custom[2].yaw_jitter, ui.anti_aims.custom[3].yaw_jitter, ui.anti_aims.custom[4].yaw_jitter, ui.anti_aims.custom[5].yaw_jitter, ui.anti_aims.custom[6].yaw_jitter,
        ui.anti_aims.custom[1].yaw_jitter_degree, ui.anti_aims.custom[2].yaw_jitter_degree, ui.anti_aims.custom[3].yaw_jitter_degree, ui.anti_aims.custom[4].yaw_jitter_degree, ui.anti_aims.custom[5].yaw_jitter_degree, ui.anti_aims.custom[6].yaw_jitter_degree,
        ui.anti_aims.custom[1].yaw_jitter_degree, ui.anti_aims.custom[2].yaw_jitter_degree2, ui.anti_aims.custom[3].yaw_jitter_degree2, ui.anti_aims.custom[4].yaw_jitter_degree2, ui.anti_aims.custom[5].yaw_jitter_degree2, ui.anti_aims.custom[6].yaw_jitter_degree2,
    
        ui.anti_aims.custom[1].self_bodyyaw_mode, ui.anti_aims.custom[2].self_bodyyaw_mode, ui.anti_aims.custom[3].self_bodyyaw_mode, ui.anti_aims.custom[4].self_bodyyaw_mode, ui.anti_aims.custom[5].self_bodyyaw_mode, ui.anti_aims.custom[6].self_bodyyaw_mode,
        ui.anti_aims.custom[1].bodyyaw_mode, ui.anti_aims.custom[2].bodyyaw_mode, ui.anti_aims.custom[3].bodyyaw_mode, ui.anti_aims.custom[4].bodyyaw_mode, ui.anti_aims.custom[5].bodyyaw_mode, ui.anti_aims.custom[6].bodyyaw_mode,
        ui.anti_aims.custom[1].bodyyaw_degree, ui.anti_aims.custom[2].bodyyaw_degree, ui.anti_aims.custom[3].bodyyaw_degree, ui.anti_aims.custom[4].bodyyaw_degree, ui.anti_aims.custom[5].bodyyaw_degree, ui.anti_aims.custom[6].bodyyaw_degree,
        ui.anti_aims.custom[1].jitter_bodyyaw_degree_left, ui.anti_aims.custom[2].jitter_bodyyaw_degree_left, ui.anti_aims.custom[3].jitter_bodyyaw_degree_left, ui.anti_aims.custom[4].jitter_bodyyaw_degree_left, ui.anti_aims.custom[5].jitter_bodyyaw_degree_left, ui.anti_aims.custom[6].jitter_bodyyaw_degree_left,
        ui.anti_aims.custom[1].jitter_bodyyaw_degree_right, ui.anti_aims.custom[2].jitter_bodyyaw_degree_right, ui.anti_aims.custom[3].jitter_bodyyaw_degree_right, ui.anti_aims.custom[4].jitter_bodyyaw_degree_right, ui.anti_aims.custom[5].jitter_bodyyaw_degree_right, ui.anti_aims.custom[6].jitter_bodyyaw_degree_right,
        ui.anti_aims.custom[1].step_bodyyaw_degree_left, ui.anti_aims.custom[2].step_bodyyaw_degree_left, ui.anti_aims.custom[3].step_bodyyaw_degree_left, ui.anti_aims.custom[4].step_bodyyaw_degree_left, ui.anti_aims.custom[5].step_bodyyaw_degree_left, ui.anti_aims.custom[6].step_bodyyaw_degree_left,
        ui.anti_aims.custom[1].step_bodyyaw_degree_right, ui.anti_aims.custom[2].step_bodyyaw_degree_right, ui.anti_aims.custom[3].step_bodyyaw_degree_right, ui.anti_aims.custom[4].step_bodyyaw_degree_right, ui.anti_aims.custom[5].step_bodyyaw_degree_right, ui.anti_aims.custom[6].step_bodyyaw_degree_right,
        ui.anti_aims.custom[1].body_yaw_step_ticks, ui.anti_aims.custom[2].body_yaw_step_ticks, ui.anti_aims.custom[3].body_yaw_step_ticks, ui.anti_aims.custom[4].body_yaw_step_ticks, ui.anti_aims.custom[5].body_yaw_step_ticks, ui.anti_aims.custom[6].body_yaw_step_ticks,
        ui.anti_aims.custom[1].body_yaw_step_value, ui.anti_aims.custom[2].body_yaw_step_value, ui.anti_aims.custom[3].body_yaw_step_value, ui.anti_aims.custom[4].body_yaw_step_value, ui.anti_aims.custom[5].body_yaw_step_value, ui.anti_aims.custom[6].body_yaw_step_value,

        ui.anti_aims.custom[1].fake_yaw_mode, ui.anti_aims.custom[2].fake_yaw_mode, ui.anti_aims.custom[3].fake_yaw_mode, ui.anti_aims.custom[4].fake_yaw_mode, ui.anti_aims.custom[5].fake_yaw_mode, ui.anti_aims.custom[6].fake_yaw_mode,
        ui.anti_aims.custom[1].static_fakeyaw, ui.anti_aims.custom[2].static_fakeyaw, ui.anti_aims.custom[3].static_fakeyaw, ui.anti_aims.custom[4].static_fakeyaw, ui.anti_aims.custom[5].static_fakeyaw, ui.anti_aims.custom[6].static_fakeyaw,
        ui.anti_aims.custom[1].jitter_fakeyaw_left, ui.anti_aims.custom[2].jitter_fakeyaw_left, ui.anti_aims.custom[3].jitter_fakeyaw_left, ui.anti_aims.custom[4].jitter_fakeyaw_left, ui.anti_aims.custom[5].jitter_fakeyaw_left, ui.anti_aims.custom[6].jitter_fakeyaw_left,
        ui.anti_aims.custom[1].jitter_fakeyaw_right, ui.anti_aims.custom[2].jitter_fakeyaw_right, ui.anti_aims.custom[3].jitter_fakeyaw_right, ui.anti_aims.custom[4].jitter_fakeyaw_right, ui.anti_aims.custom[5].jitter_fakeyaw_right, ui.anti_aims.custom[6].jitter_fakeyaw_right,
        ui.anti_aims.custom[1].step_ticks, ui.anti_aims.custom[2].step_ticks, ui.anti_aims.custom[3].step_ticks, ui.anti_aims.custom[4].step_ticks, ui.anti_aims.custom[5].step_ticks, ui.anti_aims.custom[6].step_ticks,
        ui.anti_aims.custom[1].step_value, ui.anti_aims.custom[2].step_value, ui.anti_aims.custom[3].step_value, ui.anti_aims.custom[4].step_value, ui.anti_aims.custom[5].step_value, ui.anti_aims.custom[6].step_value,
        ui.anti_aims.custom[1].step_fake_min, ui.anti_aims.custom[2].step_fake_min, ui.anti_aims.custom[3].step_fake_min, ui.anti_aims.custom[4].step_fake_min, ui.anti_aims.custom[5].step_fake_min, ui.anti_aims.custom[6].step_fake_min,
        ui.anti_aims.custom[1].step_fake_max, ui.anti_aims.custom[2].step_fake_max, ui.anti_aims.custom[3].step_fake_max, ui.anti_aims.custom[4].step_fake_max, ui.anti_aims.custom[5].step_fake_max, ui.anti_aims.custom[6].step_fake_max,
        ui.anti_aims.custom[1].extra_options, ui.anti_aims.custom[2].extra_options, ui.anti_aims.custom[3].extra_options, ui.anti_aims.custom[4].extra_options, ui.anti_aims.custom[5].extra_options, ui.anti_aims.custom[6].extra_options,
        ui.misc.slowwalk_slider,
        ui.world.shadow_dist,
        ui.world.molly_conditions,
        ui.visuals.widgets,
        ui.visuals.watermark_info,
        ui.visuals.statepanel_image,
        ui.visuals.log_type,
        ui.visuals.indicator_type,
        ui.visuals.arrows,
        ui.visuals.arrows_x,
        ui.visuals.scope_width,
        ui.visuals.scope_offset,
        ui.visuals.scope_conditions,
        ui.visuals.desync_circle_conditions,
        ui.visuals.hitmarker_length,
      
        ui.anti_aims.antiaim_helpers,
        ui.ragebot.tp_in_air,
        ui.anti_aims.animbreakers,
        ui.misc.thirdperson_distance,
        ui.ragebot.maxmissed_c,
        ui.ragebot.dormant_aimbot_damage,
        ui.ragebot.doubletap_speed,
        ui.visuals.gamesense_choose,
        ui.ragebot.baimhp,
        ui.ragebot.baimmode,
        ui.ragebot.hitchances,
        ui.ragebot.air_hitchance,
        ui.ragebot.noscope_hitchance,

    },

    floats = {
        ui.misc.hitsound_volume,
        ui.world.shadow_x,
        ui.world.shadow_y,
        ui.world.shadow_z,
        ui.misc.blur_slider,
        ui.misc.dim_slider,
        ui.world.exposure,
        ui.world.bloom,
        ui.world.model_ambient,

    },

    strings = {
        ui.misc.hitsound_direction,
        ui.world.skybox_choose,
        ui.visuals.custom_username
    },

    colors = {
        ui.visuals.ghosty_color,
        ui.visuals.ind_name_color,
        ui.visuals.ind_state_color,
        ui.visuals.ind_color,
        ui.visuals.arrows_color,
        ui.visuals.theme,
        ui.world.custom_skybox,
        ui.visuals.custom_scope,
        ui.visuals.desync_circle,
        ui.visuals.hitmarker,
        ui.misc.color_edit,
        ui.misc.color_override,
        ui.misc.autopeek
    }
}

de_en_coding = 'pl3KmT/U1Djka4d7xA9WHXfNvngIbe56PSRFZGLOwrq2Ms8QEytVYhBJoC0i+czu'

cfg_system.encode = function(data)
    return ((data:gsub('.', function(x)
        local r,de_en_coding= '', x:byte()
        for i=8,1,-1 do r=r..(de_en_coding%2^i-de_en_coding%2^(i-1)>0 and '1' or '0') end
        return r;
    end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then return '' end
        local c=0
        for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
        return de_en_coding:sub(c+1,c+1)
    end)..({ '', '==', '=' })[#data%3+1])
end

cfg_system.decode = function(data)
    data = string.gsub(data, '[^'..de_en_coding..'=]', '')
    return (data:gsub('.', function(x)
        if (x == '=') then return '' end
        local r,f='',(de_en_coding:find(x)-1)
        for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end
        return r;
    end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if (#x ~= 8) then return '' end
        local c=0
        for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end
            return string.char(c)
    end))
end
ui.global.export_cfg:RegisterCallback(function()
    local code = {{}, {}, {}, {}, {}}

    for _, bools in pairs(cfg_system.cfg_data.bools) do
        table.insert(code[1], bools:GetBool())
    end

    for _, ints in pairs(cfg_system.cfg_data.ints) do
        table.insert(code[2], ints:GetInt())
    end

    for _, floats in pairs(cfg_system.cfg_data.floats) do
        table.insert(code[3], floats:GetFloat())
    end

    for _, strings in pairs(cfg_system.cfg_data.strings) do
        table.insert(code[4], strings:GetString())
    end

    for _, colors in pairs(cfg_system.cfg_data.colors) do
        local clr = colors:GetColor()
        table.insert(code[5], string.format('%02X%02X%02X%02X', math.floor(clr.r * 255), math.floor(clr.g * 255), math.floor(clr.b * 255), math.floor(clr.a * 255)))
    end
  
    cfg_system.set_clipboard(cfg_system.encode(json.stringify(code)))
    logs:add('Config exported to clipboard.')
end)

cfg_system.config_load = function(text)
    local decode_cfg = json.parse(cfg_system.decode(text))
    if decode_cfg == nil then
        logs:add('Failed to load config.')
    else
        for k, v in pairs(decode_cfg) do
            k = ({[1] = 'bools', [2] = 'ints', [3] = 'floats', [4] = 'strings', [5] = 'colors'})[k]

            for k2, v2 in pairs(v) do
                if (k == 'bools') then
                    cfg_system.cfg_data[k][k2]:SetBool(v2)
                end

                if (k == 'ints') then
                    cfg_system.cfg_data[k][k2]:SetInt(v2)
                end

                if (k == 'floats') then
                    cfg_system.cfg_data[k][k2]:SetFloat(v2)
                end

                if (k == 'strings') then
                    cfg_system.cfg_data[k][k2]:SetString(v2)
                end

                if (k == 'colors') then
                    cfg_system.cfg_data[k][k2]:SetColor(Color.new(tonumber('0x'..v2:sub(1, 2))/255, tonumber('0x'..v2:sub(3, 4))/255, tonumber('0x'..v2:sub(5, 6))/255, tonumber('0x'..v2:sub(7, 8))/255))
                end
            end
        end
      
        logs:add("Applied imported config.")
    end
end
ui.global.import_cfg:RegisterCallback(function()
    cfg_system.config_load(cfg_system.get_clipboard())
end)

ui.global.default_cfg:RegisterCallback(function()
    cfg_system.config_load("5t1y1Fri1FmRdOAtefHM1F1RdOAtefHM1FaRdLnSIU4Gk31Y1FrYbOXGk31h1FrYbOXGk31B1FrYbOXGk31J1FrYbOXGk31o1FrLvfyVn9ERd910eUDhn9ERaWpRdOAtefHM1Fmy1FrLvfyVn9ERaW1RdLnSIU4Gk31yat10nLTMbBHM1FmY1FrLvfyVn9ERaWHRdLnSIU4Gk31y4R10nLTMbBHM1FmJ1FrLvfyVn9ERaWPRdLnSIU4Gk31yd910eUDhn9ERaFpRdLnSIU4Gk31ta910eUDhn9ERaF1RdOAtefHM1F1V1FrYbOXGk31t4310eUDhn9ERaFHRdOAtefHM1F1B1FrLvfyVn9ERaFbRdLnSIU4Gk31td310eUDhn9ERaFZRdOAtefHM1FaE1FrYbOXGk31Va910eUDhn9ERaV1RdOAtefHM1FaV1FrYbOXGk31V4310eUDhn9ERaVHRdLnSIU4Gk31V4R10eUDhn9ERaVbRdOAtefHM1Fao1FrYbOXGk31Vd910eUDhn9ER4KpRdLnSIU4Gk31Ya910eUDhn9ER4K1RdOAtefHM1FxV1FrLvfyVn9ER4KxRdOAtefHM1Fxh1FrYbOXGk31Y4R10eUDhnNYM1F1RdOMRa910a9ERaR10aRERat10a3ER4310a3ER4910a9ER4R10aRER4t10a3ERd310a3ERd910a3ERaWpRdFpM1Fmy1Fwoa3ERaW1RdFpM1FmV1FwsaRERaWxRdFpM1Fmh1FwEk31y4R10a3ERaWbRdRYtk31yd310a3ERaWZRdF1M1F1E1FwEk31ta910a3ERaF1RdFpM1F1V1Fwtk31t4310a3ERaFHRdFpM1F1B1FwsaRERaFbRdFpM1F1o1FwEk31td910a3ERaVpRdRYtk31Va910a3ERaV1RdF1M1FaV1FwEk31V4310a3ERaVHRdFpM1FaB1Fwtk31V4t10a3ERaVPRdFpM1FaC1FwEk31Ya310a3ER4KmRdFpM1Fxt1FwEk31Yat10a3ER4KxRdFpM1Fxh1FwEk31Y4R10a3ER4KbRdFpM1Fxo1FwEk31Yd910a9ER4WpRdFmM1FHy1Fwyk31haR10a9ER4WaRdFmM1FHY1Fwyk31h49104FvM1FHB1FwJa9ER4WbRdFbJk31hd310aW1M1FHC1FwBa9ER4FpRdFvtk31Ba9104FvM1Fvt1FwJatER4FaRdFPyk31B4310a3ER4FHRdFvhk31B4R104FbM1FvJ1Fwtk31Bd310aRER4FZRdF1M1FbE1FwVk31Ja910aRER4V1RdF1M1FbV1Fwtk31J4310aRER4VHRdFpM1FbB1FwEk31J4t10a9ER4VPRdF1M1FbC1Fwhd3ERdKpRdFHok31oa9104FpM1FPt1FwBa3ERdKaRdFHok31o43104WPM1FPh1FwVa3ERdKvRdFaEk31o4t10aVpM1FPo1FwVa3ERdKZRdFHtk31Ca310aVpM1FZy1FwVa3ERdW1RdFaEk31Cat10aVpM1FZY1FwVa3ERdWHRdFvEk31C4R10aVpM1FZJ1FwYk31Cd31049ERdWZRdFPM1FmEa310d3ERaWpy1Fwok31yaK1RdFxM1FmEat10aRERaWpY1Fwtk31yaKHRdFHM1FmE4R1049ERaWpJ1Fwhk31yaKPRdFmM1FmEd9104WpM1Fmya3104WpM1Fmya9104WPM1FmyaR104WPM1Fmyat104WPM1Fmy43104WpM1Fmy49104FpM1Fmy4R104FpM1Fmy4t104WPM1Fmyd3104WPM1Fmyd9104WPM1Fmta3104FpM1Fmta910a3ERaW1t1FwEk31yaFaRdFpM1Fmt4310a3ERaW1h1FwEk31yaFvRdFpM1Fmt4t104WpM1Fmtd310aWpEa3ERaW1C1FwVk31yaVpRdFvVk31yaVmRdF1Ck31yaV1RdFaM1FmVat1049ERaWaY1Fwyk31yaVHRdF1M1FmV4R10a3ERaWaJ1Fwod9ERaWao1FwtaRERaWaC1Fwy43ERaWxE1Fwtk31y4KmRdFvM1FmYaR10aWmM1FmYat1043ERaWxY1FwJk31y4KHRdFvhk31y4KvRdF1M1FmY4t10a9ERaWxo1Fwy4tERaWxC1FwtaKxJ69ERat105t1y1Fwyk31t1FwBa3ERat104FpM1FxRdFmEa3ER4910a9ER4R10a3oVaKpEaKpEaWmCaFpCaFPC4RER4t10a3ERd310a3ERd910aUYM1FxRdOMRa9101O4EvND2I/H8eBTB1RERaR101G4Evf4GAfCOgfCGkYCGvOXMvX+E431M1FaRdRDEgfCO5LXYn9Dck31h1Fri1FmRdRD3xHmYAZnKd31M1F1RdRD/AZn/AZn/AR1M1FaRdRD/AZn/AZn/AR1M1FxRdRD/AZn/AZn/AR1M1FHRdRD3xFG3AZnKd31M1FvRdRD34KS3AZvEa31M1FbRdRD/AZnTAZX/AR1M1FPRdRD3AWG3AZnKd31M1FZRdRDlaVZyAZn/AR1M1FmE1FwRdWPJAZHoxVPRk31ya9101FPB4ZD/AFxY1Ohc")
end)
-- @endregion

function ui_set_visible(vis, bool)
    vis:SetVisible(bool)
end

local function ui_callbacks()
    --ragebot
    ui.ragebot.maxmissed:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.maxmissed_c:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.maxmissed:GetBool())
    ui.ragebot.dormant_aimbot:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.dormant_aimbot_damage:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.dormant_aimbot:GetBool())
    ui.ragebot.override_doubletap:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.doubletap_speed:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.override_doubletap:GetBool())
    ui.ragebot.doubletap_recharge:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.override_doubletap:GetBool())
    ui.ragebot.Teleport_In_Air:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.tp_in_air:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.Teleport_In_Air:Get())
    ui.ragebot.bodyaims:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.baimmode:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.bodyaims:Get())
    ui.ragebot.baimhp:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.bodyaims:Get())
    ui.ragebot.hitchances:SetVisible(ui.ragebot.ragebot_enable:GetBool())
    ui.ragebot.air_hitchance:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.hitchances:Get(1))
    ui.ragebot.noscope_hitchance:SetVisible(ui.ragebot.ragebot_enable:GetBool() and ui.ragebot.hitchances:Get(2))


    --widgets
    ui.visuals.widgets:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.watermark_info:SetVisible(ui.visuals.widgets:Get(3) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.statepanel_image:SetVisible(ui.visuals.widgets:Get(4) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.custom_username:SetVisible(ui.visuals.watermark_info:Get(1) and ui.visuals.widgets:Get(3) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.theme:SetVisible(ui.visuals.visuals_enable:GetBool() and (ui.visuals.widgets:Get(1) or ui.visuals.widgets:Get(2) or ui.visuals.widgets:Get(3) or ui.visuals.widgets:Get(4) or ui.visuals.widgets:Get(6)))
    ui.visuals.disable_blur:SetVisible(ui.visuals.visuals_enable:GetBool() and (ui.visuals.widgets:Get(1) or ui.visuals.widgets:Get(2) or ui.visuals.widgets:Get(3) or ui.visuals.widgets:Get(4) or ui.visuals.widgets:Get(6)))
    ui.visuals.disable_background:SetVisible(ui.visuals.visuals_enable:GetBool() and ui.visuals.widgets:Get(5))
    ui.visuals.indicator_type:SetVisible(ui.visuals.visuals_enable:GetBool() and ui.visuals.widgets:Get(5))
    ui.visuals.arrows:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool())
    ui.visuals.arrows_x:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.arrows:Get() ~= 0 and ui.visuals.visuals_enable:GetBool())
    ui.visuals.arrows_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.arrows:Get() ~= 0 and ui.visuals.visuals_enable:GetBool())
    ui.visuals.ghosty_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 1)
    ui.visuals.ind_name_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 0)
    ui.visuals.ind_state_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 0)
    ui.visuals.ind_color:SetVisible(ui.visuals.widgets:Get(5) and ui.visuals.visuals_enable:GetBool() and ui.visuals.indicator_type:Get() == 0)

    --visuals micellaneous
    ui.visuals.custom_scope:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.scope_width:SetVisible(ui.visuals.custom_scope:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.scope_offset:SetVisible(ui.visuals.custom_scope:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.scope_conditions:SetVisible(ui.visuals.custom_scope:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.desync_circle:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.desync_circle_conditions:SetVisible(ui.visuals.desync_circle:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.hitmarker:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.hitmarker_length:SetVisible(ui.visuals.hitmarker:GetBool() and ui.visuals.visuals_enable:GetBool())
    ui.visuals.log_type:SetVisible(ui.visuals.visuals_enable:GetBool() and ui.visuals.widgets:Get(6))
    ui.visuals.gamesense:SetVisible(ui.visuals.visuals_enable:GetBool())
    ui.visuals.gamesense_choose:SetVisible(ui.visuals.gamesense:GetBool() and ui.visuals.visuals_enable:GetBool())
    -- world
    ui.world.sunset:SetVisible(ui.world.world_enable:GetBool())
    ui.world.shadow_x:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.shadow_y:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.shadow_z:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.shadow_dist:SetVisible(ui.world.sunset:GetBool() and ui.world.world_enable:GetBool())
    ui.world.molly_conditions:SetVisible(ui.world.world_enable:GetBool())
    ui.world.custom_skybox:SetVisible(ui.world.world_enable:GetBool())
    ui.world.skybox_choose:SetVisible(ui.world.world_enable:GetBool() and ui.world.custom_skybox:GetBool())
    ui.world.enable_bloom:SetVisible(ui.world.world_enable:GetBool())
    ui.world.model_ambient:SetVisible(ui.world.enable_bloom:GetBool() and ui.world.world_enable:GetBool())
    ui.world.bloom:SetVisible(ui.world.enable_bloom:GetBool() and ui.world.world_enable:GetBool())
    ui.world.exposure:SetVisible(ui.world.enable_bloom:GetBool() and ui.world.world_enable:GetBool())

    --antiaim
    ui.anti_aims.antiaim_helpers:SetVisible(ui.anti_aims.antiaim_enable:GetBool())
    ui.anti_aims.animbreakers:SetVisible(ui.anti_aims.antiaim_enable:GetBool() and ui.anti_aims.antiaim_helpers:Get(2))

    --misc
    ui.misc.slowwalk_c:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.slowwalk_slider:SetVisible(ui.misc.slowwalk_c:GetBool() and ui.misc.misc_enable:GetBool())
    ui.misc.hitsound:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.hitsound_direction:SetVisible(ui.misc.hitsound:GetBool() and ui.misc.misc_enable:GetBool())
    ui.misc.hitsound_volume:SetVisible(ui.misc.hitsound:GetBool() and ui.misc.misc_enable:GetBool())
    ui.misc.thirdperson:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.thirdperson_distance:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.thirdperson:GetBool())
    ui.misc.thirdperson_anim:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.thirdperson:GetBool())
    ui.misc.clantag:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.autopeek:SetVisible(ui.misc.misc_enable:GetBool())
    ui.misc.color_override:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.autopeek:GetBool())
    ui.misc.quick_peek:SetVisible(ui.misc.misc_enable:GetBool() and ui.misc.autopeek:GetBool())

    --main
    ui.misc.menu_glow:SetVisible(ui.misc.menu_customize:Get())
    ui.misc.glow_pulse:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_glow:Get())
    ui.misc.color_edit:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_glow:Get())
    ui.misc.menu_dim:SetVisible(ui.misc.menu_customize:Get())
    ui.misc.dim_slider:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_dim:Get())
    ui.misc.menu_blur:SetVisible(ui.misc.menu_customize:Get())
    ui.misc.blur_slider:SetVisible(ui.misc.menu_customize:Get() and ui.misc.menu_blur:Get())

    --aa buider
  
    local m = ui.anti_aims
    for i = 1,#_state do
        local selects = ui.anti_aims.states_selection:Get()+1
        local cswitch = m.custom[i].enable:Get()
        local show = selects == i and cswitch and ui.anti_aims.antiaim_enable:GetBool()
        ui.anti_aims.states_selection:SetVisible(ui.anti_aims.antiaim_enable:GetBool())
        m.custom[i].enable:SetVisible(selects == i and ui.anti_aims.antiaim_enable:GetBool())
        m.custom[i].extra_options:SetVisible(show)
        ui_set_visible(m.custom[i].yaw_mode,show)
        ---- {"Static","Period jitter \aC08A8AFF[Tick]","Period jitter \aC08A8AFF[Choke]","Period jitter \aC08A8AFF[Desync]"}
        ui_set_visible(m.custom[i].static_yaw,show and m.custom[i].yaw_mode:Get() == 0)
        ui_set_visible(m.custom[i].tick_yaw_left,show and m.custom[i].yaw_mode:Get() == 1)
        ui_set_visible(m.custom[i].tick_yaw_right,show and m.custom[i].yaw_mode:Get() == 1)
        ui_set_visible(m.custom[i].choke_yaw_left,show and m.custom[i].yaw_mode:Get() == 2)
        ui_set_visible(m.custom[i].choke_yaw_right,show and m.custom[i].yaw_mode:Get() == 2)
        ui_set_visible(m.custom[i].desync_yaw_left,show and m.custom[i].yaw_mode:Get() == 3)
        ui_set_visible(m.custom[i].desync_yaw_right,show and m.custom[i].yaw_mode:Get() == 3)
        ui_set_visible(m.custom[i].yaw_jitter,show)
        ui_set_visible(m.custom[i].yaw_jitter_mode,show and m.custom[i].yaw_jitter:Get() ~= 0)
        ui_set_visible(m.custom[i].yaw_jitter_degree,show and m.custom[i].yaw_jitter:Get() ~= 0)
        ui_set_visible(m.custom[i].yaw_jitter_degree2,show and m.custom[i].yaw_jitter:Get() ~= 0 and m.custom[i].yaw_jitter_mode:Get() == 1)

        ui_set_visible(m.custom[i].self_bodyyaw_mode,show)
        ui_set_visible(m.custom[i].bodyyaw_mode,show and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)   
        ui_set_visible(m.custom[i].bodyyaw_degree,show and m.custom[i].bodyyaw_mode:Get() == 1 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1 )
        ui_set_visible(m.custom[i].jitter_bodyyaw_degree_left,show and m.custom[i].bodyyaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].jitter_bodyyaw_degree_right,show and m.custom[i].bodyyaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].step_bodyyaw_degree_left,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].step_bodyyaw_degree_right,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].body_yaw_step_ticks,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)
        ui_set_visible(m.custom[i].body_yaw_step_value,show and m.custom[i].bodyyaw_mode:Get() == 3 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 1)

        ui_set_visible(m.custom[i].fake_yaw_mode,show and m.custom[i].self_bodyyaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].static_fakeyaw,show and m.custom[i].fake_yaw_mode:Get() == 0 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].jitter_fakeyaw_left,show and m.custom[i].fake_yaw_mode:Get() == 1 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].jitter_fakeyaw_right,show and m.custom[i].fake_yaw_mode:Get() == 1 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].step_ticks,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].step_value,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].step_ticks,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
--
        ui_set_visible(m.custom[i].step_abs,show and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0)
        ui_set_visible(m.custom[i].step_fake_min,show  and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].step_fake_max,show  and m.custom[i].fake_yaw_mode:Get() == 2 and m.custom[i].self_bodyyaw_mode:Get() ~= 0 and m.custom[i].fake_yaw_mode:Get() ~= 0 )
        ui_set_visible(m.custom[i].freestanding_bodyyaw,show and m.custom[i].self_bodyyaw_mode:Get() ~= 0)
    end

end
local time_to_ticks = function(t) return math.floor(0.5 + (t / GlobalVars.interval_per_tick)) end
local callbacks = {

    on_draw = function()
        if Cheat.IsMenuVisible() then
            ui_callbacks()
        end

        globals.local_player = EntityList.GetLocalPlayer()

        visuals.glowmenu()
      
        misc.clantag()
        autopeek:paint_function()
      if ui.visuals.visuals_enable:Get() then
        widgets.lua_panel:draw()
        widgets.indicators:draw()
        widgets.watermark:draw()
        widgets.keybinds:draw()
        widgets.spectators:draw()
        widgets.gamesense:draw()
        visuals.scope()
        visuals.hitmarker()
        visuals.circle_desync()
        logs:draw()

        local x, y = 5, 5
        if(ui.visuals.log_type:Get(2)) then
            for i, hitlog in ipairs(hitlogs) do
                    Render.Text(hitlog.text, Vector2.new(x+1, y+1), Color.RGBA(0, 0, 0, math.floor((hitlog.time + 10 - GlobalVars.realtime)*500)-105), 10, fonts.lucida_console)
                    Render.Text(hitlog.text, Vector2.new(x, y), Color.RGBA(255, 255, 255, math.floor((hitlog.time + 10 - GlobalVars.realtime)*500)), 10, fonts.lucida_console)
                y = y + 15
                if #hitlogs > 15 then table.remove(hitlogs,1) end
                if hitlog.time + 10 < GlobalVars.realtime then table.remove(hitlogs, i) end
            end
        end
      end

        world.sun_set()
        world.molotov()
        world.custom_skybox()
        world.effects()
        visuals.thirdperson()
    end,

    on_player_connect_full = function()
        t = {}
    end,

    on_prediction = function(cmd)
        anti_aims.avoid_backstab()
        anti_aims.exploit_teleport()
        anti_aims.disable_aa_warmup()
        rage.ragebot(cmd)
        anti_aims.antiaim_helpers()
        AntiAim.run_custom(cmd)
        anti_aims.edge_yaw()
        misc.slowwalk(cmd)
        rage.on_prediction()
        rage.dormant_aim(cmd)
        autopeek:autopeek_main(cmd)
    end,

    on_createmove = function(cmd)
        rage.baim()
    end,

    on_ragebot_shot = function(shot)
        if EntityList.GetLocalPlayer() == nil then return end
        total_hits = EntityList.GetLocalPlayer():GetProp('m_totalHitsOnServer')
        if total_hits == nil then return end
        miss_hitbox = missgroup_names[shot.hitgroup] or '?'
        self_choke = ClientState.m_choked_commands
        choke = time_to_ticks(GlobalVars.curtime - EntityList.GetClientEntity(shot.index):GetPlayer():GetProp('m_flSimulationTime')) + 1;
        if choke < 0 then
            choke = 0
        elseif choke > 14 then
            choke = 14
        end
        visuals.ragebot_shot(shot)
        autopeek.ragebot_shot(shot)
    end,

    on_pre_prediction = function(cmd)
        rage.hitchances()
    end,

    registered_shot = function(shot)
        rage.on_registered_shot(shot)
        visuals.registered_shot(shot)

        if ui.visuals.widgets:Get(6) and ui.visuals.log_type:Get(2) and shot.reason ~= 0 then
            local name = EntityList.GetPlayer(shot.target_index):GetName()
            local hitgroup_names = {
                [0] = "generic",
                [1] = "head",
                [2] = "chest",
                [3] = "stomach",
                [4] = "left arm",
                [5] = "right arm",
                [6] = "left leg",
                [7] = "right leg",
                [10] = "gear"
            }
            local miss_reasons = {"animation desync", "spread", "occlusion", "prediction error"}
            logs:add(string.format("Missed %s's %s due to %s", name, hitgroup_names[shot.wanted_hitgroup], miss_reasons[shot.reason]))
        end

    end,

    on_events = function(event)
        rage.reset_data(event)
        rage.resetter(event)
        visuals.events(event)
        indicators.bomb(event)
    end,
}

Cheat.RegisterCallback("draw", callbacks.on_draw)
Cheat.RegisterCallback("prediction", callbacks.on_prediction)
Cheat.RegisterCallback("createmove", callbacks.on_createmove)
Cheat.RegisterCallback("pre_prediction", callbacks.on_pre_prediction)
Cheat.RegisterCallback("registered_shot", callbacks.registered_shot)
Cheat.RegisterCallback("ragebot_shot", callbacks.on_ragebot_shot)
Cheat.RegisterCallback("events", callbacks.on_events)
logs:add("Welcome to psycho, " ..globals.username)
не рекомендую к использованию, много фпс жрет
 
Сверху Снизу