local U={}local A=0 local O={}function filteringWorkspace()if explorerFilter.Text~=""and explorerFilter.Text~="\070\105\108\116\101\114 \087\111\114\107\115\112\097\099\101"then return true end return false end function lookForAName(U,A)for U,O in pairs(U:GetChildren())do if string.find(string.lower(O.Name),string.lower(A))then nameScanned=true end lookForAName(O,A)end end function scanName(U)nameScanned=false if string.find(string.lower(U.Name),string.lower(explorerFilter.Text))then nameScanned=true else lookForAName(U,explorerFilter.Text)end return nameScanned end function updateActions()for U,A in pairs(O)do if A.Cond()then A.Toggle(true)else A.Toggle(false)end end end local p,C,I,c do local function O(U)for p=1,#U,1 do if not filteringWorkspace()or scanName(U[p].Object)then TreeList[#TreeList+1]=U[p]local C=((((U[p].Depth*((2+ENTRY_PADDING)+GUI_SIZE)+2)+ENTRY_SIZE)+4)+getTextWidth(U[p].Object.Name))+4 if C>A then A=C end if U[p].Expanded or filteringWorkspace()then O(U[p])end end end end function c()scrollBarH.TotalSpace=A scrollBarH.VisibleSpace=listFrame.AbsoluteSize.x scrollBarH:Update()local U=scrollBarH:CanScrollDown()or scrollBarH:CanScrollUp()scrollBarH.GUI.Visible=U listFrame.Size=UDim2.new(1,-GUI_SIZE,1,-GUI_SIZE*(U and 1 or 0)-HEADER_SIZE)scrollBar.VisibleSpace=math.ceil(listFrame.AbsoluteSize.y/ENTRY_BOUND)scrollBar.GUI.Size=UDim2.new(0,GUI_SIZE,1,-GUI_SIZE*(U and 1 or 0)-HEADER_SIZE)scrollBar.TotalSpace=#TreeList+1 scrollBar:Update()end function C()TreeList={}A=0 O(U[workspace.Parent])if DexStorageEnabled then O(U[DexStorage])end if NilStorageEnabled then O(U[NilStorage])end c()updateActions()end local Q=false function p()if Q then return end Q=true wait(.25)Q=false C()end local H=false function I()if H then return end H=true wait(.25)H=false scrollBar:Update()end end local Q do local A=explorerPanel:FindFirstChild("\071\101\116\083\101\108\101\099\116\105\111\110")if not A then A=Create("\066\105\110\100\097\098\108\101\070\117\110\099\116\105\111\110",{Name="\071\101\116\083\101\108\101\099\116\105\111\110"})A.Parent=explorerPanel end local O=explorerPanel:FindFirstChild("\083\101\116\083\101\108\101\099\116\105\111\110")if not O then O=Create("\066\105\110\100\097\098\108\101\070\117\110\099\116\105\111\110",{Name="\083\101\116\083\101\108\101\099\116\105\111\110"})O.Parent=explorerPanel end local p=explorerPanel:FindFirstChild("\083\101\108\101\099\116\105\111\110\067\104\097\110\103\101\100")if not p then p=Create("\066\105\110\100\097\098\108\101\069\118\101\110\116",{Name="\083\101\108\101\099\116\105\111\110\067\104\097\110\103\101\100"})p.Parent=explorerPanel end local I={}local c={}local H=true Q={Selected=c;List=I}local function X(A)local O=false local p=false if not c[A]then local C=U[A]if C then table.insert(I,A)c[A]=true C.Selected=true C=C.Parent while C do if not C.Expanded then C.Expanded=true O=true end C=C.Parent end p=true end end return O,p end function Q.Set(O,A)local H=false local u=false if#I>0 then for A=1,#I,1 do local O=I[A]local p=U[O]if p then p.Selected=false c[O]=nil end end I={}Q.List=I u=true end for U=1,#A,1 do local O,p=X(A[U])H=O or H u=p or u end if H then C()u=true elseif u then scrollBar:Update()end if u then p:Fire()updateActions()end end function Q.Add(A,U)local O,I=X(U)if O then C()if H then p:Fire()updateActions()end elseif I then scrollBar:Update()if H then p:Fire()updateActions()end end end function Q.StopUpdates(U)H=false end function Q.ResumeUpdates(U)H=true p:Fire()updateActions()end function Q.Remove(C,A,O)if c[A]then local C=U[A]if C then C.Selected=false c[A]=nil for U=1,#I,1 do if I[U]==A then table.remove(I,U)break end end if not O then scrollBar:Update()end p:Fire()updateActions()end end end function Q.Get(U)local A={}for U=1,#I,1 do A[U]=I[U]end return A end O.OnInvoke=function(...)Q:Set(...)end A.OnInvoke=function()return Q:Get()end end function CreateCaution(U,A)local O=CautionWindow:Clone()O.Title.Text=U O.MainWindow.Desc.Text=A O.Parent=explorerPanel.Parent O.Visible=true O.MainWindow.Ok.MouseButton1Up:connect(function()O:Destroy()end)end function CreateTableCaution(U,A)if type(A)~="\116\097\098\108\101"then return CreateCaution(U,tostring(A))end local O=TableCautionWindow:Clone()O.Title.Text=U local p=O.MainWindow.TableResults local C=O.MainWindow.TableTemplate for U,A in pairs(A)do local O=C:Clone()O.Type.Text=type(A)O.Value.Text=tostring(A)O.Position=UDim2.new(0,0,0,#p:GetChildren()*20)O.Parent=p p.CanvasSize=UDim2.new(0,0,0,#p:GetChildren()*20)O.Visible=true end O.Parent=explorerPanel.Parent O.Visible=true O.MainWindow.Ok.MouseButton1Up:connect(function()O:Destroy()end)end local function H(U,A)local O=1 local p={}while true do local C=string.find(U,A,O,true)if not C then break end table.insert(p,string.sub(U,O,C-1))O=C+string.len(A)end table.insert(p,string.sub(U,O))return p end local function X(U,A)if A=="\086\101\099\116\111\114\050"then local A=H(U,"\044")if#A<2 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 return Vector2.new(O,p)elseif A=="\086\101\099\116\111\114\051"then local A=H(U,"\044")if#A<3 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 local C=tonumber(A[3])or 0 return Vector3.new(O,p,C)elseif A=="\067\111\108\111\114\051"then local A=H(U,"\044")if#A<3 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 local C=tonumber(A[3])or 0 return Color3.new(O/255,p/255,C/255)elseif A=="\085\068\105\109\050"then local A=H(string.gsub(string.gsub(U,"\123",""),"\125",""),"\044")if#A<4 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 local C=tonumber(A[3])or 0 local I=tonumber(A[4])or 0 return UDim2.new(O,p,C,I)elseif A=="\078\117\109\098\101\114"then return tonumber(U)elseif A=="\083\116\114\105\110\103"then return U elseif A=="\078\117\109\098\101\114\082\097\110\103\101"then local A=H(U,"\044")if#A==1 then if tonumber(A[1])==nil then return nil end local U=tonumber(A[1])or 0 return NumberRange.new(U)end if#A<2 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 return NumberRange.new(O,p)elseif A=="\083\099\114\105\112\116"then local A,O=pcall(function()_G.D_E_X_DONOTUSETHISPLEASE=nil;(loadstring("\095\071\046\068\095\069\095\088\095\068\079\078\079\084\085\083\069\084\072\073\083\080\076\069\065\083\069 \061 "..U))()return _G.D_E_X_DONOTUSETHISPLEASE end)if O then return nil end else return nil end end local function u(U,A)if A=="\086\101\099\116\111\114\050"then local A=H(U,"\044")if#A<2 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 return Vector2.new(O,p)elseif A=="\086\101\099\116\111\114\051"then local A=H(U,"\044")if#A<3 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 local C=tonumber(A[3])or 0 return Vector3.new(O,p,C)elseif A=="\067\111\108\111\114\051"then local A=H(U,"\044")if#A<3 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 local C=tonumber(A[3])or 0 return Color3.new(O/255,p/255,C/255)elseif A=="\085\068\105\109\050"then local A=H(string.gsub(string.gsub(U,"\123",""),"\125",""),"\044")if#A<4 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 local C=tonumber(A[3])or 0 local I=tonumber(A[4])or 0 return UDim2.new(O,p,C,I)elseif A=="\067\111\110\116\101\110\116"then return U elseif A=="\102\108\111\097\116"or A=="\105\110\116"or A=="\100\111\117\098\108\101"then return tonumber(U)elseif A=="\115\116\114\105\110\103"then return U elseif A=="\078\117\109\098\101\114\082\097\110\103\101"then local A=H(U,"\044")if#A==1 then if tonumber(A[1])==nil then return nil end local U=tonumber(A[1])or 0 return NumberRange.new(U)end if#A<2 then return nil end local O=tonumber(A[1])or 0 local p=tonumber(A[2])or 0 return NumberRange.new(O,p)elseif string.sub(U,1,4)=="\069\110\117\109"then local A=U while true do local U,O=string.find(A,"\046")if O then A=string.sub(A,O+1)else break end end print(A)return A else return nil end end function PromptRemoteCaller(U)if CurrentRemoteWindow then CurrentRemoteWindow:Destroy()CurrentRemoteWindow=nil end CurrentRemoteWindow=RemoteWindow:Clone()CurrentRemoteWindow.Parent=explorerPanel.Parent CurrentRemoteWindow.Visible=true local A=false local O=CurrentRemoteWindow.MainWindow.Arguments local p=CurrentRemoteWindow.MainWindow.ArgumentTemplate if U:IsA("\082\101\109\111\116\101\069\118\101\110\116")then CurrentRemoteWindow.Title.Text="\070\105\114\101 \069\118\101\110\116"CurrentRemoteWindow.MainWindow.Ok.Text="\070\105\114\101"CurrentRemoteWindow.MainWindow.DisplayReturned.Visible=false CurrentRemoteWindow.MainWindow.Desc2.Visible=false end local C=p:Clone()C.Parent=O C.Visible=true C.Type.MouseButton1Down:connect(function()createDDown(C.Type,function(U)C.Type.Text=U end,"\083\099\114\105\112\116","\078\117\109\098\101\114","\083\116\114\105\110\103","\067\111\108\111\114\051","\086\101\099\116\111\114\051","\086\101\099\116\111\114\050","\085\068\105\109\050","\078\117\109\098\101\114\082\097\110\103\101")end)CurrentRemoteWindow.MainWindow.Ok.MouseButton1Up:connect(function()if CurrentRemoteWindow and U.Parent~=nil then local p={}for U,A in pairs(O:GetChildren())do table.insert(p,X(A.Value.Text,A.Type.Text))end if U:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")then if A then spawn(function()local A=U:InvokeServer(unpack(p))if A then CreateTableCaution("\082\101\109\111\116\101 \067\097\108\108\101\114",A)else CreateCaution("\082\101\109\111\116\101 \067\097\108\108\101\114","\084\104\105\115 \114\101\109\111\116\101 \100\105\100 \110\111\116 \114\101\116\117\114\110 \097\110\121\116\104\105\110\103\046")end end)else spawn(function()U:InvokeServer(unpack(p))end)end else U:FireServer(unpack(p))end CurrentRemoteWindow:Destroy()CurrentRemoteWindow=nil end end)CurrentRemoteWindow.MainWindow.Add.MouseButton1Up:connect(function()if CurrentRemoteWindow then local U=p:Clone()U.Position=UDim2.new(0,0,0,#O:GetChildren()*20)U.Parent=O O.CanvasSize=UDim2.new(0,0,0,#O:GetChildren()*20)U.Visible=true U.Type.MouseButton1Down:connect(function()createDDown(U.Type,function(A)U.Type.Text=A end,"\083\099\114\105\112\116","\078\117\109\098\101\114","\083\116\114\105\110\103","\067\111\108\111\114\051","\086\101\099\116\111\114\051","\086\101\099\116\111\114\050","\085\068\105\109\050","\078\117\109\098\101\114\082\097\110\103\101")end)end end)CurrentRemoteWindow.MainWindow.Subtract.MouseButton1Up:connect(function()if CurrentRemoteWindow then if#O:GetChildren()>1 then(O:GetChildren())[#O:GetChildren()]:Destroy()O.CanvasSize=UDim2.new(0,0,0,#O:GetChildren()*20)end end end)CurrentRemoteWindow.MainWindow.Cancel.MouseButton1Up:connect(function()if CurrentRemoteWindow then CurrentRemoteWindow:Destroy()CurrentRemoteWindow=nil end end)CurrentRemoteWindow.MainWindow.DisplayReturned.MouseButton1Up:connect(function()if A then A=false CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible=false else A=true CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible=true end end)end function PromptSaveInstance(U)if not SaveInstance and not _G.SaveInstance then CreateCaution("\083\097\118\101\073\110\115\116\097\110\099\101 \077\105\115\115\105\110\103","\089\111\117 \100\111 \110\111\116 \104\097\118\101 \116\104\101 \083\097\118\101\073\110\115\116\097\110\099\101 \102\117\110\099\116\105\111\110 \105\110\115\116\097\108\108\101\100\046 \080\108\101\097\115\101 \103\111 \116\111 \082\097\115\112\098\101\114\114\121\080\105\'\115 \116\104\114\101\097\100 \116\111 \114\101\116\114\105\101\118\101 \105\116\046")return end if CurrentSaveInstanceWindow then CurrentSaveInstanceWindow:Destroy()CurrentSaveInstanceWindow=nil if explorerPanel.Parent:FindFirstChild("\083\097\118\101\073\110\115\116\097\110\099\101\079\118\101\114\119\114\105\116\101\067\097\117\116\105\111\110")then explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()end end CurrentSaveInstanceWindow=SaveInstanceWindow:Clone()CurrentSaveInstanceWindow.Parent=explorerPanel.Parent CurrentSaveInstanceWindow.Visible=true local A=CurrentSaveInstanceWindow.MainWindow.FileName local O=true local p=false CurrentSaveInstanceWindow.MainWindow.Save.MouseButton1Up:connect(function()if readfile and getelysianpath then if readfile(getelysianpath()..(A.Text.."\046\114\098\120\109\120"))then if not p then p=true local C=ConfirmationWindow:Clone()C.Name="\083\097\118\101\073\110\115\116\097\110\099\101\079\118\101\114\119\114\105\116\101\067\097\117\116\105\111\110"C.MainWindow.Desc.Text="\084\104\101 \102\105\108\101\044 "..(A.Text.."\046\114\098\120\109\120\044 \097\108\114\101\097\100\121 \101\120\105\115\116\115\046 \079\118\101\114\119\114\105\116\101\063")C.Parent=explorerPanel.Parent C.Visible=true C.MainWindow.Yes.MouseButton1Up:connect(function()pcall(function()SaveInstance(U,A.Text.."\046\114\098\120\109\120",not O)end)p=false C:Destroy()if CurrentSaveInstanceWindow then CurrentSaveInstanceWindow:Destroy()CurrentSaveInstanceWindow=nil end end)C.MainWindow.No.MouseButton1Up:connect(function()p=false C:Destroy()end)end else pcall(function()SaveInstance(U,A.Text.."\046\114\098\120\109\120",not O)end)if CurrentSaveInstanceWindow then CurrentSaveInstanceWindow:Destroy()CurrentSaveInstanceWindow=nil if explorerPanel.Parent:FindFirstChild("\083\097\118\101\073\110\115\116\097\110\099\101\079\118\101\114\119\114\105\116\101\067\097\117\116\105\111\110")then explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()end end end else pcall(function()if SaveInstance then SaveInstance(U,A.Text.."\046\114\098\120\109\120",not O)else _G.SaveInstance(U,A.Text,not O)end end)if CurrentSaveInstanceWindow then CurrentSaveInstanceWindow:Destroy()CurrentSaveInstanceWindow=nil if explorerPanel.Parent:FindFirstChild("\083\097\118\101\073\110\115\116\097\110\099\101\079\118\101\114\119\114\105\116\101\067\097\117\116\105\111\110")then explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()end end end end)CurrentSaveInstanceWindow.MainWindow.Cancel.MouseButton1Up:connect(function()if CurrentSaveInstanceWindow then CurrentSaveInstanceWindow:Destroy()CurrentSaveInstanceWindow=nil if explorerPanel.Parent:FindFirstChild("\083\097\118\101\073\110\115\116\097\110\099\101\079\118\101\114\119\114\105\116\101\067\097\117\116\105\111\110")then explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()end end end)CurrentSaveInstanceWindow.MainWindow.SaveObjects.MouseButton1Up:connect(function()if O then O=false CurrentSaveInstanceWindow.MainWindow.SaveObjects.enabled.Visible=false else O=true CurrentSaveInstanceWindow.MainWindow.SaveObjects.enabled.Visible=true end end)end function DestroyRightClick()if currentRightClickMenu then currentRightClickMenu:Destroy()currentRightClickMenu=nil end if CurrentInsertObjectWindow and CurrentInsertObjectWindow.Visible then CurrentInsertObjectWindow.Visible=false end end function rightClickMenu(U)local A=game.Players.LocalPlayer:GetMouse()currentRightClickMenu=CreateRightClickMenu({"\067\117\116";"\067\111\112\121";"\080\097\115\116\101 \073\110\116\111";"\068\117\112\108\105\099\097\116\101","\068\101\108\101\116\101","\071\114\111\117\112","\085\110\103\114\111\117\112","\083\101\108\101\099\116 \067\104\105\108\100\114\101\110","\084\101\108\101\112\111\114\116 \084\111";"\073\110\115\101\114\116 \080\097\114\116","\073\110\115\101\114\116 \079\098\106\101\099\116";"\086\105\101\119 \083\099\114\105\112\116";"\083\097\118\101 \073\110\115\116\097\110\099\101","\067\097\108\108 \070\117\110\099\116\105\111\110";"\067\097\108\108 \082\101\109\111\116\101"},"",false,function(U)if U=="\067\117\116"then if not Option.Modifiable then return end clipboard={}local U=Q.List local A={}for O=1,#U,1 do local p=U[O]:Clone()if p then table.insert(clipboard,p)table.insert(A,U[O])end end for U=1,#A,1 do pcall(delete,A[U])end updateActions()elseif U=="\067\111\112\121"then if not Option.Modifiable then return end clipboard={}local U=Q.List for A=1,#U,1 do table.insert(clipboard,U[A]:Clone())end updateActions()elseif U=="\080\097\115\116\101 \073\110\116\111"then if not Option.Modifiable then return end local U=Q.List[1]or workspace for A=1,#clipboard,1 do(clipboard[A]:Clone()).Parent=U end elseif U=="\068\117\112\108\105\099\097\116\101"then if not Option.Modifiable then return end local U=Q:Get()for A=1,#U,1 do(U[A]:Clone()).Parent=Q.List[1].Parent or workspace end elseif U=="\068\101\108\101\116\101"then if not Option.Modifiable then return end local U=Q:Get()for A=1,#U,1 do pcall(delete,U[A])end Q:Set({})elseif U=="\071\114\111\117\112"then if not Option.Modifiable then return end local U=Instance.new("\077\111\100\101\108")local A=Q:Get()U.Parent=Q.List[1].Parent or workspace for O=1,#A,1 do A[O].Parent=U end Q:Set({})elseif U=="\085\110\103\114\111\117\112"then if not Option.Modifiable then return end local U={}local A=Q:Get()for O=1,#A,1 do if A[O]:IsA("\077\111\100\101\108")then for p,C in pairs(A[O]:GetChildren())do C.Parent=A[O].Parent or workspace table.insert(U,C)end pcall(delete,A[O])end end Q:Set({})if SettingsRemote:Invoke("\083\101\108\101\099\116\085\110\103\114\111\117\112\101\100")then for U,A in pairs(U)do Q:Add(A)end end elseif U=="\083\101\108\101\099\116 \067\104\105\108\100\114\101\110"then if not Option.Modifiable then return end local U=Q:Get()Q:Set({})Q:StopUpdates()for A=1,#U,1 do for U,A in pairs(U[A]:GetChildren())do Q:Add(A)end end Q:ResumeUpdates()elseif U=="\084\101\108\101\112\111\114\116 \084\111"then if not Option.Modifiable then return end local U=Q:Get()for A=1,#U,1 do if U[A]:IsA("\066\097\115\101\080\097\114\116")then pcall(function()game.Players.LocalPlayer.Character.HumanoidRootPart.CFrame=U[A].CFrame end)break end end elseif U=="\073\110\115\101\114\116 \080\097\114\116"then if not Option.Modifiable then return end local U={}local A=Q:Get()for O=1,#A,1 do pcall(function()local p=Instance.new("\080\097\114\116")p.Parent=A[O]p.CFrame=CFrame.new(game.Players.LocalPlayer.Character.Head.Position)+Vector3.new(0,3,0)table.insert(U,p)end)end elseif U=="\083\097\118\101 \073\110\115\116\097\110\099\101"then if not Option.Modifiable then return end local U=Q:Get()if#U==1 then U[1].Archivable=true pcallpcall(function()PromptSaveInstance(U[1]:Clone())end)elseif#U>1 then local A=Instance.new("\077\111\100\101\108")A.Name="\083\097\118\101\100\073\110\115\116\097\110\099\101\115"for O=1,#U,1 do pcall(function()U[O].Archivable=true;(U[O]:Clone()).Parent=A end)end PromptSaveInstance(A)end elseif U=="\067\097\108\108 \082\101\109\111\116\101"then if not Option.Modifiable then return end local U=Q:Get()for A=1,#U,1 do if U[A]:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")or U[A]:IsA("\082\101\109\111\116\101\069\118\101\110\116")then PromptRemoteCaller(U[A])break end end elseif U=="\086\105\101\119 \083\099\114\105\112\116"then if not Option.Modifiable then return end local U=Q:Get()for A=1,#U,1 do if U[A]:IsA("\076\111\099\097\108\083\099\114\105\112\116")or U[A]:IsA("\077\111\100\117\108\101\083\099\114\105\112\116")then ScriptEditorEvent:Fire(U[A])end end end end)currentRightClickMenu.Parent=explorerPanel.Parent currentRightClickMenu.Position=UDim2.new(0,A.X,0,A.Y)if currentRightClickMenu.AbsolutePosition.X+currentRightClickMenu.AbsoluteSize.X>explorerPanel.AbsolutePosition.X+explorerPanel.AbsoluteSize.X then currentRightClickMenu.Position=UDim2.new(0,(explorerPanel.AbsolutePosition.X+explorerPanel.AbsoluteSize.X)-currentRightClickMenu.AbsoluteSize.X,0,A.Y)end end local function N() end local function v() end do local U={}local O={}local p=Create("\073\109\097\103\101\066\117\116\116\111\110",{Name="\077\111\117\115\101\068\114\097\103",Position=UDim2.new(-0.25,0,-0.25,0),Size=UDim2.new(1.5,0,1.5,0);Transparency=1,AutoButtonColor=false;Active=true,ZIndex=10})local function I(U,A,O)local C local I conDrag=p.MouseMoved:connect(function(O,p)local C=Vector2.new(O,p)-listFrame.AbsolutePosition local I=listFrame.AbsoluteSize if C.x<0 or C.x>I.x or C.y<0 or C.y>I.y then return end local c=math.ceil(C.y/ENTRY_BOUND)+scrollBar.ScrollIndex for U=c<U and c or U,c>U and c or U,1 do local O=TreeList[U]if O then if A then Q:Add(O.Object)else Q:Remove(O.Object)end end end U=c end)function v()p.Parent=nil conDrag:disconnect()I:disconnect()function v() end end I=p[O]:connect(v)p.Parent=GetScreen(listFrame)end local function H(A,O,C,I)local c local H local X local u=nil local v=false local z=Create("\070\114\097\109\101",{Transparency=1;Visible=false,Create("\070\114\097\109\101",{BorderSizePixel=0;BackgroundColor3=Color3.new(0,0,0),BackgroundTransparency=.1,Position=UDim2.new(0,0,0,0);Size=UDim2.new(1,0,0,1)});Create("\070\114\097\109\101",{BorderSizePixel=0;BackgroundColor3=Color3.new(0,0,0);BackgroundTransparency=.1,Position=UDim2.new(1,0,0,0),Size=UDim2.new(0,1,1,0)}),Create("\070\114\097\109\101",{BorderSizePixel=0,BackgroundColor3=Color3.new(0,0,0),BackgroundTransparency=.1,Position=UDim2.new(0,0,1,0);Size=UDim2.new(1,0,0,1)}),Create("\070\114\097\109\101",{BorderSizePixel=0,BackgroundColor3=Color3.new(0,0,0);BackgroundTransparency=.1;Position=UDim2.new(0,0,0,0),Size=UDim2.new(0,1,1,0)})})SetZIndex(z,9)conDrag=p.MouseMoved:connect(function(p,c)local Q=Vector2.new(p,c)if v then local p=Q-listFrame.AbsolutePosition local C=listFrame.AbsoluteSize u=nil z.Visible=false if p.x>=0 and(p.x<=C.x and(p.y>=0 and p.y<=C.y+ENTRY_SIZE*2))then local O=math.ceil(p.y/ENTRY_BOUND-2)local I=TreeList[O+scrollBar.ScrollIndex]if I and(I.Object~=A and not A:IsAncestorOf(I.Object))then u=O local A=U[O]if A then z.Visible=true z.Position=UDim2.new(0,1,0,A.AbsolutePosition.y-listFrame.AbsolutePosition.y)z.Size=UDim2.new(0,C.x-4,0,A.AbsoluteSize.y)end end end O.Position=UDim2.new(0,Q.x+I.x,0,Q.y+I.y)elseif(C-Q).magnitude>8 then v=true SetZIndex(O,9)O.IndentFrame.Transparency=.25 O.IndentFrame.EntryText.TextColor3=GuiColor.TextSelected O.Position=UDim2.new(0,Q.x+I.x,0,Q.y+I.y)O.Parent=GetScreen(listFrame)z.Parent=listFrame end end)function N()p.Parent=nil conDrag:disconnect()H:disconnect()X:disconnect()O:Destroy()z:Destroy()function N() end end local s=Q.Selected[A]if not s and Option.Selectable then Q:Set({A})end H=p.MouseButton1Up:connect(function()N()if v then if u then local U=TreeList[u+scrollBar.ScrollIndex]if U then U.Expanded=true local O=U.Object local function p(U,A)U.Parent=A end if Option.Selectable then local U=Q.List for A=1,#U,1 do pcall(p,U[A],O)end else pcall(p,A,O)end end end else if s and Option.Selectable then Q:Set({})end end end)X=p.MouseButton2Down:connect(function()N()end)p.Parent=GetScreen(listFrame)end local X=Create("\073\109\097\103\101\066\117\116\116\111\110",{Name="\069\110\116\114\121";Transparency=1;AutoButtonColor=false,Position=UDim2.new(0,0,0,0);Size=UDim2.new(1,0,0,ENTRY_SIZE);Create("\070\114\097\109\101",{Name="\073\110\100\101\110\116\070\114\097\109\101",BackgroundTransparency=1;BackgroundColor3=GuiColor.Selected,BorderColor3=GuiColor.BorderSelected;Position=UDim2.new(0,0,0,0);Size=UDim2.new(1,0,1,0),Create(Icon("\073\109\097\103\101\066\117\116\116\111\110",0),{Name="\069\120\112\097\110\100",AutoButtonColor=false,Position=UDim2.new(0,-GUI_SIZE,.5,-GUI_SIZE/2);Size=UDim2.new(0,GUI_SIZE,0,GUI_SIZE)});Create(Icon(nil,0),{Name="\069\120\112\108\111\114\101\114\073\099\111\110",Position=UDim2.new(0,2+ENTRY_PADDING,.5,-GUI_SIZE/2);Size=UDim2.new(0,GUI_SIZE,0,GUI_SIZE)});Create("\084\101\120\116\076\097\098\101\108",{Name="\069\110\116\114\121\084\101\120\116";BackgroundTransparency=1;TextColor3=GuiColor.Text,TextXAlignment="\076\101\102\116";TextYAlignment="\067\101\110\116\101\114",Font=FONT;FontSize=FONT_SIZE,Text="",Position=UDim2.new(0,(2+ENTRY_SIZE)+4,0,0),Size=UDim2.new(1,-2,1,0)})})})function scrollBar.UpdateCallback(p)for c=1,p.VisibleSpace,1 do local u=TreeList[c+p.ScrollIndex]if u then local N=U[c]if not N then N=Create(X:Clone(),{Position=UDim2.new(0,2,0,ENTRY_BOUND*(c-1)+2);Size=UDim2.new(0,A,0,ENTRY_SIZE),ZIndex=listFrame.ZIndex})U[c]=N local O=N.IndentFrame.Expand O.MouseEnter:connect(function()local U=TreeList[c+p.ScrollIndex]if#U>0 then if U.Expanded then Icon(O,NODE_EXPANDED_OVER)else Icon(O,NODE_COLLAPSED_OVER)end end end)O.MouseLeave:connect(function()local U=TreeList[c+p.ScrollIndex]if#U>0 then if U.Expanded then Icon(O,NODE_EXPANDED)else Icon(O,NODE_COLLAPSED)end end end)O.MouseButton1Down:connect(function()local U=TreeList[c+p.ScrollIndex]if#U>0 then U.Expanded=not U.Expanded if U.Object==explorerPanel.Parent and U.Expanded then CreateCaution("\087\097\114\110\105\110\103","\080\108\101\097\115\101 \098\101 \099\097\114\101\102\117\108 \119\104\101\110 \101\100\105\116\105\110\103 \105\110\115\116\097\110\099\101\115 \105\110\115\105\100\101 \104\101\114\101\044 \116\104\105\115 \105\115 \108\105\107\101 \116\104\101 \083\121\115\116\101\109\051\050 \111\102 \068\101\120 \097\110\100 \109\111\100\105\102\121\105\110\103 \111\098\106\101\099\116\115 \104\101\114\101 \099\097\110 \098\114\101\097\107 \068\101\120\046")end C()end end)N.MouseButton1Down:connect(function(U,A)local O=TreeList[c+p.ScrollIndex]DestroyRightClick()if GetAwaitRemote:Invoke()then bindSetAwaiting:Fire(O.Object)return end if not HoldingShift then lastSelectedNode=c+p.ScrollIndex end if HoldingShift and not filteringWorkspace()then if lastSelectedNode then if(c+p.ScrollIndex)-lastSelectedNode>0 then Q:StopUpdates()for U=1,(c+p.ScrollIndex)-lastSelectedNode,1 do local A=TreeList[lastSelectedNode+U]if A then Q:Add(A.Object)end end Q:ResumeUpdates()else Q:StopUpdates()for U=(c+p.ScrollIndex)-lastSelectedNode,1,1 do local A=TreeList[lastSelectedNode+U]if A then Q:Add(A.Object)end end Q:ResumeUpdates()end end return end if HoldingCtrl then if Q.Selected[O.Object]then Q:Remove(O.Object)else Q:Add(O.Object)end return end if Option.Modifiable then local p=Vector2.new(U,A)H(O.Object,N:Clone(),p,N.AbsolutePosition-p)elseif Option.Selectable then if Q.Selected[O.Object]then Q:Set({})else Q:Set({O.Object})end I(c+p.ScrollIndex,true,"\077\111\117\115\101\066\117\116\116\111\110\049\085\112")end end)N.MouseButton2Down:connect(function()if not Option.Selectable then return end DestroyRightClick()curSelect=N local U=TreeList[c+p.ScrollIndex]if GetAwaitRemote:Invoke()then bindSetAwaiting:Fire(U.Object)return end if not Q.Selected[U.Object]then Q:Set({U.Object})end end)N.MouseButton2Up:connect(function()if not Option.Selectable then return end local U=TreeList[c+p.ScrollIndex]if checkMouseInGui(curSelect)then rightClickMenu(U.Object)end end)N.Parent=listFrame end N.Visible=true local v=u.Object if#u==0 then N.IndentFrame.Expand.Visible=false elseif u.Expanded then Icon(N.IndentFrame.Expand,NODE_EXPANDED)N.IndentFrame.Expand.Visible=true else Icon(N.IndentFrame.Expand,NODE_COLLAPSED)N.IndentFrame.Expand.Visible=true end Icon(N.IndentFrame.ExplorerIcon,ExplorerIndex[v.ClassName]or 0)local z=u.Depth*((2+ENTRY_PADDING)+GUI_SIZE)N.IndentFrame.Position=UDim2.new(0,z,0,0)N.IndentFrame.Size=UDim2.new(1,-z,1,0)if O[N]then O[N]:disconnect()end local s=N.IndentFrame.EntryText s.Text=v.Name O[N]=u.Object.Changed:connect(function(U)if U=="\078\097\109\101"then s.Text=v.Name end end)N.IndentFrame.Transparency=u.Selected and 0 or 1 s.TextColor3=GuiColor[u.Selected and"\084\101\120\116\083\101\108\101\099\116\101\100"or"\084\101\120\116"]N.Size=UDim2.new(0,A,0,ENTRY_SIZE)elseif U[c]then U[c].Visible=false end end for A=p.VisibleSpace+1,p.TotalSpace,1 do local O=U[A]if O then U[A]=nil O:Destroy()end end end function scrollBarH.UpdateCallback(A)for A=1,scrollBar.VisibleSpace,1 do local O=TreeList[A+scrollBar.ScrollIndex]if O then local O=U[A]if O then O.Position=UDim2.new(0,2-scrollBarH.ScrollIndex,0,ENTRY_BOUND*(A-1)+2)end end end end Connect(listFrame.Changed,function(U)if U=="\065\098\115\111\108\117\116\101\083\105\122\101"then c()end end)local u=6 explorerPanel.MouseWheelForward:connect(function()if scrollBar.VisibleSpace-1>u then scrollBar:ScrollTo(scrollBar.ScrollIndex-u)else scrollBar:ScrollTo(scrollBar.ScrollIndex-scrollBar.VisibleSpace)end end)explorerPanel.MouseWheelBackward:connect(function()if scrollBar.VisibleSpace-1>u then scrollBar:ScrollTo(scrollBar.ScrollIndex+u)else scrollBar:ScrollTo(scrollBar.ScrollIndex+scrollBar.VisibleSpace)end end)end

local NodeLookup = {}

local nodeWidth = 0

local QuickButtons = {}

function filteringWorkspace()
	if explorerFilter.Text ~= "" and explorerFilter.Text ~= "Filter Workspace" then
		return true
	end
	return false
end

function lookForAName(obj,name)
	for i,v in pairs(obj:GetChildren()) do
		if string.find(string.lower(v.Name),string.lower(name)) then nameScanned = true end
		lookForAName(v,name)
	end
end

function scanName(obj)
	nameScanned = false
	if string.find(string.lower(obj.Name),string.lower(explorerFilter.Text)) then
		nameScanned = true
	else
		lookForAName(obj,explorerFilter.Text)
	end
	return nameScanned
end

function updateActions()
	for i,v in pairs(QuickButtons) do
		if v.Cond() then
			v.Toggle(true)
		else
			v.Toggle(false)
		end
	end
end

local updateList,rawUpdateList,updateScroll,rawUpdateSize do
	local function r(t)
		for i = 1,#t do
			if not filteringWorkspace() or scanName(t[i].Object) then
				TreeList[#TreeList+1] = t[i]

				local w = (t[i].Depth)*(2+ENTRY_PADDING+GUI_SIZE) + 2 + ENTRY_SIZE + 4 + getTextWidth(t[i].Object.Name) + 4
				if w > nodeWidth then
					nodeWidth = w
				end
				if t[i].Expanded or filteringWorkspace() then
					r(t[i])
				end
			end
		end
	end

	function rawUpdateSize()
		scrollBarH.TotalSpace = nodeWidth
		scrollBarH.VisibleSpace = listFrame.AbsoluteSize.x
		scrollBarH:Update()
		local visible = scrollBarH:CanScrollDown() or scrollBarH:CanScrollUp()
		scrollBarH.GUI.Visible = visible

		listFrame.Size = UDim2.new(1,-GUI_SIZE,1,-GUI_SIZE*(visible and 1 or 0) - HEADER_SIZE)

		scrollBar.VisibleSpace = math.ceil(listFrame.AbsoluteSize.y/ENTRY_BOUND)
		scrollBar.GUI.Size = UDim2.new(0,GUI_SIZE,1,-GUI_SIZE*(visible and 1 or 0) - HEADER_SIZE)
		
		scrollBar.TotalSpace = #TreeList+1
		scrollBar:Update()
	end

	function rawUpdateList()
		-- Clear then repopulate the entire list. It appears to be fast enough.
		TreeList = {}
		nodeWidth = 0
		r(NodeLookup[workspace.Parent])
		if DexStorageEnabled then
			r(NodeLookup[DexStorage])
		end
		if NilStorageEnabled then
			r(NodeLookup[NilStorage])
		end
		rawUpdateSize()
		updateActions()
	end

	-- Adding or removing large models will cause many updates to occur. We
	-- can reduce the number of updates by creating a delay, then dropping any
	-- updates that occur during the delay.
	local updatingList = false
	function updateList()
		if updatingList then return end
		updatingList = true
		wait(0.25)
		updatingList = false
		rawUpdateList()
	end

	local updatingScroll = false
	function updateScroll()
		if updatingScroll then return end
		updatingScroll = true
		wait(0.25)
		updatingScroll = false
		scrollBar:Update()
	end
end

local Selection do
	local bindGetSelection = explorerPanel:FindFirstChild("GetSelection")
	if not bindGetSelection then
		bindGetSelection = Create('BindableFunction',{Name = "GetSelection"})
		bindGetSelection.Parent = explorerPanel
	end

	local bindSetSelection = explorerPanel:FindFirstChild("SetSelection")
	if not bindSetSelection then
		bindSetSelection = Create('BindableFunction',{Name = "SetSelection"})
		bindSetSelection.Parent = explorerPanel
	end

	local bindSelectionChanged = explorerPanel:FindFirstChild("SelectionChanged")
	if not bindSelectionChanged then
		bindSelectionChanged = Create('BindableEvent',{Name = "SelectionChanged"})
		bindSelectionChanged.Parent = explorerPanel
	end

	local SelectionList = {}
	local SelectionSet = {}
	local Updates = true
	Selection = {
		Selected = SelectionSet;
		List = SelectionList;
	}

	local function addObject(object)
		-- list update
		local lupdate = false
		-- scroll update
		local supdate = false

		if not SelectionSet[object] then
			local node = NodeLookup[object]
			if node then
				table.insert(SelectionList,object)
				SelectionSet[object] = true
				node.Selected = true

				-- expand all ancestors so that selected node becomes visible
				node = node.Parent
				while node do
					if not node.Expanded then
						node.Expanded = true
						lupdate = true
					end
					node = node.Parent
				end
				supdate = true
			end
		end
		return lupdate,supdate
	end

	function Selection:Set(objects)
		local lupdate = false
		local supdate = false

		if #SelectionList > 0 then
			for i = 1,#SelectionList do
				local object = SelectionList[i]
				local node = NodeLookup[object]
				if node then
					node.Selected = false
					SelectionSet[object] = nil
				end
			end

			SelectionList = {}
			Selection.List = SelectionList
			supdate = true
		end

		for i = 1,#objects do
			local l,s = addObject(objects[i])
			lupdate = l or lupdate
			supdate = s or supdate
		end

		if lupdate then
			rawUpdateList()
			supdate = true
		elseif supdate then
			scrollBar:Update()
		end

		if supdate then
			bindSelectionChanged:Fire()
			updateActions()
		end
	end

	function Selection:Add(object)
		local l,s = addObject(object)
		if l then
			rawUpdateList()
			if Updates then
				bindSelectionChanged:Fire()
				updateActions()
			end
		elseif s then
			scrollBar:Update()
			if Updates then
				bindSelectionChanged:Fire()
				updateActions()
			end
		end
	end
	
	function Selection:StopUpdates()
		Updates = false
	end
	
	function Selection:ResumeUpdates()
		Updates = true
		bindSelectionChanged:Fire()
		updateActions()
	end

	function Selection:Remove(object,noupdate)
		if SelectionSet[object] then
			local node = NodeLookup[object]
			if node then
				node.Selected = false
				SelectionSet[object] = nil
				for i = 1,#SelectionList do
					if SelectionList[i] == object then
						table.remove(SelectionList,i)
						break
					end
				end

				if not noupdate then
					scrollBar:Update()
				end
				bindSelectionChanged:Fire()
				updateActions()
			end
		end
	end

	function Selection:Get()
		local list = {}
		for i = 1,#SelectionList do
			list[i] = SelectionList[i]
		end
		return list
	end

	bindSetSelection.OnInvoke = function(...)
		Selection:Set(...)
	end

	bindGetSelection.OnInvoke = function()
		return Selection:Get()
	end
end

function CreateCaution(title,msg)
	local newCaution = CautionWindow:Clone()
	newCaution.Title.Text = title
	newCaution.MainWindow.Desc.Text = msg
	newCaution.Parent = explorerPanel.Parent
	newCaution.Visible = true
	newCaution.MainWindow.Ok.MouseButton1Up:connect(function()
		newCaution:Destroy()
	end)
end

function CreateTableCaution(title,msg)
	if type(msg) ~= "table" then return CreateCaution(title,tostring(msg)) end
	local newCaution = TableCautionWindow:Clone()
	newCaution.Title.Text = title
	
	local TableList = newCaution.MainWindow.TableResults
	local TableTemplate = newCaution.MainWindow.TableTemplate
	
	for i,v in pairs(msg) do
		local newResult = TableTemplate:Clone()
		newResult.Type.Text = type(v)
		newResult.Value.Text = tostring(v)
		newResult.Position = UDim2.new(0,0,0,#TableList:GetChildren() * 20)
		newResult.Parent = TableList
		TableList.CanvasSize = UDim2.new(0,0,0,#TableList:GetChildren() * 20)
		newResult.Visible = true
	end
	newCaution.Parent = explorerPanel.Parent
	newCaution.Visible = true
	newCaution.MainWindow.Ok.MouseButton1Up:connect(function()
		newCaution:Destroy()
	end)
end

local function Split(str, delimiter)
	local start = 1
	local t = {}
	while true do
		local pos = string.find (str, delimiter, start, true)
		if not pos then
			break
		end
		table.insert (t, string.sub (str, start, pos - 1))
		start = pos + string.len (delimiter)
	end
	table.insert (t, string.sub (str, start))
	return t
end

local function ToValue(value,type)
	if type == "Vector2" then
		local list = Split(value,",")
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return Vector2.new(x,y)
	elseif type == "Vector3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		local z = tonumber(list[3]) or 0
		return Vector3.new(x,y,z)
	elseif type == "Color3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local r = tonumber(list[1]) or 0
		local g = tonumber(list[2]) or 0
		local b = tonumber(list[3]) or 0
		return Color3.new(r/255,g/255, b/255)
	elseif type == "UDim2" then
		local list = Split(string.gsub(string.gsub(value, "{", ""),"}",""),",")
		if #list < 4 then return nil end
		local xScale = tonumber(list[1]) or 0
		local xOffset = tonumber(list[2]) or 0
		local yScale = tonumber(list[3]) or 0
		local yOffset = tonumber(list[4]) or 0
		return UDim2.new(xScale, xOffset, yScale, yOffset)
	elseif type == "Number" then
		return tonumber(value)
	elseif type == "String" then
		return value
	elseif type == "NumberRange" then
		local list = Split(value,",")
		if #list == 1 then
			if tonumber(list[1]) == nil then return nil end
			local newVal = tonumber(list[1]) or 0
			return NumberRange.new(newVal)
		end
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return NumberRange.new(x,y)
	elseif type == "Script" then
		local success,err = pcall(function()
		_G.D_E_X_DONOTUSETHISPLEASE = nil
		loadstring(
			"_G.D_E_X_DONOTUSETHISPLEASE = "..value
		)()
		return _G.D_E_X_DONOTUSETHISPLEASE
		end)
		if err then
			return nil
		end
	else
		return nil
	end
end

local function ToPropValue(value,type)
	if type == "Vector2" then
		local list = Split(value,",")
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return Vector2.new(x,y)
	elseif type == "Vector3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		local z = tonumber(list[3]) or 0
		return Vector3.new(x,y,z)
	elseif type == "Color3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local r = tonumber(list[1]) or 0
		local g = tonumber(list[2]) or 0
		local b = tonumber(list[3]) or 0
		return Color3.new(r/255,g/255, b/255)
	elseif type == "UDim2" then
		local list = Split(string.gsub(string.gsub(value, "{", ""),"}",""),",")
		if #list < 4 then return nil end
		local xScale = tonumber(list[1]) or 0
		local xOffset = tonumber(list[2]) or 0
		local yScale = tonumber(list[3]) or 0
		local yOffset = tonumber(list[4]) or 0
		return UDim2.new(xScale, xOffset, yScale, yOffset)
	elseif type == "Content" then
		return value
	elseif type == "float" or type == "int" or type == "double" then
		return tonumber(value)
	elseif type == "string" then
		return value
	elseif type == "NumberRange" then
		local list = Split(value,",")
		if #list == 1 then
			if tonumber(list[1]) == nil then return nil end
			local newVal = tonumber(list[1]) or 0
			return NumberRange.new(newVal)
		end
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return NumberRange.new(x,y)
	elseif string.sub(value,1,4) == "Enum" then
		local getEnum = value
		while true do
			local x,y = string.find(getEnum,".")
			if y then
				getEnum = string.sub(getEnum,y+1)
			else
				break
			end
		end
		print(getEnum)
		return getEnum
	else
		return nil
	end
end

function PromptRemoteCaller(inst)
	if CurrentRemoteWindow then
		CurrentRemoteWindow:Destroy()
		CurrentRemoteWindow = nil
	end
	CurrentRemoteWindow = RemoteWindow:Clone()
	CurrentRemoteWindow.Parent = explorerPanel.Parent
	CurrentRemoteWindow.Visible = true
	
	local displayValues = false
	
	local ArgumentList = CurrentRemoteWindow.MainWindow.Arguments
	local ArgumentTemplate = CurrentRemoteWindow.MainWindow.ArgumentTemplate
	
	if inst:IsA("RemoteEvent") then
		CurrentRemoteWindow.Title.Text = "Fire Event"
		CurrentRemoteWindow.MainWindow.Ok.Text = "Fire"
		CurrentRemoteWindow.MainWindow.DisplayReturned.Visible = false
		CurrentRemoteWindow.MainWindow.Desc2.Visible = false
	end
	
	local newArgument = ArgumentTemplate:Clone()
	newArgument.Parent = ArgumentList
	newArgument.Visible = true
	newArgument.Type.MouseButton1Down:connect(function()
		createDDown(newArgument.Type,function(choice)
			newArgument.Type.Text = choice
		end,"Script","Number","String","Color3","Vector3","Vector2","UDim2","NumberRange")
	end)
	
	CurrentRemoteWindow.MainWindow.Ok.MouseButton1Up:connect(function()
		if CurrentRemoteWindow and inst.Parent ~= nil then
			local MyArguments = {}
			for i,v in pairs(ArgumentList:GetChildren()) do
				table.insert(MyArguments,ToValue(v.Value.Text,v.Type.Text))
			end
			if inst:IsA("RemoteFunction") then
				if displayValues then
					spawn(function()
						local myResults = inst:InvokeServer(unpack(MyArguments))
						if myResults then
							CreateTableCaution("Remote Caller",myResults)
						else
							CreateCaution("Remote Caller","This remote did not return anything.")
						end
					end)
				else
					spawn(function()
						inst:InvokeServer(unpack(MyArguments))
					end)
				end
			else
				inst:FireServer(unpack(MyArguments))
			end
			CurrentRemoteWindow:Destroy()
			CurrentRemoteWindow = nil
		end
	end)
	
	CurrentRemoteWindow.MainWindow.Add.MouseButton1Up:connect(function()
		if CurrentRemoteWindow then
			local newArgument = ArgumentTemplate:Clone()
			newArgument.Position = UDim2.new(0,0,0,#ArgumentList:GetChildren() * 20)
			newArgument.Parent = ArgumentList
			ArgumentList.CanvasSize = UDim2.new(0,0,0,#ArgumentList:GetChildren() * 20)
			newArgument.Visible = true
			newArgument.Type.MouseButton1Down:connect(function()
				createDDown(newArgument.Type,function(choice)
					newArgument.Type.Text = choice
				end,"Script","Number","String","Color3","Vector3","Vector2","UDim2","NumberRange")
			end)
		end
	end)
	
	CurrentRemoteWindow.MainWindow.Subtract.MouseButton1Up:connect(function()
		if CurrentRemoteWindow then
			if #ArgumentList:GetChildren() > 1 then
				ArgumentList:GetChildren()[#ArgumentList:GetChildren()]:Destroy()
				ArgumentList.CanvasSize = UDim2.new(0,0,0,#ArgumentList:GetChildren() * 20)
			end
		end
	end)
	
	CurrentRemoteWindow.MainWindow.Cancel.MouseButton1Up:connect(function()
		if CurrentRemoteWindow then
			CurrentRemoteWindow:Destroy()
			CurrentRemoteWindow = nil
		end
	end)
	
	CurrentRemoteWindow.MainWindow.DisplayReturned.MouseButton1Up:connect(function()
		if displayValues then
			displayValues = false
			CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible = false
		else
			displayValues = true
			CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible = true
		end
	end)
end

function PromptSaveInstance(inst)
	if not SaveInstance and not _G.SaveInstance then CreateCaution("SaveInstance Missing","You do not have the SaveInstance function installed. Please go to RaspberryPi's thread to retrieve it.") return end
	if CurrentSaveInstanceWindow then
		CurrentSaveInstanceWindow:Destroy()
		CurrentSaveInstanceWindow = nil
		if explorerPanel.Parent:FindFirstChild("SaveInstanceOverwriteCaution") then
			explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()
		end
	end
	CurrentSaveInstanceWindow = SaveInstanceWindow:Clone()
	CurrentSaveInstanceWindow.Parent = explorerPanel.Parent
	CurrentSaveInstanceWindow.Visible = true
	
	local filename = CurrentSaveInstanceWindow.MainWindow.FileName
	local saveObjects = true
	local overwriteCaution = false
	
	CurrentSaveInstanceWindow.MainWindow.Save.MouseButton1Up:connect(function()
		if readfile and getelysianpath then
			if readfile(getelysianpath()..filename.Text..".rbxmx") then
				if not overwriteCaution then
					overwriteCaution = true
					local newCaution = ConfirmationWindow:Clone()
					newCaution.Name = "SaveInstanceOverwriteCaution"
					newCaution.MainWindow.Desc.Text = "The file, "..filename.Text..".rbxmx, already exists. Overwrite?"
					newCaution.Parent = explorerPanel.Parent
					newCaution.Visible = true
					newCaution.MainWindow.Yes.MouseButton1Up:connect(function()
						pcall(function()
							SaveInstance(inst,filename.Text..".rbxmx",not saveObjects)
						end)
						overwriteCaution = false
						newCaution:Destroy()
						if CurrentSaveInstanceWindow then
							CurrentSaveInstanceWindow:Destroy()
							CurrentSaveInstanceWindow = nil
						end
					end)
					newCaution.MainWindow.No.MouseButton1Up:connect(function()
						overwriteCaution = false
						newCaution:Destroy()
					end)
				end
			else
				pcall(function()
					SaveInstance(inst,filename.Text..".rbxmx",not saveObjects)
				end)
				if CurrentSaveInstanceWindow then
					CurrentSaveInstanceWindow:Destroy()
					CurrentSaveInstanceWindow = nil
					if explorerPanel.Parent:FindFirstChild("SaveInstanceOverwriteCaution") then
						explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()
					end
				end
			end
		else
			pcall(function()
				if SaveInstance then
					SaveInstance(inst,filename.Text..".rbxmx",not saveObjects)
				else
					_G.SaveInstance(inst,filename.Text,not saveObjects)
				end
			end)
			if CurrentSaveInstanceWindow then
				CurrentSaveInstanceWindow:Destroy()
				CurrentSaveInstanceWindow = nil
				if explorerPanel.Parent:FindFirstChild("SaveInstanceOverwriteCaution") then
					explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()
				end
			end
		end
	end)
	CurrentSaveInstanceWindow.MainWindow.Cancel.MouseButton1Up:connect(function()
		if CurrentSaveInstanceWindow then
			CurrentSaveInstanceWindow:Destroy()
			CurrentSaveInstanceWindow = nil
			if explorerPanel.Parent:FindFirstChild("SaveInstanceOverwriteCaution") then
				explorerPanel.Parent.SaveInstanceOverwriteCaution:Destroy()
			end
		end
	end)
	CurrentSaveInstanceWindow.MainWindow.SaveObjects.MouseButton1Up:connect(function()
		if saveObjects then
			saveObjects = false
			CurrentSaveInstanceWindow.MainWindow.SaveObjects.enabled.Visible = false
		else
			saveObjects = true
			CurrentSaveInstanceWindow.MainWindow.SaveObjects.enabled.Visible = true
		end
	end)
end

function DestroyRightClick()
	if currentRightClickMenu then
		currentRightClickMenu:Destroy()
		currentRightClickMenu = nil
	end
	if CurrentInsertObjectWindow and CurrentInsertObjectWindow.Visible then
		CurrentInsertObjectWindow.Visible = false
	end
end

function rightClickMenu(sObj)
	local mouse = game.Players.LocalPlayer:GetMouse()
	
	currentRightClickMenu = CreateRightClickMenu(
		{"Cut","Copy","Paste Into","Duplicate","Delete","Group","Ungroup","Select Children","Teleport To","Insert Part","Insert Object","View Script","Save Instance","Call Function","Call Remote"},
		"",
		false,
		function(option)
			if option == "Cut" then
				if not Option.Modifiable then return end
				clipboard = {}
				local list = Selection.List
				local cut = {}
				for i = 1,#list do
					local obj = list[i]:Clone()
					if obj then
						table.insert(clipboard,obj)
						table.insert(cut,list[i])
					end
				end
				for i = 1,#cut do
					pcall(delete,cut[i])
				end
				updateActions()
			elseif option == "Copy" then
				if not Option.Modifiable then return end
				clipboard = {}
				local list = Selection.List
				for i = 1,#list do
					table.insert(clipboard,list[i]:Clone())
				end
				updateActions()
			elseif option == "Paste Into" then
				if not Option.Modifiable then return end
				local parent = Selection.List[1] or workspace
				for i = 1,#clipboard do
					clipboard[i]:Clone().Parent = parent
				end
			elseif option == "Duplicate" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					list[i]:Clone().Parent = Selection.List[1].Parent or workspace
				end
			elseif option == "Delete" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					pcall(delete,list[i])
				end
				Selection:Set({})
			elseif option == "Group" then
				if not Option.Modifiable then return end
				local newModel = Instance.new("Model")
				local list = Selection:Get()
				newModel.Parent = Selection.List[1].Parent or workspace
				for i = 1,#list do
					list[i].Parent = newModel
				end
				Selection:Set({})
			elseif option == "Ungroup" then
				if not Option.Modifiable then return end
				local ungrouped = {}
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("Model") then
						for i2,v2 in pairs(list[i]:GetChildren()) do
							v2.Parent = list[i].Parent or workspace
							table.insert(ungrouped,v2)
						end		
						pcall(delete,list[i])			
					end
				end
				Selection:Set({})
				if SettingsRemote:Invoke("SelectUngrouped") then
					for i,v in pairs(ungrouped) do
						Selection:Add(v)
					end
				end
			elseif option == "Select Children" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				Selection:Set({})
				Selection:StopUpdates()
				for i = 1,#list do
					for i2,v2 in pairs(list[i]:GetChildren()) do
						Selection:Add(v2)
					end
				end
				Selection:ResumeUpdates()
			elseif option == "Teleport To" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("BasePart") then
						pcall(function()
							game.Players.LocalPlayer.Character.HumanoidRootPart.CFrame = list[i].CFrame
						end)
						break
					end
				end
			elseif option == "Insert Part" then
				if not Option.Modifiable then return end
				local insertedParts = {}
				local list = Selection:Get()
				for i = 1,#list do
					pcall(function()
						local newPart = Instance.new("Part")
						newPart.Parent = list[i]
						newPart.CFrame = CFrame.new(game.Players.LocalPlayer.Character.Head.Position) + Vector3.new(0,3,0)
						table.insert(insertedParts,newPart)
					end)
				end
			elseif option == "Save Instance" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				if #list == 1 then
					list[1].Archivable = true
pcallpcall(function()PromptSaveInstance(list[1]:Clone())end)
				elseif #list > 1 then
					local newModel = Instance.new("Model")
					newModel.Name = "SavedInstances"
					for i = 1,#list do
						pcall(function()
							list[i].Archivable = true
							list[i]:Clone().Parent = newModel
						end)
					end
					PromptSaveInstance(newModel)
				end
			elseif option == "Call Remote" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("RemoteFunction") or list[i]:IsA("RemoteEvent") then
						PromptRemoteCaller(list[i])
						break
					end
				end
			elseif option == "View Script" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("LocalScript") or list[i]:IsA("ModuleScript") then
						ScriptEditorEvent:Fire(list[i])
					end
				end
			end
	end)
	currentRightClickMenu.Parent = explorerPanel.Parent
	currentRightClickMenu.Position = UDim2.new(0,mouse.X,0,mouse.Y)
	if currentRightClickMenu.AbsolutePosition.X + currentRightClickMenu.AbsoluteSize.X > explorerPanel.AbsolutePosition.X + explorerPanel.AbsoluteSize.X then
		currentRightClickMenu.Position = UDim2.new(0, explorerPanel.AbsolutePosition.X + explorerPanel.AbsoluteSize.X - currentRightClickMenu.AbsoluteSize.X, 0, mouse.Y)
	end
end

local function cancelReparentDrag()end
local function cancelSelectDrag()end
do
	local listEntries = {}
	local nameConnLookup = {}

	local mouseDrag = Create('ImageButton',{
		Name = "MouseDrag";
		Position = UDim2.new(-0.25,0,-0.25,0);
		Size = UDim2.new(1.5,0,1.5,0);
		Transparency = 1;
		AutoButtonColor = false;
		Active = true;
		ZIndex = 10;
	})
	local function dragSelect(last,add,button)
		local connDrag
		local conUp

		conDrag = mouseDrag.MouseMoved:connect(function(x,y)
			local pos = Vector2.new(x,y) - listFrame.AbsolutePosition
			local size = listFrame.AbsoluteSize
			if pos.x < 0 or pos.x > size.x or pos.y < 0 or pos.y > size.y then return end

			local i = math.ceil(pos.y/ENTRY_BOUND) + scrollBar.ScrollIndex
			-- Mouse may have made a large step, so interpolate between the
			-- last index and the current.
			for n = i<last and i or last, i>last and i or last do
				local node = TreeList[n]
				if node then
					if add then
						Selection:Add(node.Object)
					else
						Selection:Remove(node.Object)
					end
				end
			end
			last = i
		end)

		function cancelSelectDrag()
			mouseDrag.Parent = nil
			conDrag:disconnect()
			conUp:disconnect()
			function cancelSelectDrag()end
		end

		conUp = mouseDrag[button]:connect(cancelSelectDrag)

		mouseDrag.Parent = GetScreen(listFrame)
	end

	local function dragReparent(object,dragGhost,clickPos,ghostOffset)
		local connDrag
		local conUp
		local conUp2

		local parentIndex = nil
		local dragged = false

		local parentHighlight = Create('Frame',{
			Transparency = 1;
			Visible = false;
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3.new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2.new(0,0,0,0);
				Size = UDim2.new(1,0,0,1);
			});
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3.new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2.new(1,0,0,0);
				Size = UDim2.new(0,1,1,0);
			});
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3.new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2.new(0,0,1,0);
				Size = UDim2.new(1,0,0,1);
			});
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3.new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2.new(0,0,0,0);
				Size = UDim2.new(0,1,1,0);
			});
		})
		SetZIndex(parentHighlight,9)

		conDrag = mouseDrag.MouseMoved:connect(function(x,y)
			local dragPos = Vector2.new(x,y)
			if dragged then
				local pos = dragPos - listFrame.AbsolutePosition
				local size = listFrame.AbsoluteSize

				parentIndex = nil
				parentHighlight.Visible = false
				if pos.x >= 0 and pos.x <= size.x and pos.y >= 0 and pos.y <= size.y + ENTRY_SIZE*2 then
					local i = math.ceil(pos.y/ENTRY_BOUND-2)
					local node = TreeList[i + scrollBar.ScrollIndex]
					if node and node.Object ~= object and not object:IsAncestorOf(node.Object) then
						parentIndex = i
						local entry = listEntries[i]
						if entry then
							parentHighlight.Visible = true
							parentHighlight.Position = UDim2.new(0,1,0,entry.AbsolutePosition.y-listFrame.AbsolutePosition.y)
							parentHighlight.Size = UDim2.new(0,size.x-4,0,entry.AbsoluteSize.y)
						end
					end
				end

				dragGhost.Position = UDim2.new(0,dragPos.x+ghostOffset.x,0,dragPos.y+ghostOffset.y)
			elseif (clickPos-dragPos).magnitude > 8 then
				dragged = true
				SetZIndex(dragGhost,9)
				dragGhost.IndentFrame.Transparency = 0.25
				dragGhost.IndentFrame.EntryText.TextColor3 = GuiColor.TextSelected
				dragGhost.Position = UDim2.new(0,dragPos.x+ghostOffset.x,0,dragPos.y+ghostOffset.y)
				dragGhost.Parent = GetScreen(listFrame)
				parentHighlight.Parent = listFrame
			end
		end)

		function cancelReparentDrag()
			mouseDrag.Parent = nil
			conDrag:disconnect()
			conUp:disconnect()
			conUp2:disconnect()
			dragGhost:Destroy()
			parentHighlight:Destroy()
			function cancelReparentDrag()end
		end

		local wasSelected = Selection.Selected[object]
		if not wasSelected and Option.Selectable then
			Selection:Set({object})
		end

		conUp = mouseDrag.MouseButton1Up:connect(function()
			cancelReparentDrag()
			if dragged then
				if parentIndex then
					local parentNode = TreeList[parentIndex + scrollBar.ScrollIndex]
					if parentNode then
						parentNode.Expanded = true

						local parentObj = parentNode.Object
						local function parent(a,b)
							a.Parent = b
						end
						if Option.Selectable then
							local list = Selection.List
							for i = 1,#list do
								pcall(parent,list[i],parentObj)
							end
						else
							pcall(parent,object,parentObj)
						end
					end
				end
			else
				-- do selection click
				if wasSelected and Option.Selectable then
					Selection:Set({})
				end
			end
		end)
		conUp2 = mouseDrag.MouseButton2Down:connect(function()
			cancelReparentDrag()
		end)

		mouseDrag.Parent = GetScreen(listFrame)
	end

	local entryTemplate = Create('ImageButton',{
		Name = "Entry";
		Transparency = 1;
		AutoButtonColor = false;
		Position = UDim2.new(0,0,0,0);
		Size = UDim2.new(1,0,0,ENTRY_SIZE);
		Create('Frame',{
			Name = "IndentFrame";
			BackgroundTransparency = 1;
			BackgroundColor3 = GuiColor.Selected;
			BorderColor3 = GuiColor.BorderSelected;
			Position = UDim2.new(0,0,0,0);
			Size = UDim2.new(1,0,1,0);
			Create(Icon('ImageButton',0),{
				Name = "Expand";
				AutoButtonColor = false;
				Position = UDim2.new(0,-GUI_SIZE,0.5,-GUI_SIZE/2);
				Size = UDim2.new(0,GUI_SIZE,0,GUI_SIZE);
			});
			Create(Icon(nil,0),{
				Name = "ExplorerIcon";
				Position = UDim2.new(0,2+ENTRY_PADDING,0.5,-GUI_SIZE/2);
				Size = UDim2.new(0,GUI_SIZE,0,GUI_SIZE);
			});
			Create('TextLabel',{
				Name = "EntryText";
				BackgroundTransparency = 1;
				TextColor3 = GuiColor.Text;
				TextXAlignment = 'Left';
				TextYAlignment = 'Center';
				Font = FONT;
				FontSize = FONT_SIZE;
				Text = "";
				Position = UDim2.new(0,2+ENTRY_SIZE+4,0,0);
				Size = UDim2.new(1,-2,1,0);
			});
		});
	})

	function scrollBar.UpdateCallback(self)
		for i = 1,self.VisibleSpace do
			local node = TreeList[i + self.ScrollIndex]
			if node then
				local entry = listEntries[i]
				if not entry then
					entry = Create(entryTemplate:Clone(),{
						Position = UDim2.new(0,2,0,ENTRY_BOUND*(i-1)+2);
						Size = UDim2.new(0,nodeWidth,0,ENTRY_SIZE);
						ZIndex = listFrame.ZIndex;
					})
					listEntries[i] = entry

					local expand = entry.IndentFrame.Expand
					expand.MouseEnter:connect(function()
						local node = TreeList[i + self.ScrollIndex]
						if #node > 0 then
							if node.Expanded then
								Icon(expand,NODE_EXPANDED_OVER)
							else
								Icon(expand,NODE_COLLAPSED_OVER)
							end
						end
					end)
					expand.MouseLeave:connect(function()
						local node = TreeList[i + self.ScrollIndex]
						if #node > 0 then
							if node.Expanded then
								Icon(expand,NODE_EXPANDED)
							else
								Icon(expand,NODE_COLLAPSED)
							end
						end
					end)
					expand.MouseButton1Down:connect(function()
						local node = TreeList[i + self.ScrollIndex]
						if #node > 0 then
							node.Expanded = not node.Expanded
							if node.Object == explorerPanel.Parent and node.Expanded then
								CreateCaution("Warning","Please be careful when editing instances inside here, this is like the System32 of Dex and modifying objects here can break Dex.")
							end
							-- use raw update so the list updates instantly
							rawUpdateList()
						end
					end)

					entry.MouseButton1Down:connect(function(x,y)
						local node = TreeList[i + self.ScrollIndex]
						DestroyRightClick()
						if GetAwaitRemote:Invoke() then
							bindSetAwaiting:Fire(node.Object)
							return
						end
						
						if not HoldingShift then
							lastSelectedNode = i + self.ScrollIndex
						end
						
						if HoldingShift and not filteringWorkspace() then
							if lastSelectedNode then
								if i + self.ScrollIndex - lastSelectedNode > 0 then
									Selection:StopUpdates()
									for i2 = 1, i + self.ScrollIndex - lastSelectedNode do
										local newNode = TreeList[lastSelectedNode + i2]
										if newNode then
											Selection:Add(newNode.Object)
										end
									end
									Selection:ResumeUpdates()
								else
									Selection:StopUpdates()
									for i2 = i + self.ScrollIndex - lastSelectedNode, 1 do
										local newNode = TreeList[lastSelectedNode + i2]
										if newNode then
											Selection:Add(newNode.Object)
										end
									end
									Selection:ResumeUpdates()
								end
							end
							return
						end
						
						if HoldingCtrl then
							if Selection.Selected[node.Object] then
								Selection:Remove(node.Object)
							else
								Selection:Add(node.Object)
							end
							return
						end
						if Option.Modifiable then
							local pos = Vector2.new(x,y)
							dragReparent(node.Object,entry:Clone(),pos,entry.AbsolutePosition-pos)
						elseif Option.Selectable then
							if Selection.Selected[node.Object] then
								Selection:Set({})
							else
								Selection:Set({node.Object})
							end
							dragSelect(i+self.ScrollIndex,true,'MouseButton1Up')
						end
					end)

					entry.MouseButton2Down:connect(function()
						if not Option.Selectable then return end
						
						DestroyRightClick()
						
						curSelect = entry
						
						local node = TreeList[i + self.ScrollIndex]
						
						if GetAwaitRemote:Invoke() then
							bindSetAwaiting:Fire(node.Object)
							return
						end
						
						if not Selection.Selected[node.Object] then
							Selection:Set({node.Object})
						end
					end)
					
					
					entry.MouseButton2Up:connect(function()
						if not Option.Selectable then return end
						
						local node = TreeList[i + self.ScrollIndex]
						
						if checkMouseInGui(curSelect) then
							rightClickMenu(node.Object)
						end
					end)

					entry.Parent = listFrame
				end

				entry.Visible = true

				local object = node.Object

				-- update expand icon
				if #node == 0 then
					entry.IndentFrame.Expand.Visible = false
				elseif node.Expanded then
					Icon(entry.IndentFrame.Expand,NODE_EXPANDED)
					entry.IndentFrame.Expand.Visible = true
				else
					Icon(entry.IndentFrame.Expand,NODE_COLLAPSED)
					entry.IndentFrame.Expand.Visible = true
				end

				-- update explorer icon
				Icon(entry.IndentFrame.ExplorerIcon,ExplorerIndex[object.ClassName] or 0)

				-- update indentation
				local w = (node.Depth)*(2+ENTRY_PADDING+GUI_SIZE)
				entry.IndentFrame.Position = UDim2.new(0,w,0,0)
				entry.IndentFrame.Size = UDim2.new(1,-w,1,0)

				-- update name change detection
				if nameConnLookup[entry] then
					nameConnLookup[entry]:disconnect()
				end
				local text = entry.IndentFrame.EntryText
				text.Text = object.Name
				nameConnLookup[entry] = node.Object.Changed:connect(function(p)
					if p == 'Name' then
						text.Text = object.Name
					end
				end)

				-- update selection
				entry.IndentFrame.Transparency = node.Selected and 0 or 1
				text.TextColor3 = GuiColor[node.Selected and 'TextSelected' or 'Text']

				entry.Size = UDim2.new(0,nodeWidth,0,ENTRY_SIZE)
			elseif listEntries[i] then
				listEntries[i].Visible = false
			end
		end
		for i = self.VisibleSpace+1,self.TotalSpace do
			local entry = listEntries[i]
			if entry then
				listEntries[i] = nil
				entry:Destroy()
			end
		end
	end

	function scrollBarH.UpdateCallback(self)
		for i = 1,scrollBar.VisibleSpace do
			local node = TreeList[i + scrollBar.ScrollIndex]
			if node then
				local entry = listEntries[i]
				if entry then
					entry.Position = UDim2.new(0,2 - scrollBarH.ScrollIndex,0,ENTRY_BOUND*(i-1)+2)
				end
			end
		end
	end

	Connect(listFrame.Changed,function(p)
		if p == 'AbsoluteSize' then
			rawUpdateSize()
		end
	end)

	local wheelAmount = 6
	explorerPanel.MouseWheelForward:connect(function()
		if scrollBar.VisibleSpace - 1 > wheelAmount then
			scrollBar:ScrollTo(scrollBar.ScrollIndex - wheelAmount)
		else
			scrollBar:ScrollTo(scrollBar.ScrollIndex - scrollBar.VisibleSpace)
		end
	end)
	explorerPanel.MouseWheelBackward:connect(function()
		if scrollBar.VisibleSpace - 1 > wheelAmount then
			scrollBar:ScrollTo(scrollBar.ScrollIndex + wheelAmount)
		else
			scrollBar:ScrollTo(scrollBar.ScrollIndex + scrollBar.VisibleSpace)
		end
	end)
end
