Dark_Agent

UNIFIED SPY TOOL

Dec 25th, 2025
161
0
Never
7
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 140.61 KB | Cybersecurity | 0 0
  1. --[[
  2.     UnifiedSpy v3.0
  3.     Advanced Signal/Remote/Request Logger
  4.    
  5.     Features:
  6.     - API Dump caching with version control
  7.     - Signal hooking via getconnections()
  8.     - Syntax highlighting
  9.     - Built-in executor
  10.     - Debug info (upvalues, constants, protos, metatable)
  11.     - Collapsible log groups
  12.     - Search and filters
  13.     - Statistics and analytics
  14.     - Decompiler integration
  15.     - Condition breakpoints
  16.     - Network monitor
  17.     - Theme system with customizable colors
  18.     - Settings persistence
  19.     - Export logs
  20.     - RobloxReplicatedStorage logging
  21.     - Bindable Events/Functions logging
  22. ]]
  23.  
  24. if not game:IsLoaded() then game.Loaded:Wait() end
  25.  
  26. local function missing(t, f, fallback)
  27.     if type(f) == t then return f end
  28.     return fallback
  29. end
  30.  
  31. local cloneref = missing("function", cloneref, function(...) return ... end)
  32. local hookfunction = missing("function", hookfunction)
  33. local hookmetamethod = missing("function", hookmetamethod)
  34. local getnamecallmethod = missing("function", getnamecallmethod or get_namecall_method)
  35. local checkcaller = missing("function", checkcaller, function() return false end)
  36. local newcclosure = missing("function", newcclosure, function(f) return f end)
  37. local replicatesignal = missing("function", replicatesignal)
  38. local getconnections = missing("function", getconnections or get_signal_cons)
  39. local firesignal = missing("function", firesignal)
  40. local getgenv = missing("function", getgenv, function() return _G end)
  41. local getcallingscript = missing("function", getcallingscript, function() return nil end)
  42. local setclipboard = missing("function", setclipboard or toclipboard or set_clipboard or (Clipboard and Clipboard.set))
  43. local iscclosure = missing("function", iscclosure, function() return false end)
  44. local islclosure = missing("function", islclosure, function() return false end)
  45. local getconstants = missing("function", debug.getconstants or getconstants, function() return {} end)
  46. local getupvalues = missing("function", debug.getupvalues or getupvalues, function() return {} end)
  47. local getprotos = missing("function", debug.getprotos or getprotos, function() return {} end)
  48. local getinfo = missing("function", debug.info or getinfo)
  49. local getnilinstances = missing("function", getnilinstances, function() return {} end)
  50. local getrawmetatable = missing("function", getrawmetatable)
  51. local isreadonly = missing("function", isreadonly or table.isfrozen, function() return false end)
  52. local setreadonly = missing("function", setreadonly or makewriteable)
  53. local gethui = missing("function", gethui or get_hidden_gui)
  54. local getgc = missing("function", getgc or get_gc_objects, function() return {} end)
  55. local getreg = missing("function", getreg or debug.getregistry, function() return {} end)
  56. local getinstances = missing("function", getinstances, function() return {} end)
  57. local decompile = missing("function", decompile)
  58. local request = missing("function", request or http_request or (syn and syn.request) or (http and http.request))
  59. local queueteleport = missing("function", queueteleport or queue_on_teleport or (syn and syn.queue_on_teleport))
  60. local isfile = missing("function", isfile, function() return false end)
  61. local readfile = missing("function", readfile, function() return "" end)
  62. local writefile = missing("function", writefile, function() end)
  63. local appendfile = missing("function", appendfile, function() end)
  64. local makefolder = missing("function", makefolder, function() end)
  65. local isfolder = missing("function", isfolder, function() return false end)
  66. local listfiles = missing("function", listfiles, function() return {} end)
  67. local delfile = missing("function", delfile, function() end)
  68. local delfolder = missing("function", delfolder, function() end)
  69.  
  70. local DEBUG = getgenv().unifiedspyDEBUG or false
  71.  
  72. DEBUG = true
  73. getgenv().unifiedspyDEBUG = true
  74.  
  75. local function debugLog(...)
  76.     if DEBUG then print("[UnifiedSpy DEBUG]", ...) end
  77. end
  78.  
  79. local function debugWarn(...)
  80.     if DEBUG then warn("[UnifiedSpy WARN]", ...) end
  81. end
  82.  
  83. if getgenv().UnifiedSpyExecuted and type(getgenv().UnifiedSpyShutdown) == "function" then
  84.     debugLog("Shutting down previous instance...")
  85.     pcall(getgenv().UnifiedSpyShutdown)
  86.     task.wait(0.2)
  87. end
  88.  
  89. local Services = setmetatable({}, {
  90.     __index = function(self, name)
  91.         local success, service = pcall(function()
  92.             return cloneref(game:GetService(name))
  93.         end)
  94.         if success and service then
  95.             rawset(self, name, service)
  96.             return service
  97.         end
  98.         return nil
  99.     end
  100. })
  101.  
  102. local HttpService = Services.HttpService
  103. local TweenService = Services.TweenService
  104. local UserInputService = Services.UserInputService
  105. local RunService = Services.RunService
  106. local Players = Services.Players
  107. local CoreGui = Services.CoreGui
  108. local MarketplaceService = Services.MarketplaceService
  109. local TextService = Services.TextService
  110. local ReplicatedStorage = Services.ReplicatedStorage
  111. local RobloxReplicatedStorage = nil
  112. pcall(function() RobloxReplicatedStorage = cloneref(game:GetService("RobloxReplicatedStorage")) end)
  113.  
  114. local FOLDER_MAIN = "UnifiedSpy"
  115. local FOLDER_CACHE = "UnifiedSpy/Cache"
  116. local FOLDER_LOGS = "UnifiedSpy/Logs"
  117. local FILE_SETTINGS = "UnifiedSpy/Settings.json"
  118.  
  119. local API_DUMP_URL = "https://raw.githubusercontent.com/MaximumADHD/Roblox-Client-Tracker/refs/heads/roblox/Full-API-Dump.json"
  120. local VERSION_GUID_URL = "https://raw.githubusercontent.com/MaximumADHD/Roblox-Client-Tracker/refs/heads/roblox/version-guid.txt"
  121. local VERSION_URL = "https://raw.githubusercontent.com/MaximumADHD/Roblox-Client-Tracker/refs/heads/roblox/version.txt"
  122.  
  123. local DefaultSettings = {
  124.     Theme = "Dark",
  125.     Colors = {
  126.         Background = {22, 22, 28},
  127.         Sidebar = {28, 28, 35},
  128.         TopBar = {18, 18, 24},
  129.         Accent = {100, 180, 255},
  130.         Text = {220, 220, 230},
  131.         TextDim = {120, 120, 130},
  132.         Success = {100, 255, 120},
  133.         Error = {255, 80, 80},
  134.         Warning = {255, 180, 100},
  135.         Signals = {120, 255, 150},
  136.         Requests = {255, 180, 100},
  137.         Remotes = {100, 180, 255},
  138.         Audios = {255, 100, 200},
  139.         Animations = {100, 255, 255},
  140.         Bindables = {200, 150, 255},
  141.         System = {255, 200, 100},
  142.         SettingsTab = {180, 150, 255},
  143.     },
  144.     Logging = {
  145.         Enabled = true,
  146.         LogRemotes = true,
  147.         LogSignals = true,
  148.         LogRequests = true,
  149.         LogAudios = true,
  150.         LogAnimations = true,
  151.         LogBindables = true,
  152.         LogRobloxReplicatedStorage = true,
  153.         LogCheckcaller = false,
  154.         LogLocalPlayerOnly = false,
  155.     },
  156.     Filters = {
  157.         FilterSpammy = true,
  158.         IgnoreSpammyLogs = true,
  159.         SpamThreshold = 5,
  160.         SpamTimeWindow = 1,
  161.     },
  162.     Display = {
  163.         MaxLogs = 500,
  164.         PathStyle = "Auto",
  165.         EnableAnimations = true,
  166.         ShowTimestamps = true,
  167.         GroupSimilarLogs = true,
  168.     },
  169.     Breakpoints = {},
  170.     Blacklist = {},
  171.     Blocklist = {},
  172.     CollapsedGroups = {},
  173.     TeleportScript = "",
  174. }
  175.  
  176. local Settings = {}
  177. local SignalDatabase = {}
  178. local ClassSignals = {}
  179. local CachedVersion = nil
  180.  
  181. local Logs = {
  182.     Signals = {},
  183.     Requests = {},
  184.     Remotes = {},
  185.     Audios = {},
  186.     Animations = {},
  187.     Bindables = {},
  188.     System = {},
  189. }
  190.  
  191. local LogGroups = {}
  192. local GroupFrames = {}
  193.  
  194. local Statistics = {
  195.     TotalCalls = 0,
  196.     CallsByType = {},
  197.     CallsByName = {},
  198.     DataTransferred = 0,
  199.     StartTime = tick(),
  200. }
  201.  
  202. local LogFrames = {}
  203. local TabData = {}
  204. local Selected = nil
  205. local LayoutOrders = {}
  206. local SpamHistory = {}
  207. local SpammySignals = {}
  208. local HookedSignals = {}
  209. local HookedConnections = {}
  210. local OriginalFunctions = {}
  211. local Connections = {}
  212. local Running = true
  213. local CurrentTab = "Remotes"
  214. local TrackedSounds = {}
  215. local TrackedAnimations = {}
  216. local SearchQuery = ""
  217.  
  218. for tab in pairs(Logs) do
  219.     LayoutOrders[tab] = 999999999
  220.     LogFrames[tab] = {}
  221.     LogGroups[tab] = {}
  222.     GroupFrames[tab] = {}
  223. end
  224.  
  225. local function ensureFolders()
  226.     pcall(function()
  227.         if not isfolder(FOLDER_MAIN) then makefolder(FOLDER_MAIN) end
  228.         if not isfolder(FOLDER_CACHE) then makefolder(FOLDER_CACHE) end
  229.         if not isfolder(FOLDER_LOGS) then makefolder(FOLDER_LOGS) end
  230.     end)
  231. end
  232.  
  233. local function httpGet(url)
  234.     local success, result = pcall(function()
  235.         if request then
  236.             local res = request({Url = url, Method = "GET"})
  237.             return res.Body
  238.         else
  239.             return game:HttpGet(url, true)
  240.         end
  241.     end)
  242.     return success and result or nil
  243. end
  244.  
  245. local function deepCopy(t)
  246.     if type(t) ~= "table" then return t end
  247.     local copy = {}
  248.     for k, v in pairs(t) do
  249.         copy[k] = deepCopy(v)
  250.     end
  251.     return copy
  252. end
  253.  
  254. local function mergeSettings(base, override)
  255.     local result = deepCopy(base)
  256.     for k, v in pairs(override or {}) do
  257.         if type(v) == "table" and type(result[k]) == "table" then
  258.             result[k] = mergeSettings(result[k], v)
  259.         else
  260.             result[k] = v
  261.         end
  262.     end
  263.     return result
  264. end
  265.  
  266. local function loadSettings()
  267.     ensureFolders()
  268.     Settings = deepCopy(DefaultSettings)
  269.    
  270.     if isfile(FILE_SETTINGS) then
  271.         local success, content = pcall(readfile, FILE_SETTINGS)
  272.         if success and content then
  273.             local decodeSuccess, data = pcall(function()
  274.                 return HttpService:JSONDecode(content)
  275.             end)
  276.             if decodeSuccess and data then
  277.                 Settings = mergeSettings(DefaultSettings, data)
  278.                 debugLog("Settings loaded from file")
  279.             end
  280.         end
  281.     end
  282.    
  283.     getgenv().UnifiedSpySettings = Settings
  284.     return Settings
  285. end
  286.  
  287. local function saveSettings()
  288.     ensureFolders()
  289.     pcall(function()
  290.         local encoded = HttpService:JSONEncode(Settings)
  291.         writefile(FILE_SETTINGS, encoded)
  292.         debugLog("Settings saved")
  293.     end)
  294. end
  295.  
  296. local function getColor(name)
  297.     local c = Settings.Colors[name]
  298.     if c then
  299.         return Color3.fromRGB(c[1], c[2], c[3])
  300.     end
  301.     return Color3.fromRGB(255, 255, 255)
  302. end
  303.  
  304. local function setColor(name, r, g, b)
  305.     Settings.Colors[name] = {r, g, b}
  306.     saveSettings()
  307. end
  308.  
  309. local function cleanOldCache(currentFileName)
  310.     pcall(function()
  311.         local files = listfiles(FOLDER_CACHE)
  312.         for _, file in ipairs(files) do
  313.             local fileName = file:match("([^/\\]+)$")
  314.             if fileName and fileName ~= currentFileName then
  315.                 delfile(file)
  316.                 debugLog("Deleted old cache:", fileName)
  317.             end
  318.         end
  319.     end)
  320. end
  321.  
  322. local function loadAPIDump()
  323.     debugLog("Loading API Dump...")
  324.     ensureFolders()
  325.    
  326.     local versionGuid = httpGet(VERSION_GUID_URL)
  327.     local version = httpGet(VERSION_URL)
  328.    
  329.     if not versionGuid or not version then
  330.         debugWarn("Failed to get version info")
  331.         return false
  332.     end
  333.    
  334.     versionGuid = versionGuid:gsub("%s+", "")
  335.     version = version:gsub("%s+", "")
  336.    
  337.     local cacheFileName = versionGuid .. "_Version_" .. version .. ".json"
  338.     local cachePath = FOLDER_CACHE .. "/" .. cacheFileName
  339.    
  340.     CachedVersion = {guid = versionGuid, version = version}
  341.     debugLog("Current version:", version, "GUID:", versionGuid)
  342.    
  343.     local cachedData = nil
  344.    
  345.     if isfile(cachePath) then
  346.         debugLog("Loading from cache:", cacheFileName)
  347.         local success, content = pcall(readfile, cachePath)
  348.         if success and content then
  349.             local decodeSuccess, data = pcall(function()
  350.                 return HttpService:JSONDecode(content)
  351.             end)
  352.             if decodeSuccess and data then
  353.                 cachedData = data
  354.             end
  355.         end
  356.     end
  357.    
  358.     if not cachedData then
  359.         debugLog("Downloading fresh API Dump...")
  360.         local apiDumpRaw = httpGet(API_DUMP_URL)
  361.         if not apiDumpRaw then
  362.             debugWarn("Failed to download API Dump")
  363.             return false
  364.         end
  365.        
  366.         local decodeSuccess, apiData = pcall(function()
  367.             return HttpService:JSONDecode(apiDumpRaw)
  368.         end)
  369.        
  370.         if not decodeSuccess or not apiData then
  371.             debugWarn("Failed to decode API Dump")
  372.             return false
  373.         end
  374.        
  375.         local processedData = {
  376.             Version = version,
  377.             VersionGuid = versionGuid,
  378.             Classes = {},
  379.             ConnectionFunctions = {}
  380.         }
  381.        
  382.         for _, classData in ipairs(apiData.Classes or {}) do
  383.             local className = classData.Name
  384.             local signals = {}
  385.             local connFuncs = {}
  386.            
  387.             for _, memberData in ipairs(classData.Members or {}) do
  388.                 if memberData.MemberType == "Event" or memberData.MemberType == "RBXScriptSignal" then
  389.                     table.insert(signals, {
  390.                         Name = memberData.Name,
  391.                         Security = memberData.Security and memberData.Security.Read or "None",
  392.                         Tags = memberData.Tags or {}
  393.                     })
  394.                 elseif memberData.MemberType == "Function" and memberData.ReturnType and memberData.ReturnType.Name == "RBXScriptConnection" then
  395.                     table.insert(connFuncs, {
  396.                         Name = memberData.Name,
  397.                         Security = memberData.Security and memberData.Security.Read or "None",
  398.                     })
  399.                 end
  400.             end
  401.            
  402.             if #signals > 0 then
  403.                 processedData.Classes[className] = signals
  404.             end
  405.             if #connFuncs > 0 then
  406.                 processedData.ConnectionFunctions[className] = connFuncs
  407.             end
  408.         end
  409.        
  410.         pcall(function()
  411.             local encoded = HttpService:JSONEncode(processedData)
  412.             writefile(cachePath, encoded)
  413.             cleanOldCache(cacheFileName)
  414.             debugLog("Cache saved:", cacheFileName)
  415.         end)
  416.        
  417.         cachedData = processedData
  418.     end
  419.    
  420.     for className, signals in pairs(cachedData.Classes or {}) do
  421.         ClassSignals[className] = signals
  422.         for _, signalInfo in ipairs(signals) do
  423.             local key = className .. "." .. signalInfo.Name
  424.             SignalDatabase[key] = {
  425.                 ClassName = className,
  426.                 SignalName = signalInfo.Name,
  427.                 Security = signalInfo.Security,
  428.                 Tags = signalInfo.Tags
  429.             }
  430.         end
  431.     end
  432.    
  433.     local signalCount = 0
  434.     for _ in pairs(SignalDatabase) do signalCount = signalCount + 1 end
  435.     debugLog("Loaded", signalCount, "signals from version", cachedData.Version or "unknown")
  436.    
  437.     return true
  438. end
  439.  
  440. local function instanceToPath(instance)
  441.     if instance == nil then return "nil" end
  442.     if instance == game then return "game" end
  443.     if instance == workspace then return "workspace" end
  444.    
  445.     local style = Settings.Display.PathStyle or "Auto"
  446.    
  447.     local player = nil
  448.     for _, p in ipairs(Players:GetPlayers()) do
  449.         if p.Character and (instance:IsDescendantOf(p.Character) or instance == p.Character) then
  450.             player = p
  451.             break
  452.         end
  453.     end
  454.    
  455.     local function formatName(name, parent, child)
  456.         if style == "WaitForChild" then
  457.             return ':WaitForChild("' .. name:gsub('"', '\\"') .. '")'
  458.         elseif style == "FindFirstChild" then
  459.             return ':FindFirstChild("' .. name:gsub('"', '\\"') .. '")'
  460.         elseif style == "Index" then
  461.             if name:match("^[%a_][%w_]*$") then
  462.                 return "." .. name
  463.             else
  464.                 return '["' .. name:gsub('"', '\\"') .. '"]'
  465.             end
  466.         elseif style == "GetChildren" and parent then
  467.             local children = parent:GetChildren()
  468.             for i, c in ipairs(children) do
  469.                 if c == child then
  470.                     return ":GetChildren()[" .. i .. "]"
  471.                 end
  472.             end
  473.         end
  474.         if name:match("^[%a_][%w_]*$") then
  475.             return "." .. name
  476.         else
  477.             return ':FindFirstChild("' .. name:gsub('"', '\\"') .. '")'
  478.         end
  479.     end
  480.    
  481.     local path = ""
  482.     local current = instance
  483.    
  484.     if player then
  485.         while current and current ~= player.Character do
  486.             path = formatName(current.Name, current.Parent, current) .. path
  487.             current = current.Parent
  488.         end
  489.         if player == Players.LocalPlayer then
  490.             return 'game:GetService("Players").LocalPlayer.Character' .. path
  491.         else
  492.             return 'game:GetService("Players"):FindFirstChild("' .. player.Name .. '").Character' .. path
  493.         end
  494.     end
  495.    
  496.     while current and current.Parent ~= game do
  497.         if current.Parent == nil then
  498.             return string.format('getNil("%s", "%s")', instance.Name:gsub('"', '\\"'), instance.ClassName)
  499.         end
  500.         path = formatName(current.Name, current.Parent, current) .. path
  501.         current = current.Parent
  502.     end
  503.    
  504.     if current and current.Parent == game then
  505.         local serviceName = current.ClassName
  506.         if pcall(function() return game:GetService(serviceName) end) then
  507.             return 'game:GetService("' .. serviceName .. '")' .. path
  508.         else
  509.             return "game" .. formatName(current.Name, game, current) .. path
  510.         end
  511.     end
  512.    
  513.     return "game"
  514. end
  515.  
  516. local function deepClone(args, copies)
  517.     copies = copies or {}
  518.     local copy
  519.     if type(args) == "table" then
  520.         if copies[args] then
  521.             copy = copies[args]
  522.         else
  523.             copy = {}
  524.             copies[args] = copy
  525.             for k, v in next, args do
  526.                 copy[deepClone(k, copies)] = deepClone(v, copies)
  527.             end
  528.         end
  529.     elseif typeof(args) == "Instance" then
  530.         pcall(function() copy = cloneref(args) end)
  531.         if not copy then copy = args end
  532.     else
  533.         copy = args
  534.     end
  535.     return copy
  536. end
  537.  
  538. local function deepSerialize(value, depth, indent)
  539.     depth = depth or 0
  540.     indent = indent or 4
  541.     if depth > 6 then return "-- max depth" end
  542.    
  543.     local t = typeof(value)
  544.     local spacing = string.rep(" ", depth * indent)
  545.     local nextSpacing = string.rep(" ", (depth + 1) * indent)
  546.    
  547.     if t == "nil" then return "nil"
  548.     elseif t == "string" then
  549.         if #value > 500 then
  550.             return string.format('"%s" --[[%d chars]]', value:sub(1, 500):gsub('"', '\\"'):gsub("\n", "\\n"), #value)
  551.         end
  552.         return '"' .. value:gsub('\\', '\\\\'):gsub('"', '\\"'):gsub("\n", "\\n"):gsub("\t", "\\t") .. '"'
  553.     elseif t == "number" then
  554.         if value == math.huge then return "math.huge"
  555.         elseif value == -math.huge then return "-math.huge"
  556.         elseif value ~= value then return "0/0"
  557.         else return tostring(value) end
  558.     elseif t == "boolean" then return tostring(value)
  559.     elseif t == "Instance" then return instanceToPath(value)
  560.     elseif t == "Vector3" then
  561.         if value == Vector3.zero then return "Vector3.zero" end
  562.         if value == Vector3.one then return "Vector3.one" end
  563.         return string.format("Vector3.new(%s, %s, %s)", value.X, value.Y, value.Z)
  564.     elseif t == "Vector2" then
  565.         if value == Vector2.zero then return "Vector2.zero" end
  566.         if value == Vector2.one then return "Vector2.one" end
  567.         return string.format("Vector2.new(%s, %s)", value.X, value.Y)
  568.     elseif t == "CFrame" then
  569.         if value == CFrame.identity then return "CFrame.identity" end
  570.         return string.format("CFrame.new(%s)", table.concat({value:GetComponents()}, ", "))
  571.     elseif t == "Color3" then
  572.         return string.format("Color3.new(%s, %s, %s)", value.R, value.G, value.B)
  573.     elseif t == "BrickColor" then
  574.         return string.format("BrickColor.new(%d)", value.Number)
  575.     elseif t == "UDim" then
  576.         return string.format("UDim.new(%s, %s)", value.Scale, value.Offset)
  577.     elseif t == "UDim2" then
  578.         return string.format("UDim2.new(%s, %s, %s, %s)", value.X.Scale, value.X.Offset, value.Y.Scale, value.Y.Offset)
  579.     elseif t == "Rect" then
  580.         return string.format("Rect.new(%s, %s, %s, %s)", value.Min.X, value.Min.Y, value.Max.X, value.Max.Y)
  581.     elseif t == "NumberRange" then
  582.         return string.format("NumberRange.new(%s, %s)", value.Min, value.Max)
  583.     elseif t == "NumberSequence" then
  584.         local keypoints = {}
  585.         for _, kp in ipairs(value.Keypoints) do
  586.             table.insert(keypoints, string.format("NumberSequenceKeypoint.new(%s, %s)", kp.Time, kp.Value))
  587.         end
  588.         return "NumberSequence.new({" .. table.concat(keypoints, ", ") .. "})"
  589.     elseif t == "ColorSequence" then
  590.         local keypoints = {}
  591.         for _, kp in ipairs(value.Keypoints) do
  592.             table.insert(keypoints, string.format("ColorSequenceKeypoint.new(%s, Color3.new(%s, %s, %s))", kp.Time, kp.Value.R, kp.Value.G, kp.Value.B))
  593.         end
  594.         return "ColorSequence.new({" .. table.concat(keypoints, ", ") .. "})"
  595.     elseif t == "EnumItem" then return tostring(value)
  596.     elseif t == "RBXScriptSignal" then return "RBXScriptSignal"
  597.     elseif t == "RBXScriptConnection" then return "RBXScriptConnection"
  598.     elseif t == "function" then
  599.         local info = "?"
  600.         pcall(function()
  601.             local src, line, name = debug.info(value, "sln")
  602.             info = string.format("%s:%s:%s", tostring(src or "?"), tostring(line or "?"), tostring(name or "?"))
  603.         end)
  604.         return "function() end --[[" .. info .. "]]"
  605.     elseif t == "table" then
  606.         local parts = {}
  607.         local count = 0
  608.         local isArray = true
  609.         local maxIndex = 0
  610.        
  611.         for k, _ in pairs(value) do
  612.             if type(k) ~= "number" or k < 1 or math.floor(k) ~= k then
  613.                 isArray = false
  614.                 break
  615.             end
  616.             maxIndex = math.max(maxIndex, k)
  617.         end
  618.        
  619.         if isArray and maxIndex > 0 then
  620.             for i = 1, maxIndex do
  621.                 if count >= 50 then
  622.                     table.insert(parts, nextSpacing .. "-- ... more")
  623.                     break
  624.                 end
  625.                 count = count + 1
  626.                 table.insert(parts, nextSpacing .. deepSerialize(value[i], depth + 1, indent))
  627.             end
  628.         else
  629.             for k, v in pairs(value) do
  630.                 if count >= 50 then
  631.                     table.insert(parts, nextSpacing .. "-- ... more")
  632.                     break
  633.                 end
  634.                 count = count + 1
  635.                 local keyStr
  636.                 if type(k) == "string" and k:match("^[%a_][%w_]*$") then
  637.                     keyStr = k
  638.                 else
  639.                     keyStr = "[" .. deepSerialize(k, depth + 1, indent) .. "]"
  640.                 end
  641.                 table.insert(parts, nextSpacing .. keyStr .. " = " .. deepSerialize(v, depth + 1, indent))
  642.             end
  643.         end
  644.         if #parts == 0 then return "{}" end
  645.         return "{\n" .. table.concat(parts, ",\n") .. "\n" .. spacing .. "}"
  646.     else
  647.         return "nil --[[" .. t .. "]]"
  648.     end
  649. end
  650.  
  651. local function estimateDataSize(value, seen)
  652.     seen = seen or {}
  653.     local t = typeof(value)
  654.    
  655.     if t == "nil" then return 1
  656.     elseif t == "boolean" then return 1
  657.     elseif t == "number" then return 8
  658.     elseif t == "string" then return #value + 2
  659.     elseif t == "Instance" then return 8
  660.     elseif t == "Vector3" then return 24
  661.     elseif t == "Vector2" then return 16
  662.     elseif t == "CFrame" then return 48
  663.     elseif t == "Color3" then return 12
  664.     elseif t == "UDim2" then return 16
  665.     elseif t == "table" then
  666.         if seen[value] then return 0 end
  667.         seen[value] = true
  668.         local size = 8
  669.         for k, v in pairs(value) do
  670.             size = size + estimateDataSize(k, seen) + estimateDataSize(v, seen)
  671.         end
  672.         return size
  673.     else
  674.         return 8
  675.     end
  676. end
  677.  
  678. local function getFunctionInfo(func)
  679.     if type(func) ~= "function" then return nil end
  680.    
  681.     local info = {
  682.         Type = "Unknown",
  683.         Source = "?",
  684.         Line = 0,
  685.         Name = "anonymous",
  686.         Upvalues = {},
  687.         Constants = {},
  688.         ProtoCount = 0,
  689.     }
  690.    
  691.     pcall(function()
  692.         if islclosure(func) then info.Type = "Lua"
  693.         elseif iscclosure(func) then info.Type = "C"
  694.         end
  695.     end)
  696.    
  697.     pcall(function()
  698.         local src, line, name = debug.info(func, "sln")
  699.         info.Source = tostring(src or "?")
  700.         info.Line = line or 0
  701.         info.Name = tostring(name or "anonymous")
  702.     end)
  703.    
  704.     pcall(function()
  705.         for i, v in pairs(getupvalues(func)) do
  706.             info.Upvalues[i] = {Value = v, Type = typeof(v)}
  707.         end
  708.     end)
  709.    
  710.     pcall(function()
  711.         for i, v in pairs(getconstants(func)) do
  712.             info.Constants[i] = {Value = v, Type = type(v)}
  713.         end
  714.     end)
  715.    
  716.     pcall(function()
  717.         info.ProtoCount = #getprotos(func)
  718.     end)
  719.    
  720.     return info
  721. end
  722.  
  723. local function getMetaInfo(obj)
  724.     if not getrawmetatable then return nil end
  725.     local mt = nil
  726.     pcall(function() mt = getrawmetatable(obj) end)
  727.     if not mt then return nil end
  728.    
  729.     local info = {ReadOnly = false, Methods = {}}
  730.     pcall(function() info.ReadOnly = isreadonly(mt) end)
  731.     for k, v in pairs(mt) do
  732.         if type(k) == "string" and k:sub(1, 2) == "__" then
  733.             info.Methods[k] = typeof(v)
  734.         end
  735.     end
  736.     return info
  737. end
  738.  
  739. local function decompileScript(script)
  740.     if not decompile then return "-- Decompiler not available" end
  741.     local success, result = pcall(decompile, script)
  742.     if success then
  743.         return result or "-- Decompile returned nil"
  744.     else
  745.         return "-- Decompile failed: " .. tostring(result)
  746.     end
  747. end
  748.  
  749. local function generateScript(logData)
  750.     local lines = {}
  751.     local needsGetNil = false
  752.    
  753.     local function add(text) table.insert(lines, text) end
  754.    
  755.     if Settings.Display.ShowTimestamps and logData.Timestamp then
  756.         add("-- Timestamp: " .. os.date("%Y-%m-%d %H:%M:%S", logData.Timestamp))
  757.     end
  758.    
  759.     if logData.Type == "RemoteEvent" or logData.Type == "UnreliableRemoteEvent" then
  760.         local remotePath = instanceToPath(logData.Remote)
  761.         if remotePath:find("getNil") then needsGetNil = true end
  762.        
  763.         add("-- Remote: " .. logData.Name)
  764.         add("-- Type: " .. logData.Type)
  765.         add("-- Method: " .. (logData.Method or "FireServer"))
  766.         if logData.DataSize then
  767.             add("-- Data Size: ~" .. logData.DataSize .. " bytes")
  768.         end
  769.         add("")
  770.        
  771.         if logData.Args and #logData.Args > 0 then
  772.             add("local args = " .. deepSerialize(logData.Args))
  773.             add("")
  774.             add(remotePath .. ":FireServer(unpack(args))")
  775.         else
  776.             add(remotePath .. ":FireServer()")
  777.         end
  778.        
  779.     elseif logData.Type == "RemoteFunction" then
  780.         local remotePath = instanceToPath(logData.Remote)
  781.         if remotePath:find("getNil") then needsGetNil = true end
  782.        
  783.         add("-- Remote: " .. logData.Name)
  784.         add("-- Type: RemoteFunction")
  785.         if logData.DataSize then
  786.             add("-- Data Size: ~" .. logData.DataSize .. " bytes")
  787.         end
  788.         add("")
  789.        
  790.         if logData.Args and #logData.Args > 0 then
  791.             add("local args = " .. deepSerialize(logData.Args))
  792.             add("")
  793.             add("local result = " .. remotePath .. ":InvokeServer(unpack(args))")
  794.         else
  795.             add("local result = " .. remotePath .. ":InvokeServer()")
  796.         end
  797.         add("print(result)")
  798.        
  799.     elseif logData.Type == "BindableEvent" then
  800.         local bindablePath = instanceToPath(logData.Remote)
  801.         if bindablePath:find("getNil") then needsGetNil = true end
  802.        
  803.         add("-- Bindable: " .. logData.Name)
  804.         add("-- Type: BindableEvent")
  805.         add("")
  806.        
  807.         if logData.Args and #logData.Args > 0 then
  808.             add("local args = " .. deepSerialize(logData.Args))
  809.             add("")
  810.             add(bindablePath .. ":Fire(unpack(args))")
  811.         else
  812.             add(bindablePath .. ":Fire()")
  813.         end
  814.        
  815.     elseif logData.Type == "BindableFunction" then
  816.         local bindablePath = instanceToPath(logData.Remote)
  817.         if bindablePath:find("getNil") then needsGetNil = true end
  818.        
  819.         add("-- Bindable: " .. logData.Name)
  820.         add("-- Type: BindableFunction")
  821.         add("")
  822.        
  823.         if logData.Args and #logData.Args > 0 then
  824.             add("local args = " .. deepSerialize(logData.Args))
  825.             add("")
  826.             add("local result = " .. bindablePath .. ":Invoke(unpack(args))")
  827.         else
  828.             add("local result = " .. bindablePath .. ":Invoke()")
  829.         end
  830.         add("print(result)")
  831.        
  832.     elseif logData.Type == "Signal" then
  833.         local instancePath = instanceToPath(logData.Instance)
  834.         if instancePath:find("getNil") then needsGetNil = true end
  835.        
  836.         add("-- Signal: " .. logData.SignalName)
  837.         add("-- Instance: " .. logData.Instance.Name .. " (" .. logData.Instance.ClassName .. ")")
  838.         add("-- Path: " .. instancePath .. "." .. logData.SignalName)
  839.         add("")
  840.        
  841.         if logData.Args and #logData.Args > 0 then
  842.             add("local args = " .. deepSerialize(logData.Args))
  843.             add("")
  844.         end
  845.        
  846.         if logData.FuncInfo then
  847.             add("--[[ Function Info:")
  848.             add("     Type: " .. logData.FuncInfo.Type)
  849.             add("     Source: " .. logData.FuncInfo.Source)
  850.             add("     Line: " .. logData.FuncInfo.Line)
  851.             add("     Name: " .. logData.FuncInfo.Name)
  852.             add("]]")
  853.             add("")
  854.         end
  855.        
  856.         local sigPath = instancePath .. "." .. logData.SignalName
  857.         if replicatesignal then
  858.             add("-- Replicate:")
  859.             if logData.Args and #logData.Args > 0 then
  860.                 add("replicatesignal(" .. sigPath .. ", unpack(args))")
  861.             else
  862.                 add("replicatesignal(" .. sigPath .. ")")
  863.             end
  864.         elseif firesignal then
  865.             add("-- Fire:")
  866.             if logData.Args and #logData.Args > 0 then
  867.                 add("firesignal(" .. sigPath .. ", unpack(args))")
  868.             else
  869.                 add("firesignal(" .. sigPath .. ")")
  870.             end
  871.         end
  872.        
  873.     elseif logData.Type == "Audio" then
  874.         add("-- Audio: " .. logData.Name)
  875.         add("-- SoundId: " .. logData.SoundId)
  876.         add("-- Volume: " .. (logData.Volume or 1))
  877.         add("")
  878.         add("local sound = Instance.new(\"Sound\")")
  879.         add("sound.SoundId = \"" .. logData.SoundId .. "\"")
  880.         add("sound.Volume = " .. (logData.Volume or 1))
  881.         add("sound.Parent = game:GetService(\"SoundService\")")
  882.         add("sound:Play()")
  883.         add("sound.Ended:Wait()")
  884.         add("sound:Destroy()")
  885.        
  886.     elseif logData.Type == "Animation" then
  887.         add("-- Animation: " .. logData.Name)
  888.         add("-- AnimationId: " .. logData.AnimationId)
  889.         add("")
  890.         add("local player = game:GetService(\"Players\").LocalPlayer")
  891.         add("local humanoid = player.Character:FindFirstChildOfClass(\"Humanoid\")")
  892.         add("local animator = humanoid:FindFirstChildOfClass(\"Animator\")")
  893.         add("")
  894.         add("local animation = Instance.new(\"Animation\")")
  895.         add("animation.AnimationId = \"" .. logData.AnimationId .. "\"")
  896.         add("")
  897.         add("local track = animator:LoadAnimation(animation)")
  898.         add("track:Play()")
  899.        
  900.     elseif logData.Type == "HttpRequest" then
  901.         add("-- HTTP Request")
  902.         add("-- URL: " .. (logData.Request.Url or "?"))
  903.         add("-- Method: " .. (logData.Request.Method or "GET"))
  904.         if logData.DataSize then
  905.             add("-- Data Size: ~" .. logData.DataSize .. " bytes")
  906.         end
  907.         add("")
  908.         add("local requestData = " .. deepSerialize(logData.Request))
  909.         add("")
  910.         add("local response = request(requestData)")
  911.         add("print(response.StatusCode)")
  912.         add("print(response.Body)")
  913.        
  914.     elseif logData.Type == "SystemRemote" then
  915.         local remotePath = instanceToPath(logData.Remote)
  916.         if remotePath:find("getNil") then needsGetNil = true end
  917.        
  918.         add("-- System Remote (RobloxReplicatedStorage)")
  919.         add("-- Name: " .. logData.Name)
  920.         add("-- Type: " .. logData.RemoteType)
  921.         add("")
  922.        
  923.         if logData.Args and #logData.Args > 0 then
  924.             add("local args = " .. deepSerialize(logData.Args))
  925.             add("")
  926.         end
  927.        
  928.         add("-- Path: " .. remotePath)
  929.     end
  930.    
  931.     local script = table.concat(lines, "\n")
  932.    
  933.     if needsGetNil then
  934.         script = "local function getNil(name, class)\n    for _, v in ipairs(getnilinstances()) do\n        if v.ClassName == class and v.Name == name then\n            return v\n        end\n    end\nend\n\n" .. script
  935.     end
  936.    
  937.     if logData.Blocked then
  938.         script = "-- THIS CALL WAS BLOCKED\n\n" .. script
  939.     end
  940.    
  941.     return script
  942. end
  943.  
  944. local function isSpammy(key)
  945.     if not Settings.Filters.FilterSpammy then return false end
  946.     local now = tick()
  947.     if not SpamHistory[key] then
  948.         SpamHistory[key] = {count = 1, lastTime = now}
  949.         return false
  950.     end
  951.     local h = SpamHistory[key]
  952.     if now - h.lastTime > Settings.Filters.SpamTimeWindow then
  953.         h.count = 1
  954.     else
  955.         h.count = h.count + 1
  956.     end
  957.     h.lastTime = now
  958.     if h.count > Settings.Filters.SpamThreshold then
  959.         if Settings.Filters.IgnoreSpammyLogs and not SpammySignals[key] then
  960.             SpammySignals[key] = true
  961.             debugLog("Auto-ignoring spammy:", key)
  962.         end
  963.         return true
  964.     end
  965.     return false
  966. end
  967.  
  968. local function isFromLocalPlayer(instance)
  969.     if not instance then return false end
  970.     local lp = Players.LocalPlayer
  971.     if not lp or not lp.Character then return false end
  972.     return instance:IsDescendantOf(lp.Character) or instance == lp.Character or instance:IsDescendantOf(lp)
  973. end
  974.  
  975. local function checkBreakpoint(logData)
  976.     for _, bp in pairs(Settings.Breakpoints) do
  977.         if bp.Enabled then
  978.             if bp.Type == "Name" and logData.Name == bp.Value then
  979.                 return true, bp
  980.             elseif bp.Type == "Contains" and logData.Name:find(bp.Value) then
  981.                 return true, bp
  982.             elseif bp.Type == "ArgType" then
  983.                 for _, arg in pairs(logData.Args or {}) do
  984.                     if typeof(arg) == bp.Value then
  985.                         return true, bp
  986.                     end
  987.                 end
  988.             elseif bp.Type == "ArgValue" then
  989.                 for _, arg in pairs(logData.Args or {}) do
  990.                     if tostring(arg) == bp.Value then
  991.                         return true, bp
  992.                     end
  993.                 end
  994.             end
  995.         end
  996.     end
  997.     return false, nil
  998. end
  999.  
  1000. local function updateStatistics(logData)
  1001.     Statistics.TotalCalls = Statistics.TotalCalls + 1
  1002.    
  1003.     local typeName = logData.Type
  1004.     Statistics.CallsByType[typeName] = (Statistics.CallsByType[typeName] or 0) + 1
  1005.    
  1006.     local name = logData.Name
  1007.     Statistics.CallsByName[name] = (Statistics.CallsByName[name] or 0) + 1
  1008.    
  1009.     if logData.DataSize then
  1010.         Statistics.DataTransferred = Statistics.DataTransferred + logData.DataSize
  1011.     end
  1012. end
  1013.  
  1014. local function getStatisticsReport()
  1015.     local uptime = tick() - Statistics.StartTime
  1016.     local report = {
  1017.         "-- UnifiedSpy Statistics Report",
  1018.         "-- ================================",
  1019.         "",
  1020.         "-- Uptime: " .. string.format("%.1f", uptime) .. " seconds",
  1021.         "-- Total Calls: " .. Statistics.TotalCalls,
  1022.         "-- Calls/Second: " .. string.format("%.2f", Statistics.TotalCalls / math.max(uptime, 1)),
  1023.         "-- Data Transferred: ~" .. string.format("%.2f", Statistics.DataTransferred / 1024) .. " KB",
  1024.         "",
  1025.         "-- By Type:",
  1026.     }
  1027.    
  1028.     for typeName, count in pairs(Statistics.CallsByType) do
  1029.         table.insert(report, "    " .. typeName .. ": " .. count)
  1030.     end
  1031.    
  1032.     table.insert(report, "")
  1033.     table.insert(report, "-- Top 15 by Name:")
  1034.    
  1035.     local sorted = {}
  1036.     for name, count in pairs(Statistics.CallsByName) do
  1037.         table.insert(sorted, {name = name, count = count})
  1038.     end
  1039.     table.sort(sorted, function(a, b) return a.count > b.count end)
  1040.    
  1041.     for i = 1, math.min(15, #sorted) do
  1042.         table.insert(report, "    " .. sorted[i].name .. ": " .. sorted[i].count)
  1043.     end
  1044.    
  1045.     return table.concat(report, "\n")
  1046. end
  1047.  
  1048. local function exportLogs(tabName, format)
  1049.     ensureFolders()
  1050.     format = format or "lua"
  1051.    
  1052.     local logs = Logs[tabName] or {}
  1053.     local fileName = FOLDER_LOGS .. "/" .. tabName .. "_" .. os.date("%Y%m%d_%H%M%S") .. "." .. format
  1054.    
  1055.     local content = ""
  1056.    
  1057.     if format == "lua" then
  1058.         content = "-- UnifiedSpy Export\n"
  1059.         content = content .. "-- Tab: " .. tabName .. "\n"
  1060.         content = content .. "-- Date: " .. os.date("%Y-%m-%d %H:%M:%S") .. "\n"
  1061.         content = content .. "-- Count: " .. #logs .. "\n\n"
  1062.        
  1063.         content = content .. "local logs = {\n"
  1064.         for i, log in ipairs(logs) do
  1065.             content = content .. "    [" .. i .. "] = {\n"
  1066.             content = content .. "        Name = " .. string.format("%q", log.Name or "") .. ",\n"
  1067.             content = content .. "        Type = " .. string.format("%q", log.Type or "") .. ",\n"
  1068.             content = content .. "        Timestamp = " .. (log.Timestamp or 0) .. ",\n"
  1069.             if log.Args then
  1070.                 content = content .. "        Args = " .. deepSerialize(log.Args, 2) .. ",\n"
  1071.             end
  1072.             content = content .. "    },\n"
  1073.         end
  1074.         content = content .. "}\n\nreturn logs"
  1075.     elseif format == "json" then
  1076.         local exportData = {
  1077.             tab = tabName,
  1078.             date = os.date("%Y-%m-%d %H:%M:%S"),
  1079.             count = #logs,
  1080.             logs = {}
  1081.         }
  1082.         for _, log in ipairs(logs) do
  1083.             table.insert(exportData.logs, {
  1084.                 Name = log.Name,
  1085.                 Type = log.Type,
  1086.                 Timestamp = log.Timestamp,
  1087.             })
  1088.         end
  1089.         local success, encoded = pcall(function()
  1090.             return HttpService:JSONEncode(exportData)
  1091.         end)
  1092.         content = success and encoded or "{}"
  1093.     end
  1094.    
  1095.     pcall(function()
  1096.         writefile(fileName, content)
  1097.     end)
  1098.    
  1099.     return fileName
  1100. end
  1101.  
  1102. local function randomString(len)
  1103.     len = len or math.random(12, 18)
  1104.     local chars = {}
  1105.     for i = 1, len do chars[i] = string.char(math.random(97, 122)) end
  1106.     return table.concat(chars)
  1107. end
  1108.  
  1109. local function Create(class, props, children)
  1110.     local inst = Instance.new(class)
  1111.     for k, v in pairs(props or {}) do
  1112.         if k ~= "Parent" then pcall(function() inst[k] = v end) end
  1113.     end
  1114.     for _, child in pairs(children or {}) do child.Parent = inst end
  1115.     if props and props.Parent then inst.Parent = props.Parent end
  1116.     return inst
  1117. end
  1118.  
  1119. local function Tween(inst, props, duration)
  1120.     if not Settings.Display.EnableAnimations then
  1121.         for k, v in pairs(props) do
  1122.             pcall(function() inst[k] = v end)
  1123.         end
  1124.         return
  1125.     end
  1126.     TweenService:Create(inst, TweenInfo.new(duration or 0.15, Enum.EasingStyle.Quad), props):Play()
  1127. end
  1128.  
  1129. local Keywords = {
  1130.     ["and"]=1,["break"]=1,["do"]=1,["else"]=1,["elseif"]=1,["end"]=1,
  1131.     ["false"]=1,["for"]=1,["function"]=1,["if"]=1,["in"]=1,["local"]=1,
  1132.     ["nil"]=1,["not"]=1,["or"]=1,["repeat"]=1,["return"]=1,["then"]=1,
  1133.     ["true"]=1,["until"]=1,["while"]=1,["continue"]=1,
  1134. }
  1135.  
  1136. local Builtins = {
  1137.     ["print"]=1,["warn"]=1,["error"]=1,["assert"]=1,["type"]=1,["typeof"]=1,
  1138.     ["tostring"]=1,["tonumber"]=1,["pairs"]=1,["ipairs"]=1,["next"]=1,
  1139.     ["select"]=1,["unpack"]=1,["pcall"]=1,["xpcall"]=1,["rawget"]=1,
  1140.     ["rawset"]=1,["setmetatable"]=1,["getmetatable"]=1,["require"]=1,
  1141.     ["loadstring"]=1,["game"]=1,["workspace"]=1,["script"]=1,["wait"]=1,
  1142.     ["spawn"]=1,["delay"]=1,["tick"]=1,["time"]=1,["task"]=1,["coroutine"]=1,
  1143.     ["string"]=1,["table"]=1,["math"]=1,["debug"]=1,["os"]=1,
  1144.     ["Instance"]=1,["Vector3"]=1,["Vector2"]=1,["CFrame"]=1,["Color3"]=1,
  1145.     ["BrickColor"]=1,["UDim2"]=1,["UDim"]=1,["Enum"]=1,["TweenInfo"]=1,
  1146.     ["Ray"]=1,["Rect"]=1,["Region3"]=1,["NumberRange"]=1,["NumberSequence"]=1,
  1147.     ["ColorSequence"]=1,["PhysicalProperties"]=1,["RaycastParams"]=1,
  1148. }
  1149.  
  1150. local function syntaxHighlight(code)
  1151.     local result = {}
  1152.     local i = 1
  1153.     local len = #code
  1154.    
  1155.     while i <= len do
  1156.         local char = code:sub(i, i)
  1157.        
  1158.         if code:sub(i, i+3) == "--[[" then
  1159.             local endPos = code:find("]]", i + 4, true)
  1160.             if endPos then
  1161.                 local comment = code:sub(i, endPos + 1)
  1162.                 table.insert(result, '<font color="#6A9955">' .. comment:gsub("<", "&lt;"):gsub(">", "&gt;") .. '</font>')
  1163.                 i = endPos + 2
  1164.             else
  1165.                 local comment = code:sub(i)
  1166.                 table.insert(result, '<font color="#6A9955">' .. comment:gsub("<", "&lt;"):gsub(">", "&gt;") .. '</font>')
  1167.                 break
  1168.             end
  1169.         elseif code:sub(i, i+1) == "--" then
  1170.             local endPos = code:find("\n", i) or len + 1
  1171.             local comment = code:sub(i, endPos - 1)
  1172.             table.insert(result, '<font color="#6A9955">' .. comment:gsub("<", "&lt;"):gsub(">", "&gt;") .. '</font>')
  1173.             i = endPos
  1174.         elseif code:sub(i, i+1) == "[[" then
  1175.             local endPos = code:find("]]", i + 2, true)
  1176.             if endPos then
  1177.                 local str = code:sub(i, endPos + 1)
  1178.                 table.insert(result, '<font color="#CE9178">' .. str:gsub("<", "&lt;"):gsub(">", "&gt;") .. '</font>')
  1179.                 i = endPos + 2
  1180.             else
  1181.                 local str = code:sub(i)
  1182.                 table.insert(result, '<font color="#CE9178">' .. str:gsub("<", "&lt;"):gsub(">", "&gt;") .. '</font>')
  1183.                 break
  1184.             end
  1185.         elseif char == '"' or char == "'" then
  1186.             local quote = char
  1187.             local j = i + 1
  1188.             while j <= len do
  1189.                 local c = code:sub(j, j)
  1190.                 if c == quote then break
  1191.                 elseif c == "\\" then j = j + 1
  1192.                 end
  1193.                 j = j + 1
  1194.             end
  1195.             local str = code:sub(i, j)
  1196.             table.insert(result, '<font color="#CE9178">' .. str:gsub("<", "&lt;"):gsub(">", "&gt;") .. '</font>')
  1197.             i = j + 1
  1198.         elseif char:match("%d") or (char == "." and code:sub(i+1, i+1):match("%d")) then
  1199.             local j = i
  1200.             local hasDecimal = false
  1201.             local hasExp = false
  1202.             local isHex = code:sub(i, i+1):lower() == "0x"
  1203.             if isHex then j = i + 2 end
  1204.             while j <= len do
  1205.                 local c = code:sub(j, j):lower()
  1206.                 if isHex then
  1207.                     if not c:match("[%da-f]") then break end
  1208.                 else
  1209.                     if c == "." and not hasDecimal then
  1210.                         hasDecimal = true
  1211.                     elseif c == "e" and not hasExp then
  1212.                         hasExp = true
  1213.                         if code:sub(j+1, j+1):match("[%+%-]") then j = j + 1 end
  1214.                     elseif not c:match("%d") then
  1215.                         break
  1216.                     end
  1217.                 end
  1218.                 j = j + 1
  1219.             end
  1220.             table.insert(result, '<font color="#B5CEA8">' .. code:sub(i, j-1) .. '</font>')
  1221.             i = j
  1222.         elseif char:match("[%a_]") then
  1223.             local j = i
  1224.             while j <= len and code:sub(j, j):match("[%w_]") do j = j + 1 end
  1225.             local word = code:sub(i, j-1)
  1226.             if Keywords[word] then
  1227.                 table.insert(result, '<font color="#C586C0">' .. word .. '</font>')
  1228.             elseif word == "true" or word == "false" or word == "nil" then
  1229.                 table.insert(result, '<font color="#569CD6">' .. word .. '</font>')
  1230.             elseif word == "self" then
  1231.                 table.insert(result, '<font color="#569CD6">' .. word .. '</font>')
  1232.             elseif Builtins[word] then
  1233.                 table.insert(result, '<font color="#4EC9B0">' .. word .. '</font>')
  1234.             elseif code:sub(j, j) == "(" then
  1235.                 table.insert(result, '<font color="#DCDCAA">' .. word .. '</font>')
  1236.             elseif code:sub(i-1, i-1) == ":" then
  1237.                 table.insert(result, '<font color="#DCDCAA">' .. word .. '</font>')
  1238.             else
  1239.                 table.insert(result, '<font color="#9CDCFE">' .. word .. '</font>')
  1240.             end
  1241.             i = j
  1242.         elseif char:match("[%+%-%%%*/%^#=<>~]") then
  1243.             table.insert(result, '<font color="#D4D4D4">' .. char:gsub("<", "&lt;"):gsub(">", "&gt;") .. '</font>')
  1244.             i = i + 1
  1245.         elseif char:match("[%(%)%[%]%{%}]") then
  1246.             table.insert(result, '<font color="#FFD700">' .. char .. '</font>')
  1247.             i = i + 1
  1248.         elseif char == "," or char == ";" then
  1249.             table.insert(result, '<font color="#D4D4D4">' .. char .. '</font>')
  1250.             i = i + 1
  1251.         else
  1252.             table.insert(result, char:gsub("<", "&lt;"):gsub(">", "&gt;"))
  1253.             i = i + 1
  1254.         end
  1255.     end
  1256.    
  1257.     return table.concat(result)
  1258. end
  1259.  
  1260. loadSettings()
  1261.  
  1262. local ScreenGui = Create("ScreenGui", {
  1263.     Name = randomString(),
  1264.     ResetOnSpawn = false,
  1265.     ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
  1266.     IgnoreGuiInset = true,
  1267. })
  1268.  
  1269. pcall(function()
  1270.     if syn and syn.protect_gui then syn.protect_gui(ScreenGui) end
  1271. end)
  1272.  
  1273. ScreenGui.Parent = (gethui and gethui()) or CoreGui
  1274.  
  1275. local MainFrame = Create("Frame", {
  1276.     Name = "Main",
  1277.     Parent = ScreenGui,
  1278.     BackgroundColor3 = getColor("Background"),
  1279.     BorderSizePixel = 0,
  1280.     Position = UDim2.new(0.5, -520, 0.5, -330),
  1281.     Size = UDim2.new(0, 1040, 0, 660),
  1282.     ClipsDescendants = true,
  1283. })
  1284. Create("UICorner", {CornerRadius = UDim.new(0, 12), Parent = MainFrame})
  1285. Create("UIStroke", {Color = Color3.fromRGB(55, 55, 65), Thickness = 1.5, Parent = MainFrame})
  1286.  
  1287. local TopBar = Create("Frame", {
  1288.     Name = "TopBar",
  1289.     Parent = MainFrame,
  1290.     BackgroundColor3 = getColor("TopBar"),
  1291.     BorderSizePixel = 0,
  1292.     Size = UDim2.new(1, 0, 0, 42),
  1293. })
  1294. Create("UICorner", {CornerRadius = UDim.new(0, 12), Parent = TopBar})
  1295. Create("Frame", {
  1296.     Parent = TopBar,
  1297.     BackgroundColor3 = getColor("TopBar"),
  1298.     BorderSizePixel = 0,
  1299.     Position = UDim2.new(0, 0, 0.5, 0),
  1300.     Size = UDim2.new(1, 0, 0.5, 0),
  1301. })
  1302.  
  1303. local TitleBtn = Create("TextButton", {
  1304.     Parent = TopBar,
  1305.     BackgroundTransparency = 1,
  1306.     Position = UDim2.new(0, 15, 0, 0),
  1307.     Size = UDim2.new(0, 130, 1, 0),
  1308.     Font = Enum.Font.GothamBlack,
  1309.     Text = "UnifiedSpy",
  1310.     TextColor3 = getColor("Accent"),
  1311.     TextSize = 18,
  1312.     TextXAlignment = Enum.TextXAlignment.Left,
  1313.     AutoButtonColor = false,
  1314. })
  1315.  
  1316. local StatusLabel = Create("TextLabel", {
  1317.     Parent = TopBar,
  1318.     BackgroundTransparency = 1,
  1319.     Position = UDim2.new(0, 140, 0, 0),
  1320.     Size = UDim2.new(0, 60, 1, 0),
  1321.     Font = Enum.Font.GothamBold,
  1322.     Text = "ACTIVE",
  1323.     TextColor3 = getColor("Success"),
  1324.     TextSize = 10,
  1325.     TextXAlignment = Enum.TextXAlignment.Left,
  1326. })
  1327.  
  1328. local VersionLabel = Create("TextLabel", {
  1329.     Parent = TopBar,
  1330.     BackgroundTransparency = 1,
  1331.     Position = UDim2.new(0, 200, 0, 0),
  1332.     Size = UDim2.new(0, 120, 1, 0),
  1333.     Font = Enum.Font.Gotham,
  1334.     Text = "v3.0",
  1335.     TextColor3 = getColor("TextDim"),
  1336.     TextSize = 10,
  1337.     TextXAlignment = Enum.TextXAlignment.Left,
  1338. })
  1339.  
  1340. local SearchBox = Create("TextBox", {
  1341.     Parent = TopBar,
  1342.     BackgroundColor3 = Color3.fromRGB(35, 35, 45),
  1343.     BorderSizePixel = 0,
  1344.     Position = UDim2.new(0.5, -110, 0, 9),
  1345.     Size = UDim2.new(0, 220, 0, 24),
  1346.     Font = Enum.Font.Gotham,
  1347.     PlaceholderText = "Search logs...",
  1348.     Text = "",
  1349.     TextColor3 = getColor("Text"),
  1350.     PlaceholderColor3 = getColor("TextDim"),
  1351.     TextSize = 11,
  1352.     ClearTextOnFocus = false,
  1353. })
  1354. Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = SearchBox})
  1355. Create("UIStroke", {Color = Color3.fromRGB(50, 50, 60), Thickness = 1, Parent = SearchBox})
  1356.  
  1357. SearchBox:GetPropertyChangedSignal("Text"):Connect(function()
  1358.     SearchQuery = SearchBox.Text:lower()
  1359. end)
  1360.  
  1361. local function makeWindowBtn(name, text, pos)
  1362.     local btn = Create("TextButton", {
  1363.         Name = name,
  1364.         Parent = TopBar,
  1365.         BackgroundTransparency = 1,
  1366.         Position = pos,
  1367.         Size = UDim2.new(0, 42, 0, 42),
  1368.         Font = Enum.Font.GothamBold,
  1369.         Text = text,
  1370.         TextColor3 = getColor("TextDim"),
  1371.         TextSize = 18,
  1372.         AutoButtonColor = false,
  1373.     })
  1374.     btn.MouseEnter:Connect(function()
  1375.         Tween(btn, {TextColor3 = getColor("Text")})
  1376.     end)
  1377.     btn.MouseLeave:Connect(function()
  1378.         Tween(btn, {TextColor3 = getColor("TextDim")})
  1379.     end)
  1380.     return btn
  1381. end
  1382.  
  1383. local CloseBtn = makeWindowBtn("Close", "×", UDim2.new(1, -42, 0, 0))
  1384. local MaxBtn = makeWindowBtn("Max", "□", UDim2.new(1, -84, 0, 0))
  1385. local MinBtn = makeWindowBtn("Min", "−", UDim2.new(1, -126, 0, 0))
  1386.  
  1387. local ContentFrame = Create("Frame", {
  1388.     Name = "Content",
  1389.     Parent = MainFrame,
  1390.     BackgroundTransparency = 1,
  1391.     Position = UDim2.new(0, 0, 0, 42),
  1392.     Size = UDim2.new(1, 0, 1, -42),
  1393. })
  1394.  
  1395. local Sidebar = Create("Frame", {
  1396.     Name = "Sidebar",
  1397.     Parent = ContentFrame,
  1398.     BackgroundColor3 = getColor("Sidebar"),
  1399.     BorderSizePixel = 0,
  1400.     Size = UDim2.new(0, 175, 1, 0),
  1401. })
  1402.  
  1403. local TabListFrame = Create("ScrollingFrame", {
  1404.     Name = "TabList",
  1405.     Parent = Sidebar,
  1406.     BackgroundTransparency = 1,
  1407.     Position = UDim2.new(0, 8, 0, 10),
  1408.     Size = UDim2.new(1, -16, 1, -20),
  1409.     CanvasSize = UDim2.new(0, 0, 0, 0),
  1410.     ScrollBarThickness = 3,
  1411.     ScrollBarImageColor3 = getColor("Accent"),
  1412.     AutomaticCanvasSize = Enum.AutomaticSize.Y,
  1413. })
  1414. Create("UIListLayout", {Parent = TabListFrame, SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 6)})
  1415.  
  1416. local MainPanel = Create("Frame", {
  1417.     Name = "MainPanel",
  1418.     Parent = ContentFrame,
  1419.     BackgroundTransparency = 1,
  1420.     Position = UDim2.new(0, 175, 0, 0),
  1421.     Size = UDim2.new(1, -175, 1, 0),
  1422. })
  1423.  
  1424. local TabDefinitions = {
  1425.     {Name = "Remotes", Icon = "R", Order = 1, ColorKey = "Remotes"},
  1426.     {Name = "Signals", Icon = "S", Order = 2, ColorKey = "Signals"},
  1427.     {Name = "Requests", Icon = "H", Order = 3, ColorKey = "Requests"},
  1428.     {Name = "Bindables", Icon = "B", Order = 4, ColorKey = "Bindables"},
  1429.     {Name = "System", Icon = "Y", Order = 5, ColorKey = "System"},
  1430.     {Name = "Audios", Icon = "A", Order = 6, ColorKey = "Audios"},
  1431.     {Name = "Animations", Icon = "M", Order = 7, ColorKey = "Animations"},
  1432.     {Name = "Settings", Icon = "⚙", Order = 8, ColorKey = "SettingsTab", IsSettings = true},
  1433. }
  1434.  
  1435. local function createLogTab(tabDef)
  1436.     local tabName = tabDef.Name
  1437.     local color = getColor(tabDef.ColorKey)
  1438.    
  1439.     local content = Create("Frame", {
  1440.         Name = tabName,
  1441.         Parent = MainPanel,
  1442.         BackgroundTransparency = 1,
  1443.         Size = UDim2.new(1, 0, 1, 0),
  1444.         Visible = false,
  1445.     })
  1446.    
  1447.     local leftPanel = Create("Frame", {
  1448.         Parent = content,
  1449.         BackgroundColor3 = Color3.fromRGB(30, 30, 38),
  1450.         BorderSizePixel = 0,
  1451.         Position = UDim2.new(0, 6, 0, 6),
  1452.         Size = UDim2.new(0.34, -8, 1, -12),
  1453.     })
  1454.     Create("UICorner", {CornerRadius = UDim.new(0, 8), Parent = leftPanel})
  1455.    
  1456.     local headerLeft = Create("Frame", {
  1457.         Parent = leftPanel,
  1458.         BackgroundColor3 = Color3.fromRGB(35, 35, 45),
  1459.         BorderSizePixel = 0,
  1460.         Size = UDim2.new(1, 0, 0, 36),
  1461.     })
  1462.     Create("UICorner", {CornerRadius = UDim.new(0, 8), Parent = headerLeft})
  1463.     Create("Frame", {Parent = headerLeft, BackgroundColor3 = Color3.fromRGB(35, 35, 45), BorderSizePixel = 0, Position = UDim2.new(0, 0, 0.5, 0), Size = UDim2.new(1, 0, 0.5, 0)})
  1464.    
  1465.     Create("TextLabel", {
  1466.         Parent = headerLeft,
  1467.         BackgroundTransparency = 1,
  1468.         Position = UDim2.new(0, 12, 0, 0),
  1469.         Size = UDim2.new(0.6, 0, 1, 0),
  1470.         Font = Enum.Font.GothamBold,
  1471.         Text = tabDef.Icon .. " " .. tabName,
  1472.         TextColor3 = color,
  1473.         TextSize = 14,
  1474.         TextXAlignment = Enum.TextXAlignment.Left,
  1475.     })
  1476.    
  1477.     local countLabel = Create("TextLabel", {
  1478.         Name = "Count",
  1479.         Parent = headerLeft,
  1480.         BackgroundTransparency = 1,
  1481.         Position = UDim2.new(0.6, 0, 0, 0),
  1482.         Size = UDim2.new(0.4, -12, 1, 0),
  1483.         Font = Enum.Font.GothamBold,
  1484.         Text = "0",
  1485.         TextColor3 = getColor("TextDim"),
  1486.         TextSize = 12,
  1487.         TextXAlignment = Enum.TextXAlignment.Right,
  1488.     })
  1489.    
  1490.     local logScroll = Create("ScrollingFrame", {
  1491.         Parent = leftPanel,
  1492.         BackgroundTransparency = 1,
  1493.         Position = UDim2.new(0, 0, 0, 40),
  1494.         Size = UDim2.new(1, 0, 1, -44),
  1495.         CanvasSize = UDim2.new(0, 0, 0, 0),
  1496.         ScrollBarThickness = 4,
  1497.         ScrollBarImageColor3 = color,
  1498.         AutomaticCanvasSize = Enum.AutomaticSize.Y,
  1499.     })
  1500.     Create("UIListLayout", {Parent = logScroll, SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 3)})
  1501.     Create("UIPadding", {Parent = logScroll, PaddingTop = UDim.new(0, 4), PaddingBottom = UDim.new(0, 4), PaddingLeft = UDim.new(0, 5), PaddingRight = UDim.new(0, 5)})
  1502.    
  1503.     local rightPanel = Create("Frame", {
  1504.         Parent = content,
  1505.         BackgroundColor3 = Color3.fromRGB(22, 22, 28),
  1506.         BorderSizePixel = 0,
  1507.         Position = UDim2.new(0.34, 4, 0, 6),
  1508.         Size = UDim2.new(0.66, -10, 0.56, -8),
  1509.     })
  1510.     Create("UICorner", {CornerRadius = UDim.new(0, 8), Parent = rightPanel})
  1511.    
  1512.     local codeHeader = Create("Frame", {
  1513.         Parent = rightPanel,
  1514.         BackgroundColor3 = Color3.fromRGB(28, 28, 36),
  1515.         BorderSizePixel = 0,
  1516.         Size = UDim2.new(1, 0, 0, 34),
  1517.     })
  1518.     Create("UICorner", {CornerRadius = UDim.new(0, 8), Parent = codeHeader})
  1519.     Create("Frame", {Parent = codeHeader, BackgroundColor3 = Color3.fromRGB(28, 28, 36), BorderSizePixel = 0, Position = UDim2.new(0, 0, 0.5, 0), Size = UDim2.new(1, 0, 0.5, 0)})
  1520.    
  1521.     Create("TextLabel", {
  1522.         Parent = codeHeader,
  1523.         BackgroundTransparency = 1,
  1524.         Position = UDim2.new(0, 14, 0, 0),
  1525.         Size = UDim2.new(0.5, 0, 1, 0),
  1526.         Font = Enum.Font.GothamBold,
  1527.         Text = "Code / Executor",
  1528.         TextColor3 = getColor("Text"),
  1529.         TextSize = 12,
  1530.         TextXAlignment = Enum.TextXAlignment.Left,
  1531.     })
  1532.    
  1533.     local copyBtn = Create("TextButton", {
  1534.         Parent = codeHeader,
  1535.         BackgroundColor3 = Color3.fromRGB(50, 70, 100),
  1536.         BorderSizePixel = 0,
  1537.         Position = UDim2.new(1, -150, 0, 5),
  1538.         Size = UDim2.new(0, 60, 0, 24),
  1539.         Font = Enum.Font.GothamBold,
  1540.         Text = "Copy",
  1541.         TextColor3 = Color3.fromRGB(255, 255, 255),
  1542.         TextSize = 10,
  1543.         AutoButtonColor = false,
  1544.     })
  1545.     Create("UICorner", {CornerRadius = UDim.new(0, 5), Parent = copyBtn})
  1546.    
  1547.     local runBtn = Create("TextButton", {
  1548.         Parent = codeHeader,
  1549.         BackgroundColor3 = Color3.fromRGB(50, 100, 50),
  1550.         BorderSizePixel = 0,
  1551.         Position = UDim2.new(1, -82, 0, 5),
  1552.         Size = UDim2.new(0, 72, 0, 24),
  1553.         Font = Enum.Font.GothamBold,
  1554.         Text = "▶ Run",
  1555.         TextColor3 = Color3.fromRGB(255, 255, 255),
  1556.         TextSize = 11,
  1557.         AutoButtonColor = false,
  1558.     })
  1559.     Create("UICorner", {CornerRadius = UDim.new(0, 5), Parent = runBtn})
  1560.    
  1561.     local codeContainer = Create("Frame", {
  1562.         Parent = rightPanel,
  1563.         BackgroundColor3 = Color3.fromRGB(18, 18, 22),
  1564.         Position = UDim2.new(0, 5, 0, 38),
  1565.         Size = UDim2.new(1, -10, 1, -43),
  1566.     })
  1567.     Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = codeContainer})
  1568.    
  1569.     local lineNums = Create("TextLabel", {
  1570.         Parent = codeContainer,
  1571.         BackgroundColor3 = Color3.fromRGB(25, 25, 32),
  1572.         Size = UDim2.new(0, 38, 1, 0),
  1573.         Font = Enum.Font.Code,
  1574.         Text = "1",
  1575.         TextColor3 = Color3.fromRGB(75, 75, 90),
  1576.         TextSize = 13,
  1577.         TextXAlignment = Enum.TextXAlignment.Right,
  1578.         TextYAlignment = Enum.TextYAlignment.Top,
  1579.     })
  1580.     Create("UIPadding", {Parent = lineNums, PaddingTop = UDim.new(0, 10), PaddingRight = UDim.new(0, 8)})
  1581.     Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = lineNums})
  1582.    
  1583.     local codeScroll = Create("ScrollingFrame", {
  1584.         Parent = codeContainer,
  1585.         BackgroundTransparency = 1,
  1586.         Position = UDim2.new(0, 42, 0, 0),
  1587.         Size = UDim2.new(1, -46, 1, 0),
  1588.         CanvasSize = UDim2.new(0, 0, 0, 0),
  1589.         ScrollBarThickness = 4,
  1590.         ScrollBarImageColor3 = color,
  1591.         AutomaticCanvasSize = Enum.AutomaticSize.XY,
  1592.     })
  1593.    
  1594.     local codeDisplay = Create("TextLabel", {
  1595.         Parent = codeScroll,
  1596.         BackgroundTransparency = 1,
  1597.         Size = UDim2.new(1, 0, 0, 0),
  1598.         AutomaticSize = Enum.AutomaticSize.XY,
  1599.         Font = Enum.Font.Code,
  1600.         Text = "",
  1601.         TextColor3 = getColor("Text"),
  1602.         TextSize = 13,
  1603.         TextXAlignment = Enum.TextXAlignment.Left,
  1604.         TextYAlignment = Enum.TextYAlignment.Top,
  1605.         RichText = true,
  1606.         TextWrapped = false,
  1607.     })
  1608.     Create("UIPadding", {Parent = codeDisplay, PaddingTop = UDim.new(0, 10), PaddingLeft = UDim.new(0, 8), PaddingRight = UDim.new(0, 8)})
  1609.    
  1610.     local codeInput = Create("TextBox", {
  1611.         Parent = codeScroll,
  1612.         BackgroundTransparency = 1,
  1613.         Size = UDim2.new(1, 0, 0, 0),
  1614.         AutomaticSize = Enum.AutomaticSize.XY,
  1615.         Font = Enum.Font.Code,
  1616.         Text = "-- Select a log entry or type code here",
  1617.         TextColor3 = getColor("Text"),
  1618.         TextTransparency = 0,
  1619.         TextSize = 13,
  1620.         TextXAlignment = Enum.TextXAlignment.Left,
  1621.         TextYAlignment = Enum.TextYAlignment.Top,
  1622.         ClearTextOnFocus = false,
  1623.         MultiLine = true,
  1624.         TextWrapped = false,
  1625.         Visible = false,
  1626.     })
  1627.     Create("UIPadding", {Parent = codeInput, PaddingTop = UDim.new(0, 10), PaddingLeft = UDim.new(0, 8), PaddingRight = UDim.new(0, 8)})
  1628.    
  1629.     local currentCode = "-- Select a log entry or type code here"
  1630.     local isEditing = false
  1631.    
  1632.     local function updateLineNumbers(code)
  1633.         local lines = 1
  1634.         for _ in code:gmatch("\n") do lines = lines + 1 end
  1635.         local nums = {}
  1636.         for i = 1, lines do nums[i] = tostring(i) end
  1637.         lineNums.Text = table.concat(nums, "\n")
  1638.     end
  1639.    
  1640.     local function updateCode(code)
  1641.         currentCode = code
  1642.         updateLineNumbers(code)
  1643.        
  1644.         if not isEditing then
  1645.             codeInput.Visible = false
  1646.             codeDisplay.Visible = true
  1647.             codeDisplay.Text = syntaxHighlight(code)
  1648.         end
  1649.     end
  1650.    
  1651.     codeContainer.InputBegan:Connect(function(input)
  1652.         if input.UserInputType == Enum.UserInputType.MouseButton1 and not isEditing then
  1653.             isEditing = true
  1654.             codeDisplay.Visible = false
  1655.             codeInput.Visible = true
  1656.             codeInput.Text = currentCode
  1657.             task.defer(function()
  1658.                 codeInput:CaptureFocus()
  1659.             end)
  1660.         end
  1661.     end)
  1662.    
  1663.     codeInput.FocusLost:Connect(function()
  1664.         isEditing = false
  1665.         currentCode = codeInput.Text
  1666.         updateCode(currentCode)
  1667.     end)
  1668.    
  1669.     codeInput:GetPropertyChangedSignal("Text"):Connect(function()
  1670.         if isEditing then
  1671.             updateLineNumbers(codeInput.Text)
  1672.         end
  1673.     end)
  1674.    
  1675.     copyBtn.MouseButton1Click:Connect(function()
  1676.         if setclipboard then
  1677.             setclipboard(currentCode)
  1678.             copyBtn.Text = "Copied!"
  1679.             task.delay(1.5, function()
  1680.                 copyBtn.Text = "Copy"
  1681.             end)
  1682.         end
  1683.     end)
  1684.    
  1685.     runBtn.MouseButton1Click:Connect(function()
  1686.         if currentCode ~= "" then
  1687.             runBtn.Text = "Running..."
  1688.             runBtn.BackgroundColor3 = Color3.fromRGB(100, 100, 50)
  1689.            
  1690.             task.spawn(function()
  1691.                 local fn, err = loadstring(currentCode)
  1692.                 if fn then
  1693.                     local ok, execErr = pcall(fn)
  1694.                     if not ok then
  1695.                         debugWarn("Execution error:", execErr)
  1696.                         runBtn.Text = "Error!"
  1697.                         runBtn.BackgroundColor3 = Color3.fromRGB(100, 50, 50)
  1698.                     else
  1699.                         runBtn.Text = "Success!"
  1700.                         runBtn.BackgroundColor3 = Color3.fromRGB(50, 100, 50)
  1701.                     end
  1702.                 else
  1703.                     debugWarn("Syntax error:", err)
  1704.                     runBtn.Text = "Syntax Error!"
  1705.                     runBtn.BackgroundColor3 = Color3.fromRGB(100, 50, 50)
  1706.                 end
  1707.                
  1708.                 task.delay(1.5, function()
  1709.                     runBtn.Text = "▶ Run"
  1710.                     runBtn.BackgroundColor3 = Color3.fromRGB(50, 100, 50)
  1711.                 end)
  1712.             end)
  1713.         end
  1714.     end)
  1715.    
  1716.     local actionsPanel = Create("Frame", {
  1717.         Parent = content,
  1718.         BackgroundColor3 = Color3.fromRGB(28, 28, 36),
  1719.         BorderSizePixel = 0,
  1720.         Position = UDim2.new(0.34, 4, 0.56, 2),
  1721.         Size = UDim2.new(0.66, -10, 0.44, -8),
  1722.     })
  1723.     Create("UICorner", {CornerRadius = UDim.new(0, 8), Parent = actionsPanel})
  1724.    
  1725.     local actionsHeader = Create("Frame", {
  1726.         Parent = actionsPanel,
  1727.         BackgroundColor3 = Color3.fromRGB(32, 32, 42),
  1728.         BorderSizePixel = 0,
  1729.         Size = UDim2.new(1, 0, 0, 30),
  1730.     })
  1731.     Create("UICorner", {CornerRadius = UDim.new(0, 8), Parent = actionsHeader})
  1732.     Create("Frame", {Parent = actionsHeader, BackgroundColor3 = Color3.fromRGB(32, 32, 42), BorderSizePixel = 0, Position = UDim2.new(0, 0, 0.5, 0), Size = UDim2.new(1, 0, 0.5, 0)})
  1733.    
  1734.     Create("TextLabel", {
  1735.         Parent = actionsHeader,
  1736. --        BackgroundTransparency =
  1737.         BackgroundTransparency = 1,
  1738.         Position = UDim2.new(0, 14, 0, 0),
  1739.         Size = UDim2.new(1, -14, 1, 0),
  1740.         Font = Enum.Font.GothamBold,
  1741.         Text = "Actions / Debug Info",
  1742.         TextColor3 = getColor("TextDim"),
  1743.         TextSize = 11,
  1744.         TextXAlignment = Enum.TextXAlignment.Left,
  1745.     })
  1746.    
  1747.     local btnScroll = Create("ScrollingFrame", {
  1748.         Parent = actionsPanel,
  1749.         BackgroundTransparency = 1,
  1750.         Position = UDim2.new(0, 5, 0, 34),
  1751.         Size = UDim2.new(1, -10, 1, -38),
  1752.         CanvasSize = UDim2.new(0, 0, 0, 0),
  1753.         ScrollBarThickness = 3,
  1754.         ScrollBarImageColor3 = color,
  1755.         AutomaticCanvasSize = Enum.AutomaticSize.Y,
  1756.     })
  1757.     Create("UIGridLayout", {
  1758.         Parent = btnScroll,
  1759.         CellSize = UDim2.new(0, 100, 0, 32),
  1760.         CellPadding = UDim2.new(0, 6, 0, 6),
  1761.         SortOrder = Enum.SortOrder.LayoutOrder,
  1762.     })
  1763.     Create("UIPadding", {Parent = btnScroll, PaddingTop = UDim.new(0, 5), PaddingLeft = UDim.new(0, 5)})
  1764.    
  1765.     local function makeActionBtn(text, order, bgColor)
  1766.         local btn = Create("TextButton", {
  1767.             Parent = btnScroll,
  1768.             BackgroundColor3 = bgColor or Color3.fromRGB(45, 45, 58),
  1769.             BorderSizePixel = 0,
  1770.             Font = Enum.Font.GothamBold,
  1771.             Text = text,
  1772.             TextColor3 = Color3.fromRGB(220, 220, 230),
  1773.             TextSize = 10,
  1774.             AutoButtonColor = false,
  1775.             LayoutOrder = order,
  1776.         })
  1777.         Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = btn})
  1778.         btn.MouseEnter:Connect(function()
  1779.             Tween(btn, {BackgroundColor3 = Color3.fromRGB(65, 65, 85)})
  1780.         end)
  1781.         btn.MouseLeave:Connect(function()
  1782.             Tween(btn, {BackgroundColor3 = bgColor or Color3.fromRGB(45, 45, 58)})
  1783.         end)
  1784.         return btn
  1785.     end
  1786.    
  1787.     local copyCodeBtn = makeActionBtn("Copy Code", 1, Color3.fromRGB(50, 70, 100))
  1788.     local copyPathBtn = makeActionBtn("Copy Path", 2, Color3.fromRGB(50, 70, 100))
  1789.     local copyArgsBtn = makeActionBtn("Copy Args", 3, Color3.fromRGB(50, 70, 100))
  1790.     local blockBtn = makeActionBtn("Block", 4, Color3.fromRGB(100, 50, 50))
  1791.     local ignoreBtn = makeActionBtn("Ignore", 5, Color3.fromRGB(90, 70, 40))
  1792.     local clearBtn = makeActionBtn("Clear Tab", 6, Color3.fromRGB(80, 50, 80))
  1793.     local funcInfoBtn = makeActionBtn("Func Info", 7)
  1794.     local metaInfoBtn = makeActionBtn("Meta Info", 8)
  1795.     local upvaluesBtn = makeActionBtn("Upvalues", 9)
  1796.     local constantsBtn = makeActionBtn("Constants", 10)
  1797.     local connectionsBtn = makeActionBtn("Connections", 11)
  1798.     local fireBtn = makeActionBtn("Fire/Replay", 12, Color3.fromRGB(50, 90, 50))
  1799.     local decompileBtn = makeActionBtn("Decompile", 13, Color3.fromRGB(70, 60, 90))
  1800.     local exportBtn = makeActionBtn("Export Lua", 14, Color3.fromRGB(60, 70, 90))
  1801.     local exportJsonBtn = makeActionBtn("Export JSON", 15, Color3.fromRGB(60, 70, 90))
  1802.     local statsBtn = makeActionBtn("Statistics", 16, Color3.fromRGB(70, 80, 60))
  1803.     local breakpointBtn = makeActionBtn("+ Breakpoint", 17, Color3.fromRGB(100, 80, 50))
  1804.     local clearBpBtn = makeActionBtn("Clear BPs", 18, Color3.fromRGB(80, 60, 60))
  1805.    
  1806.     copyCodeBtn.MouseButton1Click:Connect(function()
  1807.         if setclipboard then
  1808.             setclipboard(currentCode)
  1809.             copyCodeBtn.Text = "Copied!"
  1810.             task.delay(1, function() copyCodeBtn.Text = "Copy Code" end)
  1811.         end
  1812.     end)
  1813.    
  1814.     copyPathBtn.MouseButton1Click:Connect(function()
  1815.         if Selected and setclipboard then
  1816.             local path = ""
  1817.             if Selected.Remote then
  1818.                 path = instanceToPath(Selected.Remote)
  1819.             elseif Selected.Instance then
  1820.                 path = instanceToPath(Selected.Instance)
  1821.                 if Selected.SignalName then
  1822.                     path = path .. "." .. Selected.SignalName
  1823.                 end
  1824.             elseif Selected.Sound then
  1825.                 path = instanceToPath(Selected.Sound)
  1826.             end
  1827.             setclipboard(path)
  1828.             copyPathBtn.Text = "Copied!"
  1829.             task.delay(1, function() copyPathBtn.Text = "Copy Path" end)
  1830.         end
  1831.     end)
  1832.    
  1833.     copyArgsBtn.MouseButton1Click:Connect(function()
  1834.         if Selected and Selected.Args and setclipboard then
  1835.             setclipboard(deepSerialize(Selected.Args))
  1836.             copyArgsBtn.Text = "Copied!"
  1837.             task.delay(1, function() copyArgsBtn.Text = "Copy Args" end)
  1838.         end
  1839.     end)
  1840.    
  1841.     blockBtn.MouseButton1Click:Connect(function()
  1842.         if Selected then
  1843.             Settings.Blocklist[Selected.Name] = true
  1844.             if Selected.Remote then
  1845.                 Settings.Blocklist[tostring(Selected.Remote)] = true
  1846.             end
  1847.             saveSettings()
  1848.             blockBtn.Text = "Blocked!"
  1849.             task.delay(1, function() blockBtn.Text = "Block" end)
  1850.         end
  1851.     end)
  1852.    
  1853.     ignoreBtn.MouseButton1Click:Connect(function()
  1854.         if Selected then
  1855.             Settings.Blacklist[Selected.Name] = true
  1856.             if Selected.Remote then
  1857.                 Settings.Blacklist[tostring(Selected.Remote)] = true
  1858.             end
  1859.             saveSettings()
  1860.             ignoreBtn.Text = "Ignored!"
  1861.             task.delay(1, function() ignoreBtn.Text = "Ignore" end)
  1862.         end
  1863.     end)
  1864.    
  1865.     clearBtn.MouseButton1Click:Connect(function()
  1866.         for _, child in pairs(logScroll:GetChildren()) do
  1867.             if child:IsA("Frame") or child:IsA("TextButton") then
  1868.                 child:Destroy()
  1869.             end
  1870.         end
  1871.         Logs[tabName] = {}
  1872.         LogFrames[tabName] = {}
  1873.         LogGroups[tabName] = {}
  1874.         GroupFrames[tabName] = {}
  1875.         LayoutOrders[tabName] = 999999999
  1876.         countLabel.Text = "0"
  1877.         updateCode("-- Cleared")
  1878.         Selected = nil
  1879.     end)
  1880.    
  1881.     funcInfoBtn.MouseButton1Click:Connect(function()
  1882.         if Selected and Selected.FuncInfo then
  1883.             local info = "-- Function Info\n"
  1884.             info = info .. "-- ================\n\n"
  1885.             info = info .. "Type: " .. Selected.FuncInfo.Type .. "\n"
  1886.             info = info .. "Source: " .. Selected.FuncInfo.Source .. "\n"
  1887.             info = info .. "Line: " .. Selected.FuncInfo.Line .. "\n"
  1888.             info = info .. "Name: " .. Selected.FuncInfo.Name .. "\n"
  1889.             info = info .. "Proto Count: " .. Selected.FuncInfo.ProtoCount
  1890.             updateCode(info)
  1891.         else
  1892.             updateCode("-- No function info available")
  1893.         end
  1894.     end)
  1895.    
  1896.     metaInfoBtn.MouseButton1Click:Connect(function()
  1897.         if Selected then
  1898.             local target = Selected.Remote or Selected.Instance or Selected.Sound
  1899.             if target then
  1900.                 local meta = getMetaInfo(target)
  1901.                 if meta then
  1902.                     local info = "-- Metatable Info\n"
  1903.                     info = info .. "-- ================\n\n"
  1904.                     info = info .. "ReadOnly: " .. tostring(meta.ReadOnly) .. "\n\n"
  1905.                     info = info .. "Metamethods:\n"
  1906.                     for k, v in pairs(meta.Methods) do
  1907.                         info = info .. "    " .. k .. ": " .. v .. "\n"
  1908.                     end
  1909.                     updateCode(info)
  1910.                 else
  1911.                     updateCode("-- No metatable found")
  1912.                 end
  1913.             end
  1914.         end
  1915.     end)
  1916.    
  1917.     upvaluesBtn.MouseButton1Click:Connect(function()
  1918.         if Selected and Selected.FuncInfo and Selected.FuncInfo.Upvalues then
  1919.             local info = "-- Upvalues\n"
  1920.             info = info .. "-- ================\n\n"
  1921.             local hasUpvalues = false
  1922.             for i, data in pairs(Selected.FuncInfo.Upvalues) do
  1923.                 hasUpvalues = true
  1924.                 info = info .. "[" .. i .. "] = " .. deepSerialize(data.Value) .. "  -- " .. data.Type .. "\n"
  1925.             end
  1926.             if not hasUpvalues then
  1927.                 info = info .. "-- No upvalues found"
  1928.             end
  1929.             updateCode(info)
  1930.         else
  1931.             updateCode("-- No upvalues available")
  1932.         end
  1933.     end)
  1934.    
  1935.     constantsBtn.MouseButton1Click:Connect(function()
  1936.         if Selected and Selected.FuncInfo and Selected.FuncInfo.Constants then
  1937.             local info = "-- Constants\n"
  1938.             info = info .. "-- ================\n\n"
  1939.             local hasConstants = false
  1940.             for i, data in pairs(Selected.FuncInfo.Constants) do
  1941.                 hasConstants = true
  1942.                 local val = data.Value
  1943.                 if type(val) == "string" then
  1944.                     val = string.format("%q", val)
  1945.                 else
  1946.                     val = tostring(val)
  1947.                 end
  1948.                 info = info .. "[" .. i .. "] = " .. val .. "  -- " .. data.Type .. "\n"
  1949.             end
  1950.             if not hasConstants then
  1951.                 info = info .. "-- No constants found"
  1952.             end
  1953.             updateCode(info)
  1954.         else
  1955.             updateCode("-- No constants available")
  1956.         end
  1957.     end)
  1958.    
  1959.     connectionsBtn.MouseButton1Click:Connect(function()
  1960.         if Selected and Selected.Instance and Selected.SignalName and getconnections then
  1961.             local sig = nil
  1962.             pcall(function() sig = Selected.Instance[Selected.SignalName] end)
  1963.             if sig then
  1964.                 local conns = {}
  1965.                 pcall(function() conns = getconnections(sig) end)
  1966.                 local info = "-- Signal Connections: " .. #conns .. "\n"
  1967.                 info = info .. "-- ================\n\n"
  1968.                 for i, conn in ipairs(conns) do
  1969.                     info = info .. "[" .. i .. "] Enabled: " .. tostring(conn.Enabled) .. "\n"
  1970.                     if conn.Function then
  1971.                         local fInfo = "unknown"
  1972.                         pcall(function()
  1973.                             local s, l, n = debug.info(conn.Function, "sln")
  1974.                             fInfo = tostring(s or "?") .. ":" .. tostring(l or "?") .. " (" .. tostring(n or "anonymous") .. ")"
  1975.                         end)
  1976.                         info = info .. "    Function: " .. fInfo .. "\n"
  1977.                        
  1978.                         if conn.LuaClosureType then
  1979.                             info = info .. "    Closure: " .. tostring(conn.LuaClosureType) .. "\n"
  1980.                         end
  1981.                     end
  1982.                     info = info .. "\n"
  1983.                 end
  1984.                 updateCode(info)
  1985.             else
  1986.                 updateCode("-- Could not access signal")
  1987.             end
  1988.         else
  1989.             updateCode("-- No signal selected or getconnections unavailable")
  1990.         end
  1991.     end)
  1992.    
  1993.     fireBtn.MouseButton1Click:Connect(function()
  1994.         if Selected then
  1995.             local success = false
  1996.             local result = nil
  1997.            
  1998.             if Selected.Remote then
  1999.                 pcall(function()
  2000.                     if Selected.Type == "RemoteEvent" or Selected.Type == "UnreliableRemoteEvent" then
  2001.                         Selected.Remote:FireServer(unpack(Selected.Args or {}))
  2002.                         success = true
  2003.                     elseif Selected.Type == "RemoteFunction" then
  2004.                         result = Selected.Remote:InvokeServer(unpack(Selected.Args or {}))
  2005.                         success = true
  2006.                     elseif Selected.Type == "BindableEvent" then
  2007.                         Selected.Remote:Fire(unpack(Selected.Args or {}))
  2008.                         success = true
  2009.                     elseif Selected.Type == "BindableFunction" then
  2010.                         result = Selected.Remote:Invoke(unpack(Selected.Args or {}))
  2011.                         success = true
  2012.                     end
  2013.                 end)
  2014.             elseif Selected.Instance and Selected.SignalName then
  2015.                 if replicatesignal then
  2016.                     pcall(function()
  2017.                         replicatesignal(Selected.Instance[Selected.SignalName], unpack(Selected.Args or {}))
  2018.                         success = true
  2019.                     end)
  2020.                 elseif firesignal then
  2021.                     pcall(function()
  2022.                         firesignal(Selected.Instance[Selected.SignalName], unpack(Selected.Args or {}))
  2023.                         success = true
  2024.                     end)
  2025.                 end
  2026.             end
  2027.            
  2028.             if success then
  2029.                 fireBtn.Text = "Fired!"
  2030.                 fireBtn.BackgroundColor3 = Color3.fromRGB(50, 120, 50)
  2031.                 if result ~= nil then
  2032.                     updateCode("-- Fire Result:\n\n" .. deepSerialize(result))
  2033.                 end
  2034.             else
  2035.                 fireBtn.Text = "Failed!"
  2036.                 fireBtn.BackgroundColor3 = Color3.fromRGB(120, 50, 50)
  2037.             end
  2038.            
  2039.             task.delay(1.5, function()
  2040.                 fireBtn.Text = "Fire/Replay"
  2041.                 fireBtn.BackgroundColor3 = Color3.fromRGB(50, 90, 50)
  2042.             end)
  2043.         end
  2044.     end)
  2045.    
  2046.     decompileBtn.MouseButton1Click:Connect(function()
  2047.         if Selected then
  2048.             local scriptToDecompile = nil
  2049.            
  2050.             if Selected.Source and typeof(Selected.Source) == "Instance" then
  2051.                 scriptToDecompile = Selected.Source
  2052.             elseif Selected.FuncInfo and Selected.FuncInfo.Source and Selected.FuncInfo.Source ~= "?" then
  2053.                 local sourceName = Selected.FuncInfo.Source
  2054.                 for _, inst in pairs(getgc(true)) do
  2055.                     if typeof(inst) == "Instance" and inst:IsA("LuaSourceContainer") then
  2056.                         if inst:GetFullName():find(sourceName) or inst.Name == sourceName then
  2057.                             scriptToDecompile = inst
  2058.                             break
  2059.                         end
  2060.                     end
  2061.                 end
  2062.             end
  2063.            
  2064.             if scriptToDecompile then
  2065.                 local decompiled = decompileScript(scriptToDecompile)
  2066.                 updateCode(decompiled)
  2067.             else
  2068.                 updateCode("-- No script found to decompile\n-- Source info: " .. (Selected.FuncInfo and Selected.FuncInfo.Source or "N/A"))
  2069.             end
  2070.         else
  2071.             updateCode("-- Select a log entry first")
  2072.         end
  2073.     end)
  2074.    
  2075.     exportBtn.MouseButton1Click:Connect(function()
  2076.         local fileName = exportLogs(tabName, "lua")
  2077.         updateCode("-- Exported to:\n-- " .. fileName)
  2078.         exportBtn.Text = "Exported!"
  2079.         task.delay(1.5, function() exportBtn.Text = "Export Lua" end)
  2080.     end)
  2081.    
  2082.     exportJsonBtn.MouseButton1Click:Connect(function()
  2083.         local fileName = exportLogs(tabName, "json")
  2084.         updateCode("-- Exported to:\n-- " .. fileName)
  2085.         exportJsonBtn.Text = "Exported!"
  2086.         task.delay(1.5, function() exportJsonBtn.Text = "Export JSON" end)
  2087.     end)
  2088.    
  2089.     statsBtn.MouseButton1Click:Connect(function()
  2090.         updateCode(getStatisticsReport())
  2091.     end)
  2092.    
  2093.     breakpointBtn.MouseButton1Click:Connect(function()
  2094.         if Selected then
  2095.             local bp = {
  2096.                 Enabled = true,
  2097.                 Type = "Name",
  2098.                 Value = Selected.Name,
  2099.                 CreatedAt = os.time(),
  2100.             }
  2101.             table.insert(Settings.Breakpoints, bp)
  2102.             saveSettings()
  2103.             updateCode("-- Breakpoint added!\n-- Type: Name Match\n-- Value: " .. Selected.Name .. "\n\n-- Total breakpoints: " .. #Settings.Breakpoints)
  2104.             breakpointBtn.Text = "Added!"
  2105.             task.delay(1, function() breakpointBtn.Text = "+ Breakpoint" end)
  2106.         else
  2107.             updateCode("-- Select a log entry to add breakpoint")
  2108.         end
  2109.     end)
  2110.    
  2111.     clearBpBtn.MouseButton1Click:Connect(function()
  2112.         local count = #Settings.Breakpoints
  2113.         Settings.Breakpoints = {}
  2114.         saveSettings()
  2115.         updateCode("-- Cleared " .. count .. " breakpoints")
  2116.         clearBpBtn.Text = "Cleared!"
  2117.         task.delay(1, function() clearBpBtn.Text = "Clear BPs" end)
  2118.     end)
  2119.    
  2120.     TabData[tabName] = {
  2121.         Content = content,
  2122.         LogScroll = logScroll,
  2123.         CountLabel = countLabel,
  2124.         UpdateCode = updateCode,
  2125.         Color = color,
  2126.     }
  2127.    
  2128.     return content
  2129. end
  2130.  
  2131. local function createSettingsTab()
  2132.     local content = Create("Frame", {
  2133.         Name = "Settings",
  2134.         Parent = MainPanel,
  2135.         BackgroundTransparency = 1,
  2136.         Size = UDim2.new(1, 0, 1, 0),
  2137.         Visible = false,
  2138.     })
  2139.    
  2140.     local scroll = Create("ScrollingFrame", {
  2141.         Parent = content,
  2142.         BackgroundColor3 = Color3.fromRGB(28, 28, 36),
  2143.         Position = UDim2.new(0, 6, 0, 6),
  2144.         Size = UDim2.new(1, -12, 1, -12),
  2145.         CanvasSize = UDim2.new(0, 0, 0, 0),
  2146.         ScrollBarThickness = 5,
  2147.         ScrollBarImageColor3 = getColor("SettingsTab"),
  2148.         AutomaticCanvasSize = Enum.AutomaticSize.Y,
  2149.     })
  2150.     Create("UICorner", {CornerRadius = UDim.new(0, 10), Parent = scroll})
  2151.     Create("UIListLayout", {Parent = scroll, SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 10)})
  2152.     Create("UIPadding", {Parent = scroll, PaddingTop = UDim.new(0, 12), PaddingBottom = UDim.new(0, 12), PaddingLeft = UDim.new(0, 12), PaddingRight = UDim.new(0, 12)})
  2153.    
  2154.     local function createSection(title, order)
  2155.         local section = Create("Frame", {
  2156.             Parent = scroll,
  2157.             BackgroundColor3 = Color3.fromRGB(35, 35, 45),
  2158.             Size = UDim2.new(1, 0, 0, 0),
  2159.             AutomaticSize = Enum.AutomaticSize.Y,
  2160.             LayoutOrder = order,
  2161.         })
  2162.         Create("UICorner", {CornerRadius = UDim.new(0, 8), Parent = section})
  2163.         Create("UIListLayout", {Parent = section, SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0, 6)})
  2164.         Create("UIPadding", {Parent = section, PaddingTop = UDim.new(0, 10), PaddingBottom = UDim.new(0, 10), PaddingLeft = UDim.new(0, 12), PaddingRight = UDim.new(0, 12)})
  2165.        
  2166.         Create("TextLabel", {
  2167.             Parent = section,
  2168.             BackgroundTransparency = 1,
  2169.             Size = UDim2.new(1, 0, 0, 24),
  2170.             Font = Enum.Font.GothamBold,
  2171.             Text = title,
  2172.             TextColor3 = getColor("SettingsTab"),
  2173.             TextSize = 14,
  2174.             TextXAlignment = Enum.TextXAlignment.Left,
  2175.             LayoutOrder = 0,
  2176.         })
  2177.        
  2178.         return section
  2179.     end
  2180.    
  2181.     local function createToggle(parent, name, settingPath, order)
  2182.         local container = Create("Frame", {
  2183.             Parent = parent,
  2184.             BackgroundTransparency = 1,
  2185.             Size = UDim2.new(1, 0, 0, 28),
  2186.             LayoutOrder = order,
  2187.         })
  2188.        
  2189.         Create("TextLabel", {
  2190.             Parent = container,
  2191.             BackgroundTransparency = 1,
  2192.             Size = UDim2.new(0.7, 0, 1, 0),
  2193.             Font = Enum.Font.Gotham,
  2194.             Text = name,
  2195.             TextColor3 = getColor("Text"),
  2196.             TextSize = 12,
  2197.             TextXAlignment = Enum.TextXAlignment.Left,
  2198.         })
  2199.        
  2200.         local path = {}
  2201.         for part in settingPath:gmatch("[^%.]+") do
  2202.             table.insert(path, part)
  2203.         end
  2204.        
  2205.         local function getValue()
  2206.             local current = Settings
  2207.             for _, key in ipairs(path) do
  2208.                 current = current[key]
  2209.             end
  2210.             return current
  2211.         end
  2212.        
  2213.         local function setValue(val)
  2214.             local current = Settings
  2215.             for i = 1, #path - 1 do
  2216.                 current = current[path[i]]
  2217.             end
  2218.             current[path[#path]] = val
  2219.             saveSettings()
  2220.         end
  2221.        
  2222.         local isOn = getValue()
  2223.        
  2224.         local toggle = Create("TextButton", {
  2225.             Parent = container,
  2226.             BackgroundColor3 = isOn and Color3.fromRGB(50, 120, 50) or Color3.fromRGB(100, 50, 50),
  2227.             BorderSizePixel = 0,
  2228.             Position = UDim2.new(1, -55, 0, 2),
  2229.             Size = UDim2.new(0, 50, 0, 24),
  2230.             Font = Enum.Font.GothamBold,
  2231.             Text = isOn and "ON" or "OFF",
  2232.             TextColor3 = Color3.fromRGB(255, 255, 255),
  2233.             TextSize = 11,
  2234.             AutoButtonColor = false,
  2235.         })
  2236.         Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = toggle})
  2237.        
  2238.         toggle.MouseButton1Click:Connect(function()
  2239.             isOn = not isOn
  2240.             setValue(isOn)
  2241.             Tween(toggle, {BackgroundColor3 = isOn and Color3.fromRGB(50, 120, 50) or Color3.fromRGB(100, 50, 50)})
  2242.             toggle.Text = isOn and "ON" or "OFF"
  2243.         end)
  2244.        
  2245.         return toggle
  2246.     end
  2247.    
  2248.     local function createDropdown(parent, name, options, settingPath, order)
  2249.         local container = Create("Frame", {
  2250.             Parent = parent,
  2251.             BackgroundTransparency = 1,
  2252.             Size = UDim2.new(1, 0, 0, 28),
  2253.             LayoutOrder = order,
  2254.         })
  2255.        
  2256.         Create("TextLabel", {
  2257.             Parent = container,
  2258.             BackgroundTransparency = 1,
  2259.             Size = UDim2.new(0.5, 0, 1, 0),
  2260.             Font = Enum.Font.Gotham,
  2261.             Text = name,
  2262.             TextColor3 = getColor("Text"),
  2263.             TextSize = 12,
  2264.             TextXAlignment = Enum.TextXAlignment.Left,
  2265.         })
  2266.        
  2267.         local path = {}
  2268.         for part in settingPath:gmatch("[^%.]+") do
  2269.             table.insert(path, part)
  2270.         end
  2271.        
  2272.         local function getValue()
  2273.             local current = Settings
  2274.             for _, key in ipairs(path) do
  2275.                 current = current[key]
  2276.             end
  2277.             return current
  2278.         end
  2279.        
  2280.         local function setValue(val)
  2281.             local current = Settings
  2282.             for i = 1, #path - 1 do
  2283.                 current = current[path[i]]
  2284.             end
  2285.             current[path[#path]] = val
  2286.             saveSettings()
  2287.         end
  2288.        
  2289.         local currentValue = getValue()
  2290.         local idx = 1
  2291.         for i, v in ipairs(options) do
  2292.             if v == currentValue then
  2293.                 idx = i
  2294.                 break
  2295.             end
  2296.         end
  2297.        
  2298.         local dropdown = Create("TextButton", {
  2299.             Parent = container,
  2300.             BackgroundColor3 = Color3.fromRGB(45, 45, 58),
  2301.             BorderSizePixel = 0,
  2302.             Position = UDim2.new(0.5, 0, 0, 2),
  2303.             Size = UDim2.new(0.5, -5, 0, 24),
  2304.             Font = Enum.Font.Gotham,
  2305.             Text = "◀ " .. options[idx] .. " ▶",
  2306.             TextColor3 = getColor("Text"),
  2307.             TextSize = 11,
  2308.             AutoButtonColor = false,
  2309.         })
  2310.         Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = dropdown})
  2311.        
  2312.         dropdown.MouseButton1Click:Connect(function()
  2313.             idx = idx % #options + 1
  2314.             setValue(options[idx])
  2315.             dropdown.Text = "◀ " .. options[idx] .. " ▶"
  2316.         end)
  2317.        
  2318.         return dropdown
  2319.     end
  2320.    
  2321.     local function createSlider(parent, name, min, max, settingPath, order)
  2322.         local container = Create("Frame", {
  2323.             Parent = parent,
  2324.             BackgroundTransparency = 1,
  2325.             Size = UDim2.new(1, 0, 0, 40),
  2326.             LayoutOrder = order,
  2327.         })
  2328.        
  2329.         local path = {}
  2330.         for part in settingPath:gmatch("[^%.]+") do
  2331.             table.insert(path, part)
  2332.         end
  2333.        
  2334.         local function getValue()
  2335.             local current = Settings
  2336.             for _, key in ipairs(path) do
  2337.                 current = current[key]
  2338.             end
  2339.             return current
  2340.         end
  2341.        
  2342.         local function setValue(val)
  2343.             local current = Settings
  2344.             for i = 1, #path - 1 do
  2345.                 current = current[path[i]]
  2346.             end
  2347.             current[path[#path]] = val
  2348.             saveSettings()
  2349.         end
  2350.        
  2351.         local currentValue = getValue()
  2352.        
  2353.         local valueLabel = Create("TextLabel", {
  2354.             Parent = container,
  2355.             BackgroundTransparency = 1,
  2356.             Position = UDim2.new(0, 0, 0, 0),
  2357.             Size = UDim2.new(1, 0, 0, 18),
  2358.             Font = Enum.Font.Gotham,
  2359.             Text = name .. ": " .. currentValue,
  2360.             TextColor3 = getColor("Text"),
  2361.             TextSize = 12,
  2362.             TextXAlignment = Enum.TextXAlignment.Left,
  2363.         })
  2364.        
  2365.         local sliderBg = Create("Frame", {
  2366.             Parent = container,
  2367.             BackgroundColor3 = Color3.fromRGB(40, 40, 50),
  2368.             Position = UDim2.new(0, 0, 0, 22),
  2369.             Size = UDim2.new(1, 0, 0, 14),
  2370.         })
  2371.         Create("UICorner", {CornerRadius = UDim.new(0, 7), Parent = sliderBg})
  2372.        
  2373.         local sliderFill = Create("Frame", {
  2374.             Parent = sliderBg,
  2375.             BackgroundColor3 = getColor("Accent"),
  2376.             Size = UDim2.new((currentValue - min) / (max - min), 0, 1, 0),
  2377.         })
  2378.         Create("UICorner", {CornerRadius = UDim.new(0, 7), Parent = sliderFill})
  2379.        
  2380.         local sliderBtn = Create("TextButton", {
  2381.             Parent = sliderBg,
  2382.             BackgroundTransparency = 1,
  2383.             Size = UDim2.new(1, 0, 1, 0),
  2384.             Text = "",
  2385.         })
  2386.        
  2387.         local dragging = false
  2388.        
  2389.         sliderBtn.MouseButton1Down:Connect(function()
  2390.             dragging = true
  2391.         end)
  2392.        
  2393.         UserInputService.InputEnded:Connect(function(input)
  2394.             if input.UserInputType == Enum.UserInputType.MouseButton1 then
  2395.                 dragging = false
  2396.             end
  2397.         end)
  2398.        
  2399.         UserInputService.InputChanged:Connect(function(input)
  2400.             if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
  2401.                 local relX = (input.Position.X - sliderBg.AbsolutePosition.X) / sliderBg.AbsoluteSize.X
  2402.                 relX = math.clamp(relX, 0, 1)
  2403.                 local val = math.floor(min + (max - min) * relX)
  2404.                 setValue(val)
  2405.                 sliderFill.Size = UDim2.new(relX, 0, 1, 0)
  2406.                 valueLabel.Text = name .. ": " .. val
  2407.             end
  2408.         end)
  2409.        
  2410.         return container
  2411.     end
  2412.    
  2413.     local function createColorPicker(parent, name, colorKey, order)
  2414.         local container = Create("Frame", {
  2415.             Parent = parent,
  2416.             BackgroundTransparency = 1,
  2417.             Size = UDim2.new(1, 0, 0, 28),
  2418.             LayoutOrder = order,
  2419.         })
  2420.        
  2421.         Create("TextLabel", {
  2422.             Parent = container,
  2423.             BackgroundTransparency = 1,
  2424.             Size = UDim2.new(0.6, 0, 1, 0),
  2425.             Font = Enum.Font.Gotham,
  2426.             Text = name,
  2427.             TextColor3 = getColor("Text"),
  2428.             TextSize = 12,
  2429.             TextXAlignment = Enum.TextXAlignment.Left,
  2430.         })
  2431.        
  2432.         local colorPreview = Create("Frame", {
  2433.             Parent = container,
  2434.             BackgroundColor3 = getColor(colorKey),
  2435.             Position = UDim2.new(0.6, 0, 0, 4),
  2436.             Size = UDim2.new(0, 60, 0, 20),
  2437.         })
  2438.         Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = colorPreview})
  2439.         Create("UIStroke", {Color = Color3.fromRGB(80, 80, 90), Thickness = 1, Parent = colorPreview})
  2440.        
  2441.         local rInput = Create("TextBox", {
  2442.             Parent = container,
  2443.             BackgroundColor3 = Color3.fromRGB(60, 40, 40),
  2444.             Position = UDim2.new(0.6, 70, 0, 4),
  2445.             Size = UDim2.new(0, 35, 0, 20),
  2446.             Font = Enum.Font.Code,
  2447.             Text = tostring(Settings.Colors[colorKey][1]),
  2448.             TextColor3 = Color3.fromRGB(255, 150, 150),
  2449.             TextSize = 10,
  2450.             ClearTextOnFocus = true,
  2451.         })
  2452.         Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = rInput})
  2453.        
  2454.         local gInput = Create("TextBox", {
  2455.             Parent = container,
  2456.             BackgroundColor3 = Color3.fromRGB(40, 60, 40),
  2457.             Position = UDim2.new(0.6, 110, 0, 4),
  2458.             Size = UDim2.new(0, 35, 0, 20),
  2459.             Font = Enum.Font.Code,
  2460.             Text = tostring(Settings.Colors[colorKey][2]),
  2461.             TextColor3 = Color3.fromRGB(150, 255, 150),
  2462.             TextSize = 10,
  2463.             ClearTextOnFocus = true,
  2464.         })
  2465.         Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = gInput})
  2466.        
  2467.         local bInput = Create("TextBox", {
  2468.             Parent = container,
  2469.             BackgroundColor3 = Color3.fromRGB(40, 40, 60),
  2470.             Position = UDim2.new(0.6, 150, 0, 4),
  2471.             Size = UDim2.new(0, 35, 0, 20),
  2472.             Font = Enum.Font.Code,
  2473.             Text = tostring(Settings.Colors[colorKey][3]),
  2474.             TextColor3 = Color3.fromRGB(150, 150, 255),
  2475.             TextSize = 10,
  2476.             ClearTextOnFocus = true,
  2477.         })
  2478.         Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = bInput})
  2479.        
  2480.         local function updateColor()
  2481.             local r = math.clamp(tonumber(rInput.Text) or 0, 0, 255)
  2482.             local g = math.clamp(tonumber(gInput.Text) or 0, 0, 255)
  2483.             local b = math.clamp(tonumber(bInput.Text) or 0, 0, 255)
  2484.             setColor(colorKey, r, g, b)
  2485.             colorPreview.BackgroundColor3 = Color3.fromRGB(r, g, b)
  2486.         end
  2487.        
  2488.         rInput.FocusLost:Connect(updateColor)
  2489.         gInput.FocusLost:Connect(updateColor)
  2490.         bInput.FocusLost:Connect(updateColor)
  2491.        
  2492.         return container
  2493.     end
  2494.    
  2495.     local loggingSection = createSection("📝 Logging Options", 1)
  2496.     createToggle(loggingSection, "Enable Spy", "Logging.Enabled", 1)
  2497.     createToggle(loggingSection, "Log Remotes", "Logging.LogRemotes", 2)
  2498.     createToggle(loggingSection, "Log Signals", "Logging.LogSignals", 3)
  2499.     createToggle(loggingSection, "Log HTTP Requests", "Logging.LogRequests", 4)
  2500.     createToggle(loggingSection, "Log Audios", "Logging.LogAudios", 5)
  2501.     createToggle(loggingSection, "Log Animations", "Logging.LogAnimations", 6)
  2502.     createToggle(loggingSection, "Log Bindables", "Logging.LogBindables", 7)
  2503.     createToggle(loggingSection, "Log RobloxReplicatedStorage", "Logging.LogRobloxReplicatedStorage", 8)
  2504.     createToggle(loggingSection, "Log Checkcaller Calls", "Logging.LogCheckcaller", 9)
  2505.     createToggle(loggingSection, "LocalPlayer Only", "Logging.LogLocalPlayerOnly", 10)
  2506.    
  2507.     local filterSection = createSection("🔍 Filters", 2)
  2508.     createToggle(filterSection, "Filter Spammy", "Filters.FilterSpammy", 1)
  2509.     createToggle(filterSection, "Auto-Ignore Spam", "Filters.IgnoreSpammyLogs", 2)
  2510.     createSlider(filterSection, "Spam Threshold", 1, 20, "Filters.SpamThreshold", 3)
  2511.     createSlider(filterSection, "Spam Window (sec)", 1, 10, "Filters.SpamTimeWindow", 4)
  2512.    
  2513.     local displaySection = createSection("🖥️ Display", 3)
  2514.     createSlider(displaySection, "Max Logs", 100, 2000, "Display.MaxLogs", 1)
  2515.     createDropdown(displaySection, "Path Style", {"Auto", "WaitForChild", "FindFirstChild", "Index", "GetChildren"}, "Display.PathStyle", 2)
  2516.     createToggle(displaySection, "Enable Animations", "Display.EnableAnimations", 3)
  2517.     createToggle(displaySection, "Show Timestamps", "Display.ShowTimestamps", 4)
  2518.     createToggle(displaySection, "Group Similar Logs", "Display.GroupSimilarLogs", 5)
  2519.    
  2520.     local themeSection = createSection("🎨 Theme Colors", 4)
  2521.     createDropdown(themeSection, "Theme Preset", {"Dark", "Light", "Midnight", "Forest"}, "Theme", 1)
  2522.     createColorPicker(themeSection, "Background", "Background", 2)
  2523.     createColorPicker(themeSection, "Accent", "Accent", 3)
  2524.     createColorPicker(themeSection, "Text", "Text", 4)
  2525.     createColorPicker(themeSection, "Remotes", "Remotes", 5)
  2526.     createColorPicker(themeSection, "Signals", "Signals", 6)
  2527.     createColorPicker(themeSection, "Requests", "Requests", 7)
  2528.    
  2529.     local teleportSection = createSection("🚀 Teleport", 5)
  2530.    
  2531.     local teleportInput = Create("TextBox", {
  2532.         Parent = teleportSection,
  2533.         BackgroundColor3 = Color3.fromRGB(40, 40, 50),
  2534.         Size = UDim2.new(1, 0, 0, 60),
  2535.         Font = Enum.Font.Code,
  2536.         Text = Settings.TeleportScript,
  2537.         TextColor3 = getColor("Text"),
  2538.         PlaceholderText = "-- Script to queue on teleport...",
  2539.         PlaceholderColor3 = getColor("TextDim"),
  2540.         TextSize = 11,
  2541.         TextXAlignment = Enum.TextXAlignment.Left,
  2542.         TextYAlignment = Enum.TextYAlignment.Top,
  2543.         ClearTextOnFocus = false,
  2544.         MultiLine = true,
  2545.         LayoutOrder = 1,
  2546.     })
  2547.     Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = teleportInput})
  2548.     Create("UIPadding", {Parent = teleportInput, PaddingTop = UDim.new(0, 8), PaddingLeft = UDim.new(0, 8)})
  2549.    
  2550.     teleportInput.FocusLost:Connect(function()
  2551.         Settings.TeleportScript = teleportInput.Text
  2552.         saveSettings()
  2553.     end)
  2554.    
  2555.     local queueBtn = Create("TextButton", {
  2556.         Parent = teleportSection,
  2557.         BackgroundColor3 = Color3.fromRGB(70, 50, 100),
  2558.         Size = UDim2.new(1, 0, 0, 32),
  2559.         Font = Enum.Font.GothamBold,
  2560.         Text = "Queue Teleport Script",
  2561.         TextColor3 = Color3.fromRGB(255, 255, 255),
  2562.         TextSize = 12,
  2563.         AutoButtonColor = false,
  2564.         LayoutOrder = 2,
  2565.     })
  2566.     Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = queueBtn})
  2567.    
  2568.     queueBtn.MouseButton1Click:Connect(function()
  2569.         if queueteleport and Settings.TeleportScript ~= "" then
  2570.             queueteleport(Settings.TeleportScript)
  2571.             queueBtn.Text = "✓ Queued!"
  2572.             queueBtn.BackgroundColor3 = Color3.fromRGB(50, 100, 50)
  2573.             task.delay(2, function()
  2574.                 queueBtn.Text = "Queue Teleport Script"
  2575.                 queueBtn.BackgroundColor3 = Color3.fromRGB(70, 50, 100)
  2576.             end)
  2577.         else
  2578.             queueBtn.Text = "Not Available"
  2579.             queueBtn.BackgroundColor3 = Color3.fromRGB(100, 50, 50)
  2580.             task.delay(2, function()
  2581.                 queueBtn.Text = "Queue Teleport Script"
  2582.                 queueBtn.BackgroundColor3 = Color3.fromRGB(70, 50, 100)
  2583.             end)
  2584.         end
  2585.     end)
  2586.    
  2587.     local actionsSection = createSection("⚡ Actions", 6)
  2588.    
  2589.     local clearAllBtn = Create("TextButton", {
  2590.         Parent = actionsSection,
  2591.         BackgroundColor3 = Color3.fromRGB(100, 50, 50),
  2592.         Size = UDim2.new(1, 0, 0, 32),
  2593.         Font = Enum.Font.GothamBold,
  2594.         Text = "Clear All Logs",
  2595.         TextColor3 = Color3.fromRGB(255, 255, 255),
  2596.         TextSize = 12,
  2597.         AutoButtonColor = false,
  2598.         LayoutOrder = 1,
  2599.     })
  2600.     Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = clearAllBtn})
  2601.    
  2602.     clearAllBtn.MouseButton1Click:Connect(function()
  2603.         for tabName in pairs(Logs) do
  2604.             Logs[tabName] = {}
  2605.             LogFrames[tabName] = {}
  2606.             LogGroups[tabName] = {}
  2607.             GroupFrames[tabName] = {}
  2608.             LayoutOrders[tabName] = 999999999
  2609.            
  2610.             if TabData[tabName] and TabData[tabName].LogScroll then
  2611.                 for _, child in pairs(TabData[tabName].LogScroll:GetChildren()) do
  2612.                     if child:IsA("Frame") or child:IsA("TextButton") then
  2613.                         child:Destroy()
  2614.                     end
  2615.                 end
  2616.                 if TabData[tabName].CountLabel then
  2617.                     TabData[tabName].CountLabel.Text = "0"
  2618.                 end
  2619.             end
  2620.         end
  2621.         Statistics = {
  2622.             TotalCalls = 0,
  2623.             CallsByType = {},
  2624.             CallsByName = {},
  2625.             DataTransferred = 0,
  2626.             StartTime = tick(),
  2627.         }
  2628.         Selected = nil
  2629.         clearAllBtn.Text = "✓ Cleared!"
  2630.         task.delay(1.5, function() clearAllBtn.Text = "Clear All Logs" end)
  2631.     end)
  2632.    
  2633.     local resetSettingsBtn = Create("TextButton", {
  2634.         Parent = actionsSection,
  2635.         BackgroundColor3 = Color3.fromRGB(80, 60, 60),
  2636.         Size = UDim2.new(1, 0, 0, 32),
  2637.         Font = Enum.Font.GothamBold,
  2638.         Text = "Reset Settings to Default",
  2639.         TextColor3 = Color3.fromRGB(255, 255, 255),
  2640.         TextSize = 12,
  2641.         AutoButtonColor = false,
  2642.         LayoutOrder = 2,
  2643.     })
  2644.     Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = resetSettingsBtn})
  2645.    
  2646.     resetSettingsBtn.MouseButton1Click:Connect(function()
  2647.         Settings = deepCopy(DefaultSettings)
  2648.         saveSettings()
  2649.         resetSettingsBtn.Text = "✓ Reset! (Reload UI)"
  2650.         task.delay(2, function() resetSettingsBtn.Text = "Reset Settings to Default" end)
  2651.     end)
  2652.    
  2653.     local clearBlacklistBtn = Create("TextButton", {
  2654.         Parent = actionsSection,
  2655.         BackgroundColor3 = Color3.fromRGB(70, 70, 50),
  2656.         Size = UDim2.new(1, 0, 0, 32),
  2657.         Font = Enum.Font.GothamBold,
  2658.         Text = "Clear Blacklist/Blocklist",
  2659.         TextColor3 = Color3.fromRGB(255, 255, 255),
  2660.         TextSize = 12,
  2661.         AutoButtonColor = false,
  2662.         LayoutOrder = 3,
  2663.     })
  2664.     Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = clearBlacklistBtn})
  2665.    
  2666.     clearBlacklistBtn.MouseButton1Click:Connect(function()
  2667.         Settings.Blacklist = {}
  2668.         Settings.Blocklist = {}
  2669.         SpammySignals = {}
  2670.         saveSettings()
  2671.         clearBlacklistBtn.Text = "✓ Cleared!"
  2672.         task.delay(1.5, function() clearBlacklistBtn.Text = "Clear Blacklist/Blocklist" end)
  2673.     end)
  2674.    
  2675.     local infoSection = createSection("ℹ️ Info", 7)
  2676.    
  2677.     Create("TextLabel", {
  2678.         Parent = infoSection,
  2679.         BackgroundTransparency = 1,
  2680.         Size = UDim2.new(1, 0, 0, 80),
  2681.         Font = Enum.Font.Gotham,
  2682.         Text = "UnifiedSpy v3.0\n\nAdvanced Remote/Signal/Request Logger\nwith API Dump caching, Syntax Highlighting,\nBuilt-in Executor, and Debug Tools.\n\nSettings auto-save to: UnifiedSpy/Settings.json",
  2683.         TextColor3 = getColor("TextDim"),
  2684.         TextSize = 11,
  2685.         TextXAlignment = Enum.TextXAlignment.Left,
  2686.         TextYAlignment = Enum.TextYAlignment.Top,
  2687.         TextWrapped = true,
  2688.         LayoutOrder = 1,
  2689.     })
  2690.    
  2691.     TabData["Settings"] = {
  2692.         Content = content,
  2693.         IsSettings = true,
  2694.     }
  2695.    
  2696.     return content
  2697. end
  2698.  
  2699. local function createTab(tabDef)
  2700.     local tabName = tabDef.Name
  2701.     local color = getColor(tabDef.ColorKey)
  2702.     local icon = tabDef.Icon
  2703.    
  2704.     local tabBtn = Create("TextButton", {
  2705.         Parent = TabListFrame,
  2706.         BackgroundColor3 = Color3.fromRGB(38, 38, 48),
  2707.         BorderSizePixel = 0,
  2708.         Size = UDim2.new(1, 0, 0, 44),
  2709.         Font = Enum.Font.Gotham,
  2710.         Text = "",
  2711.         AutoButtonColor = false,
  2712.         LayoutOrder = tabDef.Order,
  2713.     })
  2714.     Create("UICorner", {CornerRadius = UDim.new(0, 8), Parent = tabBtn})
  2715.    
  2716.     local indicator = Create("Frame", {
  2717.         Parent = tabBtn,
  2718.         BackgroundColor3 = color,
  2719.         BorderSizePixel = 0,
  2720.         Position = UDim2.new(0, 0, 0.15, 0),
  2721.         Size = UDim2.new(0, 4, 0.7, 0),
  2722.         Visible = false,
  2723.     })
  2724.     Create("UICorner", {CornerRadius = UDim.new(0, 2), Parent = indicator})
  2725.    
  2726.     Create("TextLabel", {
  2727.         Parent = tabBtn,
  2728.         BackgroundTransparency = 1,
  2729.         Position = UDim2.new(0, 14, 0, 0),
  2730.         Size = UDim2.new(0, 24, 1, 0),
  2731.         Font = Enum.Font.GothamBlack,
  2732.         Text = icon,
  2733.         TextColor3 = color,
  2734.         TextSize = 16,
  2735.     })
  2736.    
  2737.     local nameLabel = Create("TextLabel", {
  2738.         Parent = tabBtn,
  2739.         BackgroundTransparency = 1,
  2740.         Position = UDim2.new(0, 44, 0, 0),
  2741.         Size = UDim2.new(1, -80, 1, 0),
  2742.         Font = Enum.Font.GothamBold,
  2743.         Text = tabName,
  2744.         TextColor3 = getColor("TextDim"),
  2745.         TextSize = 12,
  2746.         TextXAlignment = Enum.TextXAlignment.Left,
  2747.     })
  2748.    
  2749.     local tabCount = Create("TextLabel", {
  2750.         Parent = tabBtn,
  2751.         BackgroundTransparency = 1,
  2752.         Position = UDim2.new(1, -38, 0, 0),
  2753.         Size = UDim2.new(0, 32, 1, 0),
  2754.         Font = Enum.Font.GothamBold,
  2755.         Text = tabDef.IsSettings and "" or "0",
  2756.         TextColor3 = color,
  2757.         TextSize = 11,
  2758.         TextXAlignment = Enum.TextXAlignment.Right,
  2759.     })
  2760.    
  2761.     if tabDef.IsSettings then
  2762.         createSettingsTab()
  2763.     else
  2764.         createLogTab(tabDef)
  2765.     end
  2766.    
  2767.     if TabData[tabName] then
  2768.         TabData[tabName].Button = tabBtn
  2769.         TabData[tabName].Indicator = indicator
  2770.         TabData[tabName].NameLabel = nameLabel
  2771.         TabData[tabName].TabCount = tabCount
  2772.     end
  2773.    
  2774.     tabBtn.MouseEnter:Connect(function()
  2775.         if CurrentTab ~= tabName then
  2776.             Tween(tabBtn, {BackgroundColor3 = Color3.fromRGB(48, 48, 60)})
  2777.         end
  2778.     end)
  2779.    
  2780.     tabBtn.MouseLeave:Connect(function()
  2781.         if CurrentTab ~= tabName then
  2782.             Tween(tabBtn, {BackgroundColor3 = Color3.fromRGB(38, 38, 48)})
  2783.         end
  2784.     end)
  2785.    
  2786.     tabBtn.MouseButton1Click:Connect(function()
  2787.         switchTab(tabName)
  2788.     end)
  2789. end
  2790.  
  2791. function switchTab(tabName)
  2792.     if not TabData[tabName] then return end
  2793.    
  2794.     for name, data in pairs(TabData) do
  2795.         if data.Content and data.Button then
  2796.             if name == tabName then
  2797.                 data.Content.Visible = true
  2798.                 if data.Indicator then data.Indicator.Visible = true end
  2799.                 Tween(data.Button, {BackgroundColor3 = Color3.fromRGB(55, 60, 85)})
  2800.                 if data.NameLabel then
  2801.                     Tween(data.NameLabel, {TextColor3 = getColor("Text")})
  2802.                 end
  2803.             else
  2804.                 data.Content.Visible = false
  2805.                 if data.Indicator then data.Indicator.Visible = false end
  2806.                 Tween(data.Button, {BackgroundColor3 = Color3.fromRGB(38, 38, 48)})
  2807.                 if data.NameLabel then
  2808.                     Tween(data.NameLabel, {TextColor3 = getColor("TextDim")})
  2809.                 end
  2810.             end
  2811.         end
  2812.     end
  2813.    
  2814.     CurrentTab = tabName
  2815. end
  2816.  
  2817. for _, tabDef in ipairs(TabDefinitions) do
  2818.     createTab(tabDef)
  2819. end
  2820. switchTab("Remotes")
  2821.  
  2822. local function updateTabCount(tabName)
  2823.     if TabData[tabName] then
  2824.         local count = #Logs[tabName]
  2825.         if TabData[tabName].CountLabel then
  2826.             TabData[tabName].CountLabel.Text = tostring(count)
  2827.         end
  2828.         if TabData[tabName].TabCount then
  2829.             TabData[tabName].TabCount.Text = tostring(count)
  2830.         end
  2831.     end
  2832. end
  2833.  
  2834. local function matchesSearch(logData)
  2835.     if SearchQuery == "" then return true end
  2836.     local name = (logData.Name or ""):lower()
  2837.     local typeName = (logData.Type or ""):lower()
  2838.     return name:find(SearchQuery, 1, true) or typeName:find(SearchQuery, 1, true)
  2839. end
  2840.  
  2841. local function createLogEntry(tabName, logData)
  2842.     if not matchesSearch(logData) then return nil end
  2843.    
  2844.     if LayoutOrders[tabName] < 1 then LayoutOrders[tabName] = 999999999 end
  2845.    
  2846.     local data = TabData[tabName]
  2847.     if not data or not data.LogScroll then return nil end
  2848.    
  2849.     local color = data.Color or getColor("Accent")
  2850.     local groupKey = logData.Name .. "_" .. (logData.Type or "")
  2851.    
  2852.     if Settings.Display.GroupSimilarLogs and LogGroups[tabName][groupKey] then
  2853.         local group = LogGroups[tabName][groupKey]
  2854.         group.count = group.count + 1
  2855.         group.lastData = logData
  2856.        
  2857.         if GroupFrames[tabName][groupKey] then
  2858.             local countLabel = GroupFrames[tabName][groupKey]:FindFirstChild("GroupCount")
  2859.             if countLabel then
  2860.                 countLabel.Text = "#" .. group.count
  2861.             end
  2862.         end
  2863.        
  2864.         table.insert(Logs[tabName], 1, logData)
  2865.         if #Logs[tabName] > Settings.Display.MaxLogs then
  2866.             table.remove(Logs[tabName])
  2867.         end
  2868.         updateTabCount(tabName)
  2869.         return nil
  2870.     end
  2871.    
  2872.     local entry = Create("Frame", {
  2873.         Parent = data.LogScroll,
  2874.         BackgroundColor3 = Color3.fromRGB(40, 40, 52),
  2875.         BorderSizePixel = 0,
  2876.         Size = UDim2.new(1, -4, 0, 0),
  2877.         AutomaticSize = Enum.AutomaticSize.Y,
  2878.         LayoutOrder = LayoutOrders[tabName],
  2879.     })
  2880.     Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = entry})
  2881.    
  2882.     local mainContent = Create("Frame", {
  2883.         Parent = entry,
  2884.         BackgroundTransparency = 1,
  2885.         Size = UDim2.new(1, 0, 0, 38),
  2886.     })
  2887.    
  2888.     Create("Frame", {
  2889.         Parent = mainContent,
  2890.         BackgroundColor3 = color,
  2891.         BorderSizePixel = 0,
  2892.         Size = UDim2.new(0, 3, 0.75, 0),
  2893.         Position = UDim2.new(0, 0, 0.125, 0),
  2894.     })
  2895.    
  2896.     local icons = {
  2897.         RemoteEvent = "📡",
  2898.         RemoteFunction = "📞",
  2899.         UnreliableRemoteEvent = "📶",
  2900.         BindableEvent = "🔗",
  2901.         BindableFunction = "🔄",
  2902.         Signal = "⚡",
  2903.         Audio = "🔊",
  2904.         Animation = "🎬",
  2905.         HttpRequest = "🌐",
  2906.         SystemRemote = "⚙️",
  2907.     }
  2908.    
  2909.     Create("TextLabel", {
  2910.         Parent = mainContent,
  2911.         BackgroundTransparency = 1,
  2912.         Position = UDim2.new(0, 8, 0, 0),
  2913.         Size = UDim2.new(0, 22, 1, 0),
  2914.         Font = Enum.Font.Gotham,
  2915.         Text = icons[logData.Type] or "•",
  2916.         TextColor3 = color,
  2917.         TextSize = 14,
  2918.     })
  2919.    
  2920.     Create("TextLabel", {
  2921.         Parent = mainContent,
  2922.         BackgroundTransparency = 1,
  2923.         Position = UDim2.new(0, 32, 0, 3),
  2924.         Size = UDim2.new(1, -70, 0, 16),
  2925.         Font = Enum.Font.GothamBold,
  2926.         Text = logData.Name or "Unknown",
  2927.         TextColor3 = Color3.fromRGB(235, 235, 240),
  2928.         TextSize = 12,
  2929.         TextXAlignment = Enum.TextXAlignment.Left,
  2930.         TextTruncate = Enum.TextTruncate.AtEnd,
  2931.     })
  2932.    
  2933.     Create("TextLabel", {
  2934.         Parent = mainContent,
  2935.         BackgroundTransparency = 1,
  2936.         Position = UDim2.new(0, 32, 0, 19),
  2937.         Size = UDim2.new(1, -70, 0, 14),
  2938.         Font = Enum.Font.Gotham,
  2939.         Text = logData.SubText or logData.Type or "",
  2940.         TextColor3 = Color3.fromRGB(130, 130, 145),
  2941.         TextSize = 10,
  2942.         TextXAlignment = Enum.TextXAlignment.Left,
  2943.         TextTruncate = Enum.TextTruncate.AtEnd,
  2944.     })
  2945.    
  2946.     if Settings.Display.GroupSimilarLogs then
  2947.         local groupCountLabel = Create("TextLabel", {
  2948.             Name = "GroupCount",
  2949.             Parent = mainContent,
  2950.             BackgroundTransparency = 1,
  2951.             Position = UDim2.new(1, -38, 0, 0),
  2952.             Size = UDim2.new(0, 32, 1, 0),
  2953.             Font = Enum.Font.GothamBold,
  2954.             Text = "#1",
  2955.             TextColor3 = color,
  2956.             TextSize = 10,
  2957.             TextXAlignment = Enum.TextXAlignment.Right,
  2958.         })
  2959.        
  2960.         LogGroups[tabName][groupKey] = {count = 1, lastData = logData}
  2961.         GroupFrames[tabName][groupKey] = entry
  2962.     end
  2963.    
  2964.     if logData.IsLocalPlayer then
  2965.         Create("TextLabel", {
  2966.             Parent = mainContent,
  2967.             BackgroundTransparency = 1,
  2968.             Position = UDim2.new(1, -55, 0, 12),
  2969.             Size = UDim2.new(0, 20, 0, 14),
  2970.             Font = Enum.Font.GothamBold,
  2971.             Text = "LP",
  2972.             TextColor3 = Color3.fromRGB(100, 200, 255),
  2973.             TextSize = 9,
  2974.         })
  2975.     end
  2976.    
  2977.     if logData.Breakpoint then
  2978.         Create("TextLabel", {
  2979.             Parent = mainContent,
  2980.             BackgroundTransparency = 1,
  2981.             Position = UDim2.new(1, -75, 0, 12),
  2982.             Size = UDim2.new(0, 20, 0, 14),
  2983.             Font = Enum.Font.GothamBold,
  2984.             Text = "🔴",
  2985.             TextSize = 10,
  2986.         })
  2987.     end
  2988.    
  2989.     local btn = Create("TextButton", {
  2990.         Parent = mainContent,
  2991.         BackgroundTransparency = 1,
  2992.         Size = UDim2.new(1, 0, 1, 0),
  2993.         Text = "",
  2994.         AutoButtonColor = false,
  2995.     })
  2996.    
  2997.     btn.MouseEnter:Connect(function()
  2998.         if Selected ~= logData then
  2999.             Tween(entry, {BackgroundColor3 = Color3.fromRGB(50, 50, 65)})
  3000.         end
  3001.     end)
  3002.    
  3003.     btn.MouseLeave:Connect(function()
  3004.         if Selected ~= logData then
  3005.             Tween(entry, {BackgroundColor3 = Color3.fromRGB(40, 40, 52)})
  3006.         end
  3007.     end)
  3008.    
  3009.     btn.MouseButton1Click:Connect(function()
  3010.         if Selected and Selected.Entry then
  3011.             Tween(Selected.Entry, {BackgroundColor3 = Color3.fromRGB(40, 40, 52)})
  3012.         end
  3013.        
  3014.         Selected = logData
  3015.         Selected.Entry = entry
  3016.         Selected.TabName = tabName
  3017.        
  3018.         Tween(entry, {BackgroundColor3 = Color3.fromRGB(55, 70, 110)})
  3019.        
  3020.         logData.Script = logData.Script or generateScript(logData)
  3021.         if data.UpdateCode then
  3022.             data.UpdateCode(logData.Script)
  3023.         end
  3024.     end)
  3025.    
  3026.     logData.Entry = entry
  3027.     LayoutOrders[tabName] = LayoutOrders[tabName] - 1
  3028.    
  3029.     table.insert(Logs[tabName], 1, logData)
  3030.     table.insert(LogFrames[tabName], 1, {entry = entry, data = logData})
  3031.    
  3032.     while #Logs[tabName] > Settings.Display.MaxLogs do
  3033.         local oldest = table.remove(LogFrames[tabName])
  3034.         if oldest and oldest.entry then
  3035.             if oldest.data then
  3036.                 local oldKey = oldest.data.Name .. "_" .. (oldest.data.Type or "")
  3037.                 if LogGroups[tabName][oldKey] and LogGroups[tabName][oldKey].count <= 1 then
  3038.                     LogGroups[tabName][oldKey] = nil
  3039.                     GroupFrames[tabName][oldKey] = nil
  3040.                 end
  3041.             end
  3042.             oldest.entry:Destroy()
  3043.         end
  3044.         table.remove(Logs[tabName])
  3045.     end
  3046.    
  3047.     updateTabCount(tabName)
  3048.     return entry
  3049. end
  3050.  
  3051. local function logRemote(remote, method, args, blocked)
  3052.     if not Settings.Logging.Enabled or not Settings.Logging.LogRemotes then return end
  3053.     if not Settings.Logging.LogCheckcaller and checkcaller() then return end
  3054.    
  3055.     local name = remote.Name
  3056.     local remoteType = remote.ClassName
  3057.     local key = name .. "_" .. remoteType
  3058.    
  3059.     if Settings.Blacklist[name] or Settings.Blacklist[tostring(remote)] then return end
  3060.     if SpammySignals[key] then return end
  3061.     if isSpammy(key) then return end
  3062.    
  3063.     local dataSize = estimateDataSize(args)
  3064.    
  3065.     local logData = {
  3066.         Type = remoteType,
  3067.         Name = name,
  3068.         SubText = method .. " | " .. #(args or {}) .. " args | ~" .. dataSize .. "B",
  3069.         Remote = remote,
  3070.         Args = deepClone(args or {}),
  3071.         Method = method,
  3072.         Blocked = blocked or Settings.Blocklist[name] or Settings.Blocklist[tostring(remote)],
  3073.         Timestamp = os.time(),
  3074.         IsLocalPlayer = true,
  3075.         DataSize = dataSize,
  3076.     }
  3077.    
  3078.     pcall(function() logData.Source = getcallingscript() end)
  3079.    
  3080.     local hit, bp = checkBreakpoint(logData)
  3081.     if hit then
  3082.         logData.Breakpoint = bp
  3083.         warn("[UnifiedSpy] Breakpoint hit:", name)
  3084.     end
  3085.    
  3086.     updateStatistics(logData)
  3087.    
  3088.     task.defer(function()
  3089.         createLogEntry("Remotes", logData)
  3090.     end)
  3091.    
  3092.     return logData.Blocked
  3093. end
  3094.  
  3095. local function logBindable(bindable, method, args)
  3096.     if not Settings.Logging.Enabled or not Settings.Logging.LogBindables then return end
  3097.    
  3098.     local name = bindable.Name
  3099.     local bindableType = bindable.ClassName
  3100.     local key = "bindable_" .. name .. "_" .. bindableType
  3101.    
  3102.     if Settings.Blacklist[name] then return end
  3103.     if SpammySignals[key] then return end
  3104.     if isSpammy(key) then return end
  3105.    
  3106.     local logData = {
  3107.         Type = bindableType,
  3108.         Name = name,
  3109.         SubText = method .. " | " .. #(args or {}) .. " args",
  3110.         Remote = bindable,
  3111.         Args = deepClone(args or {}),
  3112.         Method = method,
  3113.         Timestamp = os.time(),
  3114.         IsLocalPlayer = true,
  3115.     }
  3116.    
  3117.     updateStatistics(logData)
  3118.    
  3119.     task.defer(function()
  3120.         createLogEntry("Bindables", logData)
  3121.     end)
  3122. end
  3123.  
  3124. local function logSystemRemote(remote, method, args)
  3125.     if not Settings.Logging.Enabled or not Settings.Logging.LogRobloxReplicatedStorage then return end
  3126.    
  3127.     local name = remote.Name
  3128.     local remoteType = remote.ClassName
  3129.     local key = "system_" .. name
  3130.    
  3131.     if SpammySignals[key] then return end
  3132.     if isSpammy(key) then return end
  3133.    
  3134.     local logData = {
  3135.         Type = "SystemRemote",
  3136.         RemoteType = remoteType,
  3137.         Name = "[RRS] " .. name,
  3138.         SubText = method .. " | " .. remoteType,
  3139.         Remote = remote,
  3140.         Args = deepClone(args or {}),
  3141.         Method = method,
  3142.         Timestamp = os.time(),
  3143.         IsLocalPlayer = true,
  3144.     }
  3145.    
  3146.     updateStatistics(logData)
  3147.    
  3148.     task.defer(function()
  3149.         createLogEntry("System", logData)
  3150.     end)
  3151. end
  3152.  
  3153. local function logSignal(instance, signalName, args, connFunc)
  3154.     if not Settings.Logging.Enabled or not Settings.Logging.LogSignals then return end
  3155.     if Settings.Logging.LogLocalPlayerOnly and not isFromLocalPlayer(instance) then return end
  3156.    
  3157.     local key = tostring(instance) .. "." .. signalName
  3158.    
  3159.     if Settings.Blacklist[key] or Settings.Blacklist[signalName] then return end
  3160.     if SpammySignals[key] then return end
  3161.     if isSpammy(key) then return end
  3162.    
  3163.     local funcInfo = nil
  3164.     if connFunc then
  3165.         funcInfo = getFunctionInfo(connFunc)
  3166.     end
  3167.    
  3168.     local logData = {
  3169.         Type = "Signal",
  3170.         Name = signalName,
  3171.         SubText = instance.ClassName .. " | " .. (instance.Name or "?"),
  3172.         SignalName = signalName,
  3173.         Instance = instance,
  3174.         Args = deepClone(args or {}),
  3175.         FuncInfo = funcInfo,
  3176.         Blocked = Settings.Blocklist[key] or Settings.Blocklist[signalName],
  3177.         Timestamp = os.time(),
  3178.         IsLocalPlayer = isFromLocalPlayer(instance),
  3179.     }
  3180.    
  3181.     local hit, bp = checkBreakpoint(logData)
  3182.     if hit then
  3183.         logData.Breakpoint = bp
  3184.     end
  3185.    
  3186.     updateStatistics(logData)
  3187.    
  3188.     task.defer(function()
  3189.         createLogEntry("Signals", logData)
  3190.     end)
  3191.    
  3192.     return logData.Blocked
  3193. end
  3194.  
  3195. local function logHttpRequest(options)
  3196.     if not Settings.Logging.Enabled or not Settings.Logging.LogRequests then return end
  3197.    
  3198.     local url = type(options) == "table" and options.Url or tostring(options)
  3199.     local method = type(options) == "table" and options.Method or "GET"
  3200.     local key = "http_" .. url:sub(1, 50)
  3201.    
  3202.     if SpammySignals[key] then return end
  3203.     if isSpammy(key) then return end
  3204.    
  3205.     local dataSize = estimateDataSize(options)
  3206.    
  3207.     local logData = {
  3208.         Type = "HttpRequest",
  3209.         Name = url:sub(1, 50) .. (#url > 50 and "..." or ""),
  3210.         SubText = method .. " | ~" .. dataSize .. "B",
  3211.         Request = type(options) == "table" and deepClone(options) or {Url = url},
  3212.         Timestamp = os.time(),
  3213.         IsLocalPlayer = true,
  3214.         DataSize = dataSize,
  3215.     }
  3216.    
  3217.     updateStatistics(logData)
  3218.    
  3219.     task.defer(function()
  3220.         createLogEntry("Requests", logData)
  3221.     end)
  3222. end
  3223.  
  3224. local function logAudio(sound)
  3225.     if not Settings.Logging.Enabled or not Settings.Logging.LogAudios then return end
  3226.     if not sound:IsA("Sound") then return end
  3227.     if TrackedSounds[sound] then return end
  3228.     if Settings.Logging.LogLocalPlayerOnly and not isFromLocalPlayer(sound) then return end
  3229.    
  3230.     local soundId = sound.SoundId
  3231.     if soundId == "" then return end
  3232.    
  3233.     local ignoredSounds = {
  3234.         "rbxasset://sounds/action_get_up.mp3",
  3235.         "rbxasset://sounds/uuhhh.mp3",
  3236.         "rbxasset://sounds/action_falling.mp3",
  3237.         "rbxasset://sounds/action_jump.mp3",
  3238.         "rbxasset://sounds/action_jump_land.mp3",
  3239.         "rbxasset://sounds/impact_water.mp3",
  3240.         "rbxasset://sounds/action_swim.mp3",
  3241.         "rbxasset://sounds/action_footsteps_plastic.mp3",
  3242.     }
  3243.     for _, v in ipairs(ignoredSounds) do
  3244.         if soundId == v then return end
  3245.     end
  3246.    
  3247.     TrackedSounds[sound] = true
  3248.    
  3249.     local id = soundId:match("%d+") or soundId
  3250.     local name = sound.Name
  3251.    
  3252.     pcall(function()
  3253.         local info = MarketplaceService:GetProductInfo(tonumber(id))
  3254.         if info and info.Name then name = info.Name end
  3255.     end)
  3256.    
  3257.     local logData = {
  3258.         Type = "Audio",
  3259.         Name = name,
  3260.         SubText = "ID: " .. id .. " | Vol: " .. string.format("%.1f", sound.Volume),
  3261.         SoundId = soundId,
  3262.         Sound = sound,
  3263.         Volume = sound.Volume,
  3264.         Timestamp = os.time(),
  3265.         IsLocalPlayer = isFromLocalPlayer(sound),
  3266.     }
  3267.    
  3268.     updateStatistics(logData)
  3269.    
  3270.     task.defer(function()
  3271.         createLogEntry("Audios", logData)
  3272.     end)
  3273. end
  3274.  
  3275. local function logAnimation(animTrack)
  3276.     if not Settings.Logging.Enabled or not Settings.Logging.LogAnimations then return end
  3277.     if not animTrack or not animTrack.Animation then return end
  3278.    
  3279.     local anim = animTrack.Animation
  3280.     local animId = anim.AnimationId
  3281.     if animId == "" then return end
  3282.    
  3283.     local ignoredAnims = {"507768375", "180435571", "180435792"}
  3284.     for _, v in ipairs(ignoredAnims) do
  3285.         if animId:find(v) then return end
  3286.     end
  3287.    
  3288.     local key = animId
  3289.     if TrackedAnimations[key] and tick() - TrackedAnimations[key] < 0.5 then return end
  3290.     TrackedAnimations[key] = tick()
  3291.    
  3292.     local id = animId:match("%d+") or animId
  3293.     local name = anim.Name
  3294.    
  3295.     pcall(function()
  3296.         local info = MarketplaceService:GetProductInfo(tonumber(id))
  3297.         if info and info.Name then name = info.Name end
  3298.     end)
  3299.    
  3300.     local logData = {
  3301.         Type = "Animation",
  3302.         Name = name,
  3303.         SubText = "ID: " .. id,
  3304.         AnimationId = animId,
  3305.         Animation = anim,
  3306.         Timestamp = os.time(),
  3307.         IsLocalPlayer = true,
  3308.     }
  3309.    
  3310.     updateStatistics(logData)
  3311.    
  3312.     task.defer(function()
  3313.         createLogEntry("Animations", logData)
  3314.     end)
  3315. end
  3316.  
  3317. local function hookSignal(instance, signalName)
  3318.     if not getconnections then return end
  3319.    
  3320.     local key = tostring(instance) .. "." .. signalName
  3321.     if HookedSignals[key] then return end
  3322.    
  3323.     local ok, signal = pcall(function() return instance[signalName] end)
  3324.     if not ok or not signal or typeof(signal) ~= "RBXScriptSignal" then return end
  3325.    
  3326.     HookedSignals[key] = true
  3327.    
  3328.     local conns = {}
  3329.     pcall(function() conns = getconnections(signal) end)
  3330.    
  3331.     for _, conn in pairs(conns) do
  3332.         if conn and conn.Function then
  3333.             local origFunc = conn.Function
  3334.             local wasEnabled = conn.Enabled
  3335.            
  3336.             pcall(function() conn:Disable() end)
  3337.            
  3338.             local newConn = signal:Connect(function(...)
  3339.                 local args = {...}
  3340.                 local blocked = logSignal(instance, signalName, args, origFunc)
  3341.                 if blocked then return end
  3342.                 return origFunc(...)
  3343.             end)
  3344.            
  3345.             table.insert(HookedConnections, {
  3346.                 Connection = newConn,
  3347.                 Original = conn,
  3348.                 WasEnabled = wasEnabled,
  3349.                 Key = key,
  3350.             })
  3351.         end
  3352.     end
  3353.    
  3354.     local catchConn = signal:Connect(function(...)
  3355.         if #conns == 0 then
  3356.             logSignal(instance, signalName, {...}, nil)
  3357.         end
  3358.     end)
  3359.     table.insert(HookedConnections, {Connection = catchConn, Key = key})
  3360. end
  3361.  
  3362. local function hookRemotes()
  3363.     local testRE = Instance.new("RemoteEvent")
  3364.     local testRF = Instance.new("RemoteFunction")
  3365.     local testURE = nil
  3366.     pcall(function() testURE = Instance.new("UnreliableRemoteEvent") end)
  3367.     local testBE = Instance.new("BindableEvent")
  3368.     local testBF = Instance.new("BindableFunction")
  3369.    
  3370.     OriginalFunctions.FireServer = testRE.FireServer
  3371.     OriginalFunctions.InvokeServer = testRF.InvokeServer
  3372.     if testURE then OriginalFunctions.UnreliableFireServer = testURE.FireServer end
  3373.     OriginalFunctions.BindableFire = testBE.Fire
  3374.     OriginalFunctions.BindableInvoke = testBF.Invoke
  3375.    
  3376.     testRE:Destroy()
  3377.     testRF:Destroy()
  3378.     if testURE then testURE:Destroy() end
  3379.     testBE:Destroy()
  3380.     testBF:Destroy()
  3381.    
  3382.     if hookfunction then
  3383.         pcall(function()
  3384.             hookfunction(Instance.new("RemoteEvent").FireServer, newcclosure(function(self, ...)
  3385.                 if typeof(self) == "Instance" and self:IsA("RemoteEvent") then
  3386.                     if logRemote(self, "FireServer", {...}) then return end
  3387.                 end
  3388.                 return OriginalFunctions.FireServer(self, ...)
  3389.             end))
  3390.         end)
  3391.        
  3392.         pcall(function()
  3393.             hookfunction(Instance.new("RemoteFunction").InvokeServer, newcclosure(function(self, ...)
  3394.                 if typeof(self) == "Instance" and self:IsA("RemoteFunction") then
  3395.                     if logRemote(self, "InvokeServer", {...}) then return end
  3396.                 end
  3397.                 return OriginalFunctions.InvokeServer(self, ...)
  3398.             end))
  3399.         end)
  3400.        
  3401.         if OriginalFunctions.UnreliableFireServer then
  3402.             pcall(function()
  3403.                 hookfunction(Instance.new("UnreliableRemoteEvent").FireServer, newcclosure(function(self, ...)
  3404.                     if typeof(self) == "Instance" and self:IsA("UnreliableRemoteEvent") then
  3405.                         if logRemote(self, "FireServer", {...}) then return end
  3406.                     end
  3407.                     return OriginalFunctions.UnreliableFireServer(self, ...)
  3408.                 end))
  3409.             end)
  3410.         end
  3411.        
  3412.         pcall(function()
  3413.             hookfunction(Instance.new("BindableEvent").Fire, newcclosure(function(self, ...)
  3414.                 if typeof(self) == "Instance" and self:IsA("BindableEvent") then
  3415.                     logBindable(self, "Fire", {...})
  3416.                 end
  3417.                 return OriginalFunctions.BindableFire(self, ...)
  3418.             end))
  3419.         end)
  3420.        
  3421.         pcall(function()
  3422.             hookfunction(Instance.new("BindableFunction").Invoke, newcclosure(function(self, ...)
  3423.                 if typeof(self) == "Instance" and self:IsA("BindableFunction") then
  3424.                     logBindable(self, "Invoke", {...})
  3425.                 end
  3426.                 return OriginalFunctions.BindableInvoke(self, ...)
  3427.             end))
  3428.         end)
  3429.     end
  3430.    
  3431.     if hookmetamethod and getnamecallmethod then
  3432.         pcall(function()
  3433.             local oldNamecall
  3434.             oldNamecall = hookmetamethod(game, "__namecall", newcclosure(function(self, ...)
  3435.                 local method = getnamecallmethod()
  3436.                 if method and typeof(self) == "Instance" then
  3437.                     local lm = method:lower()
  3438.                     if lm == "fireserver" then
  3439.                         if self:IsA("RemoteEvent") or self:IsA("UnreliableRemoteEvent") then
  3440.                             if logRemote(self, method, {...}) then return end
  3441.                         end
  3442.                     elseif lm == "invokeserver" and self:IsA("RemoteFunction") then
  3443.                         if logRemote(self, method, {...}) then return end
  3444.                     elseif lm == "fire" and self:IsA("BindableEvent") then
  3445.                         logBindable(self, method, {...})
  3446.                     elseif lm == "invoke" and self:IsA("BindableFunction") then
  3447.                         logBindable(self, method, {...})
  3448.                     end
  3449.                 end
  3450.                 return oldNamecall(self, ...)
  3451.             end))
  3452.             OriginalFunctions.Namecall = oldNamecall
  3453.         end)
  3454.     end
  3455. end
  3456.  
  3457. local function hookHttp()
  3458.     if not request or not hookfunction then return end
  3459.     OriginalFunctions.Request = request
  3460.     pcall(function()
  3461.         hookfunction(request, newcclosure(function(opts)
  3462.             logHttpRequest(opts)
  3463.             return OriginalFunctions.Request(opts)
  3464.         end))
  3465.     end)
  3466. end
  3467.  
  3468. local function hookRobloxReplicatedStorage()
  3469.     if not RobloxReplicatedStorage then return end
  3470.    
  3471.     pcall(function()
  3472.         for _, child in pairs(RobloxReplicatedStorage:GetChildren()) do
  3473.             if child:IsA("RemoteEvent") then
  3474.                 Connections["RRS_" .. child.Name] = child.OnClientEvent:Connect(function(...)
  3475.                     logSystemRemote(child, "OnClientEvent", {...})
  3476.                 end)
  3477.             elseif child:IsA("RemoteFunction") then
  3478.                 local oldCallback = child.OnClientInvoke
  3479.                 child.OnClientInvoke = function(...)
  3480.                     logSystemRemote(child, "OnClientInvoke", {...})
  3481.                     if oldCallback then
  3482.                         return oldCallback(...)
  3483.                     end
  3484.                 end
  3485.             end
  3486.         end
  3487.        
  3488.         Connections.RRSChildAdded = RobloxReplicatedStorage.ChildAdded:Connect(function(child)
  3489.             if child:IsA("RemoteEvent") then
  3490.                 Connections["RRS_" .. child.Name] = child.OnClientEvent:Connect(function(...)
  3491.                     logSystemRemote(child, "OnClientEvent", {...})
  3492.                 end)
  3493.             end
  3494.         end)
  3495.     end)
  3496. end
  3497.  
  3498. local function hookSignals()
  3499.     local function scanInstance(inst)
  3500.         if Settings.Logging.LogLocalPlayerOnly and not isFromLocalPlayer(inst) then return end
  3501.        
  3502.         pcall(function()
  3503.             local className = inst.ClassName
  3504.             local signals = ClassSignals[className]
  3505.             if signals then
  3506.                 for _, sig in ipairs(signals) do
  3507.                     if sig.Security == "None" or sig.Security == nil then
  3508.                         hookSignal(inst, sig.Name)
  3509.                     end
  3510.                 end
  3511.             end
  3512.            
  3513.             if inst:IsA("Humanoid") then
  3514.                 hookSignal(inst, "Died")
  3515.                 hookSignal(inst, "StateChanged")
  3516.                 hookSignal(inst, "Running")
  3517.                 hookSignal(inst, "Jumping")
  3518.                 hookSignal(inst, "HealthChanged")
  3519.                 hookSignal(inst, "MoveToFinished")
  3520.             elseif inst:IsA("ClickDetector") then
  3521. --                hookSignal
  3522.                 hookSignal(inst, "MouseClick")
  3523.                 hookSignal(inst, "MouseHoverEnter")
  3524.                 hookSignal(inst, "MouseHoverLeave")
  3525.                 hookSignal(inst, "RightMouseClick")
  3526.             elseif inst:IsA("ProximityPrompt") then
  3527.                 hookSignal(inst, "Triggered")
  3528.                 hookSignal(inst, "TriggerEnded")
  3529.                 hookSignal(inst, "PromptShown")
  3530.                 hookSignal(inst, "PromptHidden")
  3531.             elseif inst:IsA("Tool") then
  3532.                 hookSignal(inst, "Activated")
  3533.                 hookSignal(inst, "Deactivated")
  3534.                 hookSignal(inst, "Equipped")
  3535.                 hookSignal(inst, "Unequipped")
  3536.             elseif inst:IsA("GuiButton") then
  3537.                 hookSignal(inst, "MouseButton1Click")
  3538.                 hookSignal(inst, "MouseButton1Down")
  3539.                 hookSignal(inst, "MouseButton1Up")
  3540.                 hookSignal(inst, "MouseButton2Click")
  3541.                 hookSignal(inst, "Activated")
  3542.             elseif inst:IsA("TextBox") then
  3543.                 hookSignal(inst, "FocusLost")
  3544.                 hookSignal(inst, "Focused")
  3545.             elseif inst:IsA("ValueBase") then
  3546.                 hookSignal(inst, "Changed")
  3547.             elseif inst:IsA("BindableEvent") then
  3548.                 hookSignal(inst, "Event")
  3549.             elseif inst:IsA("TouchTransmitter") or inst:IsA("BasePart") then
  3550.                 hookSignal(inst, "Touched")
  3551.                 hookSignal(inst, "TouchEnded")
  3552.             elseif inst:IsA("Player") then
  3553.                 hookSignal(inst, "Chatted")
  3554.                 hookSignal(inst, "CharacterAdded")
  3555.                 hookSignal(inst, "CharacterRemoving")
  3556.             end
  3557.         end)
  3558.     end
  3559.    
  3560.     if Settings.Logging.LogLocalPlayerOnly then
  3561.         if Players.LocalPlayer and Players.LocalPlayer.Character then
  3562.             for _, desc in pairs(Players.LocalPlayer.Character:GetDescendants()) do
  3563.                 task.defer(scanInstance, desc)
  3564.             end
  3565.         end
  3566.         if Players.LocalPlayer then
  3567.             for _, desc in pairs(Players.LocalPlayer:GetDescendants()) do
  3568.                 task.defer(scanInstance, desc)
  3569.             end
  3570.         end
  3571.     else
  3572.         for _, desc in pairs(game:GetDescendants()) do
  3573.             task.defer(scanInstance, desc)
  3574.         end
  3575.     end
  3576.    
  3577.     Connections.DescendantAdded = game.DescendantAdded:Connect(function(desc)
  3578.         task.defer(scanInstance, desc)
  3579.     end)
  3580.    
  3581.     if Players.LocalPlayer then
  3582.         Connections.CharacterAdded = Players.LocalPlayer.CharacterAdded:Connect(function(char)
  3583.             task.wait(0.5)
  3584.             for _, desc in pairs(char:GetDescendants()) do
  3585.                 task.defer(scanInstance, desc)
  3586.             end
  3587.             Connections.CharDescAdded = char.DescendantAdded:Connect(function(desc)
  3588.                 task.defer(scanInstance, desc)
  3589.             end)
  3590.         end)
  3591.     end
  3592. end
  3593.  
  3594. local function hookAudios()
  3595.     local function onSoundAdded(sound)
  3596.         if sound:IsA("Sound") then
  3597.             local conn
  3598.             conn = sound:GetPropertyChangedSignal("Playing"):Connect(function()
  3599.                 if sound.Playing then
  3600.                     task.defer(logAudio, sound)
  3601.                 end
  3602.             end)
  3603.             table.insert(Connections, conn)
  3604.            
  3605.             if sound.Playing then
  3606.                 task.defer(logAudio, sound)
  3607.             end
  3608.         end
  3609.     end
  3610.    
  3611.     Connections.AudioAdded = game.DescendantAdded:Connect(function(desc)
  3612.         if desc:IsA("Sound") then
  3613.             onSoundAdded(desc)
  3614.         end
  3615.     end)
  3616.    
  3617.     for _, snd in pairs(game:GetDescendants()) do
  3618.         if snd:IsA("Sound") then
  3619.             onSoundAdded(snd)
  3620.         end
  3621.     end
  3622. end
  3623.  
  3624. local function hookAnimations()
  3625.     local lp = Players.LocalPlayer
  3626.     if not lp then return end
  3627.    
  3628.     local function trackChar(char)
  3629.         if not char then return end
  3630.        
  3631.         local hum = char:WaitForChild("Humanoid", 10)
  3632.         if not hum then return end
  3633.        
  3634.         local animator = hum:FindFirstChildOfClass("Animator") or hum:WaitForChild("Animator", 5)
  3635.         if animator then
  3636.             Connections.AnimatorPlayed = animator.AnimationPlayed:Connect(function(track)
  3637.                 task.defer(logAnimation, track)
  3638.             end)
  3639.         end
  3640.        
  3641.         Connections.HumAnimPlayed = hum.AnimationPlayed:Connect(function(track)
  3642.             task.defer(logAnimation, track)
  3643.         end)
  3644.     end
  3645.    
  3646.     if lp.Character then
  3647.         trackChar(lp.Character)
  3648.     end
  3649.    
  3650.     Connections.CharAddedAnim = lp.CharacterAdded:Connect(function(char)
  3651.         task.wait(0.2)
  3652.         trackChar(char)
  3653.     end)
  3654. end
  3655.  
  3656. local dragging, resizing = false, false
  3657. local dragStart, startPos, startSize
  3658.  
  3659. TopBar.InputBegan:Connect(function(input)
  3660.     if input.UserInputType == Enum.UserInputType.MouseButton1 then
  3661.         local mousePos = UserInputService:GetMouseLocation()
  3662.         local relX = mousePos.X - TopBar.AbsolutePosition.X
  3663.         if relX < TopBar.AbsoluteSize.X - 130 then
  3664.             dragging = true
  3665.             dragStart = input.Position
  3666.             startPos = MainFrame.Position
  3667.         end
  3668.     end
  3669. end)
  3670.  
  3671. TopBar.InputEnded:Connect(function(input)
  3672.     if input.UserInputType == Enum.UserInputType.MouseButton1 then
  3673.         dragging = false
  3674.     end
  3675. end)
  3676.  
  3677. local ResizeHandle = Create("TextButton", {
  3678.     Parent = MainFrame,
  3679.     BackgroundColor3 = Color3.fromRGB(60, 60, 70),
  3680.     Position = UDim2.new(1, -18, 1, -18),
  3681.     Size = UDim2.new(0, 16, 0, 16),
  3682.     Text = "◢",
  3683.     TextColor3 = Color3.fromRGB(120, 120, 130),
  3684.     TextSize = 12,
  3685.     Font = Enum.Font.GothamBold,
  3686.     AutoButtonColor = false,
  3687.     ZIndex = 10,
  3688. })
  3689. Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = ResizeHandle})
  3690.  
  3691. ResizeHandle.InputBegan:Connect(function(input)
  3692.     if input.UserInputType == Enum.UserInputType.MouseButton1 then
  3693.         resizing = true
  3694.         dragStart = input.Position
  3695.         startSize = MainFrame.Size
  3696.     end
  3697. end)
  3698.  
  3699. ResizeHandle.InputEnded:Connect(function(input)
  3700.     if input.UserInputType == Enum.UserInputType.MouseButton1 then
  3701.         resizing = false
  3702.     end
  3703. end)
  3704.  
  3705. UserInputService.InputChanged:Connect(function(input)
  3706.     if input.UserInputType == Enum.UserInputType.MouseMovement then
  3707.         if dragging then
  3708.             local delta = input.Position - dragStart
  3709.             local newPos = UDim2.new(
  3710.                 startPos.X.Scale,
  3711.                 startPos.X.Offset + delta.X,
  3712.                 startPos.Y.Scale,
  3713.                 startPos.Y.Offset + delta.Y
  3714.             )
  3715.             if Settings.Display.EnableAnimations then
  3716.                 TweenService:Create(MainFrame, TweenInfo.new(0.08, Enum.EasingStyle.Quad), {
  3717.                     Position = newPos
  3718.                 }):Play()
  3719.             else
  3720.                 MainFrame.Position = newPos
  3721.             end
  3722.         elseif resizing then
  3723.             local delta = input.Position - dragStart
  3724.             local newWidth = math.max(800, startSize.X.Offset + delta.X)
  3725.             local newHeight = math.max(500, startSize.Y.Offset + delta.Y)
  3726.             MainFrame.Size = UDim2.new(0, newWidth, 0, newHeight)
  3727.         end
  3728.     end
  3729. end)
  3730.  
  3731. local minimized = false
  3732. local savedSize = MainFrame.Size
  3733.  
  3734. MinBtn.MouseButton1Click:Connect(function()
  3735.     minimized = not minimized
  3736.     if minimized then
  3737.         savedSize = MainFrame.Size
  3738.         Tween(MainFrame, {Size = UDim2.new(0, MainFrame.Size.X.Offset, 0, 42)}, 0.25)
  3739.         ContentFrame.Visible = false
  3740.         ResizeHandle.Visible = false
  3741.         MinBtn.Text = "+"
  3742.     else
  3743.         ContentFrame.Visible = true
  3744.         ResizeHandle.Visible = true
  3745.         Tween(MainFrame, {Size = savedSize}, 0.25)
  3746.         MinBtn.Text = "−"
  3747.     end
  3748. end)
  3749.  
  3750. local sidebarHidden = false
  3751.  
  3752. MaxBtn.MouseButton1Click:Connect(function()
  3753.     sidebarHidden = not sidebarHidden
  3754.     if sidebarHidden then
  3755.         Tween(Sidebar, {Size = UDim2.new(0, 0, 1, 0)}, 0.2)
  3756.         Tween(MainPanel, {Position = UDim2.new(0, 0, 0, 0), Size = UDim2.new(1, 0, 1, 0)}, 0.2)
  3757.         MaxBtn.Text = "◧"
  3758.     else
  3759.         Tween(Sidebar, {Size = UDim2.new(0, 175, 1, 0)}, 0.2)
  3760.         Tween(MainPanel, {Position = UDim2.new(0, 175, 0, 0), Size = UDim2.new(1, -175, 1, 0)}, 0.2)
  3761.         MaxBtn.Text = "□"
  3762.     end
  3763. end)
  3764.  
  3765. local spyEnabled = true
  3766.  
  3767. TitleBtn.MouseButton1Click:Connect(function()
  3768.     spyEnabled = not spyEnabled
  3769.     Settings.Logging.Enabled = spyEnabled
  3770.     saveSettings()
  3771.    
  3772.     if spyEnabled then
  3773.         Tween(TitleBtn, {TextColor3 = getColor("Accent")})
  3774.         StatusLabel.Text = "ACTIVE"
  3775.         StatusLabel.TextColor3 = getColor("Success")
  3776.     else
  3777.         Tween(TitleBtn, {TextColor3 = getColor("Error")})
  3778.         StatusLabel.Text = "PAUSED"
  3779.         StatusLabel.TextColor3 = getColor("Error")
  3780.     end
  3781. end)
  3782.  
  3783. local function shutdown()
  3784.     Running = false
  3785.     getgenv().UnifiedSpyExecuted = false
  3786.    
  3787.     for name, conn in pairs(Connections) do
  3788.         if typeof(conn) == "RBXScriptConnection" then
  3789.             pcall(function() conn:Disconnect() end)
  3790.         end
  3791.     end
  3792.    
  3793.     for _, data in pairs(HookedConnections) do
  3794.         if data.Connection then
  3795.             pcall(function() data.Connection:Disconnect() end)
  3796.         end
  3797.         if data.Original and data.WasEnabled then
  3798.             pcall(function() data.Original:Enable() end)
  3799.         end
  3800.     end
  3801.    
  3802.     Tween(MainFrame, {
  3803.         Size = UDim2.new(0, 0, 0, 0),
  3804.         Position = UDim2.new(0.5, 0, 0.5, 0),
  3805.     }, 0.25)
  3806.    
  3807.     task.delay(0.3, function()
  3808.         ScreenGui:Destroy()
  3809.     end)
  3810.    
  3811.     debugLog("Shutdown complete")
  3812. end
  3813.  
  3814. CloseBtn.MouseButton1Click:Connect(shutdown)
  3815. getgenv().UnifiedSpyShutdown = shutdown
  3816.  
  3817. task.spawn(function()
  3818.     local success = loadAPIDump()
  3819.     if success and CachedVersion then
  3820.         VersionLabel.Text = "v3.0 | " .. (CachedVersion.version or "?")
  3821.         debugLog("API Dump loaded successfully")
  3822.     else
  3823.         VersionLabel.Text = "v3.0 | No Cache"
  3824.         debugWarn("Failed to load API Dump")
  3825.     end
  3826. end)
  3827.  
  3828. task.spawn(function()
  3829.     hookRemotes()
  3830.     debugLog("Remotes hooked")
  3831. end)
  3832.  
  3833. task.spawn(function()
  3834.     hookHttp()
  3835.     debugLog("HTTP hooked")
  3836. end)
  3837.  
  3838. task.spawn(function()
  3839.     hookRobloxReplicatedStorage()
  3840.     debugLog("RobloxReplicatedStorage hooked")
  3841. end)
  3842.  
  3843. task.spawn(function()
  3844.     hookSignals()
  3845.     debugLog("Signals hooked")
  3846. end)
  3847.  
  3848. task.spawn(function()
  3849.     hookAudios()
  3850.     debugLog("Audios hooked")
  3851. end)
  3852.  
  3853. task.spawn(function()
  3854.     hookAnimations()
  3855.     debugLog("Animations hooked")
  3856. end)
  3857.  
  3858. getgenv().UnifiedSpyExecuted = true
  3859. getgenv().UnifiedSpy = {
  3860.     Settings = Settings,
  3861.     Logs = Logs,
  3862.     Statistics = Statistics,
  3863.     SignalDatabase = SignalDatabase,
  3864.     ClassSignals = ClassSignals,
  3865.     Version = CachedVersion,
  3866.    
  3867.     shutdown = shutdown,
  3868.     switchTab = switchTab,
  3869.     hookSignal = hookSignal,
  3870.     exportLogs = exportLogs,
  3871.     saveSettings = saveSettings,
  3872.     loadSettings = loadSettings,
  3873.     getStatisticsReport = getStatisticsReport,
  3874.    
  3875.     setEnabled = function(enabled)
  3876.         Settings.Logging.Enabled = enabled
  3877.         spyEnabled = enabled
  3878.         saveSettings()
  3879.         if enabled then
  3880.             TitleBtn.TextColor3 = getColor("Accent")
  3881.             StatusLabel.Text = "ACTIVE"
  3882.             StatusLabel.TextColor3 = getColor("Success")
  3883.         else
  3884.             TitleBtn.TextColor3 = getColor("Error")
  3885.             StatusLabel.Text = "PAUSED"
  3886.             StatusLabel.TextColor3 = getColor("Error")
  3887.         end
  3888.     end,
  3889.    
  3890.     setTeleportScript = function(script)
  3891.         Settings.TeleportScript = script
  3892.         saveSettings()
  3893.     end,
  3894.    
  3895.     addBreakpoint = function(bpType, value)
  3896.         table.insert(Settings.Breakpoints, {
  3897.             Enabled = true,
  3898.             Type = bpType,
  3899.             Value = value,
  3900.             CreatedAt = os.time(),
  3901.         })
  3902.         saveSettings()
  3903.     end,
  3904.    
  3905.     clearBreakpoints = function()
  3906.         Settings.Breakpoints = {}
  3907.         saveSettings()
  3908.     end,
  3909.    
  3910.     addToBlacklist = function(name)
  3911.         Settings.Blacklist[name] = true
  3912.         saveSettings()
  3913.     end,
  3914.    
  3915.     addToBlocklist = function(name)
  3916.         Settings.Blocklist[name] = true
  3917.         saveSettings()
  3918.     end,
  3919.    
  3920.     clearBlacklist = function()
  3921.         Settings.Blacklist = {}
  3922.         SpammySignals = {}
  3923.         saveSettings()
  3924.     end,
  3925.    
  3926.     clearBlocklist = function()
  3927.         Settings.Blocklist = {}
  3928.         saveSettings()
  3929.     end,
  3930. }
  3931.  
  3932. print("═══════════════════════════════════════════")
  3933. print("  UnifiedSpy v3.0 Loaded Successfully!")
  3934. print("═══════════════════════════════════════════")
  3935. print("  • Click title to toggle logging")
  3936. print("  • Drag top bar to move window")
  3937. print("  • Drag corner to resize")
  3938. print("  • Use search to filter logs")
  3939. print("═══════════════════════════════════════════")
  3940.  
  3941. local signalCount = 0
  3942. for _ in pairs(SignalDatabase) do signalCount = signalCount + 1 end
  3943. print("  • Signals in database: " .. signalCount)
  3944. print("  • Settings: UnifiedSpy/Settings.json")
  3945. print("  • Cache: UnifiedSpy/Cache/")
  3946. print("═══════════════════════════════════════════")
  3947.  
  3948. if DEBUG then
  3949.     print("[UnifiedSpy] Debug mode enabled")
  3950.     print("[UnifiedSpy] Access via getgenv().UnifiedSpy")
  3951. end
Advertisement
Comments
  • Jaxgaitoz
    107 days
    # CSS 0.85 KB | 0 0
    1. ✅ Leaked Exploit Documentation:
    2.  
    3. https://docs.google.com/document/d/1dOCZEHS5JtM51RITOJzbS4o3hZ-__wTTRXQkV1MexNQ/edit?usp=sharing
    4.  
    5. This made me $13,000 in 2 days.
    6.  
    7. Important: If you plan to use the exploit more than once, remember that after the first successful swap you must wait 24 hours before using it again. Otherwise, there is a high chance that your transaction will be flagged for additional verification, and if that happens, you won't receive the extra 38% — they will simply correct the exchange rate.
    8. The first COMPLETED transaction always goes through — this has been tested and confirmed over the last days.
    9.  
    10. Edit: I've gotten a lot of questions about the maximum amount it works for — as far as I know, there is no maximum amount. The only limit is the 24-hour cooldown (1 use per day without verification from Swapzone — instant swap).
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment