diff --git a/.gitignore b/.gitignore index f00ad52..23b1f2d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ BuffLib *.psd Ace-Libs Images_Raw -Gladdy_old \ No newline at end of file +Gladdy_old +Gladdy_TW \ No newline at end of file diff --git a/Constants.lua b/Constants.lua index 3cc8507..67c8f8d 100644 --- a/Constants.lua +++ b/Constants.lua @@ -1,6 +1,7 @@ local tbl_sort, select = table.sort, select local GetSpellInfo = GetSpellInfo +local GetItemInfo = GetItemInfo local GetLocale = GetLocale local Gladdy = LibStub("Gladdy") @@ -648,7 +649,7 @@ local importantAuras = { -- Grounding Totem Effect [GetSpellInfo(8178)] = { track = AURA_TYPE_BUFF, - duration = 0, + duration = 4, priority = 20, spellID = 8178 }, @@ -711,6 +712,36 @@ local importantAuras = { magic = true, spellID = 34709, }, + -- Net-o-Matic + [GetSpellInfo(13120)] = { + track = AURA_TYPE_DEBUFF, + duration = 10, + priority = 30, + spellID = 13120, + }, + -- Nigh Invulnerability Shield + [GetSpellInfo(30458)] = { + track = AURA_TYPE_BUFF, + duration = 8, + priority = 15, + spellID = 30458, + texture = select(10, GetItemInfo(23825)) + }, + -- Nigh Invulnerability Belt Backfire + [GetSpellInfo(30457)] = { + track = AURA_TYPE_DEBUFF, + duration = 8, + priority = 15, + spellID = 30457, + }, + -- Flee (Skull of impending Doom) -- 5024 + [GetSpellInfo(5024)] = { + track = AURA_TYPE_BUFF, + duration = 8, + priority = 15, + spellID = 5024, + altName = select(1, GetSpellInfo(5024)) .. " - " .. (select(1, GetItemInfo(4984)) or "Skull of Impending Doom"), + }, } function Gladdy:GetImportantAuras() return importantAuras @@ -1063,9 +1094,9 @@ local arenaTimer = { [0] = "Der Arenakampf hat begonnen!", }, ["frFR"] = { - [60] = "Le combat d'arène commence dans une minute\194\160!", - [30] = "Le combat d'arène commence dans trente secondes\194\160!", - [15] = "Le combat d'arène commence dans quinze secondes\194\160!", + [61] = "Le combat d'arène commence dans une minute\194\160!", + [31] = "Le combat d'arène commence dans trente secondes\194\160!", + [16] = "Le combat d'arène commence dans quinze secondes\194\160!", [0] = "Le combat d'arène commence\194\160!", }, ["ruRU"] = { diff --git a/EventListener.lua b/EventListener.lua index 2f73d8d..4d87a28 100644 --- a/EventListener.lua +++ b/EventListener.lua @@ -48,6 +48,9 @@ end function Gladdy:SpotEnemy(unit, auraScan) local button = self.buttons[unit] + if not unit or not button then + return + end button.raceLoc = UnitRace(unit) button.race = select(2, UnitRace(unit)) button.classLoc = select(1, UnitClass(unit)) @@ -55,7 +58,9 @@ function Gladdy:SpotEnemy(unit, auraScan) button.name = UnitName(unit) button.stealthed = false Gladdy.guids[UnitGUID(unit)] = unit - Gladdy:SendMessage("ENEMY_SPOTTED", unit) + if button.class and button.race then + Gladdy:SendMessage("ENEMY_SPOTTED", unit) + end if auraScan and not button.spec then for n = 1, 30 do local spellName,_,_,_,_,_,unitCaster = UnitAura(unit, n, "HELPFUL") @@ -88,7 +93,7 @@ function EventListener:COMBAT_LOG_EVENT_UNFILTERED() Gladdy:SendMessage("UNIT_DEATH", destUnit) end -- spec detection - if not Gladdy.buttons[destUnit].class then + if not Gladdy.buttons[destUnit].class or not Gladdy.buttons[destUnit].race then Gladdy:SpotEnemy(destUnit, true) end --interrupt detection @@ -119,7 +124,7 @@ function EventListener:COMBAT_LOG_EVENT_UNFILTERED() end end - if not Gladdy.buttons[srcUnit].class then + if not Gladdy.buttons[srcUnit].class or not Gladdy.buttons[srcUnit].race then Gladdy:SpotEnemy(srcUnit, true) end if not Gladdy.buttons[srcUnit].spec then @@ -138,7 +143,7 @@ function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason) -- ENEMY_SPOTTED if button then Gladdy:SendMessage("ENEMY_STEALTH", unit, false) - if not button.class then + if not button.class or not button.race then Gladdy:SpotEnemy(unit, true) end end @@ -167,7 +172,7 @@ function EventListener:ARENA_OPPONENT_UPDATE(unit, updateReason) end end -local exceptionNames = { -- TODO MOVE ME TO CLASSBUFFS LIB +Gladdy.exceptionNames = { -- TODO MOVE ME TO CLASSBUFFS LIB [31117] = GetSpellInfo(30405) .. " Silence", -- Unstable Affliction Silence [43523] = GetSpellInfo(30405) .. " Silence", [24131] = select(1, GetSpellInfo(19386)) .. " Dot", -- Wyvern Sting Dot @@ -189,7 +194,7 @@ function EventListener:UNIT_AURA(unit) return end for i = 1, 2 do - if not Gladdy.buttons[unit].class then + if not Gladdy.buttons[unit].class or not Gladdy.buttons[unit].race then Gladdy:SpotEnemy(unit, false) end local filter = (i == 1 and "HELPFUL" or "HARMFUL") @@ -207,8 +212,8 @@ function EventListener:UNIT_AURA(unit) Gladdy:DetectSpec(unit, Gladdy.specBuffs[spellName]) end end - if exceptionNames[spellID] then - spellName = exceptionNames[spellID] + if Gladdy.exceptionNames[spellID] then + spellName = Gladdy.exceptionNames[spellID] end Gladdy:SendMessage("AURA_GAIN", unit, auraType, spellID, spellName, texture, duration, expirationTime, count, debuffType, i) Gladdy:Call("Announcements", "CheckDrink", unit, spellName) diff --git a/Frame.lua b/Frame.lua index e4a9fd0..5ed139a 100644 --- a/Frame.lua +++ b/Frame.lua @@ -275,6 +275,17 @@ function Gladdy:UpdateFrame() for _, v in self:IterModules() do self:Call(v, "UpdateFrameOnce") end + if Gladdy.db.hideBlizzard == "always" then + Gladdy:BlizzArenaSetAlpha(0) + elseif Gladdy.db.hideBlizzard == "arena" then + if Gladdy.curBracket then + Gladdy:BlizzArenaSetAlpha(0) + else + Gladdy:BlizzArenaSetAlpha(1) + end + elseif Gladdy.db.hideBlizzard == "never" then + Gladdy:BlizzArenaSetAlpha(1) + end end function Gladdy:HideFrame() diff --git a/Gladdy.lua b/Gladdy.lua index 252c270..a3f6578 100644 --- a/Gladdy.lua +++ b/Gladdy.lua @@ -5,6 +5,7 @@ local select = select local pairs = pairs local tinsert = table.insert local tsort = table.sort +local GetTime = GetTime local CreateFrame = CreateFrame local DEFAULT_CHAT_FRAME = DEFAULT_CHAT_FRAME local IsAddOnLoaded = IsAddOnLoaded @@ -25,9 +26,9 @@ local MAJOR, MINOR = "Gladdy", 4 local Gladdy = LibStub:NewLibrary(MAJOR, MINOR) local L Gladdy.version_major_num = 1 -Gladdy.version_minor_num = 0.19 +Gladdy.version_minor_num = 0.20 Gladdy.version_num = Gladdy.version_major_num + Gladdy.version_minor_num -Gladdy.version_releaseType = RELEASE_TYPES.beta +Gladdy.version_releaseType = RELEASE_TYPES.release Gladdy.version = PREFIX .. Gladdy.version_num .. "-" .. Gladdy.version_releaseType Gladdy.VERSION_REGEX = VERSION_REGEX @@ -131,8 +132,8 @@ function Gladdy:Call(module, func, ...) end end function Gladdy:SendMessage(message, ...) - for k, v in self:IterModules() do - self:Call(v, v.messages[message], ...) + for _, module in self:IterModules() do + self:Call(module, module.messages[message], ...) end end @@ -224,18 +225,12 @@ function Gladdy:OnInitialize() self:SetupOptions() - for k, v in self:IterModules() do - self:Call(v, "Initialize") -- B.E > A.E :D + for _, module in self:IterModules() do + self:Call(module, "Initialize") -- B.E > A.E :D end self:DeleteUnknownOptions(self.db, self.defaults.profile) if Gladdy.db.hideBlizzard == "always" then - if IsAddOnLoaded("Blizzard_ArenaUI") then - ArenaEnemyFrame1:SetAlpha(0) - ArenaEnemyFrame2:SetAlpha(0) - ArenaEnemyFrame3:SetAlpha(0) - ArenaEnemyFrame4:SetAlpha(0) - ArenaEnemyFrame5:SetAlpha(0) - end + Gladdy:BlizzArenaSetAlpha(0) end end @@ -310,8 +305,8 @@ function Gladdy:Test() button[k] = v end - for k, v in self:IterModules() do - self:Call(v, "Test", unit) + for _, module in self:IterModules() do + self:Call(module, "Test", unit) end button:SetAlpha(1) @@ -375,7 +370,7 @@ end function Gladdy:Reset() if type(self.guids) == "table" then - for k, v in pairs(self.guids) do + for k,_ in pairs(self.guids) do self.guids[k] = nil end end @@ -383,21 +378,15 @@ function Gladdy:Reset() self.curBracket = nil self.curUnit = 1 - for k1, v1 in self:IterModules() do - self:Call(v1, "Reset") + for _, module in self:IterModules() do + self:Call(module, "Reset") end for unit in pairs(self.buttons) do self:ResetUnit(unit) end if Gladdy.db.hideBlizzard == "never" or Gladdy.db.hideBlizzard == "arena" then - if IsAddOnLoaded("Blizzard_ArenaUI") then - ArenaEnemyFrame1:SetAlpha(1) - ArenaEnemyFrame2:SetAlpha(1) - ArenaEnemyFrame3:SetAlpha(1) - ArenaEnemyFrame4:SetAlpha(1) - ArenaEnemyFrame5:SetAlpha(1) - end + Gladdy:BlizzArenaSetAlpha(1) end end @@ -410,8 +399,8 @@ function Gladdy:ResetUnit(unit) button:SetAlpha(0) self:ResetButton(unit) - for k2, v2 in self:IterModules() do - self:Call(v2, "ResetUnit", unit) + for _, module in self:IterModules() do + self:Call(module, "ResetUnit", unit) end end @@ -462,12 +451,49 @@ function Gladdy:JoinedArena() self.buttons["arena" .. i]:SetAlpha(1) end if Gladdy.db.hideBlizzard == "arena" or Gladdy.db.hideBlizzard == "always" then - if IsAddOnLoaded("Blizzard_ArenaUI") then - ArenaEnemyFrame1:SetAlpha(0) - ArenaEnemyFrame2:SetAlpha(0) - ArenaEnemyFrame3:SetAlpha(0) - ArenaEnemyFrame4:SetAlpha(0) - ArenaEnemyFrame5:SetAlpha(0) - end + Gladdy:BlizzArenaSetAlpha(0) end end + +--------------------------- + +-- BLIZZARD FRAMES + +--------------------------- + +function Gladdy:BlizzArenaSetAlpha(alpha) + if IsAddOnLoaded("Blizzard_ArenaUI") then + ArenaEnemyFrames:SetAlpha(alpha) + ArenaEnemyFrame1:SetAlpha(alpha) + ArenaEnemyFrame1PetFrame:SetAlpha(alpha) + ArenaEnemyFrame2:SetAlpha(alpha) + ArenaEnemyFrame2PetFrame:SetAlpha(alpha) + ArenaEnemyFrame3:SetAlpha(alpha) + ArenaEnemyFrame3PetFrame:SetAlpha(alpha) + ArenaEnemyFrame4:SetAlpha(alpha) + ArenaEnemyFrame4PetFrame:SetAlpha(alpha) + ArenaEnemyFrame5:SetAlpha(alpha) + ArenaEnemyFrame5PetFrame:SetAlpha(alpha) + end +end + +--------------------------- + +-- FONT/STATUSBAR/BORDER + +--------------------------- + +local defaults = {["statusbar"] = "Smooth", ["border"] = "Gladdy Tooltip round", ["font"] = "DorisPP"} + +local lastWarning = {} +function Gladdy:SMFetch(lsmType, key) + local smMediaType = self.LSM:Fetch(lsmType, Gladdy.db[key]) + if (smMediaType == nil and Gladdy.db[key] ~= "None") then + if not lastWarning[key] or GetTime() - lastWarning[key] > 120 then + lastWarning[key] = GetTime() + Gladdy:Warn("Could not find", "\"" .. lsmType .. "\" \"", Gladdy.db[key], " \" for", "\"" .. key .. "\"", "- setting it to", "\"" .. defaults[lsmType] .. "\"") + end + return self.LSM:Fetch(lsmType, defaults[lsmType]) + end + return smMediaType +end \ No newline at end of file diff --git a/Gladdy.toc b/Gladdy.toc index ba5a687..b3623bc 100644 --- a/Gladdy.toc +++ b/Gladdy.toc @@ -1,6 +1,6 @@ -## Interface: 20501 +## Interface: 20502 ## Title: Gladdy - TBC -## Version: 1.19-Beta +## Version: 1.20-Release ## Notes: The most powerful arena AddOn for WoW 2.5.1 ## Author: XiconQoo, DnB_Junkee, Knall ## X-Email: contact me on discord Knall#1751 diff --git a/Images/BasicProfiles/Mir1.blp b/Images/BasicProfiles/Mir1.blp new file mode 100644 index 0000000..faed735 Binary files /dev/null and b/Images/BasicProfiles/Mir1.blp differ diff --git a/Images/Countdown/0.blp b/Images/Countdown/0.blp index d8ad777..3c4a50c 100644 Binary files a/Images/Countdown/0.blp and b/Images/Countdown/0.blp differ diff --git a/Images/Countdown/1.blp b/Images/Countdown/1.blp index 849c799..469aa51 100644 Binary files a/Images/Countdown/1.blp and b/Images/Countdown/1.blp differ diff --git a/Images/Countdown/2.blp b/Images/Countdown/2.blp index b74cce1..10aba5e 100644 Binary files a/Images/Countdown/2.blp and b/Images/Countdown/2.blp differ diff --git a/Images/Countdown/3.blp b/Images/Countdown/3.blp index c4157cb..3627fa6 100644 Binary files a/Images/Countdown/3.blp and b/Images/Countdown/3.blp differ diff --git a/Images/Countdown/4.blp b/Images/Countdown/4.blp index 6480f0d..dd3c6cc 100644 Binary files a/Images/Countdown/4.blp and b/Images/Countdown/4.blp differ diff --git a/Images/Countdown/5.blp b/Images/Countdown/5.blp index 4cfac61..e7a6e0e 100644 Binary files a/Images/Countdown/5.blp and b/Images/Countdown/5.blp differ diff --git a/Images/Countdown/6.blp b/Images/Countdown/6.blp index 4d34be0..a19c292 100644 Binary files a/Images/Countdown/6.blp and b/Images/Countdown/6.blp differ diff --git a/Images/Countdown/7.blp b/Images/Countdown/7.blp index 4293f83..d6979f2 100644 Binary files a/Images/Countdown/7.blp and b/Images/Countdown/7.blp differ diff --git a/Images/Countdown/8.blp b/Images/Countdown/8.blp index fb4c555..8d4eebc 100644 Binary files a/Images/Countdown/8.blp and b/Images/Countdown/8.blp differ diff --git a/Images/Countdown/9.blp b/Images/Countdown/9.blp index 7a4bbb9..290049b 100644 Binary files a/Images/Countdown/9.blp and b/Images/Countdown/9.blp differ diff --git a/Images/Countdown/Alliance.blp b/Images/Countdown/Alliance.blp new file mode 100644 index 0000000..e6218ff Binary files /dev/null and b/Images/Countdown/Alliance.blp differ diff --git a/Images/Countdown/Horde.blp b/Images/Countdown/Horde.blp new file mode 100644 index 0000000..2c489da Binary files /dev/null and b/Images/Countdown/Horde.blp differ diff --git a/ImportStrings.lua b/ImportStrings.lua index 091a8af..80e7914 100644 --- a/ImportStrings.lua +++ b/ImportStrings.lua @@ -1,25 +1,29 @@ local Gladdy = LibStub("Gladdy") function Gladdy:GetKlimpProfile() - return "4XzT8KTCBJRSFm3NJlqacqWhTtIsCDtC81YPMZu1uAcLeTfprl(qsDZ48q(2p9cajiPKIywErIIeDJEd9cqtnlA29ZMUS8QDLlZlF5U17kXBKn7MOztNtF(i9zj(z9SPvRYwU7lvfpUQ((In5L3LV(2DfBRHHC)hUfGz)dpuDf(XLRFAfJN))8YQIDB)7nz)7DL)929BO7UOyAXxZNDJuaxNvvFv2rPcbrfcIkeiv80UVKxcamz326WHlomr7q))6dazLxdtPkAiN8VMnXie6irIn2iKrrYOzp8cnmYNYRFBE266vUzC20xTRSO6wGDlZwuKT(L72TgW12wwUmB7J5VCv(IpFFzX2pdt6C)GzMCA9ZRZNn96T15LpKTi)VUC5YpST6VEZ6SLlF(VUEt2J5v)fp2)UC3(TlZx(3Zx)uOeUHFeOk8vfvzZxN)YIYfaMN3kuFSJe6I4dlsRz6CiwC8MNhRqejtKs1SRMnfKwPj4fQOuLMVWyIOlew3yKwrkDHo2sdoksj4bhhrJ1KyO7BmwAK2uRdurmFrQoHbnX6UqehZOa0A8eBT0DIuUHOSQeh0kRXnMyjEHwgZZOWMk4PoYDrQwX4nwXad3XYtDuedKnrq3XkySHKjDHmsLYZJus0Imf4jMOszyaSjy8MWprjbXctlcdrcsJMKksrQJHs0mTjKj8qLYuEMtLgNIqX4xbCnl)JmS0g4eM1KsBK0XSEQYPAuI4iEUIvSkrASSUagSLN04iRMP8uPJmItKUh50kWYggHkPGMIyDSYn40egCR2qqzCcnGVzjHrRjIWACADBCAktmgdtmsKtQDRcUEXUT3cRxk26SLPfyVElAbVenEZ2xMrlXk3)e7OOY)uazR8lQVjBtoUWMDibYOPBF6(D15BUDDwDo7j7Y1Fj75Q7ZkFmVMrorctxT7lxcZYRYPFI3)yUiLoxKlk(JIL1RMKTOEh5HA6d7wSV6CC(rEZyU82DvZME31V5T37ChIuYDGNKoC295)t9(sWrZ7l2wSjBDrvn6RGy2fzRZPjX7(Fu(KEZ6DvvnUn6ZrRaUFnkbAeuE)heD)UxpbzXY8TzVe8TvJpWfnqB8U4ALhVp7XIfhiUK4cd7a7cjkyA4A2BDxnARBtpL8MYDF5vfL5lQHGtEAYhzjWiArX5OAebbA(tVJ5xOWH0DEU6d3F)hEpzIvMVzx)ikOj7aNWqeipoNOJbFIGxeT0ghBbFFqqkLlifjXVr5z3MaeGRLo2LxUDli2zBfCcFhyx8Q8hY2VUgzqtsIa)oVDTYtLfafw)8SBIfOwpBXNbI(1x9XjtqgNdimkqIKkTECGOIta3vhdKiDdinZb5vCuZHwRgjVZr8gfisLbCTpkqa3YrjNdVhkHTNqCDyLcfIEuZIecgECzS6W6XOJlWIeduJu6aJAga2yKY3yyz1X58dojukiJHnGW2JJOsIgPTiyw1bI5Dij5WfiqUUN1kQaUMsMAuufLT1OMevSESSUmwQhlRyvJ1PfK)4XDAD41hs9y9Mgzn6r62IZ48yGihAmYzMocRxoX1rrurM0KJRso4AkPj1owqe64X6MljzKMWrQtew4W6DXyDXZP3pgvcvgWzqvbreKJLX1Yt4H4WRePe6hfiqvCNGtoK5RnzSkeLqEIWihHSWsNg1Safqn6GUqzoNqVFOzXigzQtqu6t4q9WH3avYiJxPujJn2axz)OarQsLhNx0dnws(byev6XLWh2nKwMmYf8CrYJybpxm9iwMGLypMHRgBCNuXyTePI7hherNWT4H8nq7wWieR6e74SpQXBrf(gSDcUI)6VNKhzJu7xJ71B2SFBEhyexKM6QZviBH0nZdkkDIwdveIQqiH8umPCUYWtuOkx75KYIV(Tp9)TpBzzwD23(0933Sbi8EMG4Vg)PkzG5xgVNNuP4l2xvVBdUNdZMI7C43RE5AhAJWDD93aETrdCTmk0EbetIL)OCShYvIKblEhf2pkrpiKZVe0Av9xO(RaTM4b(j)vG2iH(3cE1QbjL9RaTwP8NYq7iOvoSk2rH2l0EZx32KPdTFvgtFhXJc7h1(9NJOpMMZK87WGaQzCWoe9RaV2Obr5gfAVWVdNPno(BqTiP)UNmkuFmb8WeQ)vGwRoQFS1rH2lGidby(IutOnSoTFG(rH8Jh343IOiY(7qXPKPdsF5xbE5Je7NaVxez6yeJ6sBxd5FhlPTd3yJFfOns)loakmWWtwU5OAMUz3U6vh)mOApk5)SZba)syCpcjTMt5RvTop)Pq6DoEotLlYXdnd)rb(9nrkJiLtjSUCDv9(TNdm6ui0bat52LNniwdpnRYk3CoayWAJaa(C15mAjSiahD1IS668YZdgqLIWSSOcfBBR7PEpI4kHYcF5IZzkmrXym3PpKNvEuSFv44TSGfmb6n(2HGhMt4SXkI(GCCfrmDAzL5pbSCgEkqNduPmuqjcpUBB18Y8mWg9mam2jK3NDoJwJNrmkVkZZ)Aou21zzcRTQyeQInpb35SumnMJpVy9UT5NLUriL8YwQ2Toh5PeLmDpe0lubRVVnhqiiTFKoYToRS)bo71o9dYY2(A5fy9LnDEYTUJYK8jbZQRMp)PeIfo3Vi0j741Mh2R1f0kmhXxrOCDwfDk8)CfJw07i7)bejv)N9zLErs4rRg6JeCnuwmFFn5H8gkwC1t5RxJES3MTbMm(89NbUGxw8qrEj(eaGAWcykirYCNHBnpmukEaKmbpo)dJdzloOd9hrH6aO4sAqF7t)pQdJNw0SKpR4LiMIpfMIhdM0Nct6XGjZPWKzmyk5uykzmyYEkmzhdMspfMshdM4DN9yOc30QZgx1HEbChR)ueXuuX3(XBU)13HxTPa8RHBmmTU(pU8U7U(dbpqi1Kl)BV8Dx(QRVP5b8HQdp49x(Mx3Exgl3E31VE69n3vjvjPoS)Up8Y)3MhqB5gC)xD3hV(vTdN2)y4239H38XwCZngeC7PV9Y3FziLGDTeNjvGZUbn8syAwoFluFHOrFpD7IUoTuu0qpKyV(898q67OIMopIK7apCYZQPg3lC5PorzAmulM9DqtYPozp3mnSC6(JH6UTtpKKV3auYKtCQ6r6UkpFOj7SU9m0L(8SThuxYXj4WcF7t3davx803(efLKsmEq7z6JHH9m1R3MV5zIUcAQu2(4Gt3z0gqeMEF2)GXZ4MsY9doT9ED8JVdlB6WhRwi0XXYuJbYhes64HxeNI5eb(eA7ARwC1EpsQfgXRV5By7V5N3JVjWTErUJMSwwOtQou9DRoYcSGEBJM0IFGG7DY3PF719UDl(mN6qN0Qyci2ldW11UomdlwR4YTlwb0ElzJgkbcN22fRFRTrNfq(sFd)DpUqrlW5NBg254r(NQtP7GAV5((9bUib7Dc4BS1NMJh8GHGuMgROX7)owQJWlsfkAGyXkwcbe(OojbHlcRxyU7eUqegPOH5Eo3Rg485NqStmMt97PBIsJictksykreXxOIzeHTiXC6yGzmzsSwgdQyEayhrm33Nd4DIObgz0repiTjmQaIJFo)tQFcqmjDePrXeLkwqspBQKqaDA9etKettL1p30ztZ8PW4MBMnInXmXO1jmvOttPXgh5iyoydCH2spWyD4cDncxKiCYqqDsxOW2NLyzPHgbD4x0SfPykvYtQ0lUXMjBojv5PIpACeullLPU6IaXYmTwYFZDI1C68YsC3qWxKghXy1Ysse7S8aOl(I0uMh42LMiENTPHf6sJI(zIdvPjeGAVYdmL5Hz4lsyW4(fcUiwqtn8uEEmodWiGnAmLjuAGkN4Hy10uQ92jsqZtCOMHamGyfrcRjC6l(PGSMGwHT7nn6yEjvuseReG8v41ccNHPu6S3mKYjHx7aZIZIq4qGmj1zRhN6STJy2J7PichkJZalITILjs2Af(YHhELIBLoQuCgRAhKs3clSNcM7oSvA(LEoHxdhZAtkfj82PU1po4GrZ(syXOr400kdDBvKZEgwDWtGs55bgaE1ei34o(o1rOulUWYdADxDNWhJYHDNQX8Xvp7WNUcvjhVWGsPeZGitL1hf8jXGpbRk1GjTA1WcwUCt3wNtPKnmnaI9E1ZqU2flyedYJ15zaz6IynFyi0otoVl9rTtuyMftWnvA56NrS8mewhOlulHb3HvjAmSE8W4zTrZXgh(JpHq3gi(L(kUXBV6a7TWW6)X72p68PtzYNzaX(DveTik81kzc4vj2cr50rcHqjfNQA)G0ooMXqGanZ1QYBawKpiA(4VVdutKKfkzAbYI5uECZBgWhR4i5mfJpyzovmayh9mU9xv7lDnLnTxglrWQAH4(vWqwb0kTvjbe(p76bN593TsfF2WqeTo7OHRN2fnykOL690iKVjAKub2gVRylMiKZqoifN2eJdqanOEjOUMZW6kI88LlnXOTG6oowRfYuWQgnNtAPG(fsTQyz(vRl(6xZkblmQ1)dnw)aWBn7CME2HEZnM53Zg2yP(5NaH3TREUQawX4myCgpZzBnE3zch(B3T(5GHczUk8hwHwG2B8EOecYKcujfaIwemdMbJ)YYfzBpme0ey7dWnzSDaLjTsidzc63Cl93dQPKBdhu0emyQMUF7N3IlJ7b6hD3Mxs6wE6zOiZabq5o00SZe1ojT(RjVx4oiMv38gEaAXJxEH3u5qVUdDEH7od)Un2TNHlLWftHv)7YS)kFE9q8qouP0k9PyWHiXs5PiLUewHKZ5Bi4SGGmzjatCr2tn(CH855N4sp14Y6KF3SOW3g3ymwoGoMGrt(jCcsPm0jUK2CjIiI40sLq2loCbPqtqgB5SYGmcykk2n0ulxWGw5sHmoXn9khkW(kg)TooHFGGHarLp9thHkXJwGOpodJull)W4E0nO(vLarX5NcPx6y2io)kze(YHXecxcuIpR7yFQyrC(4kyemVqDfhDbifzSaIkprYzDrVnIoQ1PuDjQM4ZSmMRxbNzMktTUrq)Y4u6Iyx2ACjhj8GCi1WjT7EMmXWeemx8nGC4ySjsDvhbuixRG1vwusSlFXyPVwnR0puMRe(QbnmF7QcIEbcN7Ayo8gqg2S21K6QcGHp1vsHnIRcWxRH2vQJX9T1LPmGqMMIno73uxzfa1Y2jsPx(kBKxS4ul5Xc1BzCPoBSEToZ0jkFTwXCDr(YrCvnPSUuuJLoolL1VkPlNxRiILeCroUQQKXwofypn4sbwf70hGiZHpblPs9LAAtzwhmuzHl9UosmyeB2XDVjbSLzdG4Cfh4ZD3e7Qks7Scf8YkJRgfw)bw0EeL6Y8(FG8fPcdmgHnbFNKPaSQUohpTZorVu4Pr3eW8OPGZBIznMSu7PgHPn95ZXp8U66DBEFw5J0EiFWx8U(PBCv)DTcyXB3vcUJlc7VsFWem)N2KK5JI57uBbUXHHLcGZ45uocbWQrgkYjXEZ(8QQCkHsxgPHVYMnB6x4n9C4zedB5j6DZLL3SF96ZGZ68A33SJDHfaDUgyN8DQS5LbnCII6jypmR0u74JdOKjwd(EYOIfXAO03e6egPgE7ypP8ypPvuC425T9TiTZ2bFEVy9mxIVIXDlpRbpCU4VnB9dNHENX2LlQ3ZBhRJkPT3CmvKCG)sbAv4qcz5zv5hCLuSZjHP15s39xvXlGdKKpf8kA3KNMBfmT0KRdFqwGD23GVtjRdBwgMi9R9gw8FOJdwZGBS9r))pOjrr81Ximt3AOW0vvdfIVCFzpryuhVSMaZUGDNweCQ6T7HDZT6VB0oeCalNlKd99fmD)GNvVtCgESdyJoeC7JKRFqyKbBZEq0PDfv72EqdptlrS8iUIhSAPRdUtBb5yHENBqJXDyTS93YM)C2KxazqzTci75uC3FH8B4)7qw4F92dpXLJ4BDcKhBQjMYfXG)DwG4iM8ODKNuESN0XVZ97Uel3(6LH2ZDxq09Tkxd5VZMalkO4t8)BbTgpbrWx1F7kqr3b8Y10fkEl5WDTOi4nMhLV1qjXvZ9ko)Zm9(NQjCZmA(lqyQB7G6h0Hv(tPnI5BFAceG8BF6pwvuN7GT1LkP3dpYXvJ(aazFjH1w6f79x)wg8FcZzG4GmJ(b2gQoo97xKDBqU(M3D2ZOW80AvZH)Dj4DygOGdpA1teOV7ozgUrHnrlmCws8PVD25O0j6qFvWYa3VktO7xWuYVvR9cgrdM6R(oVno)uAd)2ScfI0W70enjbkO3OGL4WkCn(h(cujG1B74pjthHmRFtz9JttnlHUEBv4)GrUdhh9Uv0epTE2S)7kZXZ0d" + return "4XzTCTTCBJZK(HzVoUiaibbV0kjoX1M44FlNAMPQP0ekjAlUrh8ssTZ45I8SV9jEMurmX5IzmdjqJgnA0N(A7fQf3Vy(6SzhYwNK96dBpKHViEXnQfZxs))hP)Fg()lGFgV)XKxVjz1xV9WFNKnlo7(K)PyXSfZxfNxa)ZXOKhrjpIsEiLwdd6W21h(79xU9Pn84wN9M084LBtEDA2QTjlwwt2hBssVl8hMOfzP7)AsrpQ8usX7tI3wSbi17tsFCtXIBSW82)09hks2D724IKCIpUC7Fh)C(9XzpMuKSgNBw8Q04T3EiFX87U(DV)(gu72KSvj7lIFmbLaYI3tcCvqGZ33AcCEoxe8FlE4vbMH3a1Y3k(fj9YJp8q(m8)vk0Ex2H)(nPzjRkspSFX8p82RG16)ljlh(N)1U4)Ndz)1(J74tW2dD2NU)(p9rAVNLS7q2vh2dl8BoKLMF7T0M7p(eSqjfaJ775BurbbAyd488egp(yw8hsZlEtYdXh3wG7sByOh(ZK9OGFnYZpLLc0S45f347HcN4vFfwM3o7ZxDfUt1HATzAtrPnbbtBkg)qVOrNIkOAkvRHNXZnT1iiWmX9UrzTQPnfTXg5pTPyukv45S3BkHDNqCn8HsGVBIRIoqho19IVACbMYR3XOXZpy8JXbo3DrUX1gndES77M4MWhUonUOAWfr55p(ImW(2P06PXuHQjQ8c6HTMXYwSKU)nkNV9SUc2yxhzC2PXvbA)XNXWlInAQYkTVoyQBfNzQw5CWQmXfX3m5RTo7jUGmI9eTECLrDFLrDeyNBkAVGRgVPkTSrHJV1h8oL2g5M6u8c8NQaomCIQWkZj8JmSHuVP6tauUIol7In9jOJg)EYaMs1EEN4yFeZ7bt1me4QspXvr5PdpXMFiVi6t4vy41ikiCCB8J4bvFcdKJe8egg50uHDHtv9Y47hnXPOaJeJpLbzm0v9edGWaEugxLCilrHENq)Ay5LoyQH0AmHt1TLXO9MKjsTj6ec4G(tiW7egTh42R1BIHyhoz3OgJjA8fzWtd)aFZ4k8dCIB9NKccMD202erEtvq5S(t0yItDc7vdPMBTNkuRbuocDt7SROkJCoTXRYs)3V9L)ZX41zXfXF7l3deRzY2y1boMLSy(8DhouSz8mURZ0Um7tmT4vBJZZVE1H9)ujvVsYzUkVwxaC457RJa5LYbQVp8kW9(84cif(LhbgdwJBO8nYFkz72fZb(oEhSl46cSa2mRtFinjd)cmHcmVAit7yjf7cEyWEqparU6WQJ5dtdDnnEGgfqcZaK4sAqF7l)xMHPtnzwZLcznsj)trj)PqPGtrPGPqj7POKDkuk8uukCkuYDkk5McLIofLIMcLy3xJrk8Q9ztRcSqB4LQBJxVoDpxGpUct13YU8ywmFtBOc4DHdPYtsjalROgiA2mqDXkhgAXyE6)MqdSPrIZUMH5BIH7X54QDF6UKS7s2E7H09fW1M7)0T93e5VT2UgBC53sxxS5kqOCG2grCXSUEFrsw2XNk4zvD7N5KINFcK13U5580vXBLAHk1fDjZz898Md)9h2(CJHclLNm8lc8uv3gBoLRsrdLnMsGxJvW2B8xMTkE)WZqvPg3Cc3eZ2IPToeBBZnb9VrRn92jZjHUmlAb6TuZpU)R7bdSDN6NLxZhGYHz5gsz7jaYoKx0zHQxe0qE6L7xTbo6e9mS6OGUCJt56cL26KwjEYsw)MeAi4s78GWLwIPfegfIpaj6aP3JVb9jSSSOBWdHy9iGFI1FCj620sZuhbE0XXl)Kkj0sm2adnoLrRC08jYrfNbNMs5OXtHoHZtzOHjFNl)bUCLRhwCJLuOY865hPOfs7fYmINIFW4ZecR6Wsk1cMs2qNJPGXNhawKHLLH5sRLlKNRnqPOpv(cG9OFY7fojDCgAHnTgMTm(EK4ZfPjcqPatKo0Nwmx5Qtz8W7upltBrI6B95dLGGqMlcIIOX6RewMdZgEiWrFW6eAzdPVh6jsr48KEWacEEtRT0iOy3OvdYxH(IMxuDPahlP7ssUYlfNt7swmrpe5yXgvKvAUoE3hO5FYfgDjf3xO8cp6bltbTJfO4IWIfG94hII4TcwXqMbnIoQLL9ARju2sA(frH0uHZowGck18aT8dH8e5QXHK2ZX8seRQAfDrfSnQuQjsAvg5msXkcbIkdiU4f3fWZa0L4tKq(iro44VccDMLvwAlzSEcv8LlzE0pGKdig3tlufo2vcdPyzoKmhRkAmIYIoqeLrIKmmsUi4ZpWLUdFtOlu4ddFKQ47k6qnRgd)qOsOILnHgRCDt5ef5arKOLRDyMYepgwEtMPbfHnU5erMmUs7kQs7iSK2WBdRNSU8jI1fqCSrjA8GCMVCekJqoZdbRcZqMqytylkI4q6gzdF2)W(CBySf8HF7HmWWAQa6fyhFlyhNCN(q8QK)8Y1R)0(8)8DBHinE(pVEherq(FYJ9VYoCC)6K1)1YTpvLwq(8nh(BiNIK9Rb3NlzSR(8t4t1iJ96YKcA)6sajroBt7qle(IzdijfiFGI0N(2xiwOo)aKE1ZSjIJxbx78DG7GaLNNhKZ(PY2GZpI8)asv48UbwNemImyDKFOEiv2neMxFmlpP1jKQvGywCjRfcF6qwLpVlc4OBoVm1WrDgaa3e1WFVrMApdzv5c04vfm3kWisaMvfKvX)aFHUoyTEUqVqNpk98n93RvHy9DI7C5bi62DFesYkDpe6fb5ab96470gdaoGarniEmLjQ9DUlalA12hLNy4fNZ1hAcKiMdpgcTcIGPPqR80zm60qUV87c(B1n7h7rURCwSE)G)zWwm4nIswoaxIX(s2yFPOtO7NhU88TQBWKwMHxhEF82hoJnTCvcVR)tBAPrfh47nLuFa(4cD)t(g8Ypyzi6PUFin)W(b14SlA0Netrd5npdzgMUIh(m002X9fKTTz125A34fTr5piYkBHnDBycSEqd0FcLnaICfRP)buJeTOdQmRiZYaH2IeRLz55)VhJZs(2xU642TF7l)2M0Iez3uDA5kZFR5TNYTt3i95rEo3q70YfLS(YAA)7nmy3srQ7IwvPkCVw6CQTZwo3xp0SmCfQ0)G2vVA0iUcckWznrEqmEyGYg0AzLaOmbirA3qME9EuWSSzoq1DwtxV4)o6sZd8MbMJTEqcjq8bWXEL0RFV50uQ(JFzCjKe2J0BAz3y4tgs8D5QIJGlHLLCqJdPbsDVBQGO2hwkJY0(w2qR8oGZBfSqvXk)y6(0DXBtZBkFP52W03PVs2WShDfcFOUaiim5Lkhn2qIgwvviMxG)ttyVsFh30m2XCWBiDlCoQk99u4leYQWt)Fb01P6ba2Ki7frLwFrRqDiUbs4TlEjtI6JY09q66fHSotxqcEjiR1Vh(jVeKv5f8lHUbMEWu)sqwi13FkfTriRUFF9mjYErqP6ReZAqt9xiNZUGanjQpQ(7phtp2jhwsLxEYcPI3Rj7EjORt1dHTjr2luYrxuvyvvK2lSBdOnjspMaUpO8VeK1fO6IR3Ki7fGNHMPDfzBQdhe1fKXjr8X9B8lruOC)ko4m6OEqN(sqxL9N0t0fkBlLy8S01wr(xXvAx)w96LGSQGxyhOWaXWghRpZRaF(vyBiuhjnfzpf6w97RtW46D7oUpPZ5aCjHphqGweRjCqFTHhBvA3CjwNvLMZRu9xTRoKTB8DjxIKvPDIt(hiW9CkVmjW9YE(UkEBk(ulK0yNJNwnxsbwms9PAHvAmAL5KTvjsMWt1kHYk13Bv3X48orFHWdj87naJo8eTXRsC33e1Z(56OAKQqzD1Qka6B3NS7zsvF)EivPvj7aTfoFaoRV7sIxtLhnxsSoHMXYQb85CMT4eqWpSobtM5P4ScewYK8Jzs5JYXXTgNwE9mUFdmKnqkGuBMatKZ9QZVQapKfVlPSCAnht97iD3MD0r3kZs3PcK2DGFhYgDZx9dhqW7AKJeNfopDSWeY9xAW4fK4IY02rn3(PZ29sfyqijUtLwL7vyrTYydofvlu7YG)(PvV56oO5mQ466S)dCpSy0AzCLVZZ4mrqA8bAxGosQFtdnRQk2kzFwlVAuEJYIq8X4)bT2LdwP(q6Eu8ksRU5w3rByt66KzBt)3)nod2JGLJ9X1eTN921z3CC72ZOaQvl1zucmbJ3zLi8AG0ffO2e0o90mIiODlcyeb5sTIHPr5XOGznmIRQiFgNViBjyyLGe5ce4sf8h1AbMrJYkW0ADcUr(MA4OyeYI8fuxdTc0Xmz9umeLALNtOMlIznFhdmNvW10xgzKJrpoWiWi6hkRVrOa2324)oWpK)GhpdDGlQecsMtvEEwbGkz)lWDIL2NEb1nW0ummgLwRquRIXttRcSchhYi3fwcaRVGbNsXBbdmcAD5(7JEaeJmvazvjtkW(XOiBajtLWsoEfildfmgPFDreoGw5OqbHmA4w503ZxW5JbHge1SeuOQ1jySY9jGo0YSgSA8a8J4Lt7fjqMd8kZJIepkK1JSckXWEqu0CkgbxJUebxpPzbm(c9H1JwofJPiOG5ZhOgxKaBTrZ9xaVbWLVsMXmadMAju0bsxaqDDk(VTmQYbLqL7BfSFJyqsdzuLfmJrwSucYmqGMhNG(mkIy1zPbgqWYycWKZWyZRJeiXlXN0xaYmYxWYpuUFOCEc4VE8wvBCUk9EM3zwa0BKdzFTacBKw2oEEsByisfyiSad0Hz0XDLAubvhCch5yzgqtg9BDjKUwzewfpchJjRLHXwXhEGME5fPibc26coFh5Xe)Crt)wfG7(n5Dd)Sx3AvhtQUgnd0f)xhSHyA6fUmAdkidbekKu1oUlnC)Zg3yxigB4WO0L9qvDTQC6DJngOxzWXxzbTSaLVFqGNgUYqWkgwZ6)rZFNnBcLelZ8kXwzyed7gbsdrdtQQy01MgYRQ3g0iwhe4R2f)Tlsi8hASVBJ7qLd8wnhlZhLWZOhiXKpg)y6QbcVOcHPlWM(A(wiEYKVtlbOQsIQEF9DXBT7PxLZCrAsi7SoR9WqGzFQfqsRZEneT3JGId1AUZZ3MK8uZiWxIbqcjvvc8sk(ZBuGoreJjFr228IJ7pN5eaU6PRP7xF2tXz5LztmNA23Bcw0(lUghou0jtIHhpybdh)xZphQdgZ5KaFE12dCEPdUaZAkO0KMq(Q4c4o(5TmqY5uaQP54jZ(ZBNG1rdM0X4ZzjcW(GIIbo(riK0LzjXq6mNXe9fEdoe7kJh)q0NebRxDoJgIdK4S0DpbV5SMsPwYdjXzN1zc2LGs762oRQ1z)aMLF32d55ykGIBepji9xxcrSyxmWUOD3g0WuuhanpR0C6KONyzOFgzfygQZktJSxcdSrhi5e8FSkTrHAqZMPNnCVnSRFPKEnvfMk8BRsPKecv2ZXBGvRZKe8TaaDvAT7NAFZnH1M3)sJsxAZSLfsDT7Mw2sT0Fbfa35uBHCJY19m4SoVOiioJ8sBPJ0eP(UEo)Jfx9ki(tNZdsmjc7XsNPcS5YqHUxWZEzlNytso3REvmOVNTBTgPLx7OEvkP(tTxEJyig4oXGXXmqTbkViSLlPXSk6(UJj55j5sjfk7SUwUbBSxA3B7LIr5pjdZXFpbiJ4V)Z3C)BVdFAh1SuHEkY3WVD5D3D9NA8bS6b4hU9YpC5BU(MQpW)bra(WhV8DVT(TmvU9URF787RERbINosO(h(0R)VR(afYmg73DF(63upCQrEHxF3NE3NRPTXgabHdVE(7V8Jx2Kt8v(Sbr2yqDRbm2VyaQYtUoD(cjA4)cumBH0a4ZWSnImb8d4FGgMvMRjogQ9EXhOCPWhGKx4bJjBoJBRx89ubbMj)jfGMk2224d0VBO4dupOsRSVptcSzyNvMck(fJmeJZekZgB3AEmGNQzsBHtubZqMwAL8quGHPRVHNm8ghV0yZIIp4c9O3qLevyt6bQASZkRBa(c63JBIPI45W9aoro(lgniwyEblGWmjfXzl4wYLMByaZB0VfU0cILsGOgMNg9jdtFidxdl)vwwAZDy7Sfszw4nBjxjhngsbbFJVHpsGu45Zcojn6tyVXsCEKwydm5t(tYPcvEIzL5jpRS8e0GXisWhCyroMXzbsBtprsqAVZKFD)OrI18Hyg83opIi4oPOxXqpdVxKXgXjyDt1D)Hlrp5xtXESoRzscI72b)ZxtpJDTQT6pGf42E6ALbz)EseePrwFkVElQ2JUe8PcAoYxYg7lOZO2nCB5A3nV5MfLF4exAMkuhNrNHpXMULhjXOgDCkQlSUrkPgBR6GFgfhT1FYH(5pQoZYSUSxjjQv06e(0SrcKSZVyN)4S(Mj2)Y5fXfhZxwELR8McwaL0QyrlwS4)FtekbA" end function Gladdy:GetClassicProfile() - return "4XzTC19CBJRR)pM7ZBg(nPEmPTPnZTTj340z3Zm74TY2kX6u)rosY3UPp0)2pGeG6dBjhRMn7d1kIKGGGGGa4h0oLp9UPtwuCX2IfzfVz7QTf(xKo9Z8PtMf(3hc)BH)FRGFt38q2BwMn)B3S97zfxKwCx2Fxn9cO37U)(Yl8)Z5RECjsH5PLvqxgI6Sa1zbQZ8uFb0PTRwS97BiAWoZnDs5Yu4vL5pSS6U81zf)boM055PR2R)847XPCs1tRYMo5Qnvzf3Nop7ppFXIR3u(NVFv6Ifp9NxTo9HSY)e77FvSD3Mfzl(RzRE0ZjVnVmD2QS3KxmhOXSPtE0VGpFE1U0v(1Bvr(MVLvDq3()ZkkZ3U5VwN(V3w8xB2ToWvLvPv7kNfLfxdIPSQPF2e533TXtLfEcNUzdWjZZwNTPQ0lVOz62S0fp5NHYhZM7)nBt26WlOo8LsKalZsxvT03WISsqQ(yAr1tWeLvUROiBEfWDL((TWpSYMrC3sOllb550plcBh4RHnWpNUo7YTBQMK)Jmy5iMozZJ3TTkB9nRsRYWn8Zx990NkVlT4HSkGpMrAetwU97NVRi9TzH)miiZQ(qKYEQoDYB3wKxEZntNC)257krrKNVqzZ)kkTQ31VzB50j3E17)qq593ZxuT8Y05vBdAPETiGREaOzwq(vUkl7r)dznc573wmp7Q5B34zOC)VFMlnSKW6EEvXQYQDBoLXOtmYWbJnlo5H4m40SmTy9PmaJGz8d4BLNsVfIeNV3LZtRa9(tBmCDyvSiV0l2G9KtyqgMnytyX8tQ3CL2377ZsloL(l48WYOy72tIB0oLJ2igXqeHHK9iSKtHZCN0OsWrTOi9b4K0SISu402jmqfjK3LEk9wNyr5vrw2pYQkspjvyTtQ8JkF9JWBoPnMA1XNMVA7Mtsey4bEliec2fMNcg)aR1j1gJ61MFX0lnkHZySwMu6KwJD69)givG7bgQLzd1cm7P1gwo(vm8MRywcxJSYFvsTfQ4vibJkF8DxExWcvWOcmsg7WlGOLlVLfs0GwxBKn3igNI3xS97VnNSbxpz0fPTUcyE(jFL588Z3mFj0RgEb6s355IRV7UR)uWODr26T7B0nif3)AS551MD)nHQJL5JZvOjHcVkdkkKqFslavQ3axRv5fd47fAtBzuZa4jTF)FuZg8UxD4D8yxbC9(NY3KVoDvU)UoCCnS5vRxVd1PBy2Zssq(9mMOppBUnChtqiG(VGYRllY)Xp)6)3Uu4GFv6p)6D3rt3(3)m7a2EOBl9Zb1w4E45KEIxwCd4Is(gu5DE((ZrSNDo9zibuq9oigBwu3HhldEfu0H5649xzlTq6K8ZS6Bn4l3I3N1V26zUUI56nYWkFvAzqfyq7gAtsI2YzsL2bgTAz3O)wMnulvnsVAvCodpg8l42y5)zhODtUnsBMOOm47M)pLwPBpZQPr)BH9m4Gv121b)ON45TN7mFfrwUMZSVc01XTViYEwIGoF53h2J4sMfCM5fq9bzAW3TxbY6a1M)5jRrL8Aqwot)QqxTmr9kqwNq8Iu0gGScL7fXTNPJQVKHlDB9xPbC4)fq9b1FFzm9q7Cg7RHcHqNWEnmP54QxKW9moT1LuFXEnP9rR8ci9qcyR8vXUJg8G8fq2ZGBgAF3BIPToSg8a6fq8HV34vruWDVgBCsim5xKiEiBWMx4nrNXnDuI97LUUkYVghPDCZRX9YqmV)ZYTqhB5wEt0wr3y)1DEB5rJSieMMpBwq4bz(Lr4f3KbHhVPcOj6z9(EUVVlY(uHn8ceDrU1y(1xmXOk9cPtiVUKiTjMpPQTV6Vn7(0DRQGWlwTk4x7h(YNV7D36FAD(giwoldZwZVF(T3E11TAGj0HSLCZ5F883E1NRBaCkNfgXNo)9VR5TivU52RE3K7QFRuiTje1)41V5)TUbT1fi(BV9lx92MUlTUq(YU963)LgAlnADi3it(W5F682CIIRqfRhBLt7duaq1JwB4x0vkhufVuBvoM0bUGWssaFDHyoujDdC9GqCUegIXkeovIZOTchfcde2JgCrYcN)zcRMBGnL6WEgOLzd1s1H5X42Sv3SnFtfC65nVlSF2dFINWQtu9E5oy125FJsuur66SMmJ007M3fuSBLwb2HNpAh)zNSZ0gqGiScp0wgAfmT1WyEXV15s8RAvqgAmkMb0pHWat0sbRvOJ93YSHAPkUU2pC8L9jZu7f4)VWr6oys0oM)JNPRWr62z7PDk07WteNY8uNYotiCCuch0s8r1NwfZw1II93HUOVCGubYjqXiM1FyGoMM5hdeZAI1)GqKOtcVbIdi8cPbcZaEacx24)vQ1(F8BRH2taNd99p(RsO5(hsyYqh9jn2fiqGEoorxWQsya2e8fAUm0nQDEsC(ItOqH)nlorj8aJj8hOd)YXhKkKqoj2rTaPKb0arkivyhaEfx0ACKCEOJCJMhwdcNfjfWCy74FMOzH)gSbsKwImLemWewLjIabGG2PfHvfMkxCU1ctcTozgAUXLHc0YXUOTixaEgg6RItmmAmfEq7cnyCeT8bwapyzKme2odpibXoUKfMqpsymCPR4sKtf4KkIIBTmkvXPsWyMWdjoukZ5CloehUO1c8xUw5cT4mkl9cg(qIIJu1Hssp1r5bWx4djj4AGBDwCqss30GcDHrAP1IaFrInmuDC7duMXoAWhS4aHPcL5kwyYHwXzYqQGGLLKAL5ajnCjPr40Hjvh1uesCYDACeGkeUvyX9cAhdBfK2HrlbtH4AJtNnIczb2rldfcC89wl9dEKrBjfcwcj0SjKQUIEaC0nmrmoUgfGgtcrsdPNXrLzHssKbpNiScujMoWd2gObiOJvQKWdgPoEsLiaYFAfUxgCaW)6e60dnoO30bwUlS8nOoOLtcfPj0UKtQ1WHeCMKss2ImKLtQkeD4cvTajCURQXUC3RQUe0evs48lytqP0qay4LlrxgoLCPtGIxB921mzdLNuniQnkieeWsKK7C01GpmylZgQLECyOnefTUm6yzhoMA)2ofdozCZ2c4kI8QFH7e7lHRbyMV0JC5IvpfyV8)O1vEZZjih8c3ITF)lp69wVX923eZ(CRK(3HZqgbwxWQUk)XF(vIjM2tbr4N(ECJ65iuuGg4(MaCobF3BC(OJdrgLtdxmbQPW)b2yB5q0)O5sh5vcVmVn)jRYsHvmbJ)SoajeDg8m50AuUg1UFxpIYBPr22FhkSqwn71cCVOG(tP)TFlVe8O)J5B8avr6STOztbP0IaHoTNFWH3DyjJevd2lQHSQgeyG719OsUi7Iv5)4hPfGQqaTS2QwxdRQOVv(SsslQgiZ8k277d6ZPWr7kKhG2gbZWlJtxNSkuhinvYr7nNoNmXvIVgv(2jq2)E6Lqynj(7E8Oue85bcWs2At5e8mE)GoUz5tL5GI5ZfyELVCAUGmHdQp(NNTTQA76pblxFSKQ9ws96RCteqkrq42U4F2vKgvGBcCQT0CWBm8rgfxHbSSEwyXz9yd5e3FPf573LvwMfWUKuNAxAo1WS1(LXv4jSpT4iiV2wNmI4j4vBG8FeIxNYyHFc8voWEPG6XIC4KB1t4owiyf4W87U4lxEPFIbNXpiRUndbCO6WHGEZoQzrQSS9ZdBVZs9CeYzYOMdmWJtyoAT4Tm3WZISx5viQMrYyg9ixly8HJAiE3(g1aWqpg1qGqp2hZINBJhCND4fIGDWgpga0O2fXqLgjBzm7NP9NBxmeE64gsiKTXTwcrWoQzrOf2rQRaXMzhEw6vVxQ4dlW4hUpcld3iNcbtRg5Apep9Ogr4E0Xnc5ynq6sCdRPmWsFSh31hI87ZmcfeK2WAJ9Yw(yr3h4ONXSTAyUQpTKqG0NWe0XmFYWwthYaHyKB6HeQnQrivMJiR6XsxiG(rnfHK6nQriHy8h(AH(3ZnJFwc5WyuBjHSDmQjbZZ0OMeotypIQYHBjy6rhfBHjnCudjKZ1rTqewFs5g1KiKjIH3t09CXRsZhPTuPuCqboDC5Rp5XJAka3GoIML4GzqPvhuaAh9uOrnQdTGxahuXypZsiKu4rncjtCKlqgWE1r007zDabwEeN)6BRtjhPtwvDZoYjuWYZE2ciUUKMBd(eFVy6gikQyYi7M5ijdCRZdFPd8wtOQZCegKzmyZz1bg7d66WVeN6qYXazJKvzDsW7)KyYL6KRS28bqDv)Pefxz(VkfVeVBc7IqVTO4dPRU)eIYmSfLT4IiqvGNnyYFHlirGlycmh5AnMSzk51E0MWxWWK6BKiUrwkz1jMyQ9Jaxzvy(NnemkcbHwc47n1hJdtnTpN51zChZjDIIYrpM7BCacghXzrWzoIwUeKVuoeKbH2HCKI6k4lwG2AjHjIYstVKiHpcLlcERBXgy4i8KkINcXOc)NrrG)WCMN4q5NwerTrG8JGjraxmgIOgoIuGGRnelBrm9SryKurqf4iatquZi8nOvTWdGuePciQImjcKaisQLs0MkH7IncuIcbGZpZHzmjM6)q3n0Eotr4pGqOzrefjAACemrieNcRbziyUWoaUcGKJLqW9bCic(LJW5ZQiiquIi4JorSR4QIfH30GRBeIjjJjj8ojqqesr4bhIHdhH0aukjUKJOAfXottq3jIOPOnecTafrMszif4ecOmGDrffrezmMOwIHZkebgkGLwdH6JXf32XvTvgrpuHi9fHxJWbu6iuxucAPLGBWsbbFJJXrrbcBhHtOq5q0CI8abYLurBiCgJOhtqW(4sWnMeKhfGQkQ4jueMymoQ4H3WhgTdxha3HaDzirPbLoKYcmBiGRgcZndHGMisMKiusTsS7yYkEhmr2p9MDm)DqM8AbgtB4DqgP1BEmcGdlA)L(wid19eCTsr1XsoPT1m2bbSNnp1h(XtmfRDmkJJdCXtlbWBZlZslZ6LVI3RfkyOIqXDCq(Vp8d5PnCcrSJA9UffFE3QvNqAxJziToL48weKUkZD4c6n7k2B5W7KTAtlDPb4IlTkTe0ODAPh6Eztnh1jbVE(4aqgrX2dTUG(SaCH1C(bFTku5K0xzv1fqZ)506VzBE52n9UNBAdU6jMlAeGNN2KUoFo2D4mXttVeUnmX6uq0EAwI3U59)gCtrDwU73TR9Xv9FfMWzrSsjmDK1cUA1dbyXUL3p3T9Cpurx18522sa8P0hYN3NssC9FwO25MNhuCV76B6SP3sBE5(5z3hICpFhpXVeCIkXEhkZRAac9fhB8K7HFRr)ckbDaeSUinN4)gPV4qFJrkpjO48ZVEjCk9NF93xMxLfmewJmJWsYZgJklhS89q1KlTwlC7o4wHIb3QysAqEFGwMnul1wI6GugDoz)ZwfT(E3pKPmYejeeRulLW9Y22q92FlZgQLA3UjGV2huWMkXDOYmK3uMHit3a9yJ2upLyWF0(lZSvbx2)zR9RgJGp9yUccxftv4JKNGfngM17lA5RyDvgvxDr(IKb7m5SyS8qoWpEUiwZyHyI9puxCrKlKqqcmQSMCK33sQl(pVvA0XssJtoxhRjnWj)ekgco9qcwqpGjiQk0G3GoyyJLPKZI(74yQA2KQno05WAh(XyGdmvcRBjObodI8KqtL9w0VMOpF1vle48evSFrh3IXau7oL)B5fL78O7Zkj5kEmSG66asgQr3qFOcXb85MQCNOZKqtKGweRRlzCJ0MiixUIrre9HZf93lwZz1Hvq(WXteMyeqKqKcvdlO4aVyOkSlu(svDpCCcX4h1QR)0nn752ZHLxzWC5b3Zw76ay(lwpl75Uvm(40kGiZ2vf()rcFoaJrPV8U91H)gFK1tW)F5W0jR3Ui)(8ScFlWaQ8zEaMSukjei40t9wn7Hix6)UH7NgIgAe(6I9Kq2djop0PF(1)hz)0PHmlqp3w4PK6yusngkPpgL0JHsMJrjZyOK9yuYogk5ogLCJHsjhJsjJHsyoxhIu(eXDY0QQLFvD(KQPRhWQ23cMvHR9GRGLEWg91kL3VB8AQ4hypDOB6(FSY)6URu7DYvBkXVn721Z27c))3Ll8UOv7gs10P)3)Iv9L9b" + return "4XzT8S1CBBZS)yopxp4cbiWJw2XjEoj2(y5m9RZ0rn0s0w8l6I)iPoPUpKF7FlWUG3PIyJBFiIMayXIf79DzxWx8WI5pE4PNkM5(NRxUF3DjRwLT75f3WPrCVCE2FLU4gHCX8LjfLZsYNTpFvA(f73Sp3bIeC6lUHTy(Z()n39VLvZ)FDlaP0sagM4fZxLFzwrYJBsVilF5M0fpwd3NBaZRIfmvSMXImmzSXyx80VOIC7ZvADetZ4W7JSkPG5gr627XgjFSraCSmpB3xtl7HtRtt2uUgWQBs2ME1(DLizGlwmF3lpSVmD7DBsktloFZlRtoFZ3sET4HK8Ntltx5wEEYYSKn3TVyX87V(9F4b352dLLja8VHDM19gKsoV8v4DZVExzA(tjlt)9ZxT62Df)(73axhV(7xVn550IFhN7Fu8FoKKNU6pECZllMxSoz1(VvK986YhY2cqcHoV596f73VbM0U3NV)BxMLNUSmB)UfZ)47UcqQ))08c4p)JTj)795)XUdB9l(52tD2Tp8WTFYFUZt3U3Fowm)Y95zf3DhC7L9BHl4Fra3qjhYt(ywr5LPpLCytP76uhhZC)MUZrKxTy2I5VKNbaO81f3eXC3cjl)kaZ3n7ZxDL7ArelaoUjTeUqQutBjYOyMD0LWvvlPApysMzA7HsjN4zxY1A(0wIqQTrtBjsoNhFkN9MuyZrixdFPOImtCxekr8uplr8XjyCwVRrjlsn(14a37gRzCUr5Gx7rMjEiIIyrJtQgCt4SOX3Kbo3gUqmnKkMprMxGpC8v40E2vIYePpjrWgNAR0ONgwPerJVIH3eTDQ0krKqn1JIrovTCgyxM4MejNSyRrFebKr0NieJZmk6ZmkSGEUPW9YTk2uPwAB84h9bLPeARzQlHPIMkbooEISWC5rSJmSIu2uTjamx2tsVytBcc74YjdOkvWyh5AFe17QPQgcmvjM4UWzI4JC4hYkI4iwfgEpSQ4X1XpIfuXruqoIZtmZ4NKHzHnXtL9sgfzN4s4GsIXxYGiMZu9eDGqcwugNLCinrXSJWFnm9sOMQlTsimMjYskHivMKksH0EecSQ)cuSJO0EaPxnBIUyhpzZOsP0o(Mm4TrKksood)a346OjXGOLt1AOLnvcLrhnrLjg(r0xneBUwFmxTgG5i2mT7Usx0G)ncQnF)HDRcb1(sA5hcbF)q6FwEihGZNY2LTnzdewPBlOusayWsk62wXwRH3VjPWN9IrswXvAL2ckJHa6Gqb4svJKim8i5JnsPlA)DpNEX60LF9bmDcnYQr7ChSkFW8S0alphcFUjM2oTkNzC73l7)wAoa7pK6c9hMOoKWI7sZxMUReiUUBRa1jKdGchGXqRN5m4fBJDpibpQv4dUipDpWm0C8H8nleiN7bUKHt2f01mxW9A)71AJFM(yL8lLfHp4n65Ei2qp4IBXdcnJHBSX4FdxstrAKX0QDE7JZbKANroZ7HIXYWTMtpyvseUrsCXWBm4wZ54ImGXrpAYqO5qt)dcU0I7JZr2zbhu9iLfxd6bQhC4isbqwqCHP9OGqR8ufVZx(1gRqCZ7EXSGhtEOj00fHeHVeo1i9NRrQnAK1bpbe8gDydyfD1aMi54EfjXReH2G3fWKn4MgXnkeZTccnIIf0q0TcNlqa6n7mlOx1pzBmUCJs7xLMiAEV5CRrRuEKWRhZpZiRfrgNAhpqCNKY2s49KpVkYW0alQZvuTkgqwu(dKzvcrCml2ausfxlJQLzhzK8Xgjid9PK)0HzDLblExTgVCFM8(1SvLRVkzzjGMo5sxsU862Yp8sjUga9VHxl5w(6lGER7w)ArgOxYl9Y9sYbPAxcr7o9pSFZRnMk7mlJM(zk4jyjrDxYvzo9JnwII1yh09M)55lt2n8k8BGP7cUjbvb7v)a(828q4)ByrYENK5(utsRYVb92Q5h291DGwPUl9Z0RX8itk)chiUUhbiFVZQqRnQEt82loF3Y1WfxDsDDkIBChxNT0U3ZElCPRUm1pf3wByb5zs7jioRq(BJaLj8jJdEioO5s5LDCPZ2pUnOxe)1NQOzoFgqTWCPG7L6q5tFsBClJZrfRExQCRJheoj1jHTlSFKEszqpCKf1tiyXiIW44dssjMH0AQeiK0XO2djyXdNGl5dZcU)63ldPvd07H6EcVaqp)V82QoLccnbHrsznJSBi8aWhASh0Xr(nZe2DFKq4jf1pb60XdsKocVuuG5z)Buwu7dOAerz09B4bfQAKSwXTAuZwmlOugvccexsHlejPFgEF687gh1sJk0OeppJs17mpDf3QATJazY)G1q27CjF1VwsjUs0XolOhnMEbZ)azNfSdycBcswa0dFWskPDzserqjXJQrApyVjMosO5DqTUFPQG1rGPgNOgFiMfuMJK(i0qfmkYQQjEroCmQyQ9GuZL0DehzeueldqUWn3Oi)eu4EbCB(FPloCuGOtgNiptipgaZxKqgdDLanElyccQW1oNqiosZHG8qwrPKywekIus2QfXwsqicFatPN7nvUUahlY8lsbJfiBm8dbLyozPvQjXnY2lO6GijcsSlk43sTRb49HZZB3HJiz08c6v4b9iiLwIhdnJ2xYpbJI8UJ44b6mkCetZGUZJjVhSbxe4e9boBU53WHZtU0FDRmvdLTG1)72NdkwZk)BeQqR6FrvIRy(69F7Q8S0DRaZNZWcy95xW6Wf8m)IqebTF9D0jZTm08W5llpagSFS2956X6vLsDKrbQnbcf8FG8FJQu(wgGrZWCgJ6ZjB6LoJBbp(9vGeR1N3cwV6C211NloKxK2c68wXFOBhVZT7ZRSwEMpDb(4FWaEafyT81BySN3f7BwNXQAhd7)RlUcITaevanmrkMvd62E6xazG5)jmcdCx35Uly(WBbbgr2)4v5p2picRh3xwUF7NsYFoBxiwx)jdl(jWS9xF)l)FhswLNuM89V8WdTMqOoSNbyqPVQW)abhytRo(oxlD(ICkYA8k3PPabTo3DAs0Cq7e5AE8hwU4k1aTLbGaczsRf8YgmwjIQKbWZvJZxi81M()3euWeIgwFck(5QfVtyCv(hs280jCKOyW9TXWpRwMg17FbLKbe6JGhxbUVa2CuGzoNpfstLCEpCBai4iept)MJ)woa78(SI97gKJsxt8wnIK3WCax(6UKTzlXPpZP75WUYGAWUzuajhxb(OaXEAvGJJGOPvth1kLMb(tx27QvE0knpoOtIqnnw444CQ3bMMLE9WaG24awlBhZ93xF)lxDyZMV)LFDDwzkDAO7lEiqUMYgHdtxN(XzoAMJKwjOFwQKqmV84Mk2hEK8XgPLM0gh6ggppF3oG8V0Z13IpSloxLWlhHkyMRTzBsPSx(ZVCyHSgKb)4xbwFma6YaFfDoC7SOfzc0KqGu0fvF17lQ7lK6GQQVd66wW)YFp0sXtLaMPTLGFRXf3Jqqzp7tAylLhdR6WteiJ6ZchKgu7bcLVBOHogqxE5cHb(ydgZ7tws6KUaUxEgo9P(4el2KM(I7Hgzp9P95ltdxozUFVbCNKzXULQmFtr5HDNYAarmK9z3QtEjgnUnRtY3Eklq7scKBp2VV8uMVYe51U)1Itz2Ggr)Sx(6Yn73LEklr7eCC(wUmPeUUoTTHJYzRa9KohepPtIMfJ5Ni5uMTYIOf4kWZ73v8yEAciADclmIWn4sCc0yHFVwEkZwZJ8yw22xG3CsljWL8uAs(PmFxsjw4ZYsLIzV0rd1ch3UtdR7E7eUhANY8GsSgcL48PK35KFhRLcR7mnz0Ion7iTd2(wvVE72d7s7ypgIkfnS6YawLRxoCRro3dou3v78Q6MG8x493WR2JIKhZJ0LzD0z9Zg8uOp9Q095fO0Gn8ox8TkiyPlqrXXA7i)C8jt)haM4J1(h0o5soZXNJpp(hFkX)OjifXhP1R8ZPSMr80dJPk403TlDRpY0eYE(wGHXtVjlP3NMS6vh7tHZpNhDyIBfpwnHpx0K13nWQuxApFjjV0LY40Id5K36fO5iyzf1R4H1WuwdMy91nRmyhSJn7NYbpSR7I0650PZsB0XNSMXg32pJwoS83GDTvzb766Wh37smRJq0ABOnNvPcWpzNawszimghNFh3ngqOe0PKM0jwywhNY9giPnQDko6uGd6CJhtiEry3lZE57FHKiBvTWtG3Avoe7zE5XIOmE4aQjTE10Ngzii4iiOy1PGSauS9Xmqr4nHaP76xuhUN1zRsNTj7V(RKC4ebNRDj1aTNk6v53aERFcX32mcA3wtiUJ1)RNeTAKk7u2KZOeeixx0z2hhWHt2ybkOIKwDehCLgCO2vhomU4NhDK8XgPS9HEWkxulsgjgKd0FXRRZiG7f1I1TpmtsmTLvLk3aUExrR6GpCP8XXE)H0II0cs0P2uPacAUcZ(TMDtFZa7RAgGv5JNDMMkVXaDuXUpTaWP1iMl3fUpjGiBZCN1msKasuHBajd8cnp7XdLP1L(d0EVzZI5GiNltfZXViGfZ3UFv2tza37C3nwzj470ChaOKRGm4lcfeSdqUA)YdfdddrnmEYplxi2daIZ9t67F5)romCQbZkukD1IqPghdsrtbsQJbj1uGK(yqspfifFmifpfizogKmtbs2Jbj7uGe2pBJbkN6)tgwL9t6cAdj4FqFtPntGYKuL0YIpjJhYDKtcVPATW71SWg2mfbRBNvIHtyRV2UZcv2vkzHsSrv5KjWkH48jEMVMtujm5y5z4mS6xAj1rk2iS(EwDOiyHIdzO(qj0Lmv9ZHKhAycTHQxeydOQmuyLXSru1wJ1ujJrWY4yPjfCMHGMHAUKidwqonvpZiAMwdw1yLKkFyumT)sccu7VWvrXH2tblgMYydLEeX0QUErBPZpvMtLiuEtQxxemjwBsTMaAOnwGi01eghJvSlou41iQ2Bv9Lcmd)(w1xkrkGmIqbOvbKKk3hw94QwzYH101lvQYyQ2IHozYHb(D2sT0ewFFnD7tnTeSSq)iHuqcQuh7Wny)biI1iQb7goHilUDcMLkvoGRiosuCBmYhPPQddNbIrZWXk3kfHk3YOMeqgrWh2p)2XXAj66Gg8cvASu5QLyR)qha32xrZOMvcRfnvcAfv9)q7aP0y1KvHsKhr9VK1IfhngRMmvRyhkgOGicOe48OQo7iri7m14cmgYdgPrWjXAYlSuPWd1Lm05s2iQg(XK8b3WOI(YWJk4bHPIVhXDefa(g6sok0xw1TJfJA)cIQatbjyapmwvCtGJsvDXryKbPzamXQElcLYLAyQQoYYG1IvJLVMJxEaNEqqYsLETYrB0xTq1wIaCGB02qsMx1Wxij3RPSHBIRY7MrI1hTflR0Z2UFcFj03ISQ4shnl5rGhSUV7pxpTfRJBKL8HhjFSrkPqjUiuhcYHpLUxcUpXGS6eMkDsgjIWbQKkATPxanDJq9(0n3TpBxjaPlE3np8U7hFkI6PqrZIrR4ZqG7pLX9AW5KMvI6qr5(T(YOm35S6XIPIH209GLR4SUj(4TaUUQW(Za2ZSckmwQIznboyMUxxXpjOpks377z4nbSgz3Cy9wawDuVUK)TaSCM6Fe4QK9(yKElaRri(Py0gbSI(F9MtcSUwH4z63C83g8VsTUBR(pjOpk)7phsp2nx)CW(wawHY27tP(TaUgEVVJIjb2Z40vNTktpvG2vxOFcqpgbU)NE1BbynkE38EpjWEgyzOzviS6M8WkB387pjGpUDJ)rifG)Z)dawj4u5pfjEmDW6FslrN5(GqAWe7UlnTzK)NqK20)d69TaSC1BSb0sY1Uw1KRUbkq)cnEVGRsPayMP6BB645SgRYEiFH9CBSU1463eIH(GPrXago1fJ9)csQ7OV(NVw(((d9uoRFjmV8aGaz(6(A67k7V5p)vuXbkRqfT0L(P6g66H9N7CV)6vDAhXjL4Ow5GEzMF3F427w0mrXnqPxAqWhk4NqdQ267ajCBDV)E0HTHuPp8Lurzs5HIhd08WPx3j2PjDoBLGSAuI()1kZD57Zh0Wh(SpAc4PTUgy09fU6RI8VE(93F9TngGju(ok4UZ)45xE9nvdGFtsWaF683)U63Iq5U7V(DZFO6TsiWylb9pE7f)Vvd4J9fE)L3)5RVSE6(oXhE993((pxdB8licE98pC(NoVjM4(8M8sT0Lj18sU2YF(Jv)PtN58Mnk7W3kRh9lpIICngca16YnueZ1fu26Y2mYi5JncGbBWQuoBrVYl(PKNZw2sjsWXdnPZ2t6sQA7OJR7HxR7XxkG6YL1TfTQ7SIQulCcTg4aDTNd4BstGTH2ShRP)D)khBw(LrYgRRC2dqNgGe1aTcfz3TYULH(hPJJKc7QORb57ekoztcWjC3SEI9c9JHUvPjXSsjB)Vwj)jQvHYA)HW(3xzZQ6MPX00iZa5hzzwvoukxS4)UX05ig" end function Gladdy:GetClassicProfileNoPet() - return "4XzVCT1CBJRK(hZ(8XfUrqWhTCItCTtS9A5utovnLMqjrBXn6IxkQnJZd53(PB0niPejLfhpoVmwHeOrFdD)1naNjYj3pz80Dp8W2r4)5QzBwFB6855RFCY1s(n4dhN)JSjxR0nh85lFArQFyZs3wokTy0MI5zfxSz5McKSPtU0QDcHZjKoNvjCYjp8VImtgxm5sNmXe7IucJwQ1Xg8nrtg)yVVzAFVPCY45WIUz58nFFnZtIZCtgVDrk8OT5pUO8(8vzfFbEoZ)Dn8I0z5PljzyC5ZlZMm(Q1LzfpKol7poF(8BwV9p(Wsq588FC1Q0hZ2(h0y)ZIn7wppB(FoD5tiR8U8TPtxMDrEXmGgtNm(PnFpR48zL7sxoz0KXLf5R)wwzRH9)NvSnFZ6)Cv6)7MI)C9UvEvlXvhWVvp)9RrAmhj7S8)9nGKLvo56)Lc0XlYsxwUaSkxNUk7YnRljtOunz86NUFtz2QBxMwMrwXZx(90N3EFAXJzLa5MYQPXl289Z3vK(Um))eF(cqDUevPxTgxRrHf62SIzzRlb9c(S0sqkNUdip4iCT3jB7tzlxozmS6a)mzmTwtgVAZ88hYZkW3atOCZ6jJbXlDwzo(ZsAyGqP6GixUz2UTDtdvnnEWpkGe6oiX5(b9ZV(FP7Mo1KzozWMJuYCmkzgcLIogLIgcLShJs2HqP4JrP4Hqj3XOKBiuk5yukziuskogPG3E60QmSp82nGB4Dx9HpEpgb43ZNxU4sy8qCqCVA1wX7Z(RYDfWY9P815RsxMV1h8YV7CwkegaIeLufHOv4u)(EiOQqyItsIeAPvyT(GQAFOZEEZ0(EtjhCcyTpMHBQHLW2ypoUHViD9JzxSiB23(yqmWD4pLv6ftuFgIQ(lHHRuMe7SFKT6KtHiMFOyZ3FxErgB8(T3F591cDJWNCmrpZJbTgxI)tDS27cNvpW0qkdqrbXvk3ScTQOdYS9f8P(0np6)Vf4)17V4jRmskIFdORtg)Qi7zjkIYNHwHdiUwelSVgQ3ltNiEliRth9gqwRj5TGSsr0BcDJ0jM3aY6uQxLJwpKvzCVkU9SOG7lr6ZIA6)QTw9RH696)(6y6(SC243chcvuI4TiKMtAEvk3ZKSPlXtAztslILVgs3Ncow)Me3jsQEnK9miZqdkFwITPpCusYRH49N34nrviDVfgoTkX9QuX9fd2(kZeDgcEQHtmAlD77i)wSL2jTVf5LLr)dNaTeX62aJ42gWVECFyAJU5(7V5tEuzfzR24ripz872uKV92BHfbRjTvz2zLvvadzNOY(6es6bCN0lYeM7dHUNwaI)fqb(LiysUlir2jh0ZegbAINlQWj3hE4)r79XHD54UmOAK81LWsDX7V((3F3KwGZVA1QDRZoW3fcSq(UcvTwPwk)svZfGjW97HSkxwK)JF(1)NDPZlslt)5xV)(ai9pL(xOTDAR53xdiO6nWcQQSKc03IGY3zZPo0GfgmYB9z2L1cyBoj4EtIyDpv0g099ln4R5fxaZ6rWP03MJXBxML90b7yEytXSmKXrrlh)71sTvKG7igpRSy52YDRpL5eLy9L)uSE(jpfNLwMfPfRoLjyvcmzZ4VT9ugTccd7DaNLwwMvCAZrsfXb1qJQnW95eMKfZ)JtA2jnAPXVV4HS0Itz8kP0lgfB2CsCtKZ4ydXaMIYpLSNWwKTEw2jnReAwW2Qh3SE70ISuOC7tyIgwjVl9ugDusmPVkYY(rwzr6j5ch5G9dWSYx9e8KtYWu5o(8SLBwFsQaRmMrWVxxB9DBHQK)WqBxUHC17on0zEl3I9JpZ96LATle(cwKY8N(5x3()TdI(phy4LPB9r5)L0FJqaSQipyhPWeEV2otpl)xd)xNBOrFzslcDlkrung(rkBek2Cow0zOUNt35ZgG(eZl6m(Fdzc7u9lz7BmNbPjzNbstgAFu35yKhMJjC6ip28KrIvIOyuj6e6yNlP(KrSwJWkKWZnjrALOH1O73mTV3u2ut(UShs3TSCm23tFS6p(zp6a4xRYxJqMeuGWF)87U7QBA8cHkYhi62Z)TZF3vxx9cPql8Z4tN)H3x)uIk3E3vVF89vpvR0Xjm1)TBU4)U6frXopXF3DF(Q3vpCqN4tfD3nF4Z10wBJI8HDg)XZ)05n5eJ0qbkc2MoB1kNT3FUgVFD2QNrNTMwtVh7LrXOvbIZBejjIyuBAa0rPRxdoPZYwbbXPwesygVllD(ZOl62NYMH)nZt6Pvd4ZBPyCuGhVZCgYopLwu(mMwy7Ucg67wCCZXPTTEg3VagYciSaAm8PC7bZNQgZxBCO0UrBaHvhqQ)nqjXUjO4zJBvv4tf5WeaM(AJafV0zFdOX7h95lVe5lLRDn11trg1XuKkD0HLz8cRI2eloSk4oxLQ1W7OoO1qcPS7NT6usGnqU(xfDN6lv0qvXsNnAGYIsBB1eWxykwXaTjkHOvrOVWuC2wDm6Lm8sLQFbrjAz41sP8W(u(I(JUJ4C1dBH5)g0uKyIZboLiJBOYsKYoqzbc1hpqFfPnjU)vPt)EaIA)kmzB7iigUbUeq6vZaL9OOJe8QBrpoEGo9qT7dmaPlX1VNspI(q3Uh1UV7VWmmga(3WylyZBYHTT7fcBB6NR6YlbczFs5f2lmFs)rt7laHAGgDhi6dBgAJ9i6QoI05HrnOLiozWmLw36mQEjBUD4RIX0QlSVGjXQhAkrWUFKiJDB3fQ4J4Q02Kit0Ub6OqWEh0uIuM(Nrp4uuQbM7rPtu9BtI6iXRjsoWyPATQ1XlFC9RtpqXaGbDeplvRvWezAD8)hDxO1mOnTakGwNx)licjIHImtluhjbspXRoINEhYHkP9jqCCtNrpqqwLydQsxLXxtgzZQyQFMV6(gxdor7Me08qhQlo(EQqnS0mUA9Qg9c10ewSEVxpnlWYF4Z71w5)gTByVg3uZM32O4wuaM37rm8pAlD2tAiPeTrl3m7BKICw(5RNTayHAvcYCnu11hKWHkrVLoBE4kgccHtarugHrCJtIXFaahGe74tCq2KrHkAGFeJHyH)I1qocZcA9ZuLaLwGJp8xazGe)rIq7hi22xNNaE65tqJZtcbv8poHEqKu7hg)EkKoUEHfeJ(I)BryHsKEgtHTnW)xj9dTHieg0AKhAorjBSZruqBObGfEokuBi(ePFGsBK0ldGdjrkG5O3t)tFjfiLumtA1etPncV2ZLO8eWJA1leXg)s5cRTVEbsofwETjXWyneZefftCrusIFSgjZWuYl4hro)lSoMw4fza(rSG1HG50)dnO2jrg7a4io4MF1KAItv0IQcQBeH(iVwLwkQStCQosl7l4Zpfhj0rk6Vu5tJ8LDgZpqq)iXijQ6injsDsFa8f9JKesgGaJX0K0SVPLu6kRoMLff9GKy)uJcMpWzMgOL(rmnrcjc8dJWV4WBPvYYUGsqqQCM9K0k1ShHlYVOrbpfLMwCxendWfImfXKTGTy0BbTTF2AyFpjBsEVrqjRObgliLGKEECm)hAldKcJCiejSsloHD1n8pKw)i0cjjJeqDIKw2ptsoZkJMjdTpbaRqoX8gEi2apbfVTcrloIXa6xEftaI)8L2mIbiJpoH39WZdgnVHv68IVL8bJLSsrB9Vxlz3AytcTsaAy)4PntG2JDvy6ivMkfIFFxzDV93)6CFj4jA0W(xiMGXeLy5qYHgt(l5yKNxFuNo(a29rK)LKG5W(z28ATZQQFj8XZGckbmxAnehhCWfAf27xZeSDQ3UPaYvLx(3iD(ENEqZMqFjEiOZxw3h6gxJ(P1dfFnEdj(8t7FJCViCYunaUCIhQvBqfEEODxJFjcfmqEJv9z)CcNlsn8P9ozeJ1boM6yrcuYLWfoLd0wRK2yneVsJ1WinnT1gHesPhPLqQB4H12ATsfdzjIG6laBUO15S1)LyyzwkOai1qJU53eY5zAe8tBin(bU)TlU6ESWNkMOsD144mdm1Ns)l0SUfCh(T81z4NUabHkqZPn)Oxo88qpO1((N166YmlV5Dzam813qdaabEjWNNnAz(p(rAXC(EW00R5gqycsmI4LLLgFRqOaMx)BwPWWhJRL1UUipvoHNORe9zIWMQd03nftgS5Oautivhf(w5yuxcfLLdcgZrXzqvso)HGsldGR8tmMt3KydjNdqpJzetwgiKsX4DGOo8ySok5cM1RkNjLvjXWzzPSx0eGKuesjfKjLPfeWYptJJGjazNioYWdnXryyJ0mQgtmV8AMeyx1X)DKjMEHGMbsQaIiMrv4vzWZFuwVehP)IubCxkIFGyNeKjaVdlSskxVsgzzwoMqLhhacAcWcKeernmcsw8vI7)bOfjQaQQatsqbavsLwInQmYP4auhdbHgxz)kMesE7hULT5cdJGGabht1eW006yGEurkQylXqWArdaawqKdcGjdCibF1Xi1JnmigJku(GtfgkjvIqbkwsUjqIAHqZvSWWyaiF(F4iuyscuc4uYCPKWLgq)gXGVvb8qrwUglGIetzSSdCcd1fyxYrrfW2kuvAmAvJu0ybifwg3M1fm7KuhRd4)new9aazgjV2X4Mmkw0sidSwXaWCcjPkiG3msFLXr4Xc8adtfsHZWKfcMEcfdCZLqgMeIhvGRk54PmmQwHKC8OUs5NTJKdG7iOQwwvAjTd7SaRgvYKLrnBzmWQazsyWG)1KlbKYyEjna2m23InaSHUkw6h2LTDBMp5)HDX42fpVnhYbTxurr7R7qjEoZJQV7hdc1YEnHy6MYYnR(eeN1FNaQVeG4Py)ToR0VUrmGgcyHgdcXxgYfw3(M9X6niE9dl3SDlFpz(vHADXats5ZRXFLv1FLxn)0XQU7pnFyqxDc3MX5h5kzwLvD)VutpQt(IA2eWZXxn)Tqy6l(Dwv9HK1SbzQd0C9WUHIFEC)VNybyhWlLHd2GQmv3AgVdpD)vDe3sBaAILiO8TIg4KiVVaHHAJG4mwiCnxcwt8Wn5eG(M2B6Q9kWp6wuLs)l(J)1dA7JPlF4emLpvJFC6(ORgY2I9k8GjIVcl8EYLwgStOlw7pX4Mc)j4o8u4Qzj2RCPM1YrmqJNSFjUVCTg7vIdHKSAJuBbyEb4tvuEK7)9zX1ACQhVTqJEyOxyazPBZ6KAbxrB12Jrh7ElEI7QdrfQaYIHkdv(XAbhkTxVB5Yt4QUZAXwJ8YyaNew9lumveIMI3DHnuqaz)K(9CrqUY4QAY2JIi)8ghZTsUBDVVzN7UU2xnRoOFxb3KdU27ns3UjF7M1DolB9gG59KiOLbLki751PRYNrdF0Evx2DeXdzQl2vCGBOCpaa2U6SY)2)(qkLUxOMj2pH0A1b8UFZ5yzIxnVR9nFk9X8zDXUbv4z(7b4SC)UK7V529CRAS1zXHXZXtEUJVs5WHKu5Y0GgnRpS5NAW2Y0YDBNgcXeEJTY883aAYEWO8b8Wo)mgVRGJANIKO8yFeVF(1lHD0)8R)(I8YSk1rqSRoDR6aEl(L(LNqbm)shFPghU5SOX)R14noarLc(oWU4tXCq3eQVuYZlETwZd3D180jd(JD0lZV0WtS5Tp9faU1x4ns72UXk79)wbShCmEhAIM3O1n69sWaoQHwmEq6AstoPvBT9TwHUMb(kI4JkrltOtFJUWCJAuYE1X1uDmn4PnqdMRzp0N9wTtrQch(M)40XFuDknCL8AdFgha4oUjiAEiANM7pr1z7j5ECeoCpPG7Wa9bcsRe1viJHpop4juDEXHZ7XftLD6eMk2KpKrQg9Q(UqhFUNPse7FwEqn5epPI4ZpmuEzO07QJDbQHLp10q9ZHwXuvvlu4lDUAGbG1YWEAjlA8kfoqfT)ov7hdFIgkRJpcKqn9WRyfTkCaz6GHmorXv(gAMtOuAxOS7WH3v1DhUuAzIYgAefRe5oMrxaCpVy5JQ0FoqHKQh(jce8mP71nuMTZc6yG64rDIDj2u9)4FcNGnhOFYHF2h)9JsCyeOgTMTX3OikmZYRILxozY)5)uvaqQ" + return "4XzVCTTCBJZK(HzVECHZe8sR44exBIJxlNAMPQP0ekjABUrs0lj1MXZf5z)Vb6gKu8GIyItUjHreOrJUB0h(AWSGV4UfZxU)(7lN5(JRwLV7MK1RZ29WIR50BC)48S)nDX1c5I5RskRMLumlVyDAXRY3Kx4irYIlnslJzTmU1AemlFX9)MwbKyXLwESkYQfmLKlLrk3B0lM)WOVPyS3uTy(AyrZ3So)l7oFZtpMS4A2zw3VErwzYYnPVkRy1M0flBy0hAZKrcMoYWykltgzTXnmPXOygG5zsvSwkyU3i9m5iVPyS3amzvr2UpNw1JNEkT6TPjBQEeyS3MM9WJvlU2WwmF3t3LxLU9MnjvPL(915B(sYZL3Lu8qAv6A3ClswLLS5M8YfZV9Q3827ArTBslwLURk5H0fZQx8EAiVcfyAy3hfhRzsUHzm8wB0HFtXyVb2OLpMaQIs3o5USTPfGuh2P1MoEJQG(6nf5F5ISI0vvz57wm)DV(sGT()tlkH)5FVn5)nV4V3TFRFYpC4qN9H7U7dV3lMks3MxCz(oyTViViR8MB8YH)8dWcLcstreSv3xK8USYQlsVpz)Mk3U3efXC)D6oNczTtm9urgqGQNxCTI5eAjR(mqZxp7JxEPBNjIeG5(KMcxibB0jnfPkIfp6u466PuVgmjZoT1qRLtCVdAzdFAtrinXQPnfjNZJoL9EBjS9iIRHvkALDIRIqlIM6ErXhxGXz9uJsMspUACa9Un2oU1OCq1UYoXnHsbNYN2IWzQXxKb23wUqmnMkIprJxWoC8zWf9przvMt6iyRDDS0AMgxPfQXNXWlIjEQYkHsON6wXkNQxolSktCruYjFS1AoYbKr8NieJBmk6BmkIb)CtX6L7IaonMc0IrJV1h8mLWeBN6uyA1ufWrrt0egYd7ihSg0rkBQXeaJR4tYVy7ycI4XpNmGRubJDe1(iU31t1neeQsmXvHZerhzZpuueXrIkm8AeRJg3h)irqfhXb5ijpbvcmrtyB0unVKkv8eNchCsm(ugKXCHQNycesiIY4MKd5jkIDe7RHLxc9utPfQJAQHTKqvntYfPqgFebSU)e0SJ40EGtVg2etXoAYHrLsz84lYGAdLwjh3GFanUrnjdeJCQrdJztvqznQj6mXYpI)QHmZnMJLQ1aghr2PP7QQR7hRr8YIS)9RF6)zFY6IKQKV(P7UJQm9pcfm(Bq5MRYi8nakUIQw1nFQAw2zg433Ku6Hc5xsD1bUOUUwNWP1od5xx2SRlge0MwC55q5WT50RzoUY9Nfi6jW69u(xslAbkbh2Xpoa2cb(kutFPJWyPYZCbWIIJCpiHmK14dUDL7bMLgJVeUzHcZCpWLmCWUIOM5kw34)DJX6hPV2h)uzk8bFqm3drw6bxDiEsaIuCHTw)VWL0qKwzenBx274yGtHZOKZ9uXgZWLMtpeRLiDvsCYWVyXLMZXjzHGDE2KHuZXM(heCzmUoUetNfs40ZuX4CWmk9KdFJuaIfKxygplimAVuXNmLFUrAK38PlmlKbKNAcdPiKi9LWUgL)CdkTXGMo6jGIXOnBGRivdeYJJRLsIQeHXI6cyWwCrvCRg58ybXgQib9ksRW5cKG(WiZc(j9doocNUvB8ZYqcnF2zU5y0Apt49l5hPkogzgNBeprC7eN5BlC1g785lkkK(ZlVp5FCCr3ZBLVUXBvHh0UFpBD1JxMSQcyjh34aO6QDvPff7FQcNdWQxZB43QNFkDX8BE85YmWhK)Kk3FQnCc2b1v3H)28np3AOSZIz0Wptdpbtr1DkxMvKEWu0SwRGP34pVyvYUHNHFbSDNW1jv7PLGDgKVA7nH)Fdts2BNm3dRinl)c0BPMVF3N3bEG6o1ps)SFUbhDHne30tauKxw1zHAweNN4SZ3T6rqXr(dblmNt3w64gKo7QN9rNsxFrQFiUL2YcNDjpLWrxnAlBfO9Vhin4HOGxkT)CId2A)7Jd(aX)2dZZmx8E0Jlxk4(ty4zrpGlUPX5OtuF6qU5XdhejxhHLlSEKprzWNRkg9jiyriJW44dsYHLL8qQfiLmrONcjtIot8ahmlK6QFTSKhmWhh6Nj8da75)B(HUjLcInnsf5yMrXieEc4lR1t6iLFXSHv3xfdUtrFrG)BCJOmkuPO1rixOJrpnGBqKLXuNHh0OBqkYep2GEXIybhWOdpq4soxHQa9JWNpMF14Ohz05fbA8mcM2zE5kUunEcbXK)HylfBZbCQFUKdBWd1HXubFMr0pW8pqXubF(2WIGIfG9WhIjhYouargus2Ogu2dXwIOTegkhCH7NQoejemQXbAWhIybh3OOxHbLG3IMQgYwKdBJAJApjnCjPJ4OHGMmzaXfU4wnLtGgxlWAZ)3KIdFli0Paruwiu2bqOk6qgdtBadulycIQGANtmehL5qbAOPOusglcnjkP4YIOy6GGcFaHJZ9l1PPaBlkulkbJeOzm8xevI4uuvPHoUrXzbxhKirqh7uHCuAsda1hUSMDBosKrJl4xHh8JGsAjUnmmADPCcSAktoYIhKZ4HJiAeKopIYuioKoaNKpWEZn(wjx(ljYC3os1Zr9VI03P(5vo)X8VaLGKUBnezEg2xRp(e2nVDpK(Qhtx95xfkS4WF(gsO5Mgg558vv7HCbw2KfEZ761OtLbs3vjJyXqAImBOPLUnQuiIaxlAiPmG5B3OtMIXHOhAPlNo4hB2OcUjscNEKUC95QM6uWss8b(GmsaxDTAqRVxLyB(8I(ETdTRc5v7lktpOuf(bLQyClzJi6d5f1bBptJPvnEzFTZr0nQEManzyvqPy0UFJ1fmcmZZG9xmijKsiOiCEaelGebopn)FwCj4fWjALW5SipyiWBK93R1529nQmBzEvv(23Nu8q2oqc7ZQW3F3X3PTgqOFSNbCqLVzYJy)hwAxZ0dBFN80LxZVKJmE1dv8zSlTR2c8GMDm2ULoB53SLZ1UJE4WRVaKAMeopezHGMcv9ndaLjTKnHsMBxZrBsbdq1xB6McEw96KT(APxx82Kn3FcBj6qM)Eyu9mOpN7lE4(KvP)15Rx)HDL)1B2KSE9Z)1vBH60l)luH93L)F7tksx)3l380qxXGfeWgi17REHWhmNro4vq7kFNKio3YmRfsKWjN0rAijHG6Th)(t2OP3HQ8SY8DdAxBAudRh58)W2sx88UKTzRWHpZ58D)UQG33UmW7tEiB1qEWcR)zIgdHw4T4avSXXwTD1DP)tLBz6xFlcaKHSMDXzGbTYhqaO4ghvPbIwmZ92cF9txUFZMV(PF)XSQuI7jBbEOy12N7cbA6wydoYFj(fAKkTIKh4R)OviMdmW7YW1O35KsHGThMxcbPMxytXZ4SwYa)7Ve8QBnYygKmSRIcxmsLniqcvksoGBPlUANtKoRDXInY9UPS8hOSpWYhUhRdi9NT0tlH6mHCl2VB9b(Hg2lKFBtjtmlW6TeUdGor3KOC2Boyfdv2U0DOQRmhseaufpKd5)4R9TCtA6tUhAHM795fRsd6Jm3FFnKIml2ZORQk2uwTF3PmhDSbnx2T(KNI1GlZJjfBpLjyCGy5wJ88Qtz8ARYhP4ZLNYOHS39JE1ZR2KVl9uMIHhH58UkPc0xN2YWXZvRbpLUmtpPDIHfHyUKCkJwhhrxvVKhY3vUSinbonDctur8gOeNGm27rD9Qtz0gUYZzzBFc(LtAkbRK7ttkoLX7aAzHh5O6d)DV5FhpYdRtac3dhc5FWVvRtL44jajDhGh76qw7143KQfDU5N0ke3pS2vB3UF3HzMZodQ0gdT5q1leY0ZBT6zGBLZ67zODqMUl2L54XXJLv8QSooSoiy3PLEK3Fzi9OWDgS2XN)WKrRp6vlOYv4R4yxbk)y8nc4BqMOJDvuOvYb20XhJVhehFirFRba14DKRbMFmvngHNEPu1ve)6DPB9LdNSBhOdwLUfmw8YBkW5TPjRF2z6u6YPzPJtCZyz9a(yzBZEF4NuhmUpLuu5GapTCFbL1FPBCRDtRSzg39imKhH46(E(vfcc25ELEFbKPEZnATzmDULRnNPCnq8XHsuJ5Qp9(8v7jdDhR0nS)7YDGf72mhKkdsavt))8d2DijPkKxGZ6TZ1IM3)Gf4tinPtb2H0JvlAvInTqToInqcO4rn8Kfu3jS6vzp91prfD4YjjalGRxAGkaksTO6yLEgnCL3KBPgbqReIcjNbE(CEWkbppVld8uDDOI7WEiG2qhv8JzRtNTj7F)3KcGLbgFxsdr75dDDX1q6ZJUbAy)2LA7eFuJaMfAdGuYc4XsqIZeiSzohoZ8aus4DZrS84meQuJKAvzScbdgY7HqmnGKOLAqzO9P1n6dsTMWY3yjWfvYgmlryuJve08rgQ)cizzCehBbNzjQzPUoQSi6Tgc8BfnYyl2IbTKWAwfrRVKOa1xuOqYOqFlrKt124ao1iNw3outmT)jmX1Iaw4utqfmjcKTXqen0Fti1hdXXri8Urbu6veqT1nSegHFDRByPsdIrKkGSkWKe2WyRgQ7XTJRj1lHRDebeDOf3ooWVYXuVUXMbziTp1nByAHgvJsqIQuRC5wSzsIidYAWQHdqfJlNGft9vb4vKhjjECeAhzOwja7bYqZYry(Hesd7gQJssfrFy98lhhbEgmWWE3kL2yQ3gsSNW0gWT81YmQl2yJlO(vOPwff6tS2GTEqh6NIIASDCmIKEe26bQXcowmibrgqlWXrTOWjIqZzQlxmgAdQmi5KydCeXuFtcGyhAPDSIA4teD(GBzuhcy4wviT2A7EK3rwaSBiLSk0W(M(0ZOE1rsfyiOadSHXwOydwu6AfhXrwuMb0eBrIiG7p1j96w1BrG7nyVo4OYdS0dhKIjC6BGN6U8ZDUcVY73SQD8Mkiu9JLoxH)sQ(p4k(xZIHHxCzr85b7VBtGELOpGYTcReWR0f6QjzHd3mtkx13SjVSSMdRZEwaNEAs44etfJiYB2NwwM6tkc2jn3hkWoU19pQ93BuBCiRVVuRpYnTQb7M7ierwgsJQF2k1y6uFLNQt377qGDqY9DHedz(dHX67N6KyjaLNtO0n1UBt3CtE2Ukyl9QxF9DV(2wAn35TdRVJ219kVB2XUvBTnEpbJG6KHqZZa83kWFd3AGyf4XfIv6wa3tnC3YwqqEli3oGDD4x6V(hVpBx22KnzUK0rlM67wxSlTD62RXACS89Rp8zX9QakTKYwB6H333kb2d(shPSWRLiJKT9aT(cnYgP3xU)4GRIyBNkdk9OAdqC581m5(NYOEx)0K2y8VVSkFRhn55UtAhlbwgwFNNSCnN1TuWxc6A59Ue6tISNflOAgO(o0M4qU19UZYtI6JY09UT5ViK1k7wv)lbznQE3H5xcYYz6Fk0vl79PI8sqwRq8dzOnczf9)26MezpthmFPYU1TTFLgt3lI9KO(O2V)ym9yAU(Os9sqwHoU3h66lbDT8E3Y9jr2Z4KQlUoyAnPDOK)dq6XeW9)WyEjiRvZ7Ie4Ki7zqKH24YgBABdRJ7I45Ki(4Xn(PikGIE)jqwjuj4pKiEmFWMFWirN5UE)TmID6s7HgY)mosB7)5w(sqwU(foakmWvzTa1fY6RP)XyEG1T8L(3rhKZ)5eU2owPEMdKd9n5fvfjzFp13CWD7yv23bfoiN5X(pGIMc2A3U5dg9p6sFyA2FRKYxo09SU93SZjCTo6wD2FIQ)(x)cN(BDXfqX8(7p01CqTNu327Fjys0cd)jjI7yF4Rh5UpCZI2fX39(5n0)XQ06Bo6eQQmPckpA5(Q0MVNHYNs3SXDYBN7Apnh)F0KfZ3MVo7(S0c3BGjubI35aHsOBQfcG(IWx5qhICPRrkdtdrdn8TBXrc5aK4C)G(6N(VKdtNgYSgRCB9IW3pXyusnfkPpgL0tHsMJrjZuOu0XOu0uOK9yuYofkfFmkfpfkHFGTJrkx7LozAv1GLWG1OxwLuTVCzWPwWZPPdSPh(Hcf8(q)VwZChJ6lW)TF0Jye80w)vanI5VHbZ)9ZV92R(qRxWeA)DH4MZF35xC111Va)AWGx8(ZFZRB(vKk3C7vVE(D1)Q7IRgtu)DF4v)31VWdUm87xC7hV6IMH7)UiGF(2p8Mp2qB8B3c(55V983FEBoX9HL5fG9VPZ1x2TwDwgV0v6i3)FnzHIUyUlOP)k1gpokBIbqzBmN1VO398UT(9BfmR7xtj649sTYr5yTwyvknKxngMyDZL3W20qDVeRds0nqj2oY4i4gM9ljo2M0eyrOoIUSHX6(XR2w5FuGoh8G3gSf6ZQHPRj9SAappHeew3cJBj)Gg3Fkn)1DveMDqcED7MWWFYUJaGiTvoaj(d)yKNuMbhK8vB1YjCTKAo0ERpPq869uJbA1If)NNPuI(h" end function Gladdy:GetKnallProfile() - return "4XzRB01CBJJ7xuZWVj1J1TBA7mBtZTo3CxNPJ7QyRKOR2w5KKVUzFy)TFGeG6lBfPSXVyRidcaIVbiZk(QBwTCt5IIYnzLVRyBrP)fPRUIVA5THpVp8zP)ZA4DhU7UQpTUy)Y8)mB1vsn9Qf(pE72hFax660Q6fPJIwwaTSaAzE0UbaQy7MIFUhXXLgjtZKjkRtYDMe9Q7EJwcWNUopDBFydSx49i5ww)02Svl)0(6SY7sxN9T3UzZx2x9TpSnDZMN(2N2LEFw13qy)EzXH9BY289B3(ONlEFEv6TBZExE5Aah32UrUV7MGDH60Bdc6pMLF)d1RUsyIC2VS3J2nRwSA5dzPBRFaG6Q0DzxwSVgLKC2fGSC)J3uuNT76TP1zO48TB)z6tv3KwEFwnGGBj59Yhk(5BpuM((SWF6FpsPRlQwT83(0h(yqV(VY3u)WLPRRlckWwIFt2FuFOeetl3vuu)WQLpMv)XWpEDw56S91GqYZTrtJxKq9dBlQaU4bqkSnijwqCDuXfyYB(Y1DyiK4DKhIUwwXf(HYIF((8YS115f7B2NRZNTHgiGlZ2vu6j0QLVVOmV6AGns9IYH6EqK81VaepduLVrZrO(18Q63NDx6HT1EkzSwM)7Swf8JL5aARFA1vQajfoRCCy4ApmCHuRNapCMK5McgNsmoEqAj5gdFs8y0trljxiuJcJGGHZTtWpIeGHghgKFsGObtXZALBsAzzUX3xsepMeBYuWiCSXHH07Me3u4rW0QPWJuktgxNs8J1oUiKepYjTcDjUXfYrgozCDosiqnmfikftnUQkkIfjIPCByQXjvJLJDCsHSJZOM04s4etjHDalpLUuzEMnf6ZWvYjTT4mHDC7yCNl0c7ukcbeUyCArXluQKPSCewHysrOd28tPqDQKNzFHWKiDtPkmSPIMQfQNjOJMcemPcviteJlC0iPSUPqJukytfdukTtVVLtg2wPvYXHbnbnQPmsfc9Kj(sytQfKmXZeYj6w9mM6e3WyptkKO5NCckvhR4OTyIpTB3H9z(L1wsXfjjyvfxWeTfghRb5fvOuVQpd0(F3uWHq5RJohRgc2MXAdR8CEa2Hf39)YkRGYI((U0)tr533Fyx4TBkBWjGeOMMRlkRltZR7utkw6iskqqEKy4YIYD9fcDRR6cNxa0RjIQoiF920QqldZUiT1u1EFTdJ7R961kH7S5FTOIQ0VF9QBkB4yolkv)AFPFqP5)D8pBAvG5xUxkDnq689GarCSEWxX)u6HoR5fT9Q(VhslBKuf)mRStNm8U9o0d5iU(RF)gqNvN)4F97bX0QL3vS(q1C04bVN6Y89)GeorlAWrls0o9KCBlZ1k8DaU3Vhi86SDaCvEIrO83Ys38KFvvpMT2)D2(SDHxqa8pRqZuKs(FytwfWs3Tg(OmR6qj1UrWXBJFrvTWFZdaipaMRXqrbM7ZP)HheqEUp9DaBv7TMjpzDttHd6bjSY(707kHEebBnqqJIJ2fsVLtk82gvKNW)TR7ytJENQlqkgdUOGu0)NslMXy90UUPyl5SlmDJ0wtiIR5m7zbtqsHXq0fqfwy85WedMf6KmlM)9mWyyXsVEe5K6ZcImQKZdI4m9zctAj2fXRgroH48ypjOMwoL9KoAorHz1tJoP0yKNfgZXhLXEzisBSNhLh0Xa78eoWXvJjKUGtc9K2KetGmMLFw4knnUMxnICAUySThegSBM7eZ0OtQtsop8f3EM2GC35rKlfjUXevVmmXnJh)9cUPNrLxl4MgLGH15XXXrZ56vJiU(vNAOowlXyLC1wNhwHLp6xNA68vs0By1)nQ4SFb1un)9kbMpGiiVanR1z0WThgHq7By6T7x)aSxA3g(I26u)t7kh2)e0yW6FKTjosDqU6yqh8l8JBXMy9piej6KWBGmpHxinqQm4bRFOeW3(54UW3ZVjSsrceIZdF8BLqZ9pKWKba5sb3fqqaFHzi5xhh6xn86e8fAUmag974qq80lsq)8m8)nlsOeEGXeqPn43C8bPcrKVFy)3AbIjJ15qmivia(zjVi2RV)n8aGCJMh2dcNfrfWC4VJ)zyyTEmjiM0irMsQybPNlreqqySLHnHvfiLlsBTWKq7tMHOnUnugfYmATf5ciUyawfNyyCsjWdAx4hmocx(uGWdwgjdb1z4bji2XTSWeGim6Ia14sKtfirfrXTwgLQiPWrq4xQdLYHjFhwId30Ab(noN6fHXoAPxWWhsuCeRous6Xokpa(cFijb3dCRZIlss2MguOlmslTxe4lsSHLQJQpWygb0GpyXfIZNdEqXceh(vKsgYeKdBKgJ5aknCjzr40bIQJwkcjsCNgxbycHQclQling(RG0oSAPHHR2YjFJOqwGaAzOqGJV3APVqxgTLmiyjKqZMqM6k6bi9qGqmoUhX5FIO0q2zC0ywOKeAq)eHvGgXKdpeBGwGGCR8JjDbndUa5fecq(lmx8f04a9VoH8EO1bqtoSCxy7BqBqlNekst43LCYSgCsqkjLKSfzilNmvi8WfQgbsWVRUz(fX2gV8nGtKwbriyYeiKMrS6U3aXjA61EoDYJZUjFyy1yK94z4fISIdmEXQ2qRsWvh9EdNpL)bMJGj6c1464TaqGvyOO4E3q(6cr0LwedigoiGG8j65WqbUur2DsUJC3Keish07lU6y8wFyr)dXaUGLeQ)Wspqkrr7uuiw4nos1q(GolAa6yQg2Kc8Jkt8018ViC8ybMkH1p(k3I)IuOPy6qqi0wYO77kiTXmzcBJ1jrzfAFkHnlk3b3zuaPKO0f2AeLIg5qAgYktrwzcJJmlnChzyZjbTig0sgvKqAnYJKJXGXjGVGoeQfDcOIdSEbov6W2hcXH7fjjenu6fJgJscH2O0hbFtFDqhktp(AdG1i4NwZTnP)xet(dbFqJkHp(H)bTokXqo0HHdHSBuwmxcMB3edpgZfBXvkO92XMPGcdXTKSLCgk2bkvS4crjILcOtyNrsHemym4TJHt1u6nnQo0s04guDuaihNsvOSiQSgkFUcT6BC3qBsUcf8axRICnAMbleJKJsmTaZ9bjIXveMHVhdjmuVRrVPgJpeEOlCDFdzLH4qswd2MiRQfOTLGRnK5lza5L2rRwYq0sjy4kmAVaChOW(krmSpzhcRMkOdRsa8xWecn2HGbpYBqLtnBFmkeLFIeJCe3gSsG6JNlxVqPyhV82(DJd83FxpUSmpB)MTp5Xx37Wq3Pl3mO9W1R4x)LlbSFFzXp)Np25MS09WaOjGE8fFOZawNbFIErVDD9H0Tbkr(zEE920Y4eVH6I60BXmVqneQoX11yKx5BfOD2OXDY4x3LH950x8gVBonIVoI2iVbHp8c9QRZk)189e4bnDNUoAVGtDWqaOb7JTf(Gq(Le4DsQUWNy9OMyAnKE3HYQStOLIZxW0y9niiO)qdwUnlfq0ZNIN3Qu637v3M1idQ2dskkJo1DRPr(ptZSgP1ZZIrxNgDyxlEslU8X0YFmds(hRU05VnignuFHkbcAB81fj7yipq9nuXC9dpvLdMJJx0eEQn1(ZCyXXflrxhoOdbixCcKaYPGyyg66WDBrDDXUpNwEF(E)O)193HNSR3HhQg2U7Sv(KkU)rqe56)gdbGURyHJ3Bs(GnmOZ8TEAcoE8apaBXgBer7M5RT3snsO2zudgVl9aDFFPWm4PnL)JdPL1pZ(9cBNDaH(gELpWLEWLJdJX0Cj86gLJFYaGp)b610jWGi3wKFVqsCmDMlW3TTzCt(USWHiNwh5RJP)mAUO3I6Yhxcn3QmgwsscxQHMpJoiNajOLJ)2x24y8(N2NUlFnIWq06pMU9UzeNPBKZojzdgkVeVGEJcJCX6Etoxhperk)F7iX6CjrdXvJrJz9LwZWZU3D2TjBy)gaNWg5yodt(e3shxbo9dhDxeg7I4glMWeoU9RoSD7mIvC89iniBx8LBU5lF(4y2aTZshKon6pQ6MqTjMsBcV6Wf1TDgPeBFcM8I4Pu664I3A(8c9gIhuVH1NhgpYYXK9dhYQQYQov9fxxKxbXuofEmTm0MrcgFKBtFtTN3Mkwy3mq7J9mKcwU(AN)nW7Rzt1M4AS7yogryO9xBuJBkER)C9)u7LXUJG6ZP3NV(ufIfLtGA3laYpzYLo1g(Wqnl0vsVYHNH8yD(jQ95OsHRQtRpuDBuDexrRx7FJS69V2nrfXs)vWiukBNRRaVxnfdlLAyV6VKSfyKKEIas(nCevD)3hygi(jOSqMbs3aLIPuq)0qV6qzHQJlRT7Dd6DqqX7Hnxwy6cvBZYE0)qN7J2DfLRZ82bElRC)3xXLqsnm8CD52Q6d7NZAGkedPFl3Vz2lXzqY8qkExVMAbgF72Wc(r1CGwisc15wToTgmGM3A46WUyde7X3(B9CwKXFmW(fTEwqZvHtZ)US0Y5aV)yzccwW1zoWRDkhPiEbljeIOm7r)fbA)6SzTQeCvBktVh6f92YSuW3Eglurc5dPZbATFqEE5vzw2FMvxMoltyTtQ8RkF3JWBMLIPXC8P1Bl2plrGHh4TM8qn3Bk3GizZWdVPw7orK7ovKUv93EtaNrj)DG(eDomKT7vp1WGwB60pI)sF1wnceMniCwCu5BbG1D(pnkmCPFjCL4Izi73uVh2i7r0IfdygpQvs6UA4v98vKYyqC0J6W2)rVi75nzkQxT6))I8c73a" + return "4XzTC91CBJRR)dZ95nJiPif1JXnnTzUTj5gNoBpZSJBvSvI1P2s5ijF7M9H(z)asakrR)4kTn7ljk2KaGGG4p)avwXwD)QLpC4XhRwy(XvRlYVnzZMS8NwDnJ(gZhUm7VsxDTqUA56KQ6fjLlkk3Kw(MIDfLgsKGdF11bRw(K9NLMFwVA5gyqf72u898Z3982KvxQebYarCyKwW0Qy5Qh)nPWmUlYQsEyx6BYkxVlD1dTS6jF2eCw4WmQUml)BP19OYZP1Vpnzx9wGuVpn7PT1RUwbZl)57lQt3F7UK60kRSD(UVN8s19jLpLwNUXm3YK1zj7UTOA1Y7U6DV)EpQDBA56086KNsxTOH5twRuTnbujvgP5(S9PLWAfK2gvUDZWP3ExzX3ViRmDDDwrEJG8)Nwwb)9x2N8Vlk)s(H92z)0XJDXn3F)nF0Uwlt3xuEzroW8lkkZQU9w7I5FDdWPuqL8Bsy6jhkt(qwv9fPpMCyxTznOIIcm)on3Ow3ywSpxMbuO(Lvxhgyw6jR)gq03U4txEPzTXJ4CX8McJlKY5nfryuq8OtHjBMsdpceb65XdPumZ1UGPuS5nfUqfhoVPiymw0uw7(Ay9juxdVPid1ZKlCjpAURLq24kmwqVTrrqOC8TXb231X6XTgfdUThQN5IimmiCCv1GmHfeootgyDRzC(8eQi2mnEb7WXNbJ3)eLounPJGER6yHwnpPsYdhFgdZev8C1v8qUCUlfTyUE50axMjtcfZ(yRwDIdiJ4pHZh3yK33yKhd(5MJ1llgI5ppHc2fJgFPp4zkUkwp3PeidNRcokAMMWmXjIJmSJ0G5gtamUINKFr)yc84XpNmGRuEqWj22hX9UCUUHGqv8zYfwap6el(HIIWpruHH5rSmACF8JebLFchKJK8uGE8vYWMW6O5AEjcdJN5uyGtIXNYGcMju9mtGqarug3KCiprrbNW(Ay9fxo3uAfIO5g2si4bZYfjxeFcfSS)eKbNWP9aNEvbZmf7OzhgvieXJZKb3ncLHIXn4hyhxfoldeLyUrdJdMRIsRcNPZen7e(RgYmxPovQwdyCePN3ExDt92Dks0wq6NBktKhc1jUodbeWiPRPYuntJkJn4mn857sQSyhm5IIDuQPM0GJKjKLM8q3uEeqfCxvZTm6COq2XzgiEa7EU47PLEGca1HSCB3A7FOvSC1JxzimwK7ctONO4iZdci3wj(GPgqZdbAAm2IVw4kPY8ateGd2u(Zctz2k7NRuA7iTvTyNAqi(Gn8J5Hin9GPccljubbiJ1A7NWe0qeArenBtE34yGZplO0QTurhhGSMrpelfiDdf4KHprJSMXWjPHWuwXmaPMrmTpWzIyKpMukx4sv0kuX4CWCbTKd)gbhulOSeOSIaxjTAfBAq25gjrzZgOFHl3fl14kAJqG0xaRAu)ZuO2gd3zOhhkJIwSoPI2AGGvmKxHcClHR04EbmynY0qMwIsEmNeJWio9v0UcJXrcAdaSW5HZo44iC6APYolfP0S5vzMJskTcH1JIDKHXXOWyCayjIzLymF9W1AYhXS28Fm5pnuQ7zMQ326RO0c81VNTPE7LjRRlSNAIraIUkVoTS8WZ14SagEnRLR1V8C6QL3U9LQmWzGLZmRu4KOAZb2od)9f7EXBOaRcOHFMeEcMsy3PCzwz6rtrg4XbvVXFE56K8HNHLb6Ut46K6delcodYx0Fry)BysIERKLwG9OzzzqpwT8q(3Yb)iDN6NOpg3SOno3cIP6PaklQQ7WOwMyCNMDE(6TWwh5vdStmUo92LBXA8ODAgfDiDZfP2HyyToWDcK83bhaLOfPMJwXwGSGhIC(AKwRDzeDOo25jd)TfMLfM4TOFtMGZSNtWtuwapmtJXqxH20rmZJ5ooroaCSZXpYZMW55mmgpzZdIqbjGHpii3oAYpNKJusfHN3fbc0LGTW9fUuhT8st(HapvO3c3haIN93SJD2j4KyQeHK71aYtp3saBzLwshfAzM2XDBve4kf9OaEHXfsOke3uKYiukKXO)cWzgkYyQRWds0zgfFHfRqFrrbo3OOBlq5sUiHQWSJWMpKLBm0Vk6cIaTDbbt6cREfzvR)mqnzFiwtrOmaxANl52vY7eze88frFqG9bkYi45w7ycQwaXdFiMCRAqHdfqbzJQqDpeHiIwsyazWrSDQsx8mWOghOcFikW5(fv9HyOf4BrtvfzlYGLrJrTLKkMG2JyOHGKmza1fYCTKISlrEbwB2FtBC43ckDkCcLlbfJhc4qhYcWG)y4wEaNOkSTZibIH6COaj0uuiiJfUKuLu0vEumDqieFaHdZ8jnjBallkGjQbJ4Ozm8lIkrmk2Oqrh3OOLGRdsLWPJDHUmnAdMJ7hMSwnlosLrJZ5xH58JGAAbUmubeFPi7AjLpgzXd6z8WrencAppII3h7cQZi9dS2mJ3lfXjhFTBFD65SDec14(UKIrqDNQA52IVFzzwA(gic5cSbpF6zS3u5pL(MTPR)2BCzAF8hFlj8MPHraoFD9biMSxoTTF30B0gLsUnKHjWe3VjF2EL9H3E590cUx746QgEZHYQ0b0fUu1vgw2UOUPOSjm1zsmHK(D1QjXiZxnnTDt)X(Sx1hVS6sn4ktfekbJoiGcyz)4VbMFl)t4BmauQKG)PWyWRQY8nI(lWMuH(jLJ8qrDDX(pMu(uwouNLWwaVTRIDwFEFABBdRTDT8NyNAklZTKnkotO)PyAZAY3eRuYw2xMVIYTnmgD801pCIEBIgonN66ypg5s(IwncxYz9sh2FIxco5dHTqiWitibNWudNhY0gpkCDYEBtD3u((KDpoHLeDIW2O86xGDKL2CKFmzD6FC(Mn3Kx9hVBhuT6l)Xv7HIkR(duP)LYId5Bs38Lh298q9Jgn)DuFa54mE)9vpzzc(R6zSwKvvKpOTJALxp9NZE9fVKNSpBno8fgFphYRDoF6kaFm5PS1d5oWX)Z4TBuEfVdPc45LOXs4(0)S2WM(flHOjOjRnJBwyqRT(dbkUZqvAG4o6Y)ZHKY0F81lpSB3p(6VVnRoLKEAVI5QAY)CHZpB38RXroLZEbh7)ZlGIJ2F2ZN7rgrDzAdImMvQnEXIUH4qTI04zfuzox8bERe6MGe4wdUAmiVsEQVRYnAHh8lZOvv1nq5Nr1LtcpEj14B2hzOhGkuEYEc6iVedRaTRsk83cNO7PlhOU2UHUnMigyLC1e9G5Cqxvmeie08pbUQtTvnvTln9zZdE4W9yr56ux46mZVVgsUkigdUwxURQ(q(uMJmwzD9vMVzYtrRq2SnPC)uMGYaIHHhff1tz8sDOnA23QMYOH8(SJE9lR3vKNoLPOyqY(MmTwNud7xtJnmPvrTbCUzYLAsRevqewTEYugTmgfRnLjpvKx9qzAcC0zctmKKnytCg6yRtWnRNYOvSqRKLT)z4tM0uCwjpMMuoLXBkrFLfZHMd)DD6E6GfbD8PBE4yiFDUP8ovIJ3aM1d4b4XUazoVgx(Bq1XYqO4)arSqfRmPcaMRDUaCe02Y(bNUA)(d5PDIbdLTHbOmqe1KSKrC7aJCwFNf(Hk6YSllWtONkNX1zD8HDuiR)gjH4Uayn(cTNVus5j7tCTPkk(PUpl2XyXg(NqMOtDVciozqU40JXcl9Phs0pBacE0jUtp2Xu3Axo9cnAkR7T5P7T10LKNd7bRt3dglw9nfl9U0KnVymDQmzM8GrsmZ4HMb8Pk)tc2isPgmbFCTXHsA1HskZ6kZO2yMuv74VFlmKTquDBc91UOIDQ24XsiB4M(6e7pQoxAX2RsOq5xvPF6wMelESy9bYq3imDZe4dfgKhnlMJsMbjGPZv0PA7GnhssQDPkySEp(2M2iCEhSa3ePjDQ50LKB4kVQojg5DeBG0iXJA4jRF817bUxN98p(Q9uLjjLM6K1bMTG)pilY6tvIw0WvLsEcBx(Ezi5sndCfA8Fvb(D(qwonC7QVBUmD2J3MTjDXUS)6VskbzgsZnpPLQ98QUP8Aih4juXOFnPgwtGkVWbPSqe4W2JGxnGJqWy83SWc2fHDkdXfIfGWUPeuZRIdrGfHmHi03COsPPww5AOwtRFemxVvuAcOQqrl(xiKCXHemVrkcRAKSbmetuolqtutt9HkuJibQiGudPrgRr4QLcc3YWiI)cIcuNYyYWixNSqu4K6yhMNOK20Gmi4fU(j8vLChUQuBX4bceuuLIiQRJxqYqksIJqOcJCi(gsG(10clyew(20cRqjOgrQa6kNqs4mIWw301tJutBVegPreOMUMEAKalNJPUFInwqr7(u)nHP5ADjQbjQsn3JPXgtWJuOObCdhqymYoEqmHrpiROmsA84i0osrWsdRbYqtZqiJHuuDRgQ7eIqI(a)SSJHGycgyy38ecDmHtUa7siTamSVrNr91ebbNW(wsTDW15qPcHXw6WMpKA1zCmIkBecJnbsTreDAquaKCCCeC3gveAotDmbseIJeajNaBgapMWG3biQRjNXHuZdIOZhGxncT5aCPYfADJDpk7Oia2n0MCORfUTDUnG67dPvGHGkmWggHJx7SOKnBCKePrDgqteUDUddzQ3QnnVvJGaRqCZz4MhyP7oifty(2Ib09fNBCfELnyuTF4MAis92kJRWjdORZD60Na6NF5ZjLFBWE25xmCxmp9CU7GMZebPnI9XIZSsy8D7kQQAKp)uy3otyxjs8UdPvvP2mtG1rdb5E3ieB0U7V52JXAdtux5aKYBr3cyY9eUep4YCPFccnaP44mRjdR)gQNJYNUlwsyu8JX)5Vp1jDrdSSQ(ztDx6UBlYYRbE(M3E99V9oVDjJnUFUfN1c5CVYS6Bx5BFoH96M8oqBWXEnGi(3)Mh88rcvdOD3bkSJKsdIF2(2VCpuo9wNTH)nt6z3fhkO9e8S2eOta2eLEJdntxzJQEyQD6uep6fQQbvsspms2Sh1Tf7Xc0GAKUTy(XNhXBrp9fL1nccMTAeZFkI6Dl9s8XO(qvDXElARlnhO(ziAwtKLjzbDlY61GUAwV7Q7Si7zXoO1LIEehsBT3v7CwuFuHU3LY9vHSAr36LFniRkS3v981GSSa5)i0vk6DJ6FniRMZ)Lm0gHS8(VcsZISgx5pr)Ue)TN9RqP6EFvNf1h1(9xtOhBNRpEpVgKLlJ79(a(AqxnR3LbEwK9mgT1f3e8SH0giP)fi9yk4(V)aVgKvlzDXyBwK9miYGpINXkFByzCxSeNfXhpUX)iQcOEY)biRakY6xsfpMpy1VyKOZyQJmIn7L6JnK)N4iTU)BL2RbzzYx5aOWaxN5bxkmU2EZAZaewhukDT)TxQ9NtigBeLMzoyoZ3wuwxMK9lxiZ6SFvkm27BFBLz(f0E0O)vz9XPy)tqSDORdR)74WeU2dDlc7FHB)9VEcM9VnLxavOBV)lxZGm)tA6X8PVEaSgdkFeUNLsQYENgA2HhSi7UxORovKGVQhTVKgtOsWKAO4MhouN2E1XREoD3oZPNCZvVzj(VGHvqfjBYEmlT08nWeQbv0sGqj0TfcXxEL7cL3HixAAZWW0G3sdBZimKqmajo3oOF81)hXW0PLmBWcV2SYDv1hJsHZHsYtrj5COK6uusnhkfDkkfnhkPpfL0ZHsXNIsXZHs47s4yKY0pLjtR6wCa6vJDvDs9HQhCUKC(9uDqu843idN3d6FohlncPTa93)jlWoWt7nxDqZRePT7W)(53D3v349fsoEjfU98pC(fxDDZxGV6mWx8XZF3BB)uKk3E3vVD59nFQGlIIjQ)HBEZ)BZxyXDf(8lU7txDr7WTx)C4JV7M39PwAJVOlWhV89N)XZ9LeZBHJv51)IS2CzU865AdGjJb8fFaGVoTJ12i19AI5pbjNoVOy0)WBKHbHcwSuY1HHs79ef)hEtt8owBaphkOhHMB71GWpqKpwCztEjTlnbgi1uoVBcC3)1)4RK7J6xpl6DyxBx0GCvBElni)nHiNB8a210fzVEfpLgoA6(9IJY7PlY5hVmpR5sE0dvn3)6COLJ))dG68MnoRqUhLxI)EXecZ3EI4oB(s4TkPbAW6vR(V)5Bbjy" end function Gladdy:GetBlizzardProfile() - return "4XzVC1TCBJRK(jACH)b4L2X2jU2eBVwo1KPQP0eAjglUrwYlj9MXZf5zFBGUb)N5io2jNlgRqc0OrJgD)1aF8SKV82LlU7PV8LYt8)NlwTF31PRxNV7(LxYxUOCt669FRm)(nv3M)qwXnzBVEF(Uk4vV5SlV9SBA35J3(4M0q3wLwwDsAXj7lwNv8M9B3x4hg8D3T8CJHPf2eLwQSgRWU8l)MwUCX9t(MIPEt1YfRHby)wql31m(9v7pT8CRuXsukJJP1mfJ57pdKC6Q80TdLa(CCcSO65TzlxCXUQSIVKUk7ppE96R2v(NVDlyPE(pV4H07Zk)tST)vX(N2ToB9FD32h962P5LP3Tn7n5fRazC3YfpU)BzfhVQ6P0T()zvr(UVMvnOz44F2o)txV8KLl()YkkZ3V7VEi9)zFXFT7PhcQ5JzvVllDB1gWA)Um)8D5LgyAT7XB3xL9W1BtRYW1LJ3(T0NlVnT4(SkqI3rlCl2S)Bh)ur6PzH)zqdBjtYaK)pzWWDKg03GaMCHfwDmWce8hzIwjRxydM0LN7ScLrWuALori066fXnGQV1R(xSRmRYpFrdW17lxU4KRU92R(G3A(75RR2CE6QkyC9Iew7Hj497lYZk9ks52SSh9)iRXW9L9fRY8(1(5wU)VxYLgwcZpURQk2ww90UdPp6etqxl2T(G7IZGdZM0IhoKoaghJVdFT8qATqK48TUCvAf4BEy9HtBBYl9MTDvhsNmmlp0PvhuR5kTV1FjlT4qAVGZdtJI97piTr7uoAHygDre6s2JWuoD3QSdQxjyVwxKE)(DL3vKLwT5q6OImYpLEiTwNyr7vrw2)KvvKEqUWANu57v(dpcp5GwyQDhFE1297oitGHh0TGr4897QGq7BZO9EV0OJROOU)XvqKhyx)LCBRibyuWD3N9MnzR(ADejVMg7ymSDWXxyfcP)TCMnX6)HKNi14pmgE4hmh1gHJLe(Hw5cnMZLmSXkEOTgRj8CJXfAPq44cSVmfkKeTf7R1r)GPuOmmqgMWi7CHNWLutKoPL6T0zO2OccwdbhrP4sy4yZPFKOLOCvsSZWtC4qZ5yNCww4joMQwnd)qWLj44iebDrKatkuPsW(asJHY1IVrka7cQlmtqfegDWSiGSOyFTAu3ycl2uiCenYkB4hsyYI2DUHSYkjADHPgnskfohLmfhLSI704q6qtp0yNJEfzOf(9mb1iUqAteyB4WlXr3hm1BrsCsu1z4yc5FKH2AitvIWqUosYiAWLyPrRrBMXyWXr412Qg))rYcYSALsjyGdO1Pcz5ui8MXFtXuVXNzSj9U)hH9Gy6yrBSxXTcVTy)3onViBvfawy5IBU4TV7wc0biJw4jq5(H0)Ms5hsTgcsaAAxHeZ)cGkkYEyFioWYfNcPpkV(AyE7Hp0h)cHaSER9VjTn7B)Ly46Jb8S2r6w9u5ekH))c4vyOWDAHgIpZGmGGhSOgVsxeZ4cc4yaofn)ByN6I0cia7BGGEv(5n1oTjkGgv4IhE4jmICTIWokjb1LJycV6CzihCyTKw3iRmUGaU3qZkRsREQ8Ui0TO93sd5NQxqutJsSbaA96hRlUWBZ(7QNkGW(NSn)F(N0I1F)Z3KMd)xFeACK6JvZ7M8(8YQtZ(s6tBdzTnwlRxsOhlYb)QQNxEPI5rhNU6RGR2zN8XZp3p5foRC6UW1J0fUqcanN1OGHbMxxGy4tpkJQyywPzokg9mvmmQ)uDr00LMoWH8WZAMGjuMSldhdbKRA65HC0PEif1SM6yU9zntqCbZAueqzPtBGhxXmj2PhLrN(bujZXcBsCZCiemTAMZDWRpz61XXTWw70UkJpiY5ULpKWFMZ9KzUgc(wZShkftnT744o9bivhWCVjYLAATAe3KaoNznlqquZQlWMkXm7ca1E6594X5uMFGPAK4CcHEUzFmjQFGNOyKWC(ssM1qGqtNX0aXpFaUiT31kNPwb7ZnthAy8bjuwWmCfX6HMLAjLYKPt6o6oQqnwZBIa(vZ0xuitetVMOho31w3mhcdBMyAKs78nV(cOMXsOaWant3eFfyZWB3iNl(Ne2STumXpi9XeHR(b(6JmnGYGNlmd8WgMtxQAk46tHZrLkgCvSCeViwx8PUq8BQytL4pW3Aru)C(WQxoFpE8Mn1U0uefu(s406Ot6(xsTFR2MwgQm7xYO1Ckv3IZrF9t(YDEXhqw(Ve9VvvKnhTWi3caopq1(7F(wWXOk)XV)5GkxxmzqxdhixL)FkTdsNLIxYc7iOmyOo8Q9p4RMC5cVVw)IX74hH(0bXY1Cw)DdVgY1XhSjBwI9iadcwYoETvDeUKzhepDwsFsLEacGxfX6K9JC(AiwJAqo7xdXYz6FkYvlhuzWRHyDcXlYrBcXkgwvYSeRpI)90FlW)2Y)vAm9tmolPpP)7ltPNALZy)z4qaqCgC4qVgY1Xhuk2Se7r0bxEus9zfwlA)139ce9ug4HNf3RHyDAEFmHZsShbzgAJ(iX02hwN0h41Se(05n(Pyk4UFglCsrYG6nEnKlEFvVa5Ee30Xj2Vw666i)ZylTB4Xx(AiwU(vobAvRRd6Y0hYAHyJVSgPE7BdaVpI2m6Pp0Dp5pMEyrO7T6Z)EWSX7GkstfUCOYCAEzwAz2y6ZrksJc8Jiimp3vUb0Hw3esu4(AUqt11zfR8x5)9zHkMiLOLLJngw3FYCwAkAvjAOvvtrf0fMaA52TbG1V7JHMa)6H8DWC1Yq(t87hFZnxCvRxWe6a)fU(43F8PxCz9lW73aEXho(TN18uukxFZfNT426NkfsBcj93F1B(VQFr4mlGNF6nF8ItBAE4ygGhFZvV9JnYgVhv4XlE3XF442AI)sFdE2fHlCQX597F(eWFUzj7hFLtFPa2p0qoHgH18SGZwD5T(75SV7xzR7ie8jUEFbutDEv8Pn01IUGpvCG6FxxBgJ)uIEx42lDdvKKD33Yz9CTKRekRorO90DJroJJeoPPi52hoqhne1B)zl04nEDRLdVDI0IGBS)yasbj)(Zo)wFSNwMZMlmTVTkCSfzRJeq7wpdgImlGiYHqKOXlFhGnhEG0GSqWg5qHoWgaTLiRqsKHg0FvcK9cjmjrBabpCr)irfch3SVFWEGqhSj4d0CzKBdO8IJxCajkBiJucrLGKyqa16H)LJ)qs8PWre4qlqjzSi1gKmjY(HWfjEs88P9pHi4HrJuNq4i(wakh((UC4a2XsIwsKyqHuKWLiqUxyT0KWQcdLlo2AbrYHejsDcySXPHYOqLrRTOwaaPcTvXjfg36d)qJS2G4ndpXGu1WYIKTa5NbyAjc14eMqlcNvxy04iVrqYwqxHRxYAz0QIdvnLosCeFB8xEzOleVq0IEe9Xzuw6bm8hjkokvhAj9shThGEH)ijs3KAM(ijFtdA0fgPLMlidJej2qx1XLpWzgBOb)HLyCt4O1HFOqMNaVfhjd5cYHjsTZCqKgUK8iC6WGQJEkcjo4onXYjnowGtw4V0kg(wWAJmsI4Qe3YP9grJSaBOLHgbo(CRL(dULrBTDjgeKXJC1v0p4r2xXX5iEoXOijMib)p0SPKr(fH)BRaDIPn8qSbQdcABfrFOWjdhgEbjau)c3t3j0rS7FCcT7H6h0AAdlX6id6dA5KrrAqkDXj3AytcossjzBrfYsSxkHKdxOQniH9Dv1blJCTbcjuNE7xcUdA8F7tzLLzLELRFkWpKEF(Qo4VILvAi8xHK((t3CiPPtRjs8uZgBcS(WGyjkUrza3yqZ04SXtTdRdcdkb)DWXPE2OHaF(a7m)wklMsRbeyl8D3nC601u(AEOPuIYabQp3tK21BF2RbXN7nUeAHHyA8eS6Jp2LHJVjMoUEE0LArdtb7hI(in(XNrBSeHWkFJFOhluJGAJNaXDpk6HwvBmKevyZ51NerlT)MaIPwy27O5nG7ofA1(7xUyBwk8ASrT61a4GD5Nwd4EQ9DVbeu3)q6F7TXLGp07Z35r0rw(waxA(8cAlHqRAxO129Eqm(o0600NICzTSlRYBrrUrkp7npv0REiEN6ZmDnUxbZ(i0QWT3KpaUvlc87vx)E22tKOTz4hUqRIKoWjxTv6aCqAV41(kPiZ5Ihtl(6bmK)neJXa1DR8FJbaaiTXhVasHalKx(02TtPjSEADRLGR38CzoufX)PQKbaZiI4826)D7RGQ8)ay19178BcB3P0OqKJUeNRSqwnisPdY(eakctftnK5tIaMHqMysiHJWoYeyUAToYixcAiNYcYqWfGfk0rlL0mXeHyebqBjCFdObTKtCKfGHGPi95URZ8J5gtuewbmhSI4HlhX7ja8aKSCe1HvoeSdKJf1if10ehIexljSzqQaC4LKii2nd46SrY86IIkIRJuubX4AtcM7oXH2pTiIEKOYme3hb(bO2OjlXBzbSIqQSfRTWgHZQIGBIergAboxI8owbO)rqtEtvujjAqtuu3RT0IkH)ZgbSrmu3pYHrmjcbj0CdTMtCrNBrO8wSYgsMr(y7WsTewdQqWyHnaGhHIJLqLDaAiccN4In4AqqXuIyrqorSP4SIflZYGZBeQRKXKuDxrQJlrYB7qSKeJ1bNssl5i66igEnvcHiIQtBOkfbjIkLIy0nGC3gvx0rrerOZe1wmCubqtObwAne6tJlUSJZARmwfJcR4icZNQhr6i0FQiR4tWfyPGGr6yC0uGLpq1RiuoevzuhiW2sfTGWzrQ6Zee8txcUWeP3o4QsuuN4Fp4cHoE1uHh80X5bODiGBdzkjQWtol10(3qy)nesErumjeK2y(dFc3MZAPltV)3FghHBr)hGNCmSHTo9)ZbZleA0a1nk8HRC1iH3mZuz1hwsN8PHZPMq5ngaJ)i8q84qOO(Ta1jIFunlJ5EZBG7fV7))92U2aN6aPBqcywDAVj(mcWzq9NMt7t1s6v12NBwSEMEWiT4OEKKkNGUE8JcRg1yl6EATRl(VFkTOAmw6hpvyBZsuNtXTZHIzfSGtcSLfkXaYJHW7hdwl6x4pCDVc06dfa1N3LU9lhayguknFLNTx7)xVE2fUCF8TJF0LVuFOhBDZbnMMB3FS)7A4I19Xf(JnnS6I2o06vg(bkGyEJ75gwckOnTSe4PZoakBnUukGvyB8WVLMoF8PDcySS(6vM40JRdxGRtww3cgpBx2dphAhU4nsGnnarZbfYlsGKLqoMMcLHuCcOKnaKRZjCS6cLPavnUA)KRaog5)a2paRkT4pMuFeN8BORcsmcQ795L73n6EEtJ306jIFpqdcI)0N3L(q(kS5N0P(8wPUqdyuFp3QchiH0Pbqas8BAMp8kC(d)ry4zLKdqLPTqpcFTqGI88YZDEOrkguqcKgYJfcWXRIkvFVZ1fT)QB6)To26JSpp4GE7vx3zvVDEOn9)2W9jhh5JQmEy(TlcRTs0j3qJgq2Vw(9Di53liSt869aVKvE52p1dk5f)Vq6HSV)5ZHc7((N)9n5vWdt3Tde1QShG8iip0qD6giDy4eAkjzMf2e2CPoFSeNdOrlSs4ROZxMw1ZGzlR8PckJyjMna6wztpUDd0Kn(Z3XNap6Z1yT28l9kgXqFFAepP(NiqrR)V6GFYHm2CyF)y9pQHqq0Z9xTchemGPfaJhc8bqRhSrmUt(iBp)2oHZB2e0oQn1Y(3zE7BnEzVZjPBWd0w2C9GnjvQxj6)D3n8(WcEJ9FCtgfW9nEmH9sMgVMX267bGTT(WgBpNJZp02BuqHqqjm(BLiuRfy7DXP7X7wTbgJOMVSp9BFbXb65iSSZPOUkpoY1(vHhg3XvTC5))Oi6pdb" + return "4XzV801CBBSR)yUpF8SFVlF0kooXZnXXhlNPTZ0rnus0w8gzjFPOoPUpKF7hSlWYVePQyTtMP1MwAxaSyX3amZ4ZUB2057V)(Dt8)4QfB3Ct6YL5BEy218ztls38q2BwLT4R3S9BzftslUl7plNnz20fP7kH)CY2ILzfVz76TfEiLg218zxAmmTWMO0sL1yf2z3)V0YztFyWVPyOVPC20Lac2UE52VT581pTcXXYIlY3LoFD2BYlwSoB28As6HgKZLAjxjuwDIqZsukgHU5ZUM5jh)pl8)eqtzr(MVMvEaCxLLUUCfa5RtFm7YTBkNM)xzarauXMNUBBz2J3SoTmBxG4oF93sFE3DPfpKvMT0V9I0f5PRVz7UztN8P7U7tF0t8bWSiDDw4WqyEqMjZQvkLGj5jwNs7pdkKz2)3um03aNYDRsbo5U8hwvEx(JzfrQ4mBtbHid)DfB)2f5fzlkZ3Uz20BV6DVhOS)twXo4V)Jht))2w8hB2)yGsFO9AJhwGhvK942WrE20l2wKV7MBMn9PSYF7taMYkND9)sLCMgoW7ls)q(UYlYUpD)6sppWyTm)VZ24Vtw6L8EQihGr5ZZUgUnbwx6IVcG9Tt(8Lx6pFcRqih3w4cPwpUTaIOSKb3cxxTLkCWKm34WHwlh5zxYng(42IqAsuJBlsoNBpLZEtoS7iSR(Vu0k3iXIamFm2ZIIpmdJZo4AuYu6HVg75E3L4gwAu271UYnYdbywtnmRQxKWzQHrspNBhxighrz5Ju4fKdhEhCXHAuoL5KubBCQtKoZ4OkTqn8o6hjMKXYRekHEShfNCSw5CawgjsuYrR26mhrbza7jcXWcJIdfgfjGDUXi9Yt0SXYTmj2Hp69QtjmjUXUfMwnwgS1osryU8i(r63qkBS(eaHRKtYUytFcIKH1t6XuQGXoY1(aM31J1me4QsmsSWzc7ro895frCeVc9JJeTDyB8d4bvCedKde8eZn8jPFryNDSIxsLkzKBHdgjgEl9syEx1Jmacj4rzyrY(Sezzhr(QF(Lqp2qALs7yDBjLc2OmrkKjhHbRpCdA2rmA3J2lKC34oc2r7gvkLjdJKEVnuALCyb(EUXnQrjGyKJ1BycBSmkNrnsJjo(rSx1NyUXCSqT6r4W6g3DhSNf5y(VtlFgsiD6vBkZkUpDr2VF(YLFAZUF)DRtxU85F)QhtFiB3VJR9pk2UFZYSL)X81prPV(R1jvoC(5(8YPVBNN4wSoDxO4h)usbFbLCDv(Vq6uXQx0O(ccFHc6wrgmf9AQ8CiN5MuA7YACMZJVNOA38(mFw)WcLXIACtwXISnLahnWfi6kM8)opGX8PN49YztS(hGJJuJp4t30)aZrRjKN3Ky2B(h4sgUyFMwt8z0BcFUX4cRmKGuyRmf(qWtN)bRJEWNSsaeggdrSZf(eUKwI0jT0U9H4JRbuvNqrWhGIlHHOMtpKOLiCvsCZWN4quZ54MCGhXazYqO5jZWdcUmbXJp61jXOsdevcUhmSZa4WVrka2cslmtGeegDGReI4kSxRgPTqmftIHjfGMWqxese(s4uJ8FUb52ONvp8eqgB0Hnsv0vd4xKJ4sjXReHXH3fWIDisvCNgP8ebrgkRG(k6wHZfiad(AMenMgwCIf3UtBc7YqmTqiC(9y06aremEfwPkjbjgVTMaq8NeV4Bw57JLG7Ns9gd6lFm9p9wj6QVT7T1M0kcv27xYxwU6Y0fLaj5PgFvScgVk2)ujUhGuVMxtVLp)eyG7MvpVlFr66GMkpO1g1GbDur3L)(TRFUXszNLWOLFMgEc2IQ7wUmViR1w0SgyWCW6pVyr6M(3rabUUB460Y9ekyNbb128qe(BytYdojtdvGK2vabhGQP7381nGfOUB9Z0hJ1SLm0fpqCZbmGIT7k7GOAKe85C(MfRGlU6I86n624oUUKODVNdUWYwErwyjEu7yrDxYsjO6QrzzNaL)dvBdEWgTsPd6jAlzoijAde)DOwqt8bfGwC5sbpOHH6IHQY43gNJgrdXm53hpQisMoIOlIpYMOmAZvLG2eemlsimo(GKmy5ilKAbcjJfTuizs0ysO6ctIX3gWLJSGb24q7mXpaiVWV5TntkfezAKkYWmJ8ricaiK7Ba0wvazUi2dP6GNu0wey)gpikJcVu0Alsf6e0sdygejzm(A4bnAgK8mXtmOvmllAagn4bmxY4kKQyyfHG2cyJJwKrJxuLLNq1YDsGVIOQ2siWMcpK4iFB(QRg2lzWwl64tfSzAPpGfEG8Pc28DrKGSfG8WhsidY(sfIeOKKrniVh8TyPJe6khmHh2Qo6jeeQXfAWhSSOHBK1RqNsW3IIQgswKdhJkH6ainCjDhXrbbnjYaSle5onftGgXfiTf(nDXHFlW0jhruuiu0bGRksjJHHnGoQfmbbv4ANteeh55qwCOOOusclcnXkj)YGJcsrqHpG1SZ)jvHPahlYvlYbTcumg(fbflN8QknK6g5NfmDqSebP2PIXOuhgaEF4dT2F4iwgTUODfE0ocYPL4XWWi8sXe40uKCKepWNrLdlTc6o3srkKedhGt8h4S5xFJGl)P4zUBZRoWq9pJW3JjomD12VDzrE2MLGN55y)V(8tyl)ITn9nXelA)XXUP6jC0ZZ5lk3dXcmVok86VRBtnbVzQ(BHzCV(SioGlqlNto4lB2y1q7jPU7TER3VwF803SVyxwlqYBLTHXd06t5N2wu5Vm2FpSlGG1pr7a76NI5DP4MntSktpa9pp7sh4mZPa9iWhjyq0b3xGsW0)C2LwJwcxLAf8DW)77bSsE4PRkGS)M0PMVTSC7JFmT4H8nqAMG45uQbU1hUV)LjaJT1x0ODVHUdpOSki1d0Pf(LmbIOUsHb5dx6aZkgile44awy16kLdp71hPYqawd(H9bAW8M2TQqRWT1hVlnCWgVbcm3Za9rYxfpS)EIsDu4dAQjNpEPEcIBZpsNL)WBV8Uggt6iUBJXusXkkJXCEq(bTA(VvWchyfeNG1NJdQC3NMdQP57WVxWFzX7txF)jCKOS29A4)ZRBXHvPavMIqVNRsnKFOdmtkaNGqWq(dMgTN5aJ8CiQdWYVdIGOYO6b07pyRKhODTnF32n9PB5pPXRHLdyiOFzPlEEt6J5lWLpXB(B)MYOTZUvZOE2rQSQgLQ9Qb1MTQeMIZ6cPe3Wztqo1B)he(wemudaAThyTQH10))9PfzF)lxUF96V)LFzvEzgr51edMeztnQiH3nHdCL)uCXvZmACOJ01V20zrlz3UuCvz18SPOxW2bmG16cDge2oSrixNkKf((lnkdKaceDneuP2K4diaYlH4iXu4ORPgxgxTXZtN0mlUAgF3yj(vWEHpHdfGlMwZuSGYdRJDRAa00x0V14(BoKx4dbf8wgX63UtGBu78hprny69unHUb94Ld9LbmMj68gYN3cgI8Fa4PhUGEyleUsiv1DRZYEY)qJk0E)2IfzXBPC)VHRcdlbJSOSy9UY9BoL9OtmbdZfBwEYBXzq0SkT4XtzdgFnN84y72Ytz9ANk48(R7oLvdbBhw9INxSE7MStzlgoKHLpe1fPLW11PHgonGBGPrFGKN0jbuAXsKKEkRwNGK1YI0h2Uz38ISuqh7e2OIOn4sCe8yraxloLvB4QaLL)4tWNCsBjkLCFwAXPSEFDrMfk0tLjHG2rJagoURMgHgeCx4FODf6JwZAOuIRNQFOx)DOjvSE(3KTg(UGft0Ui7qhPx94J730okC2zqIXOVuFC1rFKOXeessfbPU2OxwCbqIHGWUg4whGUl3IkKhlI4f5DSy9s7KtCsaRS8fuNGqtp6adu6ZuvCSbBkSMqL7)BaJ9ydycHjF1Ho(Acnn44lX(3TaPWEKH7kSMYAXWtpnQQuyF7MShFoCXTzdChSi7rWquGFtouVnlDzib3DuWozHDmVAbFExtb)G7MmFDxFkTO0xZ6SD7lOa9dDBBPFB7Q3XDRGLSYNVKxGVsW9WSPUVaIpVopQ6Lv)zbX3kflFKeRA37GQaoUF7I9KGUNu6goWhWSGN3jehC7(wyskXHf7vsslJzX4LEpmCHUkwGvHS0oPthJiwnRrc1eIAg(5bDeHu1qnRV)L7aSxM)03)sqRYhssrZGRww8VHatl7jmYkkW2Fo3KHV6JFZybJXSbM(8MW2DdWfZ34n(qN(UrU0SyaRYxMnzD(F9xPfabdHnVjTgIhybDzX1qm1ds(DYt4eZPGosE52VEckrp1yK4dTbjs(F)l3MMd)m0nHYMYhLGQ1QDEY)Nsy8DLPVnBnKg2MsavV5TxF3BVT9zU32Ee1LUuzb)VCJYj56q1)HyWnv2a6RlyrbMATZ495l1)q3kh12mXQrwuPQ0uADiaNQvNU(KY)TWhIA8nldaAFreZLnkFVSOzoc0gIP9DP1pPLYePtZnCjw0Ng8R6HAOYSxpP12jhu0VFZK5UJYqAE7Kj)NFpqhJyE0(Wv6jp6UMSIlhcMR9DvvHb9AwnMnH5n0JjHj62j0cUjXgWjLSyNqOMrXeybR9romj0AaQttCSk6Cg2KcJKgsGef2ggifgQxfXA47Ordio4cvTyxYJ9W24OY6RK1DlaBGrIIAkM1qD2dblJJDqsWzocAoQF)kh23ed12jfTYeh2CpTK6YJYs4xsqGMibUwzJtma2ZcTlj2HiKsRgebtcD(PUrPfXUqrJFayDbBHKXqanozbqwmgIITyJvSX(JPOwKunQaWkc4TAubuAGnIqb4vrIK6kd2KVQPlXt101l1rjl1cO4WL4PGaMtOPmbBdRHU9P5ib2wCerqoibvAik4oSnUcRbjnaB4cuji6eSeQJMaTI0iXXtSOCKHAINVM0uxW4yd2GClJNgQxUsfbFFrRNqtN1KGago1esPlH6QOeNgd6a4rFfpJMFeSLHuNc1utAJtOrO2j(Fh7KPIgPKKeShwwSPFul98KyKdIeGwGRJAoONfHIZu)LzmuguzqWjXwNksOowgBFuCyssuuRwTK(b3XOEZXWJQq6CvY9iTJKai3qxYQ4OYupHmmQl5exbwcYWazyS5LUOeLU6IJOihYZayInNue74gndlvdjJdBzMb7YihV8aj9OIusSdzTkD4YIM16BzrxhNRAw9XHdR4PgZewLT12JZ1YIxQ59oLQ74Xy26ncSoorYd6HURcH49MyfBj3MAt010bH81QkCTED6wKFqHhZRZFooxH)GJ1QUwNbmBRDYFIrHqPzG14lK(L)pL2dMp10MDiy)UYTpgku9uF4chlEygMQyaSCnN1nRYxd464hmL6JcSNLiOeqOUw0e4G39dgQ5rb9bj6dgh9xfW6KDlqWRbynQdgY5xdWYz6FiWvlp4Dj51aSoH4fjOnayfh(Y3nkWEMok(szWRBk)knMUtQ9OG(GYVVmIEOBUdlW1Rbyf6KdEtyFnGRJFWyWpkWEgNU6sQSjxbAFj3FbGEig8HV5mVgGfYHSBrfhfypJzBvI3ettzyDs3INokGpSFJFiSciS7FaGvcXI(IyXdzd28c9eDg30si2Fx6Ali)JqL2D47J5Rby56xzhOLTkj25u9U9WTz5joEG3PLqeTZ3xMvpv37EkB9ApnSXp(itX)XFy20h3Um)(8Sc)3aBOC7giTaaa0eVGtb0S4SE3bix6RoD)WqudJqnS9Gq2diopSOV)L)hz)WPgmlXyTxolof5dbj1yGK(yqspgizogKmJbs2Jbj7yGK7yqYngiLCmiLmgiHVlIdbkF2yNmSa53gPVmJkm3I8g9SKhtvRNcB2kJXA9OlGvV9Hz1jl1SWQnAqY)8uw7wY7Fdszt4t2XPSATnrcjyGt1rRAW3S1e7ktl3VBE8qepCTMrOBdh8UntUvUV(qaxKhoG39PBM1SgXnp1nhgqp2PLfBxJFmx62bRJNhEZwbwNg(t(IyxuwKMxvmI6g49sz618f6F6wM6fbdjX((ph6Za80J(PL0)cZgAz8VC(T3E1NA8fmHom8a3C(ho)IRUU6lW32j4l(45V7T1FkcLBU9Q3o9UQpvkK2ec6F4tV5)T6lcLWb(8lU9ZxDr9YdZ9p8X3(P395AyJVBsWhp99N)XZBsj(xCQUErA1yfrDJvA11WxkdUBVd)y6d5lA5Slg8knlDNfoUR(P(AtLwndsdHoBcxiyg)7GGrzKMgJTO)1i36KmzOpiUA013uRgU0WjaSBvIAiN)sz6nhM66wy1T1t4aQ5F)z4wTId)NZfg7sfy6EDwkaws5UwFREKmaO1O3osTpjKiE7(QF2uXUYGCdAm(z19UR)QLr9TUBuon3yfnPIVdQejlB138HQQfdfuCAbebxctAygNvujO0KRm0iYXRcBBAPFycMqKxxMs7ok(JUgFiR7D7Z2TlRVxC4)5cBZpCWFQhj572EUVyPxfSzViVQgQLZM9F)tpTWLf" end function Gladdy:GetRukkProfile() - return "4XzTCf1CBJ7J)dZ98MrKuII6X4KM2mxBAU40z3DMDCxfBLyD12kNK81n7d7N9)GaGsuYYosBA7dnksKaGGGa)iiywiwC)I5RkNvuUkR8IInfL2xKU4gXI5pG))t4)xA))6fZxwuSzvX33n6o8W(hFSAM9)oFZZRP29)NvwLxS7RBt)Flk)6U9BX3MUVm9YmB7pgXd8iEaknPv1ZspQ0tTpOT9px89SsOd3N9x17lZwmFEXM8vn053(miMz1lUrQvlMxTofgPv5pTU((8TzL)2IRcJ1rkHqjKbAJoWS4XFjmbiBw9hYs3uVgOXvf7agDzrzE1T3cCoDzE6MlyTwRkOmD3tzxSoB53UdBXIhwmF3Z3xMTTajXV7efq6t3TRy)ULzBZ2vxzhG1L57(ww9DzPREX2XQNZwA)z2UST4l4g8LQSv2FDnkC2NwLvzvdPL1VaYqw1(YYSL1WCrf(vB3QA7X9RHMSgeDqJG6VvLxMxL(WMSlYlxUjZ2s3uWt(Q)GZchEcGfSdPcRGCkkCykJLs1IzlMlcuGUgEqjsur22ldc0A7dWh42inbj4drHMy6njXryVcfcBB1XyxeATjbjI0iKuldcv4NsIIP(gB4hccdjAOdcqgkmMqSTkBtSVXOIjrirz0CBcrchjd1evmjb4dAb)qsKIOBOIyn8gdXAHG6KjMg1MGWgXuIcUqLqQdPeLozcmOWMOsG(qJKasOIPVOKGEb)cO6qrqQJeKUmjK6BCejBbYysuKYeIZHGvp9P4eAqdJAbnw1g6n6OisXycts4bRtQSZn4SvOG4LmmwscHX4ASHyAID1h0ytIHgbHctenusKuteWCljfWcr7BcJcvgwFYkytKg5GMuEGCQrbgihnVz08KUqfqgvATgjlOOHFuJlS)18vWsNBaZl3I53TZA7UYsuRlRR3vNvwU)5ACbqL3xx78jCt62m7I655)DMLu4s9I6ST3UjToJCmE(MVN(s19PLpLvtRArpNZxx89ZBCmwzj7YChpEO1J2hYS(PaIhTy(Jfl3xngFIOdAAqDBr1I5Z(893)5pXe1YzW3eU8Cv5fGG(e4uldxzwTjl7z7dzTsYJfLlZUEzXo7VKB)5ncLoiHCuxxUPQE)UX0NOey(3ky7wn6UaoJr2SoTCRFhMDm5YA3aD4BvJH8WYaJT1vltRHj7X1hreokwLxzvBqqHr0jDqmoNSA5OATimY26hZsl7nOBBc4SQtVTk2IIrjnrMqdprmHUiXUK9mmKtHGwJQxjuVwvM(eek6HYSuyn3i6yiRK3NoMwhzJhy1xLzz)DwDz6OmHJmQqBVY3(m8MrnX0yo(YYnf7gLkqlqzdvcORILPBYW1SoWzZRFbEZC0DZJW6Y)48vR(8UQ)49BsxT6L)46TPpLv9huB)A1)3(0YSvF9HnpBPGLBKZNqyL)AWvXg0DXdSxgxyx0lW9FgWTa9Ex6faSJA77P(kJ0wVp8Ve45GJq)01fxlWph1FFzX3VmNbCSy(Dx)(pCFRhmphNS3rYHkc4X(RquwtpZ8ucpvWzwbBFvDXwlYUfZTakEnWG1mzfrqqTFc01ydZ8gi7zqOxKYNb249jUkigCG9gO(rfAWF9pbYAayB)4jRom5Nbzfbr)uOBKcaA9JNSgP8nzODeYkdnVjP9SiN5lr6ZI8TFvAii)BG6h1(9Tj0hBMth)ZWGqgzrR)JNUgaV(BHSNj4PUKgyInK2Iq5nq6JPGJv)u87ebrIEdK9miYGhLplr7BdhbBZ5nq8Jh34NIQqy(zmXPaOXVjv8X8bRFJrIod2eTVrSDU001q(NXsAJDlV)4jlGZ9hR0wZaVUndaJci1FkZsZN6Iqdrc6NvkVeBHzRRFACG9l3K4QFr7abIBH(Q0L1fOZKJU5xlf8s625CAVSV2YTpMxvFz2JP73GBfrhFW6KNlZbXR(fcMlaWF53aj(DZ(YvxzhWu(KMuxesvuFf)R0fvyCqF)cTDXU)CUln8aZU1K4ru0bUlFnPct)XK6IuPpaVYRYfHOpwKbh7(AyZjuxdpPGz4BsCrghyoUown88O44kmrWbtJy6QMehIoeH1RmYdddcp(iFqMGjWCkddHSV)8xBspuNC8UipKfXjtLfaQo9Owt51fmzStIly2ANetIIpi43RTOkea9nnMimQP61YaCzAmrkJMQ7uHrhnr)wucRNGPcLy7jy(s59EscLqNeF8PKbxuj1jMP2LGOWP6NloEIwWc1jIlm88EWu9XtNoWuMsWtryesLxib5eh405bnPUab3oHUsEOPO5W9O8ARCdvtn2gD(ftIlQa5jI8CKiOYt4pDy1vWeXbbHCfhFKmCSk9KJmOuXt1npDOrtWawQsKhFKenqhIKXtCvLsPoiNtVI2sfgDcf8WZ745BoPUqNS2eCzBpVTP0C1udIKemvtr8K(MwpeNWh3qXPWJoCc2u2dj9eErhyDETlF7NVSEpvWaUtn3VybO0U3E4FxVD7E6ii82BCscV34aztgECNKF7g4aabZxM)wp9bhfgt5z4vhf9lrJs8ykPJxqf7(D)roPD(u6FHQM8(76SF5C4oHfBYUwFmUUQSpzw1wLi4SkwpdJEeA3G9xE2oz3FE6Qc6KlhUVNHhehUJDVP)nPvv2J2z0SVTQtUNeC3ERFZtYKTJ7uOb0NZtRbLZd7RXtm(gCRuvpNTzJndf7s3c8HoS7fZ3wSk)X8Ss7xGouBt9amas5SqutnZs2biYv2d7EyAiBPbEK4wsOgGeNJn6F(Z)l1W0PLmROeESYsPWtrPWPqPOtrPOPqj9POKEkuk(uukEkuYCkkzMcLsofLsMcLO4MhJuw31JMwDwvXPNAULW4bx(HVCZ9V7o7tBZ3bgWaMiCL8VE(D3D9N9(qaGzW(HBp)JNF51308bk5qWh(05V)DTVLOYT3D97MFFZBvsfSrgI6F8Zx8F38bCBQW7V8UVC9LTnhHobV(Up)(V0sBQoEGxp)dN)PZ9LeBT7qPK03R3)ENg(U7zAHU3tCE3FRmGo47BHMLV7jYPypVU2sR51866Y9ytH(GZSGw6KBQbrBjpvUxW2GLY1RqM4tTfyMthEav9BdwfzNUjXVwduaU2tM5T2elZLc5iQquk4B3er3eAdRiHp(URU3liDhZIBSfyHlLYy5s9oSkiN1vo46siyiRUre4Sp4H7Y2CBr(UAjNK8vLdvINwB4EPn)H0sxfLz34WJLGRN2A9OTlTVdnzpfcp)soR)3(u6t5lhq9JNAaAIZfEtlQVM6CRdYh8yu6pdG6u9zDl5mlKIwpI36vXTwbCGkMBHdEajJ1V8mmHE76xQYbDaBMWMmpqtheqa)M)HInV41uqAdCyDJcSwzu4A)UCvUfNNxxIc84G(G2FE5Y0Dd3drtCo)oCtkbLe1EQaP)Ga)DlCKdgjZrlnUxidoGvZ3V7B7atT(D9l8RjRw2c2nGe6duaLf2IbUdJAzsDVZPHlFOOJVwqWRfwMF(ULRbJMw7fRf2bwPdD0q4MEYw5Q2X7TUTCfLQTYtNzZuzsevXOgjvcP45uapeBZ4l8t7r2mZMCwUoxtc5YZL)zOmclM1KafvxPkPalEuQKuXmGB7heLf7aMVAlbfkxzXs0ZXphd5Q9vf4yucvTRYGyssce0dQqIq2m7odthdrjDmvdSQafvMSyICN5spR9nCTbRJOcYvA4s1feo67Cr0YL)lGjGjTkKl4yQmPnjsQIETjzeheXHiRmoEJ5iIgNur2c8MggH6qsyIIIjPikHk53qblWe4c4HiQ8E1Cv(IbQGhIdyDimDIpOC1ITrQXwGBZh5MqrsQKyQ0PUThc2muRsSIscOTRgslJNgf2fU2WJK9QrCJomMFra9qsOGOQH0KwQZLSSoIEiHRR82IexX2MAsPl1QyESqfNUmjg7AKB6dmMPgQPhI5I1gpNd4HqQYVHVsCsZMGcyG0ymJKuluSfHjczAKZsrQiMBI4cKpI4fyKH)KNXOVcABS3kBzUJJnbV2WPKLudJdiLGGEFCm)dAjtumBq4QPCzCcBQhYpi0ylubcAmsNicrsUCXH)rQTqLR00PFpwsgX8cEW3a3bjVSIl(BmPsi7Lmbi5dpXTz852yFDcV6H7h0AEblxY5AYgmwWkfLMUnac2SgwKqCsPyDljqXCzUN4kDDzyJcbx3v3jw9)EiUomoJgjJp8h3211bT5sQpIzBa7dX205I30bj2QJa7lOpSpqqUTOeC4N)M3iHp6VRSfB9Qn41G5LfxbRZ1bs7j8eidnjA7n2jSr(X4x2mVKw7qz2hb1L5vzPvzdPuTxYLsclvNDbEHd8kxsenjmsmeYiRvXa7eYxN6MBSnLL8jHTE83phhN6HAfLpo1obKnHduDlqvNoTxk08MN7wIVnvvsl2CMeEG(Dc0Ns)lRgTc2MWhZ3XnhNR8UmeTOWrkWfym2QEdOnfwygO(m)3ob26xr7MVkB2M8)(VtlHbkwY0(ZWFggEoOnwqYTWE8zjpM90n82RBZ1Ptjmu9205INnczMYMwluD)jIUz2erInZHddIdq(2KggssGKcby3im5IJrCiyNRbumla5b2Xy2xCI2f5YHllMHtOzucnxmlLqZTrBipV2qcnbuixUjHCiiY1o1bWdobJqcHzyAzCxMjdfdfCDtsui30edbWlsXH8dJz2RysW33kaUqS7MPzCKYbxGfujFhW0juiHedP)IKoqj8LRsgOi8eayaEWY3BkPGVdtGGqqwJDOKcDXmfe(jf0cAS4UjuHaOskwSvv5eskoP7sZzLwEsLHve7WbeYx4lGUihtCr2WMR55C(2XjIjeIXeGzMMA(E4zie8YynjqaVOgarDjYfKWOzbjKW25UlyX8fOdWv6WwBKUMsJQah6DnnUjeuQGafdN3Dz2u0ThZqqu47qhyuYsPGaT5GggXitLoWcrAEdiafjHkuZgWjmoqqCjdfPd4xGSrJrCnssTfaiRzqnAJBANg1Xkh44qciRd9idZvzyqfHU7PxcnbRKm6etGGufeQuggmeaKaR4KbgdNkKNqebbm9cKmQgtcnXW3fpjyQsgEnxGVabz41Cx8alDACashHJtZQs(Q4XglnxerndPuZaeLoYKWiL(RfxfbdkegFuiG4nUxC8HU5jToXBYLWrbgrj6R2hnqD2U61vD9xEu4vNzADW(qrDDX2pbDdtSByJ)8(zcQjAGFYDwv()aaBQpfVI9CM3szV4WDUI2)7rvHNl0REBSdgaSXidfXtEVFFwvvgE1g5XZaX))9oxqrUNTxRjisdJ88anCR0FX(YEa5eDmc0EcLFgUmTIXbyfo9DBQ5Mw5toHttzVwO2rDdg(Ey0ID5kIN4vUCj1S7HdeNtIqyKyaxFKRY(QYB2VzZiSdwv(H0npoITa0GmBeT1FkFkM0Lf73TYzs3zkRD3mo8SDr86FlB7Fec9wXrYM9E1)Try33DpBdLhBVsJMmmDRmo6oXqE7HHKsH7bMdBYsbwE6v0IwtHwFudEqkTR)uE7kymtMUDir9gG)0(Q(PeKhGdq1ZKh691ZmzeBg(W7Oyh3m12)AjmZU6NVhK2F5GOlf5vf7g0tTULt(k(gQC5l7s3MVKe0zD391i0IDmw(x4TVZsJ(z193xC1VaOCJIT3(EaPwsIg)ZDrCxX8Gfb8PBidI8DZDFX52DhD9k)YwzaJ582BGQ3m5qhcKB)OwlV2TC1P8rqvAlabVv38QjV1lv1P17REWTO05xv37pok(N1sZTKFU9p)gZo0BpnxmhJP(p)5vGZZ)5p)1151zEUL7ESxOvrR6y9KpNkAzFNTxYk5(lR8pH1rq4UEcAx03FhOTOW6Bq5P5wM3ECtkH)8NFJCHC9M99prVf()rw5G5FlfCPfcNF7jnFSjbaDwfD45rGgkhEuyTEWGj)MC901Xo5BZUZFFT0yD723JRtFWaEAoKC3HTWI6I(Lf0KCj0bayJ9817QOsfchGnvyvJHA9If)N)p8ugma" + return "4XzTC12CBB7K)dZ966HaGea8LwjXjEUehFwotBNPJAPKOT4fzjFKuxQ7l6N9)7IDbjeFqrSX9nrYKalwSyX(0VvzHyX9lMVUC2(Y15LVz)29L4dYwCJyX8LU)9r3)wI)Bn8z2UhZFZM8vF929FlVCww595)z9IzlMVkRQg(ZXOuKJsrokfHuAnmO9BxV)B7UC7ZBOXTU8Tfvzl3M)MIYvBZxSSLSpgsYOlIhMO1Lf7(AEDpQ8CE9hYZ2wVbi1hYlECt9IB0W829897RZF62Tz15vo(4YTFl7LQ7ZkFmVoFno3YSvfzBVDF1I5Z(893)5pfqUBZlxLVRo7XCueWR(zlcAfMnmhsMLhE4HQz4)4LqVVC)3EBrz(Q6I97wm)URF)hac))Nxwb)9V)u2)7(YFF3HNOZRJh79F(w32Sm)P9LxTFhSSVDFzr1T362g)6NHLjhKg)KwcS6HYSpwuv)28hYoSTg5ETXeHFMVdLORr(75YcGc1VS4M4iCtNT6RarF3SVC1v4UsAKs10MIqQssM2uuXMO0rNIiPzknRrKkYoT1ijrnX9UsO1IPnfPsNgpTPOecH5C27Hsy7jexdFOKeBN4QitKMPUxIfJlWer9ogvrXjJFmoW5Un1oU2OAWJ9y7e3eXXrXJlQgCrerXJVidSVTcPCAmLrmrLxqpC8ziK9VrzJ1N1vWGDDQYQNgxLiJhFgdVi60PkRKXYKPUvSQPALZcRYexKy1KV2A1N4cYi2tKYXvgL9vgLPGDUPO9kstIMQ0sNAgFRp4DkPo1o1PeLepvbSXmrvyH6e(rg2qA0u9jakxPNLDXqFcY0XVNmGPuzu0jo2hX8EYundbUQKtCversZj28d5frEcVcdVgPjMXTXpIhu5jmqosWtr2X3jdRcBntv9sfhNoXPiaJeJpLbzm0v9edGqbEugxLCilrMOtOFnS8sMm1qAvkZuDBPuYOjzIuQspHaoP)esIoHr7bU9QJMyi2Mj7gvPuPJVidEAeNeRgxHFGtCD8Kuq0QP6nmnAQckRoEIgtSItyVAi1CT(uHAnGYHXoTZU6MuT7NKyt2PyU(hkZxmF((TfRhp9520MBYVewYvBZQQUE1(DNDcYR48FdPswnKM9YdWccZ9gxUdvpNVD7I5a)K9eWCuY7lM)0(1fpuKxIVbMqnMomSqzCMX10WaQkhGixTF1HQHPHSLgp4gfqc1aK4s3G(7)4)snmDAjZAQEfRrkfFkkfpfkLCkkLmfkPpfL0tHsMtrjZuOK9uuYofkLEkkLofkrUIgJu410ZMw1y1WWll3MTEDXoQkCuLHAV9C5HYSXVbDHfPYZCD68L9c9mSzGIx5hhE9FEXFLtMvcV9F2xBR2Kb3ARW17(INYlVlF7T7l2vl5Yr1DBu9UwRuKzJFUyD9MRaXYE3gjLkn117QZllp8CnnRM7)eNu)YZG0(2nVuvSkBlxYsU8LljoJUPho8pSF7lbdfwQiE4xKejAUpgoLRkqlGbtjjkyf09g)LLRY2n8menkYHt4MmYiRBRdrQgUjC)nAVP3ozUtOZZYTa9wQ5h291DG50Ut9l8JPdq(W0VHe6EcGY9v1DwO2fbnBxC5UvBGJowrdRRjOnhCk3wIZJoPfSFP81Vn3neCPTrqWpZWG8nPg8lqAlqY64tSqakZ8Lqd(IbRUa8jwnXzOtqTBMYuW)moE(txbEMHE6vUXjusH1nFh5CLAbNMaYX394u6bjcLBy87PIzGlNF9WsvmZf4lTEXPc3cjJmeJejOVOIjcH1qyMlrbIsAJ1suqftdalzWmFqRU1YAO5Qtec3R8payp3N0EHs5gNHKztTIylvCKt8ztLoc4sO1rAtSBXS(v3L)cTtJ0eTzjASoMoussmexKKM6gBSGzzkOz4ljw3l0wMwAJ79MiwkcNNUVOabpTPLA3iCrI5wni7d3BK0Ik9cCSaTZCYvAPOmuNrIj3xsTKyZvYu3CT0UprsFsL5CMlkod)Gi3x0efKwsGIlcjwa2J(sAkTvW6)rmOI1r1KSxQvgEljPhKACtfo7ibkOutdutFXqtKQTgs6ilXlPKQQM1ffW2OrP2rsTqXNrcsriHvzaXfT42eAgGUeDIyOJe(GJEli0jwwODBjLoIPsmFjlY9beQVJXJKmvHJDbZqcsMdPMrQIkfRSityrzkljnP8fHy6luH4WNySgMpu0rQGURinssng(GPIrqYgJsZx3ewwroHfjs(AhM3RJhn(BYenCXlJBowKXJZBxr4TJqsAfTn0r86sNiABIJJvcwJhKZ0Lddpc(m3iy1hMnHTilInUBKbET)h7ZnWyl4d)29LGH1cgAkWo(wWoUZD6dzRY)TlxV(Z7Q(T3VfI14LF76NGqcQ(nAS)E1)3HSY81)(YTp3eWF18n7)2vLf57wdUpxsGo9LNXfRftR34d3NYgOlUH4G3CCOfmFDZE0DPp2)Jh35bdiNjJZ3cMpvsiCJoK8yi0Coz6Hwy34tEZHYQ8Je)IJIZsJRz7o8Z7lBCODrcf6YjsQcF1zG8AigE)sq(qVS4kWaMosI1lnsgBt1lE4Naf15)5IRsucRZIxsmyEW4Ft3nytqtFNyjxUhIy9PpbjovSdKRXO7AhKND2Ebpfol2MtE2D5B9DuOH1PzhJYnmgHZ5oGBcoPkfLlMd9QIq5K)uym6eiQx(9XET5(zhfsJpmnE7O8HX1WFtttM08VbtKygQe)HSTpCg7a(caE7Bsx2l3Fy36ox2dYUNu29uFa(4cz)JXaE5mSJ1t1CFr1(DdQQOxe0mbt5O9TVazMvSIg(m0uZHD1EBnE7o97oHnD7GaSGwdGHVVJi4BbHwIrTg02jOkSYzydi0wKyhzaCUZK7F)hxDy72)(p(5nf15mN3YmuEsHk4EgVBe10ipNlrDAkHag3t7FXz88JV7Q77OE0DrBQ1dUt9obo2PgLKPbTqcxmyB1GXQ2vJgbeDiVh8zvWc2aX317qPWYWelAfvDDn(lGftJgmn6QPT2QHOua7Inlt)t(qr4KUpDKZZLqMnp6UHD0v)HpgCYQlxvFaSk3unTGtKbYhUB(vOIgwHaFUuHkG3bCos3nJvAVgrB32N50xYcmA5UOGFjOIcYwLGaUL1KAYQFEn(NktVcdNfAe6qf4lYDxBoQY89uSRzYcPjf1fvIxd6Af9GhAsK9IuVTZevpIRGei7IMWKO(OmDpCGEviRv1Te6VgKvh3dDHxdYkIs(xHUjQEG4(AqwivYFifTriRSFxVmjYI2XFK)SK(mq)fYHRlejtI6JQ)(JX0JDYHLO41NSqQT9AbTxd6Af9WFAsK9cbF0L2eOudPJmDBpRjr6XeW9HS(1GS2erxuVMezVa8meM0tQouhojTleCtI4J734FfrbK43)cKvjt7bS4RbDf6Fqprxi0hPeJNL2JvK)34kTTFJq9AqwrYRSduyGyeJJ1E1TTbmOmgeeTlcExOBQMN3MiX1p90HD5DohGlj05acCbBnHc67y8Mwv0nNH1LHPZ0DXUAF5tJVjP6tSQWhv5sA)(JgYUVHOBI02fEQoj5K9nvnwBp5P6Vt3yKc1j75qKmMt1ND8k13zv3XyJorttqdX89gGsAorpUkyV9HOiEEf1QPEIVBx(tV4003TdssAv(tGYcLoaLV3D5zRDvBScZEEjYj4mw2mGVurN8u(h43wNJiv9CwznIYxE1HsUqoUwuynoTQ2zC)gyiBGK)C1pcMiL1vNIB9qz2t5TL1QDmTpZP7g20cDl0P7kLgdvY1bb0tDBTo5Q(X9iAyOu5O0TjceN0Cb2ny8kswTp)Cu3TFQSDVwbweYZ6uDt(MfwtQsYItDZcDCDL)WPkGBB7KCgAcRl)FG7D1NQ0GMJ0BAkgAly18kguJcFLe(u2FIMYQatqFSyhpCNOiWGH7V7CyVPyD(STf)1FLvcjfdgg2L1s1EwtxxEZHTBpJkv2SuNrjRyerN5XdvbjdYatXydgjj8dqZsZCi1Wa)jiqnereMrAfHpPinMqflv7HoYdPInHbxKrRtkzq5ucndQP2YOSeRAbVHWtknMXO0OzGwjYgjia9KIiltnBkXAXwcglnJcympYulH1AIIbDl2WRVIPa2ZY4FNeBOxerZqMyt9a2rCQiksZW5W7FgCWePhuqjXoYifHONwZevli0NKIenZXgcNlJhUYygXkHG2ckyeU1L6Tn3xaXirfqw5zsgKmcZvfizAew8XldWNHrKZ9tLG5a3kNAy8KCdxZN(rXmQyeKTGOMKGmv1wgrscvDPrtSgSA0aItPLtgLYamd8kXJSep1q6rAgtvypWkAwbH3Ps6X7mIHwxfZ0hwp3Yjie4afSy6avztzqEvscnEAdGlFJmJyac6rpWTjmM5UoUe)BnHbBIhy5ynJuAkbPOHWGLryfzrVeKyGejnogRwuerQZmC)rrKoySMiNIqYwMYai7rZlMH9lnMr(2W3pe2igQ0iARkvwBJEpX7ela6n8HCSKHSmvYBNOiUPfyPcmesGb6WewYwVgvsZbhZrwsMb0KWkw6bavZJqlOryjem1eOVc6Wd009xKszalBlB8DohIo3YHoLQbV5BQ6gCzVUB64iozl6Oh8Voy7Je6K1hmbocpApiPA9l7nC)Jgwyx47cCy49h3PCQn1dVBqVaPAI6nGd)1J(9ggcNdvtCPhZJGLUBSd(9nMEptHMLc1HAwSFzOivqmNoUYTDbRGErWE7yWbACqFupGs8rdmDj9Ji5tzpwSAGGfAa85cSdOMVfIgm)7GpUOjdO291Wqv2VHZACr3Q(SUCGtVGaiwx(gi4Shbs7Ao15vBZZFomK5Ly8EqsqEarkWpVrO0rPeU11LBRQpS7CMtc482DXB36ZEkwnTmBYOCPccLFy(cTOIRX(91N3ce7Yd7RvNZObZZuwBVSA7EkpYV3u0cJlzKQvz1WT2ZBzGKPDrywuHNm7oRDIgR7fmPdzNZOtsj2ADz2JquMllZZG8poJjgZ8gCiobzSt)F9QZz0qKDooR4PNHNCwtXRL8qEw5zPKG1GLBy1U3x(Hn0g4EWf89B8q1Y2bt0logUENnixxM2bTXbsnj0oMTXuq)CMQXSiN5t1Rxu)KPfifd8pwv0wlffACS4SrEnW(9LCkWok2aLkbyQ3K5ry)w8JkPxvWs0JQ)t4Aq7E23SHhvpCFzHxxfH3c(JDnqXncBx5)aNmoh(NrwJhD0poIV)6IR(jinHetme2leGBAQ2b5RjmUL7zuLxEKlP)5s0SgOxpBNubPm362DvrRoDqGaboBFo4)kgcd6yGe0Duf8UTTPUcmjF)H8QQCcK42(fliMRJ(pjIJ7yBVeK)VnG5y)V7mn)HVCZ9V7o8Bp5AyitKWzX)NV8U7U(ZbVisM4mQD7LF8Y3E9nnVG(r7dV4tx((31(uIk3E31VB(9npvbX9MYu)JF(n)3nVWfAl6Z)UVC9BBhUR9uHhF3NF)xAPTsNKGMZMp)dx(Pld5KybBMJUV3In)yT7UWFO1PJsCIg6)LeCHXJTm6smRGuvc9f8)ebwgKtyttR20SQyldsdgtkCj1SQlxWjUVK)zV7Mk2mY4BC)(fXN00zLCMIQySfpx6tvehRchc(eRIZd21RZ0yOme8n7mKsp3tLUs47gl1rOQ4yfT0WtO8gm(wG0AOKxCvMKztjowjNCxt(90V1yCike9mANWnjRHB2xjiwCVXNOVlvULlAB0uiLiUjYLTD(PV)J1ex601M5Yevj4dcljg89nAt5qAQlaiQIsPdRyUToJvCEZAl3YZ(KPeX(o(0Kkz2WNKySGe5uzewgKpBtzeGxqvNaOIomBnQTNX540ExY)K0qQ5Rnd9liBPtsdFu3RMKNHdkNDg2pxBJPD)(lrpZxZHa36(R1LAOTQoPo1AN7OcC(pW47r9U2Xz6DoEsAAxub(BT0p)U5OgwF7GSictgbL2DZP50RDOtZWutcAyss22gfa(t4lO0XNrjhp6)CAMKG944ec41ZO4LlhkrFMv6ekXSEHX1K(7X)Wb)NZ8BMyp3wvNvFOAP)kIxZgrGROjAJ6fl(pF81Sba" +end + +function Gladdy:GetMirProfile() + return "4XzT80SCBJZKpm75XfXpee4OvsCIRnXXRLtntQAkndLeTf3ir6LKAZ45qE2)AGUbjejLIyIZLiAsGgn6Ur)pYc2I7xmF5(hEOEM9FUEvzXTPRxNx84IBylMxLw8y2R2KT6l3w(1SQzPv3N9pnlMTy(Q06g4pNvwToR6vLBlRSqk1nRLlUjAX8hD)BL9FBwmFnmOYTRl)AXLBFAdoU1vVoVoD52SxLxTABwiyFmeKrxihhOnv5fFjR5qOSCX8nzPBB2aW5M0Dzxvw0mp)FZwCdhMAXt3x2KT72TPnz1ou5YTFn9567tREmRjBTD6vPRYt3EBz9I53D9BF39wm1bLvPa8rmh34ZBEgEZ8RlAYQEiDv2FE561FSO(pF7wGi(8FE9U0hZQ)tCS)1B3wwdGSEtkqgQZFCtZ957ay0c1o(GNw92QYV(68QSvn5LfTyZ)Fwvn83)1U0)3YQ)Qy)o3SF8WXo7J3F)h)GBdxLTR0Tbwm)1Lv513E7I5pL185pcRuwZIB(nfhOZ7RsFFEDZRZEiD)2glPxLKez)nRWsExB5ppvLdqO55f3iJS0)0vFba6BM9PRUYYq4jCUyAtHXfXXtBkczsK5OtHf3oL21isePN2AehlM4ExWuk20McxOmYPnfbJXsoN9EifwFcY14mLyPEIRcpMNm19IKDCcglAaBuejJpoBCe(U2OpU0Oyu2UupXnHugjpoPA0fHfjp(ImY(wZ48PHujSjk8cYHhFgm(WtuAP6SocgSRncTAAyvmxE8zm(IOmtLwXL84PUv0IPQLtdRYexePyYhB1QtCa5i6t48JlmYhkmYnGEUPi9YmXrtLAPmjhFRp6zkUYON6uIILtLaNKmrryM4e2rgxrA0uTjacxMZsVyOnbU54Ntgrvkpk6eS9JOEpEQQHatv8jUkSiEYj28JzfHFcRcJVgM4KJRJ)iwq5Nqb5rCEksF8DY4IW6KPkEjKsZeNcdusC8PmkIznvprhieGfLJlsoMMOKOtiFno9IhpvxAfIKPA2si4rtsfjxyobboE4eIJoHs7ro9QIMOl2jt2mQqimhFrgLBiJLIJlWpchxjNKaIsmvRHMOPsO0k5evMOzNqF1yI5k1PC1AeHJe904DnTXD3lirxaP)HpmXOJh9SnQ5UOxdNXQTP1U0kmitbxj1ArsuCCc4MNWAy9HFlwmEG(D5H4EmKF7cgGZU47VsMWzmJsbM24MyvcaqP2gSE)0AGOAhcDje7lIuJL(Il0wu4jkbiVlZg5oYPW8mCBw1QSIgiuFlw5hxxAhSSiiC735tkXzNZehO(q6)0rD7Mz9B64UvU8v875RB2Cv6QMshsBWq6DPMOA)tn4SGf8gw3Q288tzlMF7MNRZxLU1TYmhw4Xi7gT)WFx52NdgkSur0WVigEcMIS)uUkVk7GPehfScQbJ)YQvPfJpd3cO7pHBsB2tlr0fGf(WnH7VHjjgStM7sfdnl3cmyPMVV4lfLFTO)u)e9AKzrmo)gIPgqaQkRB6TqDlI9ay(LfR2aSUUKxzLCd4YDNVoGtZOZZzRFDMBi2LwhbgnMzDokXKyFWEGW4EJguSpZN6b4HeBuzWV2SWmZQ8q5Mj3a61SJN(1fy8mRgsHBCmbNPDZ3boxiQ2PXGyJCV2GViMjCdJ(ogeOD58RNneVzohgW1tAyUfIhLGisedFqirazJ9AMZblesQeTgHGqIdWgQ1mVXE3APtW5QIzm3N8Vaqp3V4EbdvXodoHMkbIwczKJ8PnChaCbc4aDI0TyA)Q787d3Prke2efvQKitbu5HyrSX4gRKrOm6Sb8qS29bLMGLkX99KiIkc8t3dcGWJBAUYncNfm3QbET5(chxuUNGBtS1mhDfxk0Z(zizY9GrJKnxQMCZvJ7(yo(lMEOzoRFj0lICpOqiW1ib1Uiizbqp8bJb3k28MGiOGKrviTNRej0wIJVWK4MkW7qckiuJduHpKGteZjHf0rAexmOOQIKfzW2OvO2bsftq8igkietIma5cxCDmodqwc5ijilHyC4xbIoIYmLBljureuK0HSi3pGlsoepItqfy7mcHyinhCPffffcsyHhtKsdrjtm0bbj(aMad7Bs0jeEiqwkdpRWt4Oym8dbLegsBsek64gttcYXejHth7SXl4WXe)jzego)mSBoIKrJZRxH51JGuAbUnur06ICeLo2HXcgjXd0z8WrcncINNWiXhcnHTirItCNidSqF22x7Nj(bkBNGllTQ0Ri7gKRs1Z3u(1RQYZkwdwnxIPP)tpHLzW7uZR8ojD4R91CXIqBo07bQWdyDg(2FFFz52M8N(2FxvUVynynHQFWbfd5mlQIFUwhyogrmyF2vyhxbtE)BUcg(2sRbPXiKVAFvD2bqKDGVwQdD37JLvTg6UigDPzyLmADTACCEmEtBnrcDw9zGdhZngUa0jAKGUvT1hsGd)plUsl1kHIdkYatF2i1XV0Fd26m13XFYLLnnL7(qA1J5foFtMtvZQ32l4TDvkQXvTQVJGoSoT7ylDZ67WuePdrAhqCu6oVFxL3s7(njOWRL5Cgsnl)(v5Q94CpX2eVxD0Uu496RffNM8oE(WwPqR866Q3LU9HZyhqrFyp1oPQa6oHMT(VwU9PXINcpd4H(i4Xf8HC3aCz6S2Ow(rOuCzEDzXOsvQfbf1DkS7x)Cr6U8v4WNzv0SVOXPLAwNwNHvjUv)Lx2tffQHOLD7RmnDGjqzUtsYQhgepw5ujcaARfyhOmD()3(0QSV93xTF72V93)(M8MmcZ7qgmuRdcWLq4(oLJJ8h98wVOEd2m(17pcu3EGyuFePncC7U3BK5qBLyCQs3Xh30HjcQ(Axl87X(nLpsfIshqpVUOgJnVlyLoAxFZT)HBZEGMGUbhQI(ZbK7LqOop6odDWH7XjGUD5LRA2dQJBRRVNwUC0aK77dGvSXMEaFWvlTs99jXGnqGY)iOYoZf(v92SSNSpeKcMhkRwL5j)52FVb8slYG2CBQ2w3SV4CMtSr5u1vvSU)uwESPOv4YSjTA35SgkBcmTRrzzZ5m(yW4iHt9NYXXjj3HtpVABzr25Skkge6G1VTvPnatR(CMdNf7OwRb9zwVWoRTJkkbJ9p9CgDSbrR1vPpwwuVSklfobDgtus42xoVDc34OXRxDoJwXKoKkF3tWBoRP4LsEilT6CgVnw)fUKx0E(3PAjWe8Pnney(1PE3(qqAZ4DQPc1)L)tPt1EKFq)cr2p7AiM4Kf96kkeNerdnvE9UD7lY6zKgcpeTwAtfL3kiQ)bHK2QzoVxo7ID9efGHohHUbiVdwTRkXtWNY1Yv590X9d0Ssh4MIV3GA1v6eyvXXNSeIn2W14NQvhCJHZeNS87wWKCQsotRKnfjNEm6Otu)aCijFVbi4jNODpCJP5WKaFEXJ0gR4BkY25cumTOa4bRY2bkTC0BYC7DzPRDdOM8MjZpdAaFQg584jlNfRmBYhFkTQXM42S69vKZ2K9myA1DZ4(nWq2agKDU53k32lUKhQapMPisqNcBhvVoAl08D)WyDNfmwfmR2tI5UTwpxfEpgp5YEU6q(Te1Ec2ny7rK0gVVrwz3HUx0)yfOsilTxGPEhELlccnLwOqVlhKA)VxW5D1T4mKnwx9)aUL2CQ48swmAKTDvFGwXapg9E29H0)XQDR(wGgNxqd3rCcuH4(7ES)n5RZMTn)F)30kylb(nxK2b1bkyxxDd4u9PtjtxGcNzqf0UYkx)LZGqEGJMosX9F0gFDOitdCwBtDx)DEEgzgSu9fFVlBleqvrdmKx9MBU)n3DiYpAs(dp1qhS772PpEBlJU9KOPJn8dO2N6r1(5ujKXpXCT0g(r)6tf3UVc70wpU)5oouyK2TwHx3hVwxfsXO50gOMugeQwy4BOwRrI6SxiI4zPa8Bam(bO2hyKLqzFuU2nziBim631v)Xy6u7N5iRw)zbNP60l7n4q(RfCwVnw57aKVZMafFTRgBZ3bU4Vja7ckaQvFOVqRDcUt5W0qp2S6wELpxbuNChRged7zP0nKBkAXVHS)rYVGDVHC6bQ3wowv58oQ(JlrGKEQaWRYBJcVlIE0vs(bACUK8BySSQ48JaBsB4RTvhuWmyv9WEy2(qKMgJV2pT18XM5DCWsSyAunFGPQPAKPPP6RPNR9PMfwGIiSQacjvPebttfksqdraci0S9Lm0wzp7d(AgYI0uPjumFnkIPY1jPQecVbRArIVsc6eScloVbj0KQDjwEgSLiTVW1QJoKYeDybcDEKAhlpMklzuevMpfwsN261is81IL3vafFz8ueJqGWxa7AK(Zui1UT8lCUVuFQwSIynIijvDePGQVPstvouXWQJYK(cNKy4eAiPsSiz(YgXWYkInW0mFh64gmv2oakk3SuerRT6Hq4aoKW1rmUrkn(60rLe1vrPtyFK3zFmu13anpq4)v5l33K11pdGZWB3UyoOAZMi35415ybmH15pKdovo3EkTPbcRAU1YjLQzmp6l8D5qpGCL1P0XHbVdgoxxTGqmciU0nOV93)xIXHthywJkvwVW3)ehdsYPaP4tbP4Paj1PGKAkqk5uqkzkqsFkiPNcKmNcsMPajSLepgOSUxF2WQn0RppSfSWSv6cl0(NGUY(nvwAy5e2x3uUZLH85wRcNYp8iCLDGLfd2i(faxnBq)0ojWEHXxfKyXaGlIsg0(Ltc6hfPh04SViGvl6N4IxcWQKdAhZxcWYII)La3yXGUE)LaSAo)Nsq7iGLp8AcnjWAZ03J0VuM)cKFfkv)EkDsq)OYV)Ci9X4Cdt82lby5XMb3zVxc4QzdAy3jb2lyeRZ0gJBlOTLn4Na0hJapSh)FjaRoM1pzNtcSxawgct9SrfkdhB6Nu3jb8JB34xcPGP)vW4eCZGoX(LaUy4o)eW9ciuOqHylVuFOG8VIJ06H3CSxcWYIFHnGcdSne7WCMEqkeoD6gcYV8KI)V21dc(mcL)5dBWM(Xn9zhEFqYkdZBBDtAZ(6LEu2dlBV70LFJ7CEy2VWD9sp)Q8rthxaXjSJKCPejTI6KaUoQDs0RKr2Sye0Nzh2ox3ww1uLMh2chhKiPjrrpiJkDBB6AUp36NUZn639jxGNWt7SnKL9Yf5kM2VF5D3D9hd(qmhl37Tx((lF9130(bmiE4dF4Y3(MU3Iq527U(nZVV9TcUiXqq)9F8v)3TFW1tLwYXDF66x3nCxBbdV(Up(2p1bBmKB41ZF3LF4YqmXMpaNC8bLl5NL61VOjFi9X8vhCwYBBK6rOlC7L022Ny65bK1ESSFPJoDXeCZa76O(jRlqa7NLGekc3LC1TzPWiPJcZgMm9U)ZOGKQ7sJhm02m7Y8B5UgyXVE9VplHLBS)13z2GYE4)FgcFnZ8zx5d5f57s3MBRviDLcCt2sKfqqvuNDtnxFehBaxBrGN5YMe158mSRGzrytxReuY6msSTYnkFVx77jznLIoFceBt1LG5ZLKstTPSu019ZydzBKut(NOOBQac2ig2r82M1KGMMY7MuJ9bUIAJEjnsJgZ2vSGsgPmHwFbbbkZGSyzIpZDypyhRn(oEhX02ecQm0(N6U(yUVR6P0aYJeyU1ukcO(m8XzuY2aebZQyIpjGsQLVBtzhmc362MYozmqgrOa0kpssDzoEPfAZYRfRj2l1H8julT7tYRfdCRSHY2lETsue3NYNlljYNQwKcsqLsMjtJPcLNOqudwnCasdUC8idLbtaxrCKO4MeuosrxkbypqcAAgEHbeC)fgiIUBkcjbFy9ClhdZaliGHzVui0g6wsiWSIsBa7Y3sZO84Ixbckl4X0LoXNP0yfMk9y)nZqsP21yWKRMGxIb6kkyrrpferaWSI7f0LDWsIqXzk53rrOmOuHGtGxfeUHUbg(2H3NuxJKU6ijsFg2JO7AqeUv5cTUvUhXDefa5gIjl9PSUlt1yIQtO7aadgcsWazy8YyO9suXTmocJ0indGjEzl4(BqaLl52KvRXRaGcV1emK5bs6(dsgQJ)d10EgTA06GAicXre20bNrPPpSQQNNrmwakewZ63UpRUoR2UDw67WObxqXdl4zxBkFF5L2sIDTZhVE3VYFCBzpf8FWthwMp7ho8ooUk33RYWEAX)5fSSRtb" end \ No newline at end of file diff --git a/Lang.lua b/Lang.lua index 473b243..ce0ec8d 100644 --- a/Lang.lua +++ b/Lang.lua @@ -406,6 +406,8 @@ elseif GetLocale() == "deDE" then L["Categories"] = "Kategorien" L["Force Icon"] = "Erzwinge Symbol" L["Icon of the DR"] = "Symbol des DR" + L["DR Duration"] = "DR Dauer" + L["Change the DR Duration in seconds (DR is dynamic between 15-20s)"] = "Verändere die DR Dauer in Sekunden (DR ist dynamisch zwischen 15-20s)" -- ExportImport.lua L["Export Import"] = "Exportieren Importieren" @@ -555,6 +557,434 @@ elseif GetLocale() == "deDE" then L["Offset of border to statusbar (in case statusbar shows beyond the border)"] = "Offset des Rahmens zur Statusbar (falls der Balken hinter dem Rahmen erscheint)" L["Statusbar border color"] = "Balken Rahmenfarbe" L["This changes the border color of all statusbar frames"] = "Dies ändert die Rahmenfarbe aller Balken" +elseif GetLocale() == "zhTW" then + -- Announcements.lua + L["Announcements"] = "通報" + L["RESURRECTING: %s (%s)"] = "復活: %s (%s) " + L["SPEC DETECTED: %s - %s (%s)"] = "敵方天賦: %s - %s (%s)" + L["LOW HEALTH: %s (%s)"] = "低生命值: %s (%s)" + L["TRINKET USED: %s (%s)"] = "飾品已使用: %s (%s)" + L["TRINKET READY: %s (%s)"] = "飾品就緒: %s (%s)" + L["DRINKING: %s (%s)"] = "正在喝水: %s (%s)" + L["Self"] = "玩家" + L["Party"] = "隊伍" + L["Raid Warning"] = "團隊警告" + L["Blizzard's Floating Combat Text"] = "Blizzard 戰鬥浮動文字" + L["Trinket used"] = "飾品已使用" + L["Announce when an enemy's trinket is used"] = "當敵方使用飾品時發出通知" + L["Trinket ready"] = "飾品就緒" + L["Announce when an enemy's trinket is ready again"] = "當敵方飾品就緒時發出通報" + L["Drinking"] = "正在喝水" + L["Announces when enemies sit down to drink"] = "當敵方喝水時發出通報" + L["Resurrection"] = "復活" + L["Announces when an enemy tries to resurrect a teammate"] = "當敵方嘗試復活隊友時發出通報" + L["New enemies"] = "新的敵人" + L["Announces when new enemies are discovered"] = "當發現新的敵人時發出通報" + L["Spec Detection"] = "天賦偵測" + L["Announces when the spec of an enemy was detected"] = "當偵測到敵方天賦時發出通報" + L["Low health"] = "低生命值" + L["Announces when an enemy drops below a certain health threshold"] = "當敵方生命值低於一定條件時發出通報" + L["Low health threshold"] = "低生命值門檻" + L["Choose how low an enemy must be before low health is announced"] = "設定低生命值通報門檻" + L["Destination"] = "發送通報至" + L["Choose how your announcements are displayed"] = "選擇通報發送至哪個頻道" + + -- ArenaCountDown.lua + L["Arena Countdown"] = "競技場計時" + L["Turns countdown before the start of an arena match on/off."] = "在競技場開始前倒數剩餘秒數" + L["Size"] = "大小" + + -- Auras.lua + L["Auras"] = "光環" + L["Frame"] = "框架" + L["Cooldown"] = "冷卻時間" + L["No Cooldown Circle"] = "取消圖示冷卻倒數陰影" + L["Cooldown circle alpha"] = "冷卻倒數陰影alpha值" + L["Font"] = "字型" + L["Font of the cooldown"] = "設定冷卻時間字型" + L["Font scale"] = "字體大小" + L["Scale of the text"] = "設定字體大小" + L["Font color"] = "字體顏色" + L["Color of the text"] = "設定字體顏色" + L["Border"] = "邊框" + L["Border style"] = "邊框樣式" + L["Buff color"] = "增益顏色" + L["Debuff color"] = "減益顏色" + L["Check All"] = "全選" + L["Uncheck All"] = "取消全選" + L["Enabled"] = "啟用" + L["Priority"] = "優先" + L["Interrupt Spells School Colors"] = "打斷法術分類顏色" + L["Enable Interrupt Spell School Colors"] = "啟用" + L["Will use Debuff Color if disabled"] = "若未啟用則使用一般減益顏色" + L["Buffs"] = "增益" --Line 573 + L["Debuffs"] = "減益" --Line 566 + L["Interrupts"] = "斷法" --Line 580 + + -- BuffsDebuffs.lua + L["Buffs and Debuffs"] = "增益與減益" + L["Enabled Buffs and Debuffs module"] = "啟用增益與減益模組" + L["Show CC"] = "顯示控場" + L["Shows all debuffs, which are displayed on the ClassIcon as well"] = "顯示所有減益效果,這些減益效果也顯示在職業圖示上" + L["Buffs"] = "增益" + L["Size & Padding"] = "大小與內距" + L["Icon Size"] = "圖示大小" + L["Size of the DR Icons"] = "遞減圖示大小" + L["Icon Width Factor"] = "圖示寬度比例" + L["Stretches the icon"] = "圖示寬度" + L["Icon Padding"] = "圖示內距" + L["Space between Icons"] = "圖示間距" + L["Position"] = "位置" + L["Aura Position"] = "光環位置" + L["Position of the aura icons"] = "光環圖示位置" + L["Top"] = "頂部" + L["Bottom"] = "底部" + L["Left"] = "左" + L["Right"] = "右" + --L["Grow Direction"] = "" + L["Grow Direction of the aura icons"] = "光環圖示的延伸方向" + L["Horizontal offset"] = "水平位移" + L["Vertical offset"] = "垂直位移" + L["Alpha"] = "Alpha值" + L["Debuffs"] = "減益" + L["Dynamic Timer Color"] = "動態計時條顏色" + L["Show dynamic color on cooldown numbers"] = "冷卻時間數字以動態顏色顯示" + L["Color of the cooldown timer and stacks"] = "Farbe der Abklingzeit und Stapel" + L["Spell School Colors"] = "法術種類顏色" + L["Spell School Colors Enabled"] = "啟用" + L["Show border colors by spell school"] = "根據不同法術種類顯示不同邊框顏色" + L["Curse"] = "詛咒" + L["Color of the border"] = "邊框顏色" + L["Magic"] = "魔法" + L["Poison"] = "中毒" + L["Physical"] = "物理" + L["Immune"] = "免疫" + L["Disease"] = "疾病" + L["Aura"] = "光環" + L["Form"] = "形態" + L["Font"] = "字型" --Line 906 + L["Border"] = "邊框" --Line 949 + L["Debuff Lists"] = "減益列表" --Line 1036 + L["Buff Lists"] = "增益列表" --Line 1051 + + -- Castbar.lua + L["Cast Bar"] = "施法條" + L["Bar"] = "施法條" + L["Bar Size"] = "施法條大小" + L["Bar height"] = "高度" + L["Height of the bar"] = "計量條高度" + L["Bar width"] = "寬度" + L["Width of the bars"] = "計量條寬度" + L["Texture"] = "材質" + L["Bar texture"] = "施法條材質" + L["Texture of the bar"] = "計量條材質" + L["Bar color"] = "施法條顏色" + L["Color of the cast bar"] = "計量條顏色" + L["Background color"] = "背景顏色" + L["Color of the cast bar background"] = "施法條背景顏色" + L["Border size"] = "邊框大小" + L["Status Bar border"] = "狀態列邊框" + L["Status Bar border color"] = "狀態列邊框顏色" + L["Icon"] = "圖示" + L["Icon size"] = "圖示大小" + L["Icon border"] = "圖示邊框" + L["Icon border color"] = "圖示邊框顏色" + L["If test is running, type \"/gladdy test\" again"] = "如果測試已經開始,調整此選項後請輸入/gladdy test以重新開始測試" + L["Spark"] = "尾端發亮" + L["Spark enabled"] = "啟用" + L["Spark color"] = "顏色" + L["Color of the cast bar spark"] = "計時條進度的尾端顏色" + L["Font of the castbar"] = "施法條字型" + L["Font size"] = "字體大小" + L["Size of the text"] = "施法條字體大小" + L["Format"] = "格式" + L["Timer Format"] = "時間格式" + L["Remaining"] = "剩餘時間" + L["Total"] = "總時間" + L["Both"] = "兩者" + L["Castbar position"] = "施法條位置" + L["Icon position"] = "圖示位置" + L["Offsets"] = "位移" + + -- Classicon.lua + L["Class Icon"] = "職業圖示" + L["Balance"] = "平衡" + L["Feral"] = "野性" + L["Restoration"] = "恢復" + L["Beast Mastery"] = "獸王" + L["Marksmanship"] = "射擊" + L["Survival"] = "生存" + L["Arcane"] = "奧術" + L["Fire"] = "火焰" + L["Frost"] = "冰霜" + L["Holy"] = "神聖" + L["Protection"] = "防護" + L["Retribution"] = "懲戒" + L["Discipline"] = "戒律" + L["Shadow"] = "暗影" + L["Assassination"] = "刺殺" + L["Combat"] = "戰鬥" + L["Subtlety"] = "敏銳" + L["Elemental"] = "元素" + L["Enhancement"] = "增強" + L["Affliction"] = "痛苦" + L["Demonology"] = "惡魔" + L["Destruction"] = "毀滅" + L["Arms"] = "武器" + L["Fury"] = "狂怒" + L["Show Spec Icon"] = "顯示天賦圖示" + L["Shows Spec Icon once spec is detected"] = "若偵測到天賦則顯示天賦圖示" + L["Icon width factor"] = "圖示寬度比例" + L["This changes positions with trinket"] = "調整職業圖示位置" + L["Border color"] = "邊框顏色" + + --CombatIndicator.lua + L["Combat Indicator"] = "戰鬥指示器" + L["Enable Combat Indicator icon"] = "顯示是否進入戰鬥" + L["Anchor"] = "定位" + L["This changes the anchor of the ci icon"] = "調整戰鬥指示器圖示定位點" + L["This changes position relative to its anchor of the ci icon"] = "調整戰鬥指示器位置" + + -- Constants.lua + L["Physical"] = "物理" --Line 749 + L["Holy"] = "神聖" --Line 750 + L["Fire"] = "火焰" --Line 751 + L["Nature"] = "自然" --Line 752 + L["Frost"] = "冰霜" --Line 753 + L["Shadow"] = "暗影" --Line 754 + L["Arcane"] = "奧術" --Line 755 + L["Unknown"] = "未知" --Line 756 + + -- Cooldowns.lua + L["Cooldowns"] = "技能冷卻監控" + L["Enabled cooldown module"] = "啟用冷卻時間監控模組" + L["Cooldown size"] = "大小" + L["Size of each cd icon"] = "冷卻時間圖示大小" + L["Icon Width Factor"] = "寬度" + L["Max Icons per row"] = "每行圖示數量" + L["Scale of the font"] = "字體大小" + L["Anchor of the cooldown icons"] = "冷卻圖示定位" + L["Grow Direction of the cooldown icons"] = "冷卻圖示延伸方向" + L["Offset"] = "位移" + L["BloodElf"] = "血精靈" + L["NightElf"] = "夜精靈" + L["Scourge"] = "不死族" + + -- Diminishings.lua + L["Diminishings"] = "控場遞減" + L["Enabled DR module"] = "啟用遞減模組" + L["DR Cooldown position"] = "遞減冷卻時間位置" + L["Position of the cooldown icons"] = "遞減冷卻時間圖示位置" + L["DR Border Colors"] = "DR邊框顏色" + L["Dr Border Colors Enabled"] = "啟用" + L["Colors borders of DRs in respective DR-color below"] = "邊框顏色依遞減設定為以下顏色" + L["Half"] = "二分之一" + L["Quarter"] = "四分之一" + L["Categories"] = "法術列表" + L["Force Icon"] = "使用自訂圖示" + L["Icon of the DR"] = "選擇此區圖示取代原始技能圖示" + + -- ExportImport.lua + L["Export Import"] = "匯出/匯入" + L["Profile Export Import"] = "設定檔匯出/匯入" + L["Export"] = "匯出" --Line 138 + L["Export your current profile to share with others or your various accounts."] = "匯出您目前的設定檔" --Line 139 + L["Import"] = "匯入" --Line 162 + L["This will overwrite your current profile!"] = "這將會覆蓋您目前的設定檔" --Line 163 + + -- Healthbar.lua + L["Health Bar"] = "血量條" + L["DEAD"] = "死亡" + L["LEAVE"] = "暫離" + L["General"] = "一般" + L["Color of the status bar background"] = "狀態列背景顏色" + L["Font of the bar"] = "字型" + L["Name font size"] = "名稱字體大小" + L["Size of the name text"] = "設定名稱字體大小" + L["Health font size"] = "生命值字體大小" + L["Size of the health text"] = "設定生命值字體大小" + L["Size of the border"] = "邊框大小" + L["Health Bar Text"] = "血量條文字" + L["Show name text"] = "顯示名稱" + L["Show the units name"] = "顯示單位名稱" + L["Show ArenaX"] = "顯示編號" + L["Show 1-5 as name instead"] = "使用編號1-5代替角色名稱" + L["Show the actual health"] = "顯示目前生命值" + L["Show the actual health on the health bar"] = "在血量條上顯示目前生命值" + L["Show max health"] = "顯示最大生命值" + L["Show max health on the health bar"] = "在血量條上顯示最大生命值" + L["Show health percentage"] = "顯示百分比" + L["Show health percentage on the health bar"] = "在血量條上顯示生命值百分比" + + -- Highlight.lua + L["Highlight"] = "高亮提示" + L["Show Inside"] = "顯示在框架內" + L["Show Highlight border inside of frame"] = "將高亮邊框顯示於框架內側" + L["Colors"] = "邊框顏色" + L["Target border color"] = "目標" + L["Color of the selected targets border"] = "目標的邊框顏色" + L["Focus border color"] = "專注" + L["Color of the focus border"] = "專注目標邊框顏色" + L["Highlight target"] = "高亮目標" + L["Toggle if the selected target should be highlighted"] = "是否高亮當前目標" + L["Show border around target"] = "顯示目標邊框" + L["Toggle if a border should be shown around the selected target"] = "是否顯示當前目標的邊框" + L["Show border around focus"] = "顯示專注邊框" + L["Toggle of a border should be shown around the current focus"] = "是否顯示當前專注目標的邊框" + + -- Pets.lua + L["Pets"] = "寵物" + L["Enables Pets module"] = "啟用寵物模組" + L["Width of the bar"] = "寵物列寬度" + L["Health color"] = "生命值顏色" + L["Color of the status bar"] = "狀態列顏色" + L["Portrait"] = "頭像" + L["Health Values"] = "生命值" + + -- Powerbar.lua + L["Power Bar"] = "法力/能量條" + L["Power Bar Text"] = "法力/能量條文字" + L["Power Texts"] = "法力/能量條文字" + L["Show race"] = "顯示種族" + L["Show spec"] = "顯示天賦" + L["Show the actual power"] = "顯示目前法力/能量" + L["Show the actual power on the power bar"] = "在計量條中顯示目前法力/能量值" + L["Show max power"] = "顯示最大法力/能量值" + L["Show max power on the power bar"] = "在計量條中顯示最大法力/能量值" + L["Show power percentage"] = "顯示法力/能量百分比" + L["Show power percentage on the power bar"] = "在計量條中顯示目前法力/能量百分比" + + -- Racial.lua + L["Racial"] = "種族" + L["Enable racial icon"] = "啟用種族圖示" + L["This changes the anchor of the racial icon"] = "調整種族圖示定位點" + L["This changes position relative to its anchor of the racial icon"] = "調整種族圖示位置" + + -- TotemPlates.lua + L["Totem Plates"] = "圖騰名條" + L["Customize Totems"] = "自訂圖騰" + L["Custom totem name"] = "自訂圖騰名稱" + L["Totem General"] = "圖騰通用設定" + L["Turns totem icons instead of nameplates on or off. (Requires reload)"] = "是否顯示圖騰名條(需重新載入)" + L["Show friendly"] = "顯示友方圖騰" + L["Show enemy"] = "顯示敵方圖騰" + L["Totem size"] = "圖騰大小" + L["Size of totem icons"] = "圖騰圖示大小" + L["Font of the custom totem name"] = "自訂圖騰字型" + L["Apply alpha when no target"] = "圖騰非目標時套用alpha值" + L["Always applies alpha, even when you don't have a target. Else it is 1."] = "若圖騰未被選為目標,其圖示套用alpha值設定" + L["Apply alpha when targeted"] = "圖騰為目標時套用alpha值" + L["Always applies alpha, even when you target the totem. Else it is 1."] = "圖騰被選為目標時,其圖示套用alpha值設定" + L["All totem border alphas (configurable per totem)"] = "圖騰 Alpha值 " + L["Totem icon border style"] = "圖騰邊框樣式" + L["All totem border color"] = "圖騰邊框顏色" + + -- Trinket.lua + L["Trinket"] = "飾品" + L["Enable trinket icon"] = "啟用飾品圖示" + L["This changes positions of the trinket"] = "調整飾品圖示位置" + + -- XiconProfiles.lua + L["Profile"] = "樣式" + L["XiconProfiles"] = "框架外觀" --Line 4 + L[" No Pet"] = "(無寵物)" --Line 109, 119 + + -- Frame.lua + L["Gladdy - drag to move"] = "Gladdy - 拖曳移動" + + -- Gladdy.lua + L["Welcome to Gladdy!"] = "歡迎使用 Gladdy!" + L["First run has been detected, displaying test frame."] = "第一次使用時,顯示此測試框架。" + L["Valid slash commands are:"] = "可用的指令為:" + L["If this is not your first run please lock or move the frame to prevent this from happening."] = "若非第一次使用,請移動或鎖定框架以避免此提示再次出現。" + + -- Clicks.lua + L["Action #%d"] = "動作 #%d" + L["Target"] = "目標" --Line 15 + L["Focus"] = "專注" --Line 16 + L["Clicks"] = "點擊動作" + L["Left button"] = "左鍵" + L["Right button"] = "右鍵" + L["Middle button"] = "中鍵" + L["Button 4"] = "滑鼠按鍵4" + L["Button 5"] = "滑鼠按鍵5" + L["Select what action this mouse button does"] = "設定輸入按鍵後的欲執行的動作" + L["Modifier"] = "修飾鍵" + L["Select which modifier to use"] = "設定欲使用的修飾鍵" + L["Button"] = "按鍵" + L["Select which mouse button to use"] = "設定欲使用的滑鼠按鍵" + L["Name"] = "名稱" + L["Select the name of the click option"] = "設定動作名稱" + L["Action"] = "動作" + L["Cast Spell / Macro"] = "施放法術/巨集" + + --RangeCheck.lua + L["Range Check"] = "距離檢查" + L["Spells"] = "法術" + L["Fade"] = "變暗" + L["Out of Range Darkening Level"] = "超出距離時變暗程度" + L["Higher is darker"] = "數值越高越暗" + L["yds"] = " 碼" --Line 366, 388 + L["Changing the spellID only applies to your player class!\n\nExample: If you are a Paladin and wish to change your range check spell to Repentance, edit the Paladin spellID to 20066."] = "對應您的職業修改欲用於監控距離的技能。\n\n範例:若您為聖騎士且想以懺悔技能用於距離監控,請將聖騎士的法術ID改為20066。" --Line 352 + + --ShadowsightTimer.lua + L["Shadowsight Timer"] = "暗影視界計時" + L["Locked"] = "鎖定" + L["Announce"] = "通報" + L["Scale"] = "大小" + L["Shadowsight up in %ds"] = "暗影視界於%d秒後就緒" + L["Shadowsight up!"] = "暗影視界已就緒" + + -- Options.lua + L["settings"] = "設定" + L["Reset module"] = "重設模組" + L["Reset module to defaults"] = "將模組重設為預設值" + L["No settings"] = "無設定" + L["Module has no settings"] = "模組沒有設定" + L["General settings"] = "通用設定" + L["Lock frame"] = "鎖定框架" + L["Toggle if frame can be moved"] = "調整框架是否可移動" + L["Grow frame upwards"] = "框架向上延伸" + L["If enabled the frame will grow upwards instead of downwards"] = "開啟此選項時框架向上延伸" + L["Down"] = "下" + L["Up"] = "上" + L["Frame General"] = "框架" + L["Frame scale"] = "框架大小" + L["Scale of the frame"] = "框架的尺寸" + L["Frame padding"] = "框架內距" + L["Padding of the frame"] = "框架的內距" + L["Frame width"] = "框架寬度" + L["Margin"] = "框架間距" + L["Margin between each button"] = "框架的間距" + L["Cooldown General"] = "冷卻" + L["Font General"] = "字型" + L["General Font"] = "Allgemeine Schriftart" + L["Font color text"] = "文字顏色" + L["Font color timer"] = "計時器文字顏色" + L["Color of the timers"] = "計時器顏色" + L["Icons General"] = "圖示" + L["Icon border style"] = "圖示邊框樣式" + L["This changes the border style of all icons"] = "調整所有圖示的邊框樣式" + L["This changes the border color of all icons"] = "調整所有圖示的邊框顏色" + L["Statusbar General"] = "狀態列" + L["Statusbar texture"] = "狀態列材質" + L["This changes the texture of all statusbar frames"] = "調整所有狀態列的材質" + L["Statusbar border style"] = "狀態列邊框樣式" + L["This changes the border style of all statusbar frames"] = "調整所有狀態列的邊框樣式" + L["Statusbar border offset divider (smaller is higher offset)"] = "狀態列邊框距離" + L["Offset of border to statusbar (in case statusbar shows beyond the border)"] = "調整狀態列邊框距離" + L["Statusbar border color"] = "狀態列邊框顏色" + L["This changes the border color of all statusbar frames"] = "調整所有狀態列的邊框顏色" + L["Hide Blizzard"] = "隱藏暴雪框架" + L["Grow Direction"] = "框架延伸方向" + L["Arena only"] = "只在競技場中" + L["Never"] = "從不" + L["Always"] = "永遠" + L["Load configuration"] = "設定選項" --Line 713 + L["Load configuration options"] = "載入設定選項" --Line 714 + L["Background Color of the frame"] = "框架的背景顏色" + + L["Gladdy"] = "Gladdy目標框架" --Line 210, 709, 727 end diff --git a/Libs/DRData-1.0/DRData-1.0.lua b/Libs/DRData-1.0/DRData-1.0.lua index 92523a6..e6bd775 100644 --- a/Libs/DRData-1.0/DRData-1.0.lua +++ b/Libs/DRData-1.0/DRData-1.0.lua @@ -1,4 +1,4 @@ -local major = "DRData-1.0" +local major = "DRData-1.0-BCC" local minor = tonumber(string.match("$Revision: 793$", "(%d+)") or 1) assert(LibStub, string.format("%s requires LibStub.", major)) @@ -139,6 +139,9 @@ Data.spells = { -- Revenge Stun [12798] = "rndstun", + + -- Pyroclasm + [18093] = "rndstun", --[[ CYCLONE ]]-- -- Blind @@ -167,6 +170,15 @@ Data.spells = { [9853] = "root", [26989] = "root", + -- Nature's Grasp + [19975] = "root", + [19974] = "root", + [19973] = "root", + [19972] = "root", + [19971] = "root", + [19970] = "root", + [27010] = "root", + --[[ RANDOM ROOTS ]]-- -- Improved Hamstring [23694] = "rndroot", @@ -181,10 +193,10 @@ Data.spells = { [18658] = "sleep", -- Wyvern Sting - [19386] = "sleep", - [24132] = "sleep", - [24133] = "sleep", - [27068] = "sleep", + [19386] = "disorient", + [24132] = "disorient", + [24133] = "disorient", + [27068] = "disorient", --[[ MISC ]]-- -- Chastise (Maybe this shares DR with Imp HS?) @@ -201,15 +213,15 @@ Data.spells = { [33042] = "dragonsbreath", -- Dragon's Breath [33043] = "dragonsbreath", -- Dragon's Breath -- Repentance - [20066] = "repentance", + [20066] = "disorient", -- Scatter Shot [19503] = "scatters", -- Freezing Trap - [3355] = "freezetrap", - [14308] = "freezetrap", - [14309] = "freezetrap", + [3355] = "disorient", + [14308] = "disorient", + [14309] = "disorient", -- Improved Conc Shot [19410] = "impconc", diff --git a/Libs/LibClassAuras-1.0/ClassBuffs.lua b/Libs/LibClassAuras-1.0/ClassBuffs.lua index e8bcbfe..48de7aa 100644 --- a/Libs/LibClassAuras-1.0/ClassBuffs.lua +++ b/Libs/LibClassAuras-1.0/ClassBuffs.lua @@ -140,7 +140,8 @@ Buff( { 25782 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Might Buff( { 25895 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Salvation Buff( { 25899 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Sanctuary Buff( { 25894 }, { buffType = "magic"}, "PALADIN") -- Greater Blessing of Wisdom -Buff( { 642 }, { buffType = "magic"}, "PALADIN") -- Divine Shield +Buff( { 642 }, { buffType = "immune"}, "PALADIN") -- Divine Shield +Buff( { 31884 }, { buffType = "magic"}, "PALADIN") -- Avenging Wrath --Auras Buff( { 465, 10290, 643, 10291, 1032, 10292, 10293, 27149 }, { buffType = "aura"}, "PALADIN") -- Devotion Aura Buff( { 7294 }, { buffType = "aura"}, "PALADIN") -- Retribution Aura @@ -167,6 +168,8 @@ Buff( { 21082 }, { buffType = "magic"}, "PALADIN") -- Seal of the Crusade ------------- Buff( { 5384 }, { buffType = "physical"}, "HUNTER") -- Feign Death +Buff( { 19263 }, { buffType = "physical"}, "HUNTER") -- Deterrence +Buff( { 3045 }, { buffType = "physical"}, "HUNTER") -- Rapid Fire --local FEIGN_DEATH = GetSpellInfo(5384) -- Localized name for Feign Death diff --git a/Libs/LibClassAuras-1.0/ClassDebuffs.lua b/Libs/LibClassAuras-1.0/ClassDebuffs.lua index 8d4a166..12ca9f8 100644 --- a/Libs/LibClassAuras-1.0/ClassDebuffs.lua +++ b/Libs/LibClassAuras-1.0/ClassDebuffs.lua @@ -20,7 +20,8 @@ Debuff({ 15286 } ,{ buffType = "magic" }, "PRIEST") -- Vampiric Embrace Debuff({ 15407, 17311, 17312, 17313, 17314, 18807, 25387 }, { buffType = "magic" }, "PRIEST") -- Mind Flay Debuff({ 605, 10911, 10912 }, { buffType = "magic" }, "PRIEST") -- Mind Control Debuff({ 8122, 8124, 10888, 10890 }, { buffType = "magic", }, "PRIEST") -- Psychic Scream -Debuff({ 15269 }, { buffType = "magic"}, "PRIEST") +Debuff({ 15269 }, { buffType = "magic"}, "PRIEST") -- Blackout +Debuff({ 44041, 44043, 44044, 44045, 44046, 44047 }, { buffType = "magic"}, "PRIEST") -- Chastise --------------- -- DRUID @@ -44,6 +45,8 @@ Debuff({ 1822, 1823, 1824, 9904, 27003 }, { stacking = true, buffType = "physica Debuff({ 1079, 9492, 9493, 9752, 9894, 9896, 27008 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Rip Debuff({ 5570, 24974, 24975, 24976, 24977, 27013 }, { stacking = true, buffType = "magic", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Insect Swarm Debuff({ 33745 }, { stacking = true, buffType = "physical", preEvent = "SPELL_CAST_SUCCESS" }, "DRUID") -- Lacerate +Debuff({ 33878, 33986, 33987 }, { buffType = "physical" }, "DRUID") -- Mangle (Bear) +Debuff({ 33876, 33982, 33983 }, { buffType = "physical" }, "DRUID") -- Mangle (Cat) ------------- -- WARRIOR diff --git a/Modules/Announcements.lua b/Modules/Announcements.lua index afeca6a..aeb5fd5 100644 --- a/Modules/Announcements.lua +++ b/Modules/Announcements.lua @@ -210,10 +210,15 @@ function Announcements:GetOptions() ["self"] = L["Self"], ["party"] = L["Party"], ["rw"] = L["Raid Warning"], - ["fct"] = L["Blizzard's Floating Combat Text"], - ["msbt"] = L["MikScrollingBattleText"], } + if IsAddOnLoaded("Blizzard_CombatText") then + destValues["fct"] = L["Blizzard's Floating Combat Text"] + end + if IsAddOnLoaded("MikScrollingBattleText") then + destValues["msbt"] = L["MikScrollingBattleText"] + end + return { headerAnnouncements = { type = "header", diff --git a/Modules/ArenaCountDown.lua b/Modules/ArenaCountDown.lua index 8a38b5e..38b6076 100644 --- a/Modules/ArenaCountDown.lua +++ b/Modules/ArenaCountDown.lua @@ -1,6 +1,5 @@ local floor, str_len, tostring, str_sub, str_find, pairs = math.floor, string.len, tostring, string.sub, string.find, pairs local CreateFrame = CreateFrame -local GetLocale = GetLocale local GetTime = GetTime local Gladdy = LibStub("Gladdy") @@ -22,33 +21,34 @@ function ACDFrame:Initialize() local ACDNumFrame = CreateFrame("Frame", "ACDNumFrame", UIParent) ACDNumFrame:EnableMouse(false) - ACDNumFrame:SetHeight(256) - ACDNumFrame:SetWidth(256) - ACDNumFrame:SetPoint("CENTER", 0, 128) + ACDNumFrame:SetHeight(512) + ACDNumFrame:SetWidth(512) + ACDNumFrame:SetPoint("CENTER", 0, 256) ACDNumFrame:Show() self.ACDNumFrame = ACDNumFrame local ACDNumTens = ACDNumFrame:CreateTexture("ACDNumTens", "HIGH") ACDNumTens:SetWidth(256) - ACDNumTens:SetHeight(128) - ACDNumTens:SetPoint("CENTER", ACDNumFrame, "CENTER", -48, 0) + ACDNumTens:SetHeight(256) + ACDNumTens:SetPoint("CENTER", ACDNumFrame, "CENTER", -50, 0) self.ACDNumTens = ACDNumTens local ACDNumOnes = ACDNumFrame:CreateTexture("ACDNumOnes", "HIGH") ACDNumOnes:SetWidth(256) - ACDNumOnes:SetHeight(128) - ACDNumOnes:SetPoint("CENTER", ACDNumFrame, "CENTER", 48, 0) + ACDNumOnes:SetHeight(256) + ACDNumOnes:SetPoint("CENTER", ACDNumFrame, "CENTER", 50, 0) self.ACDNumOnes = ACDNumOnes local ACDNumOne = ACDNumFrame:CreateTexture("ACDNumOne", "HIGH") ACDNumOne:SetWidth(256) - ACDNumOne:SetHeight(128) + ACDNumOne:SetHeight(256) ACDNumOne:SetPoint("CENTER", ACDNumFrame, "CENTER", 0, 0) self.ACDNumOne = ACDNumOne self:RegisterMessage("JOINED_ARENA") self:RegisterMessage("ENEMY_SPOTTED") self:RegisterMessage("UNIT_SPEC") + self.faction = UnitFactionGroup("player") end function ACDFrame.OnUpdate(self, elapse) @@ -58,11 +58,7 @@ function ACDFrame.OnUpdate(self, elapse) if ((floor(self.countdown) ~= floor(self.countdown - elapse)) and (floor(self.countdown - elapse) >= 0)) then local str = tostring(floor(self.countdown - elapse)); - if (floor(self.countdown - elapse) == 0) then - self.ACDNumTens:Hide(); - self.ACDNumOnes:Hide(); - self.ACDNumOne:Hide(); - elseif (str_len(str) == 2) then + if (str_len(str) == 2) then -- Display has 2 digits self.ACDNumOne:Hide(); self.ACDNumTens:Show(); @@ -73,8 +69,10 @@ function ACDFrame.OnUpdate(self, elapse) self.ACDNumFrame:SetScale(0.7) elseif (str_len(str) == 1) then -- Display has 1 digit + local numStr = str_sub(str, 0, 1) + local path = numStr == "0" and self.faction or numStr self.ACDNumOne:Show(); - self.ACDNumOne:SetTexture(self.texturePath .. str_sub(str, 0, 1)); + self.ACDNumOne:SetTexture(self.texturePath .. path); self.ACDNumOnes:Hide(); self.ACDNumTens:Hide(); self.ACDNumFrame:SetScale(1.0) @@ -93,18 +91,24 @@ function ACDFrame.OnUpdate(self, elapse) end function ACDFrame:JOINED_ARENA() - self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL") - self:SetScript("OnEvent", ACDFrame.OnEvent) - self.endTime = GetTime() + 70 - self:SetScript("OnUpdate", ACDFrame.OnUpdate) + if Gladdy.db.countdown then + self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL") + self:SetScript("OnEvent", ACDFrame.OnEvent) + self.endTime = GetTime() + 70 + self:SetScript("OnUpdate", ACDFrame.OnUpdate) + end end function ACDFrame:ENEMY_SPOTTED() - ACDFrame:Reset() + if not Gladdy.frame.testing then + ACDFrame:Reset() + end end function ACDFrame:UNIT_SPEC() - ACDFrame:Reset() + if not Gladdy.frame.testing then + ACDFrame:Reset() + end end function ACDFrame:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg) @@ -125,15 +129,15 @@ function ACDFrame:UpdateFrame() self.ACDNumFrame:SetPoint("CENTER", 0, 128) self.ACDNumTens:SetWidth(Gladdy.db.arenaCountdownSize) - self.ACDNumTens:SetHeight(Gladdy.db.arenaCountdownSize/2) + self.ACDNumTens:SetHeight(Gladdy.db.arenaCountdownSize) self.ACDNumTens:SetPoint("CENTER", self.ACDNumFrame, "CENTER", -(Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0) self.ACDNumOnes:SetWidth(Gladdy.db.arenaCountdownSize) - self.ACDNumOnes:SetHeight(Gladdy.db.arenaCountdownSize/2) + self.ACDNumOnes:SetHeight(Gladdy.db.arenaCountdownSize) self.ACDNumOnes:SetPoint("CENTER", self.ACDNumFrame, "CENTER", (Gladdy.db.arenaCountdownSize/8 + Gladdy.db.arenaCountdownSize/8/2), 0) self.ACDNumOne:SetWidth(Gladdy.db.arenaCountdownSize) - self.ACDNumOne:SetHeight(Gladdy.db.arenaCountdownSize/2) + self.ACDNumOne:SetHeight(Gladdy.db.arenaCountdownSize) self.ACDNumOne:SetPoint("CENTER", self.ACDNumFrame, "CENTER", 0, 0) end diff --git a/Modules/Auras.lua b/Modules/Auras.lua index 50e65cc..abf93c8 100644 --- a/Modules/Auras.lua +++ b/Modules/Auras.lua @@ -1,6 +1,7 @@ -local pairs, ipairs, select, tinsert, tbl_sort, tostring = pairs, ipairs, select, tinsert, table.sort, tostring +local pairs, ipairs, select, tinsert, tbl_sort, tostring, tonumber, rand = pairs, ipairs, select, tinsert, table.sort, tostring, tonumber, math.random local GetSpellInfo = GetSpellInfo +local GetSpellDescription = GetSpellDescription local CreateFrame, GetTime = CreateFrame, GetTime local AURA_TYPE_DEBUFF, AURA_TYPE_BUFF = AURA_TYPE_DEBUFF, AURA_TYPE_BUFF @@ -8,7 +9,7 @@ local Gladdy = LibStub("Gladdy") local L = Gladdy.L local function defaultSpells(auraType) local spells = {} - for k,v in pairs(Gladdy:GetImportantAuras()) do + for _,v in pairs(Gladdy:GetImportantAuras()) do if not auraType or auraType == v.track then spells[tostring(v.spellID)] = {} spells[tostring(v.spellID)].enabled = true @@ -20,7 +21,7 @@ local function defaultSpells(auraType) end local function defaultInterrupts() local spells = {} - for k,v in pairs(Gladdy:GetInterrupts()) do + for _,v in pairs(Gladdy:GetInterrupts()) do spells[tostring(v.spellID)] = {} spells[tostring(v.spellID)].enabled = true spells[tostring(v.spellID)].priority = v.priority @@ -87,7 +88,7 @@ function Auras:CreateFrame(unit) auraFrame:SetAllPoints(classIcon) auraFrame.text = auraFrame.cooldownFrame:CreateFontString(nil, "OVERLAY") - auraFrame.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), 10, "OUTLINE") + auraFrame.text:SetFont(Gladdy:SMFetch("font", "auraFont"), 10, "OUTLINE") auraFrame.text:SetTextColor(Gladdy.db.auraFontColor.r, Gladdy.db.auraFontColor.g, Gladdy.db.auraFontColor.b, Gladdy.db.auraFontColor.a) --auraFrame.text:SetShadowOffset(1, -1) --auraFrame.text:SetShadowColor(0, 0, 0, 1) @@ -151,7 +152,7 @@ function Auras:CreateInterrupt(unit) interruptFrame:SetAllPoints(classIcon) interruptFrame.text = interruptFrame.cooldownFrame:CreateFontString(nil, "OVERLAY") - interruptFrame.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), 10, "OUTLINE") + interruptFrame.text:SetFont(Gladdy:SMFetch("font", "auraFont"), 10, "OUTLINE") interruptFrame.text:SetTextColor(Gladdy.db.auraFontColor.r, Gladdy.db.auraFontColor.g, Gladdy.db.auraFontColor.b, Gladdy.db.auraFontColor.a) --auraFrame.text:SetShadowOffset(1, -1) --auraFrame.text:SetShadowColor(0, 0, 0, 1) @@ -204,7 +205,7 @@ function Auras:UpdateFrame(unit) auraFrame.cooldown:SetPoint("CENTER", auraFrame, "CENTER") auraFrame.cooldown:SetAlpha(Gladdy.db.auraCooldownAlpha) - auraFrame.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), (width/2 - 1) * Gladdy.db.auraFontSizeScale, "OUTLINE") + auraFrame.text:SetFont(Gladdy:SMFetch("font", "auraFont"), (width/2 - 1) * Gladdy.db.auraFontSizeScale, "OUTLINE") auraFrame.text:SetTextColor(Gladdy.db.auraFontColor.r, Gladdy.db.auraFontColor.g, Gladdy.db.auraFontColor.b, Gladdy.db.auraFontColor.a) auraFrame.icon.overlay:SetTexture(Gladdy.db.auraBorderStyle) @@ -242,7 +243,7 @@ function Auras:UpdateInterruptFrame(unit) interruptFrame.cooldown:SetPoint("CENTER", interruptFrame, "CENTER") interruptFrame.cooldown:SetAlpha(Gladdy.db.auraCooldownAlpha) - interruptFrame.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), (width/2 - 1) * Gladdy.db.auraFontSizeScale, "OUTLINE") + interruptFrame.text:SetFont(Gladdy:SMFetch("font", "auraFont"), (width/2 - 1) * Gladdy.db.auraFontSizeScale, "OUTLINE") interruptFrame.text:SetTextColor(Gladdy.db.auraFontColor.r, Gladdy.db.auraFontColor.g, Gladdy.db.auraFontColor.b, Gladdy.db.auraFontColor.a) interruptFrame.icon.overlay:SetTexture(Gladdy.db.auraBorderStyle) @@ -266,36 +267,72 @@ function Auras:ResetUnit(unit) end function Auras:Test(unit) - local spellName, _, icon + local spellName, spellid, icon, limit - if (unit == "arena1") then - spellName, _, icon = GetSpellInfo(7922) - self:AURA_FADE(unit, AURA_TYPE_BUFF) - self:AURA_FADE(unit, AURA_TYPE_DEBUFF) - self:AURA_GAIN(unit,AURA_TYPE_DEBUFF, 7922, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration) - self:SPELL_INTERRUPT(unit,19244, select(1, GetSpellInfo(19244)), "physical", 25396, select(1, GetSpellInfo(25396)), 64) - elseif (unit == "arena2") then - spellName = select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689)) - _, _, icon = GetSpellInfo(27010) - self:AURA_FADE(unit, AURA_TYPE_BUFF) - self:AURA_FADE(unit,AURA_TYPE_DEBUFF) - self:AURA_GAIN(unit,AURA_TYPE_DEBUFF, 27010, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration) - self:SPELL_INTERRUPT(unit,19244, select(1, GetSpellInfo(19244)), "physical", 25396, select(1, GetSpellInfo(25396)), 64) - elseif (unit == "arena3") then - spellName, _, icon = GetSpellInfo(34709) - self:AURA_FADE(unit, AURA_TYPE_BUFF) - self:AURA_GAIN(unit,AURA_TYPE_BUFF, 34709, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration) - spellName, _, icon = GetSpellInfo(18425) - --self:AURA_FADE(unit, AURA_TYPE_DEBUFF) - --self:AURA_GAIN(unit,AURA_TYPE_DEBUFF, 18425, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration) + self:AURA_FADE(unit, AURA_TYPE_BUFF) + self:AURA_FADE(unit, AURA_TYPE_DEBUFF) + + --Auras + local enabledDebuffs, enabledBuffs, testauras = {}, {} + for spellIdStr,value in pairs(Gladdy.db.auraListDefault) do + if value.enabled then + if value.track == AURA_TYPE_BUFF then + tinsert(enabledBuffs, {value = value, spellIdStr = spellIdStr}) + else + tinsert(enabledDebuffs, {value = value, spellIdStr = spellIdStr}) + end + end + end + if unit == "arena2" then + testauras = enabledBuffs + else + testauras = enabledDebuffs + end + + if #testauras > 0 then + limit = rand(1, #testauras) + local v = testauras[rand(1, #testauras)] + spellid = tonumber(v.spellIdStr) + spellName = select(1, GetSpellInfo(tonumber(v.spellIdStr))) + icon = select(3, GetSpellInfo(tonumber(v.spellIdStr))) + if Gladdy.exceptionNames[spellid] then + spellName = Gladdy.exceptionNames[spellid] + end + if (unit == "arena2") then + if (v.value.track == AURA_TYPE_BUFF) then + self:AURA_GAIN(unit,v.value.track, spellid, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration) + end + else + self:AURA_GAIN(unit,v.value.track, spellid, spellName, icon, self.auras[spellName].duration, GetTime() + self.auras[spellName].duration) + end + end + + --Interrupts + if (unit == "arena1" or unit == "arena3") then + local enabledInterrupts = {} + local spellSchools = {} + for k,_ in pairs(Gladdy:GetSpellSchoolColors()) do + tinsert(spellSchools, k) + end + for spellIdStr, value in pairs(Gladdy.db.auraListInterrupts) do + if value.enabled then + tinsert(enabledInterrupts, spellIdStr) + end + end + if #enabledInterrupts > 0 then + local extraSpellSchool = spellSchools[rand(1, #spellSchools)] + spellid = tonumber(enabledInterrupts[rand(1, #enabledInterrupts)]) + spellName = select(1, GetSpellInfo(spellid)) + self:SPELL_INTERRUPT(unit,spellid, spellName, "physical", spellid, spellName, extraSpellSchool) + end end end function Auras:JOINED_ARENA() - for i=1, Gladdy.curBracket do - --self.frames["arena" .. i]:RegisterUnitEvent("UNIT_AURA", "arena" .. i) - --self.frames["arena" .. i]:SetScript("OnEvent", Auras.OnEvent) - end + --[[for i=1, Gladdy.curBracket do + self.frames["arena" .. i]:RegisterUnitEvent("UNIT_AURA", "arena" .. i) + self.frames["arena" .. i]:SetScript("OnEvent", Auras.OnEvent) + end--]] end function Auras:AURA_GAIN(unit, auraType, spellID, spellName, icon, duration, expirationTime, count, debuffType) @@ -459,11 +496,11 @@ function Auras:GetOptions() for i,v in ipairs(list) do borderArgs["auraSpellSchool" .. v.key] = { type = "color", - name = v.val.type, + name = L[v.val.type], order = i + 13, hasAlpha = true, width = "0.8", - set = function(info, r, g, b, a) + set = function(_, r, g, b, a) Gladdy.db.auraInterruptColors[v.key].r = r Gladdy.db.auraInterruptColors[v.key].g = g Gladdy.db.auraInterruptColors[v.key].b = b @@ -563,21 +600,21 @@ function Auras:GetOptions() debuffList = { type = "group", childGroups = "tree", - name = "Debuffs", + name = L["Debuffs"], order = 4, args = Auras:GetAuraOptions(AURA_TYPE_DEBUFF) }, buffList = { type = "group", childGroups = "tree", - name = "Buffs", + name = L["Buffs"], order = 5, args = Auras:GetAuraOptions(AURA_TYPE_BUFF) }, interruptList = { type = "group", childGroups = "tree", - name = "Interrupts", + name = L["Interrupts"], order = 6, args = Auras:GetInterruptOptions() } @@ -591,8 +628,8 @@ function Auras:GetAuraOptions(auraType) width = "0.7", name = L["Check All"], type = "execute", - func = function(info) - for k,v in pairs(defaultSpells(auraType)) do + func = function() + for k,_ in pairs(defaultSpells(auraType)) do Gladdy.db.auraListDefault[k].enabled = true end end, @@ -602,15 +639,15 @@ function Auras:GetAuraOptions(auraType) width = "0.7", name = L["Uncheck All"], type = "execute", - func = function(info) - for k,v in pairs(defaultSpells(auraType)) do + func = function() + for k,_ in pairs(defaultSpells(auraType)) do Gladdy.db.auraListDefault[k].enabled = false end end, }, } local auras = {} - for k,v in pairs(Gladdy:GetImportantAuras()) do + for _,v in pairs(Gladdy:GetImportantAuras()) do if v.track == auraType then tinsert(auras, v.spellID) end @@ -625,6 +662,7 @@ function Auras:GetAuraOptions(auraType) or (Gladdy:GetImportantAuras()[select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689))] and Gladdy:GetImportantAuras()[select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689))].spellID == k and Gladdy:GetImportantAuras()[select(1, GetSpellInfo(27010)) .. " " .. select(1, GetSpellInfo(16689))].altName) + or Gladdy:GetImportantAuras()[GetSpellInfo(k)].altName or GetSpellInfo(k), order = i+2, icon = Gladdy:GetImportantAuras()[GetSpellInfo(k)] and Gladdy:GetImportantAuras()[GetSpellInfo(k)].texture or select(3, GetSpellInfo(k)), @@ -632,13 +670,14 @@ function Auras:GetAuraOptions(auraType) enabled = { order = 1, name = L["Enabled"], + desc = GetSpellDescription(k), type = "toggle", image = Gladdy:GetImportantAuras()[GetSpellInfo(k)] and Gladdy:GetImportantAuras()[GetSpellInfo(k)].texture or select(3, GetSpellInfo(k)), width = "2", - set = function(info, value) + set = function(_, value) Gladdy.db.auraListDefault[tostring(k)].enabled = value end, - get = function(info) + get = function() return Gladdy.db.auraListDefault[tostring(k)].enabled end }, @@ -650,10 +689,10 @@ function Auras:GetAuraOptions(auraType) max = 50, width = "2", step = 1, - get = function(info) + get = function() return Gladdy.db.auraListDefault[tostring(k)].priority end, - set = function(info, value) + set = function(_, value) Gladdy.db.auraListDefault[tostring(k)].priority = value end, width = "full", @@ -666,13 +705,13 @@ end function Auras:GetInterruptOptions() local options = { - ckeckAll = { + checkAll = { order = 1, width = "0.7", name = L["Check All"], type = "execute", - func = function(info) - for k,v in pairs(defaultInterrupts()) do + func = function() + for k,_ in pairs(defaultInterrupts()) do Gladdy.db.auraListInterrupts[k].enabled = true end end, @@ -682,15 +721,15 @@ function Auras:GetInterruptOptions() width = "0.7", name = L["Uncheck All"], type = "execute", - func = function(info) - for k,v in pairs(defaultInterrupts()) do + func = function() + for k,_ in pairs(defaultInterrupts()) do Gladdy.db.auraListInterrupts[k].enabled = false end end, }, } local auras = {} - for k,v in pairs(Gladdy:GetInterrupts()) do + for _,v in pairs(Gladdy:GetInterrupts()) do tinsert(auras, v.spellID) end tbl_sort(auras, function(a, b) return GetSpellInfo(a) < GetSpellInfo(b) end) @@ -710,10 +749,10 @@ function Auras:GetInterruptOptions() type = "toggle", image = Gladdy:GetInterrupts()[GetSpellInfo(k)] and Gladdy:GetInterrupts()[GetSpellInfo(k)].texture or select(3, GetSpellInfo(k)), width = "2", - set = function(info, value) + set = function(_, value) Gladdy.db.auraListInterrupts[tostring(k)].enabled = value end, - get = function(info) + get = function() return Gladdy.db.auraListInterrupts[tostring(k)].enabled end }, @@ -725,10 +764,10 @@ function Auras:GetInterruptOptions() max = 50, width = "2", step = 1, - get = function(info) + get = function() return Gladdy.db.auraListInterrupts[tostring(k)].priority end, - set = function(info, value) + set = function(_, value) Gladdy.db.auraListInterrupts[tostring(k)].priority = value end, width = "full", diff --git a/Modules/BuffsDebuffs.lua b/Modules/BuffsDebuffs.lua index a1f7fa7..7940fd6 100644 --- a/Modules/BuffsDebuffs.lua +++ b/Modules/BuffsDebuffs.lua @@ -264,9 +264,9 @@ local function styleIcon(aura, auraType) aura.border:SetTexture(Gladdy.db.buffsBorderStyle) aura.border:SetVertexColor(spellSchoolToOptionValue(aura.spellSchool)) - aura.cooldown:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.buffsFont), (Gladdy.db.buffsIconSize/2 - 1) * Gladdy.db.buffsFontScale, "OUTLINE") + aura.cooldown:SetFont(Gladdy:SMFetch("font", "buffsFont"), (Gladdy.db.buffsIconSize/2 - 1) * Gladdy.db.buffsFontScale, "OUTLINE") aura.cooldown:SetTextColor(Gladdy.db.buffsFontColor.r, Gladdy.db.buffsFontColor.g, Gladdy.db.buffsFontColor.b, Gladdy.db.buffsFontColor.a) - aura.stacks:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.buffsFont), (Gladdy.db.buffsIconSize/3 - 1) * Gladdy.db.buffsFontScale, "OUTLINE") + aura.stacks:SetFont(Gladdy:SMFetch("font", "buffsFont"), (Gladdy.db.buffsIconSize/3 - 1) * Gladdy.db.buffsFontScale, "OUTLINE") aura.stacks:SetTextColor(Gladdy.db.buffsFontColor.r, Gladdy.db.buffsFontColor.g, Gladdy.db.buffsFontColor.b, Gladdy.db.buffsFontColor.a) end @@ -903,7 +903,7 @@ function BuffsDebuffs:GetOptions() }, font = { type = "group", - name = "Font", + name = L["Font"], order = 4, args = { header = { @@ -946,7 +946,7 @@ function BuffsDebuffs:GetOptions() }, border = { type = "group", - name = "Border", + name = L["Border"], order = 5, args = { header = { @@ -1033,7 +1033,7 @@ function BuffsDebuffs:GetOptions() }, }, debuffList = { - name = "Debuff Lists", + name = L["Debuff Lists"], type = "group", order = 11, childGroups = "tree", @@ -1048,7 +1048,7 @@ function BuffsDebuffs:GetOptions() end, }, buffList = { - name = "Buff Lists", + name = L["Buff Lists"], type = "group", order = 12, childGroups = "tree", diff --git a/Modules/Castbar.lua b/Modules/Castbar.lua index 847d6d6..17d62e7 100644 --- a/Modules/Castbar.lua +++ b/Modules/Castbar.lua @@ -61,13 +61,13 @@ function Castbar:CreateFrame(unit) castBar:EnableMouse(false) castBar.unit = unit - castBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.castBarBorderStyle), + castBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "castBarBorderStyle"), edgeSize = Gladdy.db.castBarBorderSize }) castBar:SetBackdropBorderColor(Gladdy.db.castBarBorderColor.r, Gladdy.db.castBarBorderColor.g, Gladdy.db.castBarBorderColor.b, Gladdy.db.castBarBorderColor.a) castBar:SetFrameLevel(1) castBar.bar = CreateFrame("StatusBar", nil, castBar) - castBar.bar:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture)) + castBar.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "castBarTexture")) castBar.bar:SetStatusBarColor(Gladdy.db.castBarColor.r, Gladdy.db.castBarColor.g, Gladdy.db.castBarColor.b, Gladdy.db.castBarColor.a) castBar.bar:SetMinMaxValues(0, 100) castBar.bar:SetFrameLevel(0) @@ -81,7 +81,7 @@ function Castbar:CreateFrame(unit) castBar.bg = castBar.bar:CreateTexture(nil, "BACKGROUND") castBar.bg:SetAlpha(1) - castBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture)) + castBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "castBarTexture")) castBar.bg:SetVertexColor(Gladdy.db.castBarBgColor.r, Gladdy.db.castBarBgColor.g, Gladdy.db.castBarBgColor.b, Gladdy.db.castBarBgColor.a) castBar.bg:SetAllPoints(castBar.bar) @@ -101,7 +101,7 @@ function Castbar:CreateFrame(unit) end castBar.spellText = castBar:CreateFontString(nil, "LOW") - castBar.spellText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), Gladdy.db.castBarFontSize) + castBar.spellText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize) castBar.spellText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a) castBar.spellText:SetShadowOffset(1, -1) castBar.spellText:SetShadowColor(0, 0, 0, 1) @@ -109,7 +109,7 @@ function Castbar:CreateFrame(unit) castBar.spellText:SetPoint("LEFT", 7, 0) -- Text of the spell castBar.timeText = castBar:CreateFontString(nil, "LOW") - castBar.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.auraFont), Gladdy.db.castBarFontSize) + castBar.timeText:SetFont(Gladdy:SMFetch("font", "auraFont"), Gladdy.db.castBarFontSize) castBar.timeText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a) castBar.timeText:SetShadowOffset(1, -1) castBar.timeText:SetShadowColor(0, 0, 0, 1) @@ -122,7 +122,6 @@ function Castbar:CreateFrame(unit) end function Castbar:UpdateFrame(unit) - local button = Gladdy.buttons[unit] local castBar = self.frames[unit] if (not castBar) then return @@ -130,17 +129,17 @@ function Castbar:UpdateFrame(unit) castBar:SetWidth(Gladdy.db.castBarWidth) castBar:SetHeight(Gladdy.db.castBarHeight) - castBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.castBarBorderStyle), + castBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "castBarBorderStyle"), edgeSize = Gladdy.db.castBarBorderSize }) castBar:SetBackdropBorderColor(Gladdy.db.castBarBorderColor.r, Gladdy.db.castBarBorderColor.g, Gladdy.db.castBarBorderColor.b, Gladdy.db.castBarBorderColor.a) - castBar.bar:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture)) + castBar.bar:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "castBarTexture")) castBar.bar:ClearAllPoints() castBar.bar:SetStatusBarColor(Gladdy.db.castBarColor.r, Gladdy.db.castBarColor.g, Gladdy.db.castBarColor.b, Gladdy.db.castBarColor.a) castBar.bar:SetPoint("TOPLEFT", castBar, "TOPLEFT", (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset)) castBar.bar:SetPoint("BOTTOMRIGHT", castBar, "BOTTOMRIGHT", -(Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.castBarBorderSize/Gladdy.db.statusbarBorderOffset)) - castBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.castBarTexture)) + castBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "castBarTexture")) castBar.bg:SetVertexColor(Gladdy.db.castBarBgColor.r, Gladdy.db.castBarBgColor.g, Gladdy.db.castBarBgColor.b, Gladdy.db.castBarBgColor.a) if Gladdy.db.castBarSparkEnabled then @@ -184,10 +183,10 @@ function Castbar:UpdateFrame(unit) end end - castBar.spellText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.castBarFont), Gladdy.db.castBarFontSize) + castBar.spellText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize) castBar.spellText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a) - castBar.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.castBarFont), Gladdy.db.castBarFontSize) + castBar.timeText:SetFont(Gladdy:SMFetch("font", "castBarFont"), Gladdy.db.castBarFontSize) castBar.timeText:SetTextColor(Gladdy.db.castBarFontColor.r, Gladdy.db.castBarFontColor.g, Gladdy.db.castBarFontColor.b, Gladdy.db.castBarFontColor.a) castBar.icon.texture.overlay:SetTexture(Gladdy.db.castBarIconStyle) diff --git a/Modules/Classicon.lua b/Modules/Classicon.lua index 7f44842..839b52f 100644 --- a/Modules/Classicon.lua +++ b/Modules/Classicon.lua @@ -178,8 +178,8 @@ function Classicon:GetOptions() name = L["Show Spec Icon"], desc = L["Shows Spec Icon once spec is detected"], order = 3, - get = function(info) return Gladdy.db.classIconSpecIcon end, - set = function(info, value) + get = function() return Gladdy.db.classIconSpecIcon end, + set = function(_, value) Gladdy.db.classIconSpecIcon = value if Gladdy.curBracket and Gladdy.curBracket > 0 then for i=1,Gladdy.curBracket do diff --git a/Modules/Clicks.lua b/Modules/Clicks.lua index ae9b9a3..1b5f971 100644 --- a/Modules/Clicks.lua +++ b/Modules/Clicks.lua @@ -12,8 +12,8 @@ local Gladdy = LibStub("Gladdy") local L = Gladdy.L local attributes = { - { name = "Target", button = "1", modifier = "", action = "target", spell = "" }, - { name = "Focus", button = "2", modifier = "", action = "focus", spell = "" }, + { name = L["Target"], button = "1", modifier = "", action = "target", spell = "" }, + { name = L["Focus"], button = "2", modifier = "", action = "focus", spell = "" }, } for i = 3, 10 do tinsert(attributes, { name = L["Action #%d"]:format(i), button = "", modifier = "", action = "disabled", spell = "" }) @@ -70,7 +70,7 @@ function Clicks:UpdateFrame(unit) end function Clicks:UpdateFrameOnce() - for k, v in pairs(Gladdy.buttons) do + for _, v in pairs(Gladdy.buttons) do local left = GetBindingKey(("GLADDYBUTTON%d_LEFT"):format(v.id)) local right = GetBindingKey(("GLADDYBUTTON%d_RIGHT"):format(v.id)) local middle = GetBindingKey(("GLADDYBUTTON%d_MIDDLE"):format(v.id)) @@ -107,7 +107,7 @@ function Clicks:SetupAttributes(unit) return end - for k, v in pairs(Gladdy.db.attributes) do + for _, v in pairs(Gladdy.db.attributes) do self:SetupAttribute(button, v.button, v.modifier, v.action, v.spell) end end diff --git a/Modules/Cooldowns.lua b/Modules/Cooldowns.lua index aa6b984..97c0a15 100644 --- a/Modules/Cooldowns.lua +++ b/Modules/Cooldowns.lua @@ -36,9 +36,9 @@ local L = Gladdy.L local function getDefaultCooldown() local cooldowns = {} - for class, t in pairs(Gladdy:GetCooldownList()) do - for spellId, v in pairs(t) do - local spellName, _, texture = GetSpellInfo(spellId) + for _,spellTable in pairs(Gladdy:GetCooldownList()) do + for spellId,_ in pairs(spellTable) do + local spellName = GetSpellInfo(spellId) if spellName then cooldowns[tostring(spellId)] = true else @@ -72,14 +72,14 @@ local Cooldowns = Gladdy:NewModule("Cooldowns", nil, { function Cooldowns:Initialize() self.cooldownSpellIds = {} self.spellTextures = {} - for class, t in pairs(Gladdy:GetCooldownList()) do - for k, v in pairs(t) do - local spellName, _, texture = GetSpellInfo(k) + for _,spellTable in pairs(Gladdy:GetCooldownList()) do + for spellId,_ in pairs(spellTable) do + local spellName, _, texture = GetSpellInfo(spellId) if spellName then - self.cooldownSpellIds[spellName] = k - self.spellTextures[k] = texture + self.cooldownSpellIds[spellName] = spellId + self.spellTextures[spellId] = texture else - Gladdy:Print("spellid does not exist " .. k) + Gladdy:Print("spellid does not exist " .. spellId) end end end @@ -120,7 +120,7 @@ function Cooldowns:CreateFrame(unit) icon.border:SetVertexColor(Gladdy.db.cooldownBorderColor.r, Gladdy.db.cooldownBorderColor.g, Gladdy.db.cooldownBorderColor.b, Gladdy.db.cooldownBorderColor.a) icon.cooldownFont = icon.cooldownFrame:CreateFontString(nil, "OVERLAY") - icon.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.cooldownFont), Gladdy.db.cooldownSize / 2 * Gladdy.db.cooldownFontScale, "OUTLINE") + icon.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), Gladdy.db.cooldownSize / 2 * Gladdy.db.cooldownFontScale, "OUTLINE") icon.cooldownFont:SetTextColor(Gladdy.db.cooldownFontColor.r, Gladdy.db.cooldownFontColor.g, Gladdy.db.cooldownFontColor.b, Gladdy.db.cooldownFontColor.a) icon.cooldownFont:SetAllPoints(icon) @@ -172,7 +172,7 @@ function Cooldowns:UpdateFrame(unit) local icon = button.spellCooldownFrame["icon" .. j] icon:SetHeight(Gladdy.db.cooldownSize) icon:SetWidth(Gladdy.db.cooldownSize * Gladdy.db.cooldownWidthFactor) - icon.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.cooldownFont), Gladdy.db.cooldownSize / 2 * Gladdy.db.cooldownFontScale, "OUTLINE") + icon.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), Gladdy.db.cooldownSize / 2 * Gladdy.db.cooldownFontScale, "OUTLINE") icon.cooldownFont:SetTextColor(Gladdy.db.cooldownFontColor.r, Gladdy.db.cooldownFontColor.g, Gladdy.db.cooldownFontColor.b, Gladdy.db.cooldownFontColor.a) icon:ClearAllPoints() if (Gladdy.db.cooldownXPos == "RIGHT") then @@ -220,7 +220,7 @@ function Cooldowns:UpdateFrame(unit) icon.cooldown:SetPoint("CENTER", icon, "CENTER") icon.cooldown:SetAlpha(Gladdy.db.cooldownCooldownAlpha) - icon.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.cooldownFont), (icon:GetWidth()/2 - 1) * Gladdy.db.cooldownFontScale, "OUTLINE") + icon.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), (icon:GetWidth()/2 - 1) * Gladdy.db.cooldownFontScale, "OUTLINE") icon.cooldownFont:SetTextColor(Gladdy.db.cooldownFontColor.r, Gladdy.db.cooldownFontColor.g, Gladdy.db.cooldownFontColor.b, Gladdy.db.cooldownFontColor.a) icon.border:SetTexture(Gladdy.db.cooldownBorderStyle) @@ -261,13 +261,12 @@ function Cooldowns:UpdateTestCooldowns(unit) button.test = true -- use class spells - for k, v in pairs(Gladdy:GetCooldownList()[button.class]) do - --k is spellId - self:CooldownUsed(unit, button.class, k, nil) + for spellId,_ in pairs(Gladdy:GetCooldownList()[button.class]) do + self:CooldownUsed(unit, button.class, spellId) end -- use race spells - for k, v in pairs(Gladdy:GetCooldownList()[button.race]) do - self:CooldownUsed(unit, button.race, k, nil) + for spellId,_ in pairs(Gladdy:GetCooldownList()[button.race]) do + self:CooldownUsed(unit, button.race, spellId) end end end @@ -295,11 +294,11 @@ function Cooldowns:CooldownStart(button, spellId, duration) self.timeLeft = self.timeLeft - elapsed local timeLeft = ceil(self.timeLeft) if timeLeft >= 540 then - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.cooldownFont), Gladdy.db.cooldownSize / 3.1 * Gladdy.db.cooldownFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), Gladdy.db.cooldownSize / 3.1 * Gladdy.db.cooldownFontScale, "OUTLINE") elseif timeLeft < 540 and timeLeft >= 60 then - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.cooldownFont), Gladdy.db.cooldownSize / 2.15 * Gladdy.db.cooldownFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), Gladdy.db.cooldownSize / 2.15 * Gladdy.db.cooldownFontScale, "OUTLINE") elseif timeLeft < 60 and timeLeft > 0 then - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.cooldownFont), Gladdy.db.cooldownSize / 2.15 * Gladdy.db.cooldownFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "cooldownFont"), Gladdy.db.cooldownSize / 2.15 * Gladdy.db.cooldownFontScale, "OUTLINE") end Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 0) if (self.timeLeft <= 0) then @@ -339,6 +338,9 @@ function Cooldowns:DetectSpec(unit, spec) if (not button or not spec or button.spec) then return end + if button.class == "PALADIN" and (spec ~= L["Holy"] or spec ~= L["Retribution"]) then + return + end button.spec = spec if not button.test then @@ -353,7 +355,6 @@ function Cooldowns:DetectSpec(unit, spec) ]] if (Gladdy.db.cooldown) then local class = Gladdy.buttons[unit].class - local race = Gladdy.buttons[unit].race for k, v in pairs(Gladdy:GetCooldownList()[class]) do if Gladdy.db.cooldownCooldowns[tostring(k)] then --if (self.db.cooldownList[k] ~= false and self.db.cooldownList[class] ~= false) then @@ -484,7 +485,7 @@ function Cooldowns:UpdateCooldowns(button) end end -function Cooldowns:CooldownUsed(unit, unitClass, spellId, spellName) +function Cooldowns:CooldownUsed(unit, unitClass, spellId) local button = Gladdy.buttons[unit] if not button then return @@ -502,8 +503,8 @@ function Cooldowns:CooldownUsed(unit, unitClass, spellId, spellName) -- check if we need to reset other cooldowns because of this spell if (cooldown.resetCD ~= nil) then - for k, v in pairs(cooldown.resetCD) do - self:CooldownReady(button, k, false) + for spellID,_ in pairs(cooldown.resetCD) do + self:CooldownReady(button, spellID, false) end end @@ -519,9 +520,9 @@ function Cooldowns:CooldownUsed(unit, unitClass, spellId, spellName) if (cooldown.sharedCD ~= nil) then local sharedCD = cooldown.sharedCD.cd and cooldown.sharedCD.cd or cd - for k, v in pairs(cooldown.sharedCD) do - if (k ~= "cd") then - self:CooldownStart(button, k, sharedCD) + for spellID,_ in pairs(cooldown.sharedCD) do + if (spellID ~= "cd") then + self:CooldownStart(button, spellID, sharedCD) end end end @@ -816,10 +817,10 @@ function Cooldowns:GetCooldownOptions() order = o, width = "full", image = select(3, GetSpellInfo(spellId)), - get = function(info) + get = function() return Gladdy.db.cooldownCooldowns[tostring(spellId)] end, - set = function(info, value) + set = function(_, value) Gladdy.db.cooldownCooldowns[tostring(spellId)] = value Gladdy:UpdateFrame() end @@ -845,10 +846,10 @@ function Cooldowns:GetCooldownOptions() order = o, width = "full", image = select(3, GetSpellInfo(spellId)), - get = function(info) + get = function() return Gladdy.db.cooldownCooldowns[tostring(spellId)] end, - set = function(info, value) + set = function(_, value) Gladdy.db.cooldownCooldowns[tostring(spellId)] = value Gladdy:UpdateFrame() end @@ -870,13 +871,13 @@ function Gladdy:UpdateTestCooldowns(i) Cooldowns:DetectSpec(unit, button.testSpec) -- use class spells - for k, v in pairs(Gladdy:GetCooldownList()[button.class]) do + for spellID,_ in pairs(Gladdy:GetCooldownList()[button.class]) do --k is spellId - Cooldowns:CooldownUsed(unit, button.class, k, nil) + Cooldowns:CooldownUsed(unit, button.class, spellID) end -- use race spells - for k, v in pairs(Gladdy:GetCooldownList()[button.race]) do - Cooldowns:CooldownUsed(unit, button.race, k, nil) + for spellID,_ in pairs(Gladdy:GetCooldownList()[button.race]) do + Cooldowns:CooldownUsed(unit, button.race, spellID) end end end \ No newline at end of file diff --git a/Modules/Diminishings.lua b/Modules/Diminishings.lua index 9c3b00b..780c188 100644 --- a/Modules/Diminishings.lua +++ b/Modules/Diminishings.lua @@ -1,14 +1,12 @@ local select = select -local pairs,ipairs,tbl_sort,tinsert,format = pairs,ipairs,table.sort,tinsert,format - -local drDuration = 18 +local pairs,ipairs,tbl_sort,tinsert,format,rand = pairs,ipairs,table.sort,tinsert,format,math.random local GetSpellInfo = GetSpellInfo local CreateFrame = CreateFrame local GetTime = GetTime local Gladdy = LibStub("Gladdy") -local DRData = LibStub("DRData-1.0") +local DRData = LibStub("DRData-1.0-BCC") local L = Gladdy.L local function defaultCategories() local categories = {} @@ -17,7 +15,7 @@ local function defaultCategories() tinsert(indexList, {spellID = k, category = v}) end tbl_sort(indexList, function(a, b) return a.spellID < b.spellID end) - for i,v in ipairs(indexList) do + for _,v in ipairs(indexList) do if not categories[v.category] then categories[v.category] = { enabled = true, @@ -47,7 +45,8 @@ local Diminishings = Gladdy:NewModule("Diminishings", nil, { drQuarterColor = {r = 1, g = 0.7, b = 0, a = 1 }, drNullColor = {r = 1, g = 0, b = 0, a = 1 }, drWidthFactor = 1, - drCategories = defaultCategories() + drCategories = defaultCategories(), + drDuration = 18 }) local function getDiminishColor(dr) @@ -117,7 +116,7 @@ function Diminishings:CreateFrame(unit) icon.text = icon.cooldownFrame:CreateFontString(nil, "OVERLAY") icon.text:SetDrawLayer("OVERLAY") - icon.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.drFont), 10, "OUTLINE") + icon.text:SetFont(Gladdy:SMFetch("font", "drFont"), 10, "OUTLINE") icon.text:SetTextColor(Gladdy.db.drFontColor.r, Gladdy.db.drFontColor.g, Gladdy.db.drFontColor.b, Gladdy.db.drFontColor.a) icon.text:SetShadowOffset(1, -1) icon.text:SetShadowColor(0, 0, 0, 1) @@ -126,7 +125,7 @@ function Diminishings:CreateFrame(unit) icon.timeText = icon.cooldownFrame:CreateFontString(nil, "OVERLAY") icon.timeText:SetDrawLayer("OVERLAY") - icon.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.drFont), 10, "OUTLINE") + icon.timeText:SetFont(Gladdy:SMFetch("font", "drFont"), 10, "OUTLINE") icon.timeText:SetTextColor(Gladdy.db.drFontColor.r, Gladdy.db.drFontColor.g, Gladdy.db.drFontColor.b, Gladdy.db.drFontColor.a) icon.timeText:SetShadowOffset(1, -1) icon.timeText:SetShadowColor(0, 0, 0, 1) @@ -185,9 +184,9 @@ function Diminishings:UpdateFrame(unit) icon:SetWidth(Gladdy.db.drIconSize * Gladdy.db.drWidthFactor) icon:SetHeight(Gladdy.db.drIconSize) - icon.text:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.drFont), (Gladdy.db.drIconSize/2 - 1) * Gladdy.db.drFontScale, "OUTLINE") + icon.text:SetFont(Gladdy:SMFetch("font", "drFont"), (Gladdy.db.drIconSize/2 - 1) * Gladdy.db.drFontScale, "OUTLINE") icon.text:SetTextColor(Gladdy.db.drFontColor.r, Gladdy.db.drFontColor.g, Gladdy.db.drFontColor.b, Gladdy.db.drFontColor.a) - icon.timeText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.drFont), (Gladdy.db.drIconSize/2 - 1) * Gladdy.db.drFontScale, "OUTLINE") + icon.timeText:SetFont(Gladdy:SMFetch("font", "drFont"), (Gladdy.db.drIconSize/2 - 1) * Gladdy.db.drFontScale, "OUTLINE") icon.timeText:SetTextColor(Gladdy.db.drFontColor.r, Gladdy.db.drFontColor.g, Gladdy.db.drFontColor.b, Gladdy.db.drFontColor.a) icon.cooldown:SetWidth(icon:GetWidth() - icon:GetWidth()/16) @@ -258,17 +257,32 @@ end function Diminishings:Test(unit) if Gladdy.db.drEnabled then - local spells = { 33786, 118, 8643, 8983 } - for i = 1, 4 do - if i == 1 then - self:AuraFade(unit, spells[i]) - elseif i == 2 then - self:AuraFade(unit, spells[i]) - self:AuraFade(unit, spells[i]) - else - self:AuraFade(unit, spells[i]) - self:AuraFade(unit, spells[i]) - self:AuraFade(unit, spells[i]) + local enabledCategories = {} + for cat,val in pairs(Gladdy.db.drCategories) do + if (val.enabled) then + tinsert(enabledCategories, {cat = cat , spellIDs = {}}) + enabledCategories[cat] = #enabledCategories + end + end + for spellId,cat in pairs(DRData:GetSpells()) do + if enabledCategories[cat] then + tinsert(enabledCategories[enabledCategories[cat]].spellIDs, spellId) + end + end + + --shuffle + for i = #enabledCategories, 2, -1 do + local j = rand(i) + enabledCategories[i], enabledCategories[j] = enabledCategories[j], enabledCategories[i] + end + + --execute test + local index, amount = 0,0 + for i=1, (#enabledCategories < 4 and #enabledCategories) or 4 do + amount = rand(1,3) + index = rand(1, #enabledCategories[i].spellIDs) + for _=1, amount do + self:AuraFade(unit, enabledCategories[i].spellIDs[index]) end end end @@ -295,15 +309,16 @@ function Diminishings:AuraFade(unit, spellID) lastIcon.diminishing = 1.0 end end + if not lastIcon then return end lastIcon.dr = drCat - lastIcon.timeLeft = drDuration + lastIcon.timeLeft = Gladdy.db.drDuration lastIcon.diminishing = DRData:NextDR(lastIcon.diminishing) if Gladdy.db.drBorderColorsEnabled then lastIcon.border:SetVertexColor(getDiminishColor(lastIcon.diminishing)) else lastIcon.border:SetVertexColor(Gladdy.db.drBorderColor.r, Gladdy.db.drBorderColor.g, Gladdy.db.drBorderColor.b, Gladdy.db.drBorderColor.a) end - lastIcon.cooldown:SetCooldown(GetTime(), drDuration) + lastIcon.cooldown:SetCooldown(GetTime(), Gladdy.db.drDuration) if Gladdy.db.drCategories[drCat].forceIcon then lastIcon.texture:SetTexture(Gladdy.db.drCategories[drCat].icon) else @@ -359,11 +374,20 @@ function Diminishings:GetOptions() desc = L["Enabled DR module"], order = 3, }), + drDuration = Gladdy:option({ + type = "range", + name = L["DR Duration"], + desc = L["Change the DR Duration in seconds (DR is dynamic between 15-20s)"], + order = 4, + min = 15, + max = 20, + step = .1, + }), group = { type = "group", childGroups = "tree", name = L["Frame"], - order = 4, + order = 5, args = { icon = { type = "group", @@ -586,16 +610,39 @@ function Diminishings:GetOptions() end function Diminishings:CategoryOptions() - local categories = {} + local categories = { + checkAll = { + order = 1, + width = "0.7", + name = L["Check All"], + type = "execute", + func = function() + for k,_ in pairs(defaultCategories()) do + Gladdy.db.drCategories[k].enabled = true + end + end, + }, + uncheckAll = { + order = 2, + width = "0.7", + name = L["Uncheck All"], + type = "execute", + func = function() + for k,_ in pairs(defaultCategories()) do + Gladdy.db.drCategories[k].enabled = false + end + end, + }, + } local indexList = {} - for k,v in pairs(DRData:GetCategories()) do + for k,_ in pairs(DRData:GetCategories()) do tinsert(indexList, k) end tbl_sort(indexList) - for i, k in ipairs(indexList) do + for i,k in ipairs(indexList) do categories[k] = { type = "group", - name = DRData:GetCategoryName(k), + name = L[DRData:GetCategoryName(k)], order = i, icon = Gladdy.db.drCategories[k].icon, args = { @@ -603,10 +650,10 @@ function Diminishings:CategoryOptions() type = "toggle", name = L["Enabled"], order = 1, - get = function(info) + get = function() return Gladdy.db.drCategories[k].enabled end, - set = function(info, value) + set = function(_, value) Gladdy.db.drCategories[k].enabled = value end, }, @@ -614,10 +661,10 @@ function Diminishings:CategoryOptions() type = "toggle", name = L["Force Icon"], order = 2, - get = function(info) + get = function() return Gladdy.db.drCategories[k].forceIcon end, - set = function(info, value) + set = function(_, value) Gladdy.db.drCategories[k].forceIcon = value end, }, @@ -627,10 +674,10 @@ function Diminishings:CategoryOptions() desc = L["Icon of the DR"], order = 4, values = Diminishings:GetDRIcons(k), - get = function(info) + get = function() return Gladdy.db.drCategories[k].icon end, - set = function(info, value) + set = function(_, value) Gladdy.db.drCategories[k].icon = value Gladdy.options.args.Diminishings.args.categories.args[k].icon = value end, diff --git a/Modules/ExportImport.lua b/Modules/ExportImport.lua index 9d9110a..1bafaaa 100644 --- a/Modules/ExportImport.lua +++ b/Modules/ExportImport.lua @@ -1,4 +1,4 @@ -local type, pairs = type, pairs +local type, pairs, str_match = type, pairs, string.match local Gladdy = LibStub("Gladdy") local AceSerializer = LibStub("AceSerializer-3.0") @@ -6,12 +6,23 @@ local L = Gladdy.L local AceGUI = LibStub("AceGUI-3.0") local LibDeflate = LibStub:GetLibrary("LibDeflate") -local function table_copy(t) + +local function table_copy(t, str) local t2 = {}; + if str == nil then + str = "Gladdy.db" + end for k,v in pairs(t) do if type(v) == "table" then - t2[k] = table_copy(v); + if k == "drCategories" then + for key,val in pairs(v) do + --Gladdy:Print("TableCopy", str .. "." .. key) + end + end + + t2[k] = table_copy(v, str .. "." .. k); else + t2[k] = v; end end @@ -84,9 +95,27 @@ import:AddChild(importClearButton) import.clearButton = importClearButton local deletedOptions = { --TODO backward compatibility Imports on deleted options - growUp = true + growUp = true, + freezetrap = true, + repentance = true } +local function checkIsDeletedOption(k, str, msg, errorFound, errorMsg) + local isDeleted + for key, _ in pairs(deletedOptions) do + if str_match(k, key) then + isDeleted = true + Gladdy:Warn("found deleted option =", str .. "." .. k) + end + end + if errorFound then + return errorFound, errorMsg + end + if not isDeleted then + return true, msg or str .. "." .. k .. " does not exist" + end +end + function ExportImport:CheckDeserializedOptions(tbl, refTbl, str) if str == nil and not tbl.version_major_num then return false, "Version conflict: version_major_num not seen" @@ -98,17 +127,29 @@ function ExportImport:CheckDeserializedOptions(tbl, refTbl, str) str = "Gladdy.db" tbl.version_major_num = nil end - for k,v in pairs(tbl) do - if refTbl[k] == nil then - --return false, str .. "." .. k .. " does not exist" - else - if type(v) ~= type(refTbl[k]) then - return false, str .. "." .. k .. " type error. Expected " .. type(refTbl[k]) .. " found " .. type(v) + local res, msg + local errorFound, errorMsg + if refTbl == nil then + return false, str .. "does not exist" + else + for k,v in pairs(tbl) do + if refTbl[k] == nil then + errorFound, errorMsg = checkIsDeletedOption(k, str, nil, errorFound, errorMsg) + elseif type(v) ~= type(refTbl[k]) then + errorFound = true + errorMsg = str .. "." .. k .. " type error. Expected " .. type(refTbl[k]) .. " found " .. type(v) elseif type(v) == "table" then - ExportImport:CheckDeserializedOptions(v, refTbl[k], str .. "." .. k) + res, msg = ExportImport:CheckDeserializedOptions(v, refTbl[k], str .. "." .. k) + if not res then + errorFound, errorMsg = checkIsDeletedOption(msg, str, msg, errorFound, errorMsg) + end end end end + + if errorFound then + return false, errorMsg + end return true end @@ -135,8 +176,8 @@ function ExportImport:GetOptions() export.eb:HighlightText(0, export.eb.editBox:GetNumLetters()) export:SetStatusText("Copy this string to share your configuration with others.") end, - name = "Export", - desc = "Export your current profile to share with others or your various accounts.", + name = L["Export"], + desc = L["Export your current profile to share with others or your various accounts."], order = 3, }, import = { @@ -159,17 +200,25 @@ function ExportImport:GetOptions() import.deserializedTable = deserialized end) end, - name = "Import", - desc = "This will overwrite your current profile!", + name = L["Import"], + desc = L["This will overwrite your current profile!"], order = 4, }, } end -function ExportImport:ApplyImport(t, table) +function ExportImport:ApplyImport(t, table, str) + if str == nil then + str = "Gladdy.db" + end for k,v in pairs(t) do if type(v) == "table" then - ExportImport:ApplyImport(v, table[k]) + if (table[k] ~= nil) then + ExportImport:ApplyImport(v, table[k], str .. "." .. k) + else + Gladdy:Warn("ApplyImport failed for", str .. "." .. k) + end + else table[k] = v end diff --git a/Modules/Healthbar.lua b/Modules/Healthbar.lua index a9d9d96..31e850a 100644 --- a/Modules/Healthbar.lua +++ b/Modules/Healthbar.lua @@ -39,18 +39,18 @@ function Healthbar:CreateFrame(unit) local healthBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate") healthBar:EnableMouse(false) - healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.healthBarBorderStyle), + healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "healthBarBorderStyle"), edgeSize = Gladdy.db.healthBarBorderSize }) healthBar:SetBackdropBorderColor(Gladdy.db.healthBarBorderColor.r, Gladdy.db.healthBarBorderColor.g, Gladdy.db.healthBarBorderColor.b, Gladdy.db.healthBarBorderColor.a) healthBar:SetFrameLevel(1) healthBar.hp = CreateFrame("StatusBar", nil, healthBar) - healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture)) + healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "healthBarTexture")) healthBar.hp:SetMinMaxValues(0, 100) healthBar.hp:SetFrameLevel(0) healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND") - healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture)) + healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "healthBarTexture")) healthBar.bg:ClearAllPoints() healthBar.bg:SetAllPoints(healthBar.hp) healthBar.bg:SetAlpha(1) @@ -58,10 +58,10 @@ function Healthbar:CreateFrame(unit) healthBar.nameText = healthBar:CreateFontString(nil, "LOW", "GameFontNormalSmall") if (Gladdy.db.healthBarNameFontSize < 1) then - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarNameFont), 1) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1) healthBar.nameText:Hide() else - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarNameFontSize) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize) healthBar.nameText:Show() end healthBar.nameText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) @@ -72,10 +72,10 @@ function Healthbar:CreateFrame(unit) healthBar.healthText = healthBar:CreateFontString(nil, "LOW") if (Gladdy.db.healthBarHealthFontSize < 1) then - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1) healthBar.healthText:Hide() else - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarHealthFontSize) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize) healthBar.healthText:Hide() end healthBar.healthText:SetTextColor(Gladdy.db.healthBarFontColor.r, Gladdy.db.healthBarFontColor.g, Gladdy.db.healthBarFontColor.b, Gladdy.db.healthBarFontColor.a) @@ -167,35 +167,33 @@ function Healthbar:UpdateFrame(unit) return end - local iconSize = Gladdy.db.healthBarHeight + Gladdy.db.powerBarHeight - - healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture)) + healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "healthBarTexture")) healthBar.bg:SetVertexColor(Gladdy.db.healthBarBgColor.r, Gladdy.db.healthBarBgColor.g, Gladdy.db.healthBarBgColor.b, Gladdy.db.healthBarBgColor.a) - healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.healthBarBorderStyle), + healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "healthBarBorderStyle"), edgeSize = Gladdy.db.healthBarBorderSize }) healthBar:SetBackdropBorderColor(Gladdy.db.healthBarBorderColor.r, Gladdy.db.healthBarBorderColor.g, Gladdy.db.healthBarBorderColor.b, Gladdy.db.healthBarBorderColor.a) healthBar:ClearAllPoints() healthBar:SetPoint("TOPLEFT", Gladdy.buttons[unit], "TOPLEFT", 0, 0) healthBar:SetPoint("BOTTOMRIGHT", Gladdy.buttons[unit], "BOTTOMRIGHT") - healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.healthBarTexture)) + healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "healthBarTexture")) healthBar.hp:ClearAllPoints() healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.healthBarBorderSize/Gladdy.db.statusbarBorderOffset)) if (Gladdy.db.healthBarHealthFontSize < 1) then - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), 1) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), 1) healthBar.healthText:Hide() else - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarHealthFontSize) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarHealthFontSize) healthBar.healthText:Show() end if (Gladdy.db.healthBarNameFontSize < 1) then - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarNameFont), 1) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarNameFont"), 1) healthBar.nameText:Hide() else - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.healthBarFont), Gladdy.db.healthBarNameFontSize) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "healthBarFont"), Gladdy.db.healthBarNameFontSize) if Gladdy.db.healthName then healthBar.nameText:Show() else diff --git a/Modules/Highlight.lua b/Modules/Highlight.lua index e48a4c2..5cebb1a 100644 --- a/Modules/Highlight.lua +++ b/Modules/Highlight.lua @@ -55,17 +55,17 @@ function Highlight:CreateFrame(unit) local healthBar = Gladdy.modules["Health Bar"].frames[unit] local targetBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") - targetBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = Gladdy.db.highlightBorderSize }) + targetBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = Gladdy.db.highlightBorderSize }) --targetBorder:SetFrameStrata("MEDIUM") targetBorder:Hide() local focusBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") - focusBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = Gladdy.db.highlightBorderSize }) + focusBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = Gladdy.db.highlightBorderSize }) --focusBorder:SetFrameStrata("MEDIUM") focusBorder:Hide() local leaderBorder = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") - leaderBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = Gladdy.db.highlightBorderSize }) + leaderBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = Gladdy.db.highlightBorderSize }) --leaderBorder:SetFrameStrata("MEDIUM") leaderBorder:Hide() @@ -106,7 +106,7 @@ function Highlight:UpdateFrame(unit) button.targetBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize)) end - button.targetBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = borderSize }) + button.targetBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = borderSize }) button.targetBorder:SetBackdropBorderColor(Gladdy.db.targetBorderColor.r, Gladdy.db.targetBorderColor.g, Gladdy.db.targetBorderColor.b, Gladdy.db.targetBorderColor.a) button.focusBorder:SetWidth(width) @@ -119,7 +119,7 @@ function Highlight:UpdateFrame(unit) button.focusBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize)) end - button.focusBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = borderSize }) + button.focusBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = borderSize }) button.focusBorder:SetBackdropBorderColor(Gladdy.db.focusBorderColor.r, Gladdy.db.focusBorderColor.g, Gladdy.db.focusBorderColor.b, Gladdy.db.focusBorderColor.a) button.leaderBorder:SetWidth(width) @@ -132,7 +132,7 @@ function Highlight:UpdateFrame(unit) button.leaderBorder:SetPoint("TOP", button.healthBar, "TOP", 0, (Gladdy.db.highlightInset and 0 or borderSize)) end - button.leaderBorder:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.highlightBorderStyle), edgeSize = borderSize }) + button.leaderBorder:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "highlightBorderStyle"), edgeSize = borderSize }) button.leaderBorder:SetBackdropBorderColor(Gladdy.db.leaderBorderColor.r, Gladdy.db.leaderBorderColor.g, Gladdy.db.leaderBorderColor.b, Gladdy.db.leaderBorderColor.a) if Gladdy.frame.testing then Highlight:Test(unit) diff --git a/Modules/Pets.lua b/Modules/Pets.lua index 7ab729f..994a8b5 100644 --- a/Modules/Pets.lua +++ b/Modules/Pets.lua @@ -35,12 +35,12 @@ function Pets:Initialize() end function Pets:JOINED_ARENA() - for k,v in pairs(self.frames) do + for _,v in pairs(self.frames) do v.healthBar:SetAlpha(0) end if Gladdy.db.petEnabled then self:RegisterEvent("UNIT_PET") - self:SetScript("OnEvent", function(self, event, unitId) + self:SetScript("OnEvent", function(_, event, unitId) if event == "UNIT_PET" then local unit = Gladdy.guids[UnitGUID(unitId)] if unit then @@ -149,7 +149,7 @@ function Pets:CreateFrame(unitId) button.secure = secure local healthBar = CreateFrame("Frame", nil, button, BackdropTemplateMixin and "BackdropTemplate") - healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.petHealthBarBorderStyle), + healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "petHealthBarBorderStyle"), edgeSize = Gladdy.db.petHealthBarBorderSize }) healthBar:SetBackdropBorderColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a) healthBar:SetFrameLevel(1) @@ -167,14 +167,14 @@ function Pets:CreateFrame(unitId) healthBar.hp = CreateFrame("StatusBar", nil, healthBar) - healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture)) + healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture")) healthBar.hp:SetStatusBarColor(Gladdy.db.petHealthBarColor.r, Gladdy.db.petHealthBarColor.g, Gladdy.db.petHealthBarColor.b, Gladdy.db.petHealthBarColor.a) healthBar.hp:SetMinMaxValues(0, 100) healthBar.hp:SetFrameLevel(0) healthBar.hp:SetAllPoints(healthBar) healthBar.bg = healthBar.hp:CreateTexture(nil, "BACKGROUND") - healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture)) + healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture")) healthBar.bg:ClearAllPoints() healthBar.bg:SetAllPoints(healthBar.hp) healthBar.bg:SetAlpha(1) @@ -182,10 +182,10 @@ function Pets:CreateFrame(unitId) healthBar.nameText = healthBar:CreateFontString(nil, "LOW", "GameFontNormalSmall") if (Gladdy.db.petHealthBarFontSize < 1) then - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1) healthBar.nameText:Hide() else - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize) healthBar.nameText:Show() end healthBar.nameText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a) @@ -196,10 +196,10 @@ function Pets:CreateFrame(unitId) healthBar.healthText = healthBar:CreateFontString(nil, "LOW") if (Gladdy.db.petHealthBarFontSize < 1) then - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1) healthBar.healthText:Hide() else - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize) healthBar.healthText:Hide() end healthBar.healthText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a) @@ -263,28 +263,28 @@ function Pets:UpdateFrame(unitId) healthBar.portrait.border:SetTexture(Gladdy.db.petPortraitBorderStyle) healthBar.portrait.border:SetVertexColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a) - healthBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture)) + healthBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture")) healthBar.bg:SetVertexColor(Gladdy.db.petHealthBarBgColor.r, Gladdy.db.petHealthBarBgColor.g, Gladdy.db.petHealthBarBgColor.b, Gladdy.db.petHealthBarBgColor.a) - healthBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.petHealthBarBorderStyle), + healthBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "petHealthBarBorderStyle"), edgeSize = Gladdy.db.petHealthBarBorderSize }) healthBar:SetBackdropBorderColor(Gladdy.db.petHealthBarBorderColor.r, Gladdy.db.petHealthBarBorderColor.g, Gladdy.db.petHealthBarBorderColor.b, Gladdy.db.petHealthBarBorderColor.a) - healthBar.hp:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.petHealthBarTexture)) + healthBar.hp:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "petHealthBarTexture")) healthBar.hp:SetStatusBarColor(Gladdy.db.petHealthBarColor.r, Gladdy.db.petHealthBarColor.g, Gladdy.db.petHealthBarColor.b, Gladdy.db.petHealthBarColor.a) healthBar.hp:ClearAllPoints() healthBar.hp:SetPoint("TOPLEFT", healthBar, "TOPLEFT", (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset)) healthBar.hp:SetPoint("BOTTOMRIGHT", healthBar, "BOTTOMRIGHT", -(Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.petHealthBarBorderSize/Gladdy.db.statusbarBorderOffset)) if (Gladdy.db.petHealthBarFontSize < 1) then - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1) - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), 1) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), 1) healthBar.nameText:Hide() healthBar.healthText:Hide() else - healthBar.nameText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize) + healthBar.nameText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize) healthBar.nameText:Show() - healthBar.healthText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.petHealthBarFont), Gladdy.db.petHealthBarFontSize) + healthBar.healthText:SetFont(Gladdy:SMFetch("font", "petHealthBarFont"), Gladdy.db.petHealthBarFontSize) healthBar.healthText:Show() end healthBar.nameText:SetTextColor(Gladdy.db.petHealthBarFontColor.r, Gladdy.db.petHealthBarFontColor.g, Gladdy.db.petHealthBarFontColor.b, Gladdy.db.petHealthBarFontColor.a) diff --git a/Modules/Powerbar.lua b/Modules/Powerbar.lua index 01b608c..eaa961a 100644 --- a/Modules/Powerbar.lua +++ b/Modules/Powerbar.lua @@ -38,24 +38,24 @@ function Powerbar:CreateFrame(unit) local powerBar = CreateFrame("Frame", nil, Gladdy.buttons[unit], BackdropTemplateMixin and "BackdropTemplate") powerBar:EnableMouse(false) - powerBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.powerBarBorderStyle), + powerBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "powerBarBorderStyle"), edgeSize = Gladdy.db.powerBarBorderSize }) powerBar:SetBackdropBorderColor(Gladdy.db.powerBarBorderColor.r, Gladdy.db.powerBarBorderColor.g, Gladdy.db.powerBarBorderColor.b, Gladdy.db.powerBarBorderColor.a) powerBar:SetFrameLevel(1) powerBar.energy = CreateFrame("StatusBar", nil, powerBar) - powerBar.energy:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture)) + powerBar.energy:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "powerBarTexture")) powerBar.energy:SetMinMaxValues(0, 100) powerBar.energy:SetFrameLevel(0) powerBar.bg = powerBar.energy:CreateTexture(nil, "BACKGROUND") - powerBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture)) + powerBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "powerBarTexture")) powerBar.bg:ClearAllPoints() powerBar.bg:SetAllPoints(powerBar.energy) powerBar.bg:SetVertexColor(Gladdy.db.powerBarBgColor.r, Gladdy.db.powerBarBgColor.g, Gladdy.db.powerBarBgColor.b, Gladdy.db.powerBarBgColor.a) powerBar.raceText = powerBar:CreateFontString(nil, "LOW") - powerBar.raceText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize) + powerBar.raceText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarFontSize) powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a) powerBar.raceText:SetShadowOffset(1, -1) powerBar.raceText:SetShadowColor(0, 0, 0, 1) @@ -63,7 +63,7 @@ function Powerbar:CreateFrame(unit) powerBar.raceText:SetPoint("LEFT", 5, 1) powerBar.powerText = powerBar:CreateFontString(nil, "LOW") - powerBar.powerText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize) + powerBar.powerText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarFontSize) powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a) powerBar.powerText:SetShadowOffset(1, -1) powerBar.powerText:SetShadowColor(0, 0, 0, 1) @@ -149,7 +149,7 @@ function Powerbar:UpdateFrame(unit) else powerBar:Show() end - powerBar.bg:SetTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture)) + powerBar.bg:SetTexture(Gladdy:SMFetch("statusbar", "powerBarTexture")) powerBar.bg:SetVertexColor(Gladdy.db.powerBarBgColor.r, Gladdy.db.powerBarBgColor.g, Gladdy.db.powerBarBgColor.b, Gladdy.db.powerBarBgColor.a) powerBar:SetWidth(healthBar:GetWidth()) @@ -158,18 +158,18 @@ function Powerbar:UpdateFrame(unit) powerBar:ClearAllPoints() powerBar:SetPoint("TOPLEFT", healthBar, "BOTTOMLEFT", 0, -1) - powerBar:SetBackdrop({ edgeFile = Gladdy.LSM:Fetch("border", Gladdy.db.powerBarBorderStyle), + powerBar:SetBackdrop({ edgeFile = Gladdy:SMFetch("border", "powerBarBorderStyle"), edgeSize = Gladdy.db.powerBarBorderSize }) powerBar:SetBackdropBorderColor(Gladdy.db.powerBarBorderColor.r, Gladdy.db.powerBarBorderColor.g, Gladdy.db.powerBarBorderColor.b, Gladdy.db.powerBarBorderColor.a) - powerBar.energy:SetStatusBarTexture(Gladdy.LSM:Fetch("statusbar", Gladdy.db.powerBarTexture)) + powerBar.energy:SetStatusBarTexture(Gladdy:SMFetch("statusbar", "powerBarTexture")) powerBar.energy:ClearAllPoints() powerBar.energy:SetPoint("TOPLEFT", powerBar, "TOPLEFT", (Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset), -(Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset)) powerBar.energy:SetPoint("BOTTOMRIGHT", powerBar, "BOTTOMRIGHT", -(Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset), (Gladdy.db.powerBarBorderSize/Gladdy.db.statusbarBorderOffset)) - powerBar.raceText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize) + powerBar.raceText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarFontSize) powerBar.raceText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a) - powerBar.powerText:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.powerBarFont), Gladdy.db.powerBarFontSize) + powerBar.powerText:SetFont(Gladdy:SMFetch("font", "powerBarFont"), Gladdy.db.powerBarFontSize) powerBar.powerText:SetTextColor(Gladdy.db.powerBarFontColor.r, Gladdy.db.powerBarFontColor.g, Gladdy.db.powerBarFontColor.b, Gladdy.db.powerBarFontColor.a) end diff --git a/Modules/Racial.lua b/Modules/Racial.lua index cf988c6..94fb049 100644 --- a/Modules/Racial.lua +++ b/Modules/Racial.lua @@ -1,10 +1,8 @@ -local ceil, floor, string_format, tonumber = ceil, floor, string.format, tonumber +local ceil = ceil local CreateFrame = CreateFrame local GetTime = GetTime - - local Gladdy = LibStub("Gladdy") local L = Gladdy.L local Racial = Gladdy:NewModule("Racial", nil, { @@ -46,19 +44,19 @@ local function iconTimer(self,elapsed) if timeLeft >= 60 then self.cooldownFont:SetTextColor(1, 1, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 0.15* self:GetWidth()) * Gladdy.db.racialFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 0.15* self:GetWidth()) * Gladdy.db.racialFontScale, "OUTLINE") elseif timeLeft < 60 and timeLeft >= 30 then self.cooldownFont:SetTextColor(1, 1, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") elseif timeLeft < 30 and timeLeft >= 11 then self.cooldownFont:SetTextColor(1, 0.7, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") elseif timeLeft < 10 and timeLeft >= 5 then self.cooldownFont:SetTextColor(1, 0.7, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") elseif timeLeft < 5 and timeLeft > 0 then self.cooldownFont:SetTextColor(1, 0, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), (self:GetWidth()/2 - 1) * Gladdy.db.racialFontScale, "OUTLINE") end Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 10, true) end @@ -82,7 +80,7 @@ function Racial:CreateFrame(unit) racial.cooldownFrame:SetPoint("BOTTOMRIGHT", racial, "BOTTOMRIGHT") racial.cooldownFont = racial.cooldownFrame:CreateFontString(nil, "OVERLAY") - racial.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.racialFont), 20, "OUTLINE") + racial.cooldownFont:SetFont(Gladdy:SMFetch("font", "racialFont"), 20, "OUTLINE") --trinket.cooldownFont:SetAllPoints(trinket.cooldown) racial.cooldownFont:SetJustifyH("CENTER") racial.cooldownFont:SetPoint("CENTER") @@ -123,7 +121,6 @@ function Racial:UpdateFrame(unit) racial.texture.overlay:SetVertexColor(Gladdy.db.racialBorderColor.r, Gladdy.db.racialBorderColor.g, Gladdy.db.racialBorderColor.b, Gladdy.db.racialBorderColor.a) racial:ClearAllPoints() - local margin = (Gladdy.db.highlightInset and 0 or Gladdy.db.highlightBorderSize) + Gladdy.db.padding local parent = Gladdy.buttons[unit][Gladdy.db.racialAnchor] if (Gladdy.db.racialPos == "RIGHT") then racial:SetPoint(ANCHORS[Gladdy.db.racialPos], parent, Gladdy.db.racialPos, Gladdy.db.padding + Gladdy.db.racialXOffset, Gladdy.db.racialYOffset) @@ -174,7 +171,7 @@ end function Racial:ENEMY_SPOTTED(unit) local racial = self.frames[unit] - if (not racial) then + if (not racial or not Gladdy.buttons[unit].race) then return end racial.texture:SetTexture(Gladdy:Racials()[Gladdy.buttons[unit].race].texture) diff --git a/Modules/RangeCheck.lua b/Modules/RangeCheck.lua index eccb1a6..3e95600 100644 --- a/Modules/RangeCheck.lua +++ b/Modules/RangeCheck.lua @@ -211,12 +211,12 @@ function RangeCheck.CheckRange(self) local spell = Gladdy.db.rangeCheckDefaultSpells[RangeCheck.playerClass].min - if( not UnitIsConnected(button.unit) or not UnitInPhase(button.unit) ) then + if (not UnitIsConnected(button.unit) or not UnitInPhase(button.unit)) then RangeCheck:SetRangeAlpha(button, false) - elseif( spell ) then + elseif (spell) then RangeCheck:SetRangeAlpha(button, LSR.IsSpellInRange(spell, button.unit) == 1) -- That didn't work, but they are grouped lets try the actual API for this, it's a bit flaky though and not that useful generally - elseif( UnitInRaid(button.unit) or UnitInParty(button.unit) ) then + elseif (UnitInRaid(button.unit) or UnitInParty(button.unit)) then RangeCheck:SetRangeAlpha(button, UnitInRange(button.unit, "player")) -- Nope, fall back to interaction :( else @@ -349,7 +349,7 @@ function RangeCheck:GetSpells() local group = { description = { type = "description", - name = "Changing the spellID only applies to your player class!\n\nExample: If you are a Paladin and wish to change your range check spell to Repentance, edit the Paladin spellID to 20066.", + name = L["Changing the spellID only applies to your player class!\n\nExample: If you are a Paladin and wish to change your range check spell to Repentance, edit the Paladin spellID to 20066."], order = 1, }, } @@ -363,7 +363,7 @@ function RangeCheck:GetSpells() args = { headerMin = { type = "header", - name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %dyds", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min))) + name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %d" .. L["yds"], select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min))) or "nil", order = 1, }, @@ -385,7 +385,7 @@ function RangeCheck:GetSpells() Gladdy.db.rangeCheckDefaultSpells[class].min = tonumber(value) --Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.min.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min))) -- or "nil" - Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.headerMin.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %dyds", select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min))) + Gladdy.options.args["Range Check"].args.oorSpells.args[class].args.headerMin.name = GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min) and format("|T%s:20|t %s - %d" .. L["yds"], select(3, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(1, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min)), select(6, GetSpellInfo(Gladdy.db.rangeCheckDefaultSpells[class].min))) or "nil" end }, diff --git a/Modules/ShadowsightTimer.lua b/Modules/ShadowsightTimer.lua index 097d238..edd280e 100644 --- a/Modules/ShadowsightTimer.lua +++ b/Modules/ShadowsightTimer.lua @@ -1,4 +1,4 @@ -local floor, str_len, tostring, str_sub, str_find, pairs = math.floor, string.len, tostring, string.sub, string.find, pairs +local floor, str_find, pairs = math.floor, string.find, pairs local CreateFrame = CreateFrame local Gladdy = LibStub("Gladdy") @@ -21,6 +21,7 @@ end function ShadowsightTimer:Initialize() self.locale = Gladdy:GetArenaTimer() self:RegisterMessage("JOINED_ARENA") + self:RegisterMessage("AURA_GAIN") self:CreateTimerFrame() end @@ -32,6 +33,12 @@ function ShadowsightTimer:JOINED_ARENA() self.timerFrame:Show() end +function ShadowsightTimer:AURA_GAIN(unit, auraType, spellID) + if (spellID == 34709) then + --TODO reset timer after 15s + end +end + function ShadowsightTimer:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg) for k,v in pairs(self.locale) do if str_find(msg, v) then @@ -101,7 +108,9 @@ function ShadowsightTimer:UpdateFrameOnce() self.timerFrame:SetScale(Gladdy.db.shadowsightTimerScale) self.timerFrame:ClearAllPoints() self.timerFrame:SetPoint(Gladdy.db.shadowsightTimerRelPoint1, nil, Gladdy.db.shadowsightTimerRelPoint2, Gladdy.db.shadowsightTimerX, Gladdy.db.shadowsightTimerY) - self.timerFrame:Show() + if Gladdy.frame.testing or Gladdy.curBracket then + self.timerFrame:Show() + end else self.timerFrame:SetScale(Gladdy.db.shadowsightTimerScale) self.timerFrame:ClearAllPoints() diff --git a/Modules/TotemPlates.lua b/Modules/TotemPlates.lua index 189a28f..f87053d 100644 --- a/Modules/TotemPlates.lua +++ b/Modules/TotemPlates.lua @@ -3,7 +3,7 @@ local UnitExists, UnitIsUnit, UnitName, UnitIsEnemy = UnitExists, UnitIsUnit, Un local C_NamePlate = C_NamePlate local Gladdy = LibStub("Gladdy") local L = Gladdy.L -local GetSpellInfo, CreateFrame, GetCVar = GetSpellInfo, CreateFrame, GetCVar +local GetSpellInfo, CreateFrame = GetSpellInfo, CreateFrame --------------------------------------------------- @@ -117,8 +117,8 @@ local function GetTotemColorDefaultOptions() desc = "Enable " .. format("|T%s:20|t %s", indexedList[i].texture, select(1, GetSpellInfo(indexedList[i].id))), type = "toggle", width = "full", - get = function(info) return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled end, - set = function(info, value) + get = function() return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled end, + set = function(_, value) Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].enabled = value Gladdy:UpdateFrame() end @@ -130,15 +130,13 @@ local function GetTotemColorDefaultOptions() order = 3, hasAlpha = true, width = "full", - get = function(info) - local key = info.arg or info[#info] + get = function() return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.a end, - set = function(info, r, g, b, a) - local key = info.arg or info[#info] + set = function(_, r, g, b, a) Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.r, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.g, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].color.b, @@ -154,10 +152,10 @@ local function GetTotemColorDefaultOptions() max = 1, step = 0.1, width = "full", - get = function(info) + get = function() return Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha end, - set = function(info, value) + set = function(_, value) Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id].alpha = value Gladdy:UpdateFrame() end @@ -167,8 +165,8 @@ local function GetTotemColorDefaultOptions() name = L["Custom totem name"], order = 5, width = "full", - get = function(info) return Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText end, - set = function(info, value) Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText = value Gladdy:UpdateFrame() end + get = function() return Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText end, + set = function(_, value) Gladdy.db.npTotemColors["totem" .. indexedList[i].id].customText = value Gladdy:UpdateFrame() end }, } } @@ -176,15 +174,6 @@ local function GetTotemColorDefaultOptions() return defaultDB, options, indexedList end -local function GetTotemOptions() - local indexedList = select(3, GetTotemColorDefaultOptions()) - local colorList = {} - for i=1, #indexedList do - tinsert(colorList, Gladdy.dbi.profile.npTotemColors["totem" .. indexedList[i].id]) - end - return colorList -end - function Gladdy:GetTotemColors() return GetTotemColorDefaultOptions() end @@ -280,7 +269,7 @@ function TotemPlates:UpdateFrameOnce() Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.b, Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].color.a) nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset) - nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE") + nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy:SMFetch("font", "npTremorFont"), Gladdy.db.npTremorFontSize, "OUTLINE") nameplate.gladdyTotemFrame.totemName:SetText(Gladdy.db.npTotemColors["totem" .. totemDataEntry.id].customText or "") self:SetTotemAlpha(nameplate.gladdyTotemFrame, k) @@ -311,7 +300,7 @@ function TotemPlates:UpdateFrameOnce() gladdyTotemFrame:SetWidth(Gladdy.db.npTotemPlatesSize * Gladdy.db.npTotemPlatesWidthFactor) gladdyTotemFrame:SetHeight(Gladdy.db.npTotemPlatesSize) gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle) - gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE") + gladdyTotemFrame.totemName:SetFont(Gladdy:SMFetch("font", "npTremorFont"), Gladdy.db.npTremorFontSize, "OUTLINE") gladdyTotemFrame.totemName:SetPoint("TOP", gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset) end end @@ -338,7 +327,7 @@ function TotemPlates:CreateTotemFrame(nameplate) nameplate.gladdyTotemFrame.totemBorder:SetPoint("BOTTOMRIGHT", nameplate.gladdyTotemFrame, "BOTTOMRIGHT") nameplate.gladdyTotemFrame.totemBorder:SetTexture(Gladdy.db.npTotemPlatesBorderStyle) nameplate.gladdyTotemFrame.totemName = nameplate.gladdyTotemFrame:CreateFontString(nil, "OVERLAY") - nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.npTremorFont), Gladdy.db.npTremorFontSize, "OUTLINE") + nameplate.gladdyTotemFrame.totemName:SetFont(Gladdy:SMFetch("font", "npTremorFont"), Gladdy.db.npTremorFontSize, "OUTLINE") nameplate.gladdyTotemFrame.totemName:SetPoint("TOP", nameplate.gladdyTotemFrame, "BOTTOM", Gladdy.db.npTremorFontXOffset, Gladdy.db.npTremorFontYOffset) nameplate.gladdyTotemFrame.selectionHighlight = nameplate.gladdyTotemFrame:CreateTexture(nil, "OVERLAY") nameplate.gladdyTotemFrame.selectionHighlight:SetTexture("Interface/TargetingFrame/UI-TargetingFrame-BarFill") @@ -394,11 +383,11 @@ function TotemPlates:ToggleAddon(nameplate, show) local addonFrames = { self:GetAddonFrame(nameplate) } if addonFrames and #addonFrames > 0 then if show then - for i,v in ipairs(addonFrames) do + for _,v in ipairs(addonFrames) do v:Show() end else - for i,v in ipairs(addonFrames) do + for _,v in ipairs(addonFrames) do v:Hide() end end @@ -665,19 +654,23 @@ function TotemPlates:GetOptions() step = 0.1, width = "full", order = 23, - get = function(info) - local alphas = GetTotemOptions() - for i=2, #alphas do - if alphas[i].alpha ~= alphas[1].alpha then - return "" + get = function() + local alpha, i = nil, 1 + for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do + if i == 1 then + alpha = v.alpha + i = i + 1 + else + if v.alpha ~= alpha then + return "" + end end end - return alphas[1].alpha + return alpha end, - set = function(info, value) - local alphas = GetTotemOptions() - for i=1, #alphas do - alphas[i].alpha = value + set = function(_, value) + for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do + v.alpha = value end Gladdy:UpdateFrame() end, @@ -705,23 +698,27 @@ function TotemPlates:GetOptions() name = L["All totem border color"], order = 42, hasAlpha = true, - get = function(info) - local colors = GetTotemOptions() - local color = colors[1].color - for i=2, #colors do - if colors[i].r ~= color.r or colors[i].color.r ~= color.r or colors[i].color.r ~= color.r or colors[i].color.r ~= color.r then - return 0, 0, 0, 0 + get = function() + local color + local i = 1 + for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do + if i == 1 then + color = v.color + i = i + 1 + else + if v.color.r ~= color.r or v.color.g ~= color.g or v.color.b ~= color.b or v.color.a ~= color.a then + return 0, 0, 0, 0 + end end end return color.r, color.g, color.b, color.a end, - set = function(info, r, g, b, a) - local colors = GetTotemOptions() - for i=1, #colors do - colors[i].color.r = r - colors[i].color.g = g - colors[i].color.b = b - colors[i].color.a = a + set = function(_, r, g, b, a) + for _,v in pairs(Gladdy.dbi.profile.npTotemColors) do + v.color.r = r + v.color.g = g + v.color.b = b + v.color.a = a end Gladdy:UpdateFrame() end, diff --git a/Modules/Trinket.lua b/Modules/Trinket.lua index 2b4bd2d..3a71c6a 100644 --- a/Modules/Trinket.lua +++ b/Modules/Trinket.lua @@ -1,4 +1,4 @@ -local ceil, floor, string_format, tonumber = ceil, floor, string.format, tonumber +local ceil = ceil local C_PvP = C_PvP local CreateFrame = CreateFrame @@ -40,19 +40,19 @@ local function iconTimer(self, elapsed) if timeLeft >= 60 then self.cooldownFont:SetTextColor(1, 1, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 0.15*self:GetWidth()) * Gladdy.db.trinketFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 0.15*self:GetWidth()) * Gladdy.db.trinketFontScale, "OUTLINE") elseif timeLeft < 60 and timeLeft >= 30 then self.cooldownFont:SetTextColor(1, 1, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") elseif timeLeft < 30 and timeLeft >= 11 then self.cooldownFont:SetTextColor(1, 0.7, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") elseif timeLeft <= 10 and timeLeft >= 5 then self.cooldownFont:SetTextColor(1, 0.7, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") elseif timeLeft < 5 and timeLeft > 0 then self.cooldownFont:SetTextColor(1, 0, 0) - self.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") + self.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), (self:GetWidth()/2 - 1) * Gladdy.db.trinketFontScale, "OUTLINE") end Gladdy:FormatTimer(self.cooldownFont, self.timeLeft, self.timeLeft < 10, true) end @@ -76,7 +76,7 @@ function Trinket:CreateFrame(unit) trinket.cooldownFrame:SetPoint("BOTTOMRIGHT", trinket, "BOTTOMRIGHT") trinket.cooldownFont = trinket.cooldownFrame:CreateFontString(nil, "OVERLAY") - trinket.cooldownFont:SetFont(Gladdy.LSM:Fetch("font", Gladdy.db.trinketFont), 20, "OUTLINE") + trinket.cooldownFont:SetFont(Gladdy:SMFetch("font", "trinketFont"), 20, "OUTLINE") --trinket.cooldownFont:SetAllPoints(trinket.cooldown) trinket.cooldownFont:SetJustifyH("CENTER") trinket.cooldownFont:SetPoint("CENTER") diff --git a/Modules/VersionCheck.lua b/Modules/VersionCheck.lua index 45bd3da..9bbe922 100644 --- a/Modules/VersionCheck.lua +++ b/Modules/VersionCheck.lua @@ -1,11 +1,11 @@ -local str_match, tonumber, tostring = string.match, tonumber, tostring +local tonumber, tostring = tonumber, tostring local UnitName = UnitName local IsInGroup, IsInRaid = IsInGroup, IsInRaid local LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE = LE_PARTY_CATEGORY_HOME, LE_PARTY_CATEGORY_INSTANCE local Gladdy = LibStub("Gladdy") -local L = Gladdy.L + local VersionCheck = Gladdy:NewModule("VersionCheck", 1, { }) LibStub("AceComm-3.0"):Embed(VersionCheck) diff --git a/Modules/XiconProfiles.lua b/Modules/XiconProfiles.lua index 9fb9c1b..ab871d9 100644 --- a/Modules/XiconProfiles.lua +++ b/Modules/XiconProfiles.lua @@ -64,6 +64,16 @@ function XiconProfiles:ApplyRukk() Gladdy:ToggleFrame(3) end +function XiconProfiles:ApplyMir() + local deserialized = Gladdy.modules["Export Import"]:Decode(Gladdy:GetMirProfile()) + if deserialized then + Gladdy.modules["Export Import"]:ApplyImport(deserialized, Gladdy.db) + end + Gladdy:Reset() + Gladdy:HideFrame() + Gladdy:ToggleFrame(3) +end + function XiconProfiles:GetOptions() return { headerProfileBlizzard = { @@ -106,7 +116,7 @@ function XiconProfiles:GetOptions() }, headerProfileClassicNoPet = { type = "header", - name = "Classic " .. L["Profile"] .. " No Pet", + name = "Classic " .. L["Profile"] .. L[" No Pet"], order = 6, }, classicProfileNoPet = { @@ -116,7 +126,7 @@ function XiconProfiles:GetOptions() XiconProfiles:ApplyClassicNoPet() end, name = " ", - desc = "Classic " .. L["Profile"] .. " No Pet", + desc = "Classic " .. L["Profile"] .. L[" No Pet"], image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Classic2.blp", imageWidth = 350, imageHeight = 175, @@ -180,5 +190,24 @@ function XiconProfiles:GetOptions() width = "full", order = 13, }, + headerProfileMir = { + type = "header", + name = "Mir's " .. L["Profile"], + order = 14, + }, + mirProfile = { + type = "execute", + func = function() + Gladdy.dbi:ResetProfile(Gladdy.dbi:GetCurrentProfile()) + XiconProfiles:ApplyMir() + end, + name = " ", + desc = "Mir's " .. L["Profile"], + image = "Interface\\AddOns\\Gladdy\\Images\\BasicProfiles\\Mir1.blp", + imageWidth = 350, + imageHeight = 175, + width = "full", + order = 15, + }, } end \ No newline at end of file diff --git a/Options.lua b/Options.lua index 8fd249c..e0c7f37 100644 --- a/Options.lua +++ b/Options.lua @@ -1,6 +1,7 @@ local type, pairs, tinsert, tsort = type, pairs, table.insert, table.sort local tostring, str_match, tonumber, string_format = tostring, string.match, tonumber, string.format local ceil, floor = ceil, floor +local ReloadUI = ReloadUI local InterfaceOptionsFrame_OpenToFrame = InterfaceOptionsFrame_OpenToFrame local GetSpellInfo = GetSpellInfo @@ -207,18 +208,52 @@ end function Gladdy:SetupOptions() self.options = { type = "group", - name = "Gladdy", + name = L["Gladdy"], plugins = {}, childGroups = "tree", get = getOpt, set = setOpt, args = { + test = { + order = 1, + width = 0.7, + name = L["Test"], + type = "execute", + func = function() + Gladdy:ToggleFrame(3) + end, + }, + hide = { + order = 2, + width = 0.7, + name = L["Hide"], + type = "execute", + func = function() + Gladdy:Reset() + Gladdy:HideFrame() + end, + }, + reload = { + order = 3, + width = 0.7, + name = L["ReloadUI"], + type = "execute", + func = function() + ReloadUI() + end, + }, + version = { + order = 4, + width = 1, + type = "description", + name = " Gladdy v" .. Gladdy.version_num .. "-" .. Gladdy.version_releaseType + }, general = { type = "group", name = L["General"], desc = L["General settings"], childGroups = "tab", - order = 1, + order = 5, args = { locked = { type = "toggle", @@ -270,7 +305,7 @@ function Gladdy:SetupOptions() order = 4, min = .1, max = 2, - step = .1, + step = .01, }, padding = { type = "range", @@ -699,19 +734,19 @@ function Gladdy:SetupOptions() }, } - local order = 2 + local order = 6 for k, v in pairsByKeys(self.modules) do self:SetupModule(k, v, order) order = order + 1 end local options = { - name = "Gladdy", + name = L["Gladdy"], type = "group", args = { load = { - name = "Load configuration", - desc = "Load configuration options", + name = L["Load configuration"], + desc = L["Load configuration options"], type = "execute", func = function() HideUIPanel(InterfaceOptionsFrame) @@ -738,7 +773,7 @@ function Gladdy:GetAuras(auraType) ckeckAll = { order = 1, width = "0.7", - name = "Check All", + name = L["Check All"], type = "execute", func = function(info) if auraType == AURA_TYPE_DEBUFF then @@ -755,7 +790,7 @@ function Gladdy:GetAuras(auraType) uncheckAll = { order = 2, width = "0.7", - name = "Uncheck All", + name = L["Uncheck All"], type = "execute", func = function(info) if auraType == AURA_TYPE_DEBUFF then diff --git a/README.md b/README.md index f4bdfb5..06f3d23 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Gladdy - TBC ### The most powerful arena addon for WoW TBC 2.5.1 -## [v1.19-Beta Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v1.19-Beta/Gladdy_TBC-Classic_v1.19-Beta.zip) +## [v1.20-Release Download Here](https://github.com/XiconQoo/Gladdy-TBC/releases/download/v1.20-Release/Gladdy_TBC-Classic_v1.20-Release.zip) ###### Please consider donating if you like my work @@ -62,6 +62,25 @@ The goal is to make Gladdy highly configurable in it's appearance. Everything ca ### Changes +### v1.20-Release +- configurable DR duration +- scale in 0.01 percent steps +- added Net-o-Matic, Nigh Invulnerablility Shield, Nigh Invulnerablility Backfire & Flee (Skull of Impending Doom) to Auras +- added Mangle, Chastise, Avenging Wrath, Rapid Fire to BuffsDebuffs +- improved testmode to only activate Auras/Buffs/Debuffs/Dr's that are actually enabled +- added Mir's profile to XiconProfiles +- added zhTW localization +- added buttons for Test, Hide & Reload in the config +- added version in config +- ArenaCountdown upgrade +- Repentance, Freezing Trap & Wyvern Sting are now disorients +- import string now ignores errors on deleted options +- added (un)checkAll button in DR-Categories in Diminishing Module +- totemplates fix option to alter all colors/alphas +- hide blizzard arena pets as well +- fix shadowsight timer showing when not in arena or testmode +- some minor refactoring / optimization + ### v1.19-Beta - fix gladdy frames not showing v2 - minor bug fixes