changeset 58:0682d738499b v8.0.1.058

- 8.0.1 Update.
author Tercio
date Fri, 20 Jul 2018 19:04:12 -0300
parents b1c62eed8999
children 8a4c1438dbdf
files Hansgar_And_Franzok_Assist.toc Libs/AceAddon-3.0/AceAddon-3.0.xml Libs/AceComm-3.0/AceComm-3.0.lua Libs/AceComm-3.0/AceComm-3.0.xml Libs/AceComm-3.0/ChatThrottleLib.lua Libs/AceConfig-3.0/AceConfig-3.0.xml Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml Libs/AceConsole-3.0/AceConsole-3.0.xml Libs/AceDB-3.0/AceDB-3.0.xml Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml Libs/AceEvent-3.0/AceEvent-3.0.xml Libs/AceLocale-3.0/AceLocale-3.0.xml Libs/AceTimer-3.0/AceTimer-3.0.lua Libs/AceTimer-3.0/AceTimer-3.0.xml Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml Libs/DF/addon.lua Libs/DF/all_addons.tga Libs/DF/auras.lua Libs/DF/button.lua Libs/DF/button.xml Libs/DF/colors.lua Libs/DF/cooltip.lua Libs/DF/cooltip.xml Libs/DF/dropdown.lua Libs/DF/fw.lua Libs/DF/help.lua Libs/DF/label.lua Libs/DF/load.xml Libs/DF/math.lua Libs/DF/normal_bar.lua Libs/DF/normal_bar.xml Libs/DF/panel.lua Libs/DF/panel.xml Libs/DF/picture.lua Libs/DF/pictureedit.lua Libs/DF/scrollbar.lua Libs/DF/slider.lua Libs/DF/spells.lua Libs/DF/split_bar.lua Libs/DF/split_bar.xml Libs/DF/textentry.lua Libs/DF/textentry.xml Libs/DF/tutorial_alert.xml Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua Libs/LibSharedMedia-3.0/lib.xml
diffstat 51 files changed, 4668 insertions(+), 429 deletions(-) [+]
line wrap: on
line diff
--- a/Hansgar_And_Franzok_Assist.toc	Sun Mar 11 10:50:42 2018 -0300
+++ b/Hansgar_And_Franzok_Assist.toc	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
-## Interface: 70300
+## Interface: 80000
 ## Title: Hansgar And Franzok Assist
 ## Notes: Helps with Smart Stampers on Mythic during this encounter.
 ## SavedVariables: Hansgar_And_Franzok_DB
--- a/Libs/AceAddon-3.0/AceAddon-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceAddon-3.0/AceAddon-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceAddon-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceComm-3.0/AceComm-3.0.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceComm-3.0/AceComm-3.0.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -9,7 +9,7 @@
 -- make into AceComm.
 -- @class file
 -- @name AceComm-3.0
--- @release $Id: AceComm-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceComm-3.0.lua 1174 2018-05-14 17:29:49Z h.leppkes@gmail.com $
 
 --[[ AceComm-3.0
 
@@ -20,7 +20,7 @@
 local CallbackHandler = LibStub("CallbackHandler-1.0")
 local CTL = assert(ChatThrottleLib, "AceComm-3.0 requires ChatThrottleLib")
 
-local MAJOR, MINOR = "AceComm-3.0", 10
+local MAJOR, MINOR = "AceComm-3.0", 12
 local AceComm,oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
 if not AceComm then return end
@@ -65,7 +65,11 @@
 	if #prefix > 16 then -- TODO: 15?
 		error("AceComm:RegisterComm(prefix,method): prefix length is limited to 16 characters")
 	end
-	RegisterAddonMessagePrefix(prefix)
+	if C_ChatInfo then
+		C_ChatInfo.RegisterAddonMessagePrefix(prefix)
+	else
+		RegisterAddonMessagePrefix(prefix)
+	end
 
 	return AceComm._RegisterComm(self, prefix, method)	-- created by CallbackHandler
 end
@@ -85,7 +89,7 @@
 	if not( type(prefix)=="string" and
 			type(text)=="string" and
 			type(distribution)=="string" and
-			(target==nil or type(target)=="string") and
+			(target==nil or type(target)=="string" or type(target)=="number") and
 			(prio=="BULK" or prio=="NORMAL" or prio=="ALERT") 
 		) then
 		error('Usage: SendCommMessage(addon, "prefix", "text", "distribution"[, "target"[, "prio"[, callbackFn, callbackarg]]])', 2)
--- a/Libs/AceComm-3.0/AceComm-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceComm-3.0/AceComm-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -2,4 +2,4 @@
 ..\FrameXML\UI.xsd">
 	<Script file="ChatThrottleLib.lua"/>
 	<Script file="AceComm-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceComm-3.0/ChatThrottleLib.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceComm-3.0/ChatThrottleLib.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -23,7 +23,7 @@
 -- LICENSE: ChatThrottleLib is released into the Public Domain
 --
 
-local CTL_VERSION = 23
+local CTL_VERSION = 24
 
 local _G = _G
 
@@ -213,9 +213,15 @@
 			return ChatThrottleLib.Hook_SendChatMessage(...)
 		end)
 		--SendAddonMessage
-		hooksecurefunc("SendAddonMessage", function(...)
-			return ChatThrottleLib.Hook_SendAddonMessage(...)
-		end)
+		if _G.C_ChatInfo then
+			hooksecurefunc(_G.C_ChatInfo, "SendAddonMessage", function(...)
+				return ChatThrottleLib.Hook_SendAddonMessage(...)
+			end)
+		else
+			hooksecurefunc("SendAddonMessage", function(...)
+				return ChatThrottleLib.Hook_SendAddonMessage(...)
+			end)
+		end
 	end
 	self.nBypass = 0
 end
@@ -461,7 +467,7 @@
 
 	local nSize = text:len();
 
-	if RegisterAddonMessagePrefix then
+	if C_ChatInfo or RegisterAddonMessagePrefix then
 		if nSize>255 then
 			error("ChatThrottleLib:SendAddonMessage(): message length cannot exceed 255 bytes", 2)
 		end
@@ -478,7 +484,11 @@
 	if not self.bQueueing and nSize < self:UpdateAvail() then
 		self.avail = self.avail - nSize
 		bMyTraffic = true
-		_G.SendAddonMessage(prefix, text, chattype, target)
+		if _G.C_ChatInfo then
+			_G.C_ChatInfo.SendAddonMessage(prefix, text, chattype, target)
+		else
+			_G.SendAddonMessage(prefix, text, chattype, target)
+		end
 		bMyTraffic = false
 		self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize
 		if callbackFn then
@@ -490,7 +500,7 @@
 
 	-- Message needs to be queued
 	local msg = NewMsg()
-	msg.f = _G.SendAddonMessage
+	msg.f = _G.C_ChatInfo and _G.C_ChatInfo.SendAddonMessage or _G.SendAddonMessage
 	msg[1] = prefix
 	msg[2] = text
 	msg[3] = chattype
--- a/Libs/AceConfig-3.0/AceConfig-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceConfig-3.0/AceConfig-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -5,4 +5,4 @@
 	<Include file="AceConfigDialog-3.0\AceConfigDialog-3.0.xml"/>
 	<!--<Include file="AceConfigDropdown-3.0\AceConfigDropdown-3.0.xml"/>-->
 	<Script file="AceConfig-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceConfigCmd-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -1,13 +1,13 @@
 --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
 -- @class file
 -- @name AceConfigDialog-3.0
--- @release $Id: AceConfigDialog-3.0.lua 1167 2017-08-29 22:08:48Z funkydude $
+-- @release $Id: AceConfigDialog-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $
 
 local LibStub = LibStub
 local gui = LibStub("AceGUI-3.0")
 local reg = LibStub("AceConfigRegistry-3.0")
 
-local MAJOR, MINOR = "AceConfigDialog-3.0", 64
+local MAJOR, MINOR = "AceConfigDialog-3.0", 66
 local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
 if not AceConfigDialog then return end
@@ -1034,6 +1034,7 @@
 				entry.value = k
 				entry.text = GetOptionsMemberValue("name", v, options, path, appName)
 				entry.icon = GetOptionsMemberValue("icon", v, options, path, appName)
+				entry.iconCoords = GetOptionsMemberValue("iconCoords", v, options, path, appName)
 				entry.disabled = CheckOptionDisabled(v, options, path, appName)
 				tinsert(tree,entry)
 				if recurse and (v.childGroups or "tree") == "tree" then
@@ -1226,6 +1227,8 @@
 								radio:SetWidth(width_multiplier * 2)
 							elseif width == "half" then
 								radio:SetWidth(width_multiplier / 2)
+							elseif (type(width) == "number") then
+								radio:SetWidth(width_multiplier * width)
 							elseif width == "full" then
 								radio.width = "fill"
 							else
@@ -1288,6 +1291,8 @@
 							control:SetWidth(width_multiplier * 2)
 						elseif width == "half" then
 							control:SetWidth(width_multiplier / 2)
+						elseif (type(width) == "number") then
+							control:SetWidth(width_multiplier * width)
 						elseif width == "full" then
 							control.width = "fill"
 						else
@@ -1324,6 +1329,8 @@
 								check:SetWidth(width_multiplier * 2)
 							elseif width == "half" then
 								check:SetWidth(width_multiplier / 2)
+							elseif (type(width) == "number") then
+								control:SetWidth(width_multiplier * width)
 							elseif width == "full" then
 								check.width = "fill"
 							else
@@ -1405,6 +1412,8 @@
 							control:SetWidth(width_multiplier * 2)
 						elseif width == "half" then
 							control:SetWidth(width_multiplier / 2)
+						elseif (type(width) == "number") then
+							control:SetWidth(width_multiplier * width)
 						elseif width == "full" then
 							control.width = "fill"
 						else
--- a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceConfigDialog-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -8,10 +8,10 @@
 -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
 -- @class file
 -- @name AceConfigRegistry-3.0
--- @release $Id: AceConfigRegistry-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceConfigRegistry-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $
 local CallbackHandler = LibStub("CallbackHandler-1.0")
 
-local MAJOR, MINOR = "AceConfigRegistry-3.0", 17
+local MAJOR, MINOR = "AceConfigRegistry-3.0", 18
 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
 
 if not AceConfigRegistry then return end
@@ -67,6 +67,7 @@
 local opttable={["nil"]=true,["table"]=true,  _="table"}
 local optbool={["nil"]=true,["boolean"]=true,  _="boolean"}
 local optboolnumber={["nil"]=true,["boolean"]=true,["number"]=true,  _="boolean or number"}
+local optstringnumber={["nil"]=true,["string"]=true,["number"]=true, _="string or number"}
 
 local basekeys={
 	type=isstring,
@@ -90,7 +91,7 @@
 	set=optmethodfalse,
 	func=optmethodfalse,
 	arg={["*"]=true},
-	width=optstring,
+	width=optstringnumber,
 }
 
 local typedkeys={
--- a/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceConfigRegistry-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceConsole-3.0/AceConsole-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceConsole-3.0/AceConsole-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceConsole-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceDB-3.0/AceDB-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceDB-3.0/AceDB-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceDB-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceDBOptions-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceEvent-3.0/AceEvent-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceEvent-3.0/AceEvent-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceEvent-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceLocale-3.0/AceLocale-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceLocale-3.0/AceLocale-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceLocale-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/AceTimer-3.0/AceTimer-3.0.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceTimer-3.0/AceTimer-3.0.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -15,7 +15,7 @@
 -- make into AceTimer.
 -- @class file
 -- @name AceTimer-3.0
--- @release $Id: AceTimer-3.0.lua 1119 2014-10-14 17:23:29Z nevcairiel $
+-- @release $Id: AceTimer-3.0.lua 1170 2018-03-29 17:38:58Z funkydude $
 
 local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes
 local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -34,13 +34,15 @@
 		delay = 0.01 -- Restrict to the lowest time that the C_Timer API allows us
 	end
 
-	local timer = {...}
-	timer.object = self
-	timer.func = func
-	timer.looping = loop
-	timer.argsCount = select("#", ...)
-	timer.delay = delay
-	timer.ends = GetTime() + delay
+	local timer = {
+		object = self,
+		func = func,
+		looping = loop,
+		argsCount = select("#", ...),
+		delay = delay,
+		ends = GetTime() + delay,
+		...
+	}
 
 	activeTimers[timer] = timer
 
@@ -156,7 +158,7 @@
 
 --- Cancels all timers registered to the current addon object ('self')
 function AceTimer:CancelAllTimers()
-	for k,v in pairs(activeTimers) do
+	for k,v in next, activeTimers do
 		if v.object == self then
 			AceTimer.CancelTimer(self, k)
 		end
@@ -187,8 +189,8 @@
 	AceTimer.frame:SetScript("OnEvent", nil)
 	AceTimer.frame:UnregisterAllEvents()
 	-- convert timers
-	for object,timers in pairs(AceTimer.selfs) do
-		for handle,timer in pairs(timers) do
+	for object,timers in next, AceTimer.selfs do
+		for handle,timer in next, timers do
 			if type(timer) == "table" and timer.callback then
 				local newTimer
 				if timer.delay then
@@ -214,7 +216,7 @@
 	-- Clear old timer table and update upvalue
 	AceTimer.activeTimers = {}
 	activeTimers = AceTimer.activeTimers
-	for handle, timer in pairs(oldTimers) do
+	for handle, timer in next, oldTimers do
 		local newTimer
 		-- Stop the old timer animation
 		local duration, elapsed = timer:GetDuration(), timer:GetElapsed()
@@ -232,7 +234,7 @@
 
 	-- Migrate transitional handles
 	if oldminor < 13 and AceTimer.hashCompatTable then
-		for handle, id in pairs(AceTimer.hashCompatTable) do
+		for handle, id in next, AceTimer.hashCompatTable do
 			local t = activeTimers[id]
 			if t then
 				activeTimers[id] = nil
@@ -257,7 +259,7 @@
 
 function AceTimer:Embed(target)
 	AceTimer.embeds[target] = true
-	for _,v in pairs(mixins) do
+	for _,v in next, mixins do
 		target[v] = AceTimer[v]
 	end
 	return target
@@ -271,6 +273,6 @@
 	target:CancelAllTimers()
 end
 
-for addon in pairs(AceTimer.embeds) do
+for addon in next, AceTimer.embeds do
 	AceTimer:Embed(addon)
 end
--- a/Libs/AceTimer-3.0/AceTimer-3.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/AceTimer-3.0/AceTimer-3.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="AceTimer-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="CallbackHandler-1.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/DF/addon.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/addon.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -59,4 +59,4 @@
 	
 	return addon
 	
-end
\ No newline at end of file
+end
Binary file Libs/DF/all_addons.tga has changed
--- a/Libs/DF/auras.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/auras.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -10,6 +10,98 @@
 local lower = string.lower
 local GetSpellBookItemInfo = GetSpellBookItemInfo
 
+local CONST_MAX_SPELLS = 300000
+
+function DF:GetAuraByName (unit, spellName, isDebuff)
+	isDebuff = isDebuff and "HARMFUL|PLAYER"
+
+	for i = 1, 40 do
+		local name, texture, count, debuffType, duration, expirationTime, caster, canStealOrPurge, nameplateShowPersonal, spellId, canApplyAura, isBossDebuff, isCastByPlayer, nameplateShowAll = UnitAura (unit, i, isDebuff)
+		if (not name) then
+			return
+		end
+		
+		if (name == spellName) then
+			return name, texture, count, debuffType, duration, expirationTime, caster, canStealOrPurge, nameplateShowPersonal, spellId, canApplyAura, isBossDebuff, isCastByPlayer, nameplateShowAll
+		end
+	end
+end
+
+local default_text_for_aura_frame = {
+	AUTOMATIC = "Automatic", 
+	MANUAL = "Manual", 
+	METHOD = "Aura Tracking Method:", 
+	BUFFS_IGNORED = "Buffs Ignored",
+	DEBUFFS_IGNORED = "Debuffs Ignored",
+	BUFFS_TRACKED = "Buffs Tracked",
+	DEBUFFS_TRACKED = "Debuffs Tracked",
+	
+	AUTOMATIC_DESC = "Auras are being tracked automatically, the addon controls what to show.\nYou may add auras to the blacklist or add extra auras to track.",
+	MANUAL_DESC = "Auras are being tracked manually, the addon only check for auras you entered below.",
+	
+	MANUAL_ADD_BLACKLIST_BUFF = "Add Buff to Blacklist",
+	MANUAL_ADD_BLACKLIST_DEBUFF =  "Add Debuff to Blacklist",
+	MANUAL_ADD_TRACKLIST_BUFF = "Add Buff to Tracklist",
+	MANUAL_ADD_TRACKLIST_DEBUFF = "Add Debuff to Tracklist",
+}
+
+function DF:LoadAllSpells (hashMap, indexTable)
+
+	--pre checking which tables to fill to avoid checking if the table exists during the gigantic loop for performance
+	
+	if (not DF.LoadingAuraAlertFrame) then
+		DF.LoadingAuraAlertFrame = CreateFrame ("frame", "DetailsFrameworkLoadingAurasAlert", UIParent)
+		DF.LoadingAuraAlertFrame:SetSize (340, 75)
+		DF.LoadingAuraAlertFrame:SetPoint ("center")
+		DF.LoadingAuraAlertFrame:SetFrameStrata ("TOOLTIP")
+		DF:ApplyStandardBackdrop (DF.LoadingAuraAlertFrame)
+		DF.LoadingAuraAlertFrame:SetBackdropBorderColor (1, 0.8, 0.1)
+		
+		DF.LoadingAuraAlertFrame.IsLoadingLabel1 = DF:CreateLabel (DF.LoadingAuraAlertFrame, "We are currently loading spell names and spell IDs")
+		DF.LoadingAuraAlertFrame.IsLoadingLabel2 = DF:CreateLabel (DF.LoadingAuraAlertFrame, "This may take only a few seconds")
+		DF.LoadingAuraAlertFrame.IsLoadingImage1 = DF:CreateImage (DF.LoadingAuraAlertFrame, [[Interface\DialogFrame\UI-Dialog-Icon-AlertOther]], 32, 32)
+		DF.LoadingAuraAlertFrame.IsLoadingLabel1.align = "center"
+		DF.LoadingAuraAlertFrame.IsLoadingLabel2.align = "center"
+		
+		DF.LoadingAuraAlertFrame.IsLoadingLabel1:SetPoint ("center", 16, 10)
+		DF.LoadingAuraAlertFrame.IsLoadingLabel2:SetPoint ("center", 16, -5)
+		DF.LoadingAuraAlertFrame.IsLoadingImage1:SetPoint ("left", 10, 0)
+	end
+
+	DF.LoadingAuraAlertFrame:Show()
+	
+	C_Timer.After (0.1, function()
+		if (hashMap and not indexTable) then
+			for i = 1, CONST_MAX_SPELLS do
+				local spellName = GetSpellInfo (i)
+				if (spellName) then
+					hashMap [lower (spellName)] = i
+				end
+			end
+		
+		elseif (not hashMap and indexTable) then
+			for i = 1, CONST_MAX_SPELLS do
+				local spellName = GetSpellInfo (i)
+				if (spellName) then
+					indexTable [#indexTable+1] = lower (spellName)
+				end
+			end
+			
+		elseif (hashMap and indexTable) then
+			for i = 1, CONST_MAX_SPELLS do
+				local spellName = GetSpellInfo (i)
+				if (spellName) then
+					indexTable [#indexTable+1] = lower (spellName)
+					hashMap [indexTable [#indexTable]] = i
+				end
+			end
+		end
+		
+		DF.LoadingAuraAlertFrame:Hide()
+	end)
+
+end
+
 local cleanfunction = function() end
 
 do
@@ -32,10 +124,13 @@
 	--automatic
 	self.buff_ignored:SetData (newdb.aura_tracker.buff_banned)
 	self.debuff_ignored:SetData (newdb.aura_tracker.debuff_banned)
-	self.buff_available:Refresh()
+	self.buff_tracked:SetData (newdb.aura_tracker.buff_tracked)
+	self.debuff_tracked:SetData (newdb.aura_tracker.debuff_tracked)
+	
 	self.buff_ignored:Refresh()
-	self.debuff_available:Refresh()
 	self.debuff_ignored:Refresh()
+	self.buff_tracked:Refresh()
+	self.debuff_tracked:Refresh()
 	
 	--manual
 	self.buffs_added:SetData (newdb.aura_tracker.buff)
@@ -47,18 +142,29 @@
 	if (newdb.aura_tracker.track_method == 0x1) then
 		self.f_auto:Show()
 		self.f_manual:Hide()
+		
+		self.AutomaticTrackingCheckbox:SetValue (true)
+		self.ManualTrackingCheckbox:SetValue (false)
+		self.desc_label.text = texts.AUTOMATIC_DESC
+		
 	elseif (newdb.aura_tracker.track_method == 0x2) then
 		self.f_auto:Hide()
 		self.f_manual:Show()
+		
+		self.AutomaticTrackingCheckbox:SetValue (false)
+		self.ManualTrackingCheckbox:SetValue (true)
+		self.desc_label.text = texts.MANUAL_DESC
 	end
 end
 
 local aura_panel_defaultoptions = {
 	height = 400, 
-	row_height = 16,
+	row_height = 18,
 	width = 230,
+	button_text_template = "OPTIONS_FONT_TEMPLATE"
 }
-function DF:CreateAuraConfigPanel (parent, name, db, method_change_callback, options)
+
+function DF:CreateAuraConfigPanel (parent, name, db, change_callback, options, texts)
 
 	local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")
 	local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
@@ -81,155 +187,412 @@
 	f.f_auto = f_auto
 	f.f_manual = f_manual
 	
-	local on_select_tracking_option = function (_, _, method)
+	--check if the texts table is valid and also deploy default values into the table in case some value is nil
+	texts = (type (texts == "table") and texts) or default_text_for_aura_frame
+	DF.table.deploy (texts, default_text_for_aura_frame)
+	
+	-------------
+	
+	local on_switch_tracking_method = function (self)
+		local method = self.Method
+	
 		f.db.aura_tracker.track_method = method
-		if (method_change_callback) then
-			method_change_callback (self, method)
+		if (change_callback) then
+			DF:QuickDispatch (change_callback)
 		end
 
 		if (method == 0x1) then
 			f_auto:Show()
 			f_manual:Hide()
-			f.desc_label.text = "Auras are being tracked automatically, the addon controls what to show. You may entry an aura to ignore.\nCast spells to fill the Buff and Buff available boxes."
-			f.desc_label:SetPoint ("topleft", f.tracking_method, "topright", 10, 8)
+			f.AutomaticTrackingCheckbox:SetValue (true)
+			f.ManualTrackingCheckbox:SetValue (false)
+			f.desc_label.text = texts.AUTOMATIC_DESC
+			
 		elseif (method == 0x2) then
 			f_auto:Hide()
 			f_manual:Show()
-			f.desc_label.text = "Auras are being tracked manually, the addon only check for auras you entered below."
-			f.desc_label:SetPoint ("topleft", f.tracking_method, "topright", 10, 1)
+			f.AutomaticTrackingCheckbox:SetValue (false)
+			f.ManualTrackingCheckbox:SetValue (true)
+			f.desc_label.text = texts.MANUAL_DESC
 		end
 	end
 	
-	local tracking_options = function()
-		return {
-			{label = "Automatic", value = 0x1, onclick = on_select_tracking_option, desc = "Show all your auras by default, you can exclude those you don't want to show."},
-			{label = "Manual", value = 0x2, onclick = on_select_tracking_option, desc = "Do not show any aura by default, you need to manually add each aura you want to track."},
-		}
+	local background_method_selection = CreateFrame ("frame", nil, f)
+	background_method_selection:SetHeight (82)
+	background_method_selection:SetPoint ("topleft", f, "topleft", 0, 0)
+	background_method_selection:SetPoint ("topright", f, "topright", 0, 0)
+	DF:ApplyStandardBackdrop (background_method_selection)
+	
+	local tracking_method_label = self:CreateLabel (background_method_selection, texts.METHOD, 12, "orange")
+	tracking_method_label:SetPoint ("topleft", background_method_selection, "topleft", 6, -4)
+
+	f.desc_label = self:CreateLabel (background_method_selection, "", 10, "silver")
+	f.desc_label:SetPoint ("left", background_method_selection, "left", 130, 0)
+	f.desc_label:SetJustifyV ("top")
+	
+	local automatic_tracking_checkbox = DF:CreateSwitch (background_method_selection, on_switch_tracking_method, f.db.aura_tracker.track_method == 0x1, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_BRIGHT_TEMPLATE"))
+	automatic_tracking_checkbox.Method = 0x1
+	automatic_tracking_checkbox:SetAsCheckBox()
+	automatic_tracking_checkbox:SetSize (24, 24)
+	f.AutomaticTrackingCheckbox = automatic_tracking_checkbox
+	
+	local automatic_tracking_label = DF:CreateLabel (background_method_selection, "Automatic")
+	automatic_tracking_label:SetPoint ("left", automatic_tracking_checkbox, "right", 2, 0)
+	
+	local manual_tracking_checkbox = DF:CreateSwitch (background_method_selection, on_switch_tracking_method, f.db.aura_tracker.track_method == 0x2, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_BRIGHT_TEMPLATE"))
+	manual_tracking_checkbox.Method = 0x2
+	manual_tracking_checkbox:SetAsCheckBox()
+	manual_tracking_checkbox:SetSize (24, 24)
+	f.ManualTrackingCheckbox = manual_tracking_checkbox
+	
+	local manual_tracking_label = DF:CreateLabel (background_method_selection, "Manual")
+	manual_tracking_label:SetPoint ("left", manual_tracking_checkbox, "right", 2, 0)
+	
+	automatic_tracking_checkbox:SetPoint ("topleft", tracking_method_label, "bottomleft", 0, -6)
+	manual_tracking_checkbox:SetPoint ("topleft", automatic_tracking_checkbox, "bottomleft", 0, -6)
+	
+
+-------- anchors points
+
+	local y = -110
+	local xLocation = 230
+	
+	
+-------- automatic
+
+	--manual add the buff and ebuff names
+	local AllSpellsMap = {}
+	local AllSpellNames = {}
+	
+	local load_all_spells = function (self, capsule)
+		if (not next (AllSpellsMap)) then
+			DF:LoadAllSpells (AllSpellsMap, AllSpellNames)
+			
+			f_auto.AddBuffBlacklistTextBox.SpellAutoCompleteList = AllSpellNames
+			f_auto.AddDebuffBlacklistTextBox.SpellAutoCompleteList = AllSpellNames
+			f_auto.AddBuffTracklistTextBox.SpellAutoCompleteList = AllSpellNames
+			f_auto.AddDebuffTracklistTextBox.SpellAutoCompleteList = AllSpellNames
+			
+			f_manual.NewBuffTextBox.SpellAutoCompleteList = AllSpellNames
+			f_manual.NewDebuffTextBox.SpellAutoCompleteList = AllSpellNames
+			
+			--
+			
+			f_auto.AddBuffBlacklistTextBox:SetAsAutoComplete ("SpellAutoCompleteList")
+			f_auto.AddDebuffBlacklistTextBox:SetAsAutoComplete ("SpellAutoCompleteList")
+			f_auto.AddBuffTracklistTextBox:SetAsAutoComplete ("SpellAutoCompleteList")
+			f_auto.AddDebuffTracklistTextBox:SetAsAutoComplete ("SpellAutoCompleteList")
+			
+			f_manual.NewBuffTextBox:SetAsAutoComplete ("SpellAutoCompleteList")
+			f_manual.NewDebuffTextBox:SetAsAutoComplete ("SpellAutoCompleteList")
+			
+			--
+			
+			f_auto.AddBuffBlacklistTextBox.ShouldOptimizeAutoComplete = true
+			f_auto.AddDebuffBlacklistTextBox.ShouldOptimizeAutoComplete = true
+			f_auto.AddBuffTracklistTextBox.ShouldOptimizeAutoComplete = true
+			f_auto.AddDebuffTracklistTextBox.ShouldOptimizeAutoComplete = true
+			
+			f_manual.NewBuffTextBox.ShouldOptimizeAutoComplete = true
+			f_manual.NewDebuffTextBox.ShouldOptimizeAutoComplete = true
+		end
 	end
+
+	local background_add_blacklist = CreateFrame ("frame", nil, f_auto)
+	background_add_blacklist:SetSize (220, 135)
+	DF:ApplyStandardBackdrop (background_add_blacklist)
 	
-	local tracking_method_label = self:CreateLabel (f, "Tracking Aura Method:", 12, "orange")
-	local tracking_method = self:CreateDropDown (f, tracking_options, f.db.aura_tracker.track_method, 120, 20, "dropdown_tracking_method", _, self:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
+	local background_add_tracklist = CreateFrame ("frame", nil, f_auto)
+	background_add_tracklist:SetSize (220, 135)
+	DF:ApplyStandardBackdrop (background_add_tracklist)
 	
-	tracking_method_label:SetPoint ("topleft", f, "topleft", 10, -10)
-	tracking_method:SetPoint ("left", tracking_method_label, "right", 2, 0)
-	tracking_method:SetFrameStrata ("tooltip")
-	tracking_method.tooltip = "Choose which aura tracking method you want to use."
-	f.tracking_method = tracking_method
+	--black list
+		local buff_blacklist_label = self:CreateLabel (background_add_blacklist, texts.MANUAL_ADD_BLACKLIST_BUFF, DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+		local debuff_blacklist_label = self:CreateLabel (background_add_blacklist, texts.MANUAL_ADD_BLACKLIST_DEBUFF, DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+
+		local buff_name_blacklist_entry = self:CreateTextEntry (background_add_blacklist, function()end, 200, 20, "AddBuffBlacklistTextBox", _, _, options_dropdown_template)
+		buff_name_blacklist_entry:SetHook ("OnEditFocusGained", load_all_spells)
+		buff_name_blacklist_entry:SetJustifyH ("left")
+		buff_name_blacklist_entry.tooltip = "Enter the buff name using lower case letters."
+		f_auto.AddBuffBlacklistTextBox = buff_name_blacklist_entry
+		
+		local debuff_name_blacklist_entry = self:CreateTextEntry (background_add_blacklist, function()end, 200, 20, "AddDebuffBlacklistTextBox", _, _, options_dropdown_template)
+		debuff_name_blacklist_entry:SetHook ("OnEditFocusGained", load_all_spells)
+		debuff_name_blacklist_entry:SetJustifyH ("left")
+		debuff_name_blacklist_entry.tooltip = "Enter the debuff name using lower case letters."
+		f_auto.AddDebuffBlacklistTextBox = debuff_name_blacklist_entry
 	
-	f.desc_label = self:CreateLabel (f, "", 10, "silver")
-	f.desc_label:SetSize (400, 40)
-	f.desc_label:SetPoint ("topleft", tracking_method, "topright", 10, 8)
-	f.desc_label:SetJustifyV ("top")
+		local add_blacklist_buff_button = self:CreateButton (background_add_blacklist, function()
+			local text = buff_name_blacklist_entry.text
+			buff_name_blacklist_entry:SetText ("")
+			buff_name_blacklist_entry:ClearFocus()
+			
+			if (text ~= "") then
+				text = lower (text)
+			
+				--get the spellId
+				local spellId = AllSpellsMap [text]
+				if (not spellId) then
+					print ("spell not found")
+					return
+				end
+				
+				--add the spellId to the blacklist
+				f.db.aura_tracker.buff_banned [spellId] = true 
+				
+				--refresh the buff blacklist frame
+				_G [f_auto:GetName() .. "BuffIgnored"]:Refresh()
+				
+				DF:QuickDispatch (change_callback)
+			end
+			
+		end, 100, 20, "Add to Blacklist", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", options.button_text_template))
+		
+		local add_blacklist_debuff_button = self:CreateButton (background_add_blacklist, function()
+			local text = debuff_name_blacklist_entry.text
+			debuff_name_blacklist_entry:SetText ("")
+			debuff_name_blacklist_entry:ClearFocus()
+			
+			if (text ~= "") then
+				text = lower (text)
+			
+				--get the spellId
+				local spellId = AllSpellsMap [text]
+				if (not spellId) then
+					print ("spell not found")
+					return
+				end
+				
+				--add the spellId to the blacklist
+				f.db.aura_tracker.debuff_banned [spellId] = true
+				
+				--refresh the buff blacklist frame
+				_G [f_auto:GetName() .. "DebuffIgnored"]:Refresh()
+				
+				DF:QuickDispatch (change_callback)
+			end
+		end, 100, 20, "Add to Blacklist", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", options.button_text_template))	
+	
+	
+	--track list
+		local buff_tracklist_label = self:CreateLabel (background_add_tracklist, texts.MANUAL_ADD_TRACKLIST_BUFF, DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+		local debuff_tracklist_label = self:CreateLabel (background_add_tracklist, texts.MANUAL_ADD_TRACKLIST_DEBUFF, DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+		
+		local buff_name_tracklist_entry = self:CreateTextEntry (background_add_tracklist, function()end, 200, 20, "AddBuffTracklistTextBox", _, _, options_dropdown_template)
+		buff_name_tracklist_entry:SetHook ("OnEditFocusGained", load_all_spells)
+		buff_name_tracklist_entry:SetJustifyH ("left")
+		buff_name_tracklist_entry.tooltip = "Enter the buff name using lower case letters."
+		f_auto.AddBuffTracklistTextBox = buff_name_tracklist_entry
+		
+		local debuff_name_tracklist_entry = self:CreateTextEntry (background_add_tracklist, function()end, 200, 20, "AddDebuffTracklistTextBox", _, _, options_dropdown_template)
+		debuff_name_tracklist_entry:SetHook ("OnEditFocusGained", load_all_spells)
+		debuff_name_tracklist_entry:SetJustifyH ("left")
+		debuff_name_tracklist_entry.tooltip = "Enter the debuff name using lower case letters."
+		f_auto.AddDebuffTracklistTextBox = debuff_name_tracklist_entry
+		
+		local add_tracklist_buff_button = self:CreateButton (background_add_tracklist, function()
+			local text = buff_name_tracklist_entry.text
+			buff_name_tracklist_entry:SetText ("")
+			buff_name_tracklist_entry:ClearFocus()
+			
+			if (text ~= "") then
+				text = lower (text)
+			
+				--get the spellId
+				local spellId = AllSpellsMap [text]
+				if (not spellId) then
+					print ("spell not found")
+					return
+				end
+				
+				--add the spellId to the blacklist
+				f.db.aura_tracker.buff_tracked [spellId] = true 
+				
+				--refresh the buff blacklist frame
+				_G [f_auto:GetName() .. "BuffTracked"]:Refresh()
+				
+				DF:QuickDispatch (change_callback)
+			end
+			
+		end, 100, 20, "Add to Tracklist", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", options.button_text_template))
+		
+		local add_tracklist_debuff_button = self:CreateButton (background_add_tracklist, function()
+			local text = debuff_name_tracklist_entry.text
+			debuff_name_tracklist_entry:SetText ("")
+			debuff_name_tracklist_entry:ClearFocus()
+			
+			if (text ~= "") then
+				text = lower (text)
+			
+				--get the spellId
+				local spellId = AllSpellsMap [text]
+				if (not spellId) then
+					print ("spell not found")
+					return
+				end
+				
+				--add the spellId to the blacklist
+				f.db.aura_tracker.debuff_tracked [spellId] = true
+				
+				--refresh the buff blacklist frame
+				_G [f_auto:GetName() .. "DebuffTracked"]:Refresh()
+				
+				DF:QuickDispatch (change_callback)
+			end
+		end, 100, 20, "Add to Tracklist", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", options.button_text_template))
+	
+	--anchors:
+		background_add_blacklist:SetPoint ("topleft", f_auto, "topleft", 0, y)
+		background_add_tracklist:SetPoint ("topleft", background_add_blacklist, "bottomleft", 0, -10)
+	
+		--debuff blacklist
+		debuff_name_blacklist_entry:SetPoint ("topleft", background_add_blacklist, "topleft", 4, -20)
+		debuff_blacklist_label:SetPoint ("bottomleft", debuff_name_blacklist_entry, "topleft", 0, 2)
+		add_blacklist_debuff_button:SetPoint ("topleft", debuff_name_blacklist_entry, "bottomleft", 0, -2)
+	
+		--buff blacklist
+		buff_blacklist_label:SetPoint ("topleft", add_blacklist_debuff_button.widget, "bottomleft", 0, -10)
+		buff_name_blacklist_entry:SetPoint ("topleft", buff_blacklist_label, "bottomleft", 0, -2)
+		add_blacklist_buff_button:SetPoint ("topleft", buff_name_blacklist_entry, "bottomleft", 0, -2)
 
---------automatic
+		
+		--debuff tracklist
+		debuff_name_tracklist_entry:SetPoint ("topleft", background_add_tracklist, "topleft", 4, -20)
+		debuff_tracklist_label:SetPoint ("bottomleft", debuff_name_tracklist_entry, "topleft", 0, 2)
+		add_tracklist_debuff_button:SetPoint ("topleft", debuff_name_tracklist_entry, "bottomleft", 0, -2)
+		
+		--buff tracklist
+		buff_tracklist_label:SetPoint ("topleft", add_tracklist_debuff_button.widget, "bottomleft", 0, -10)
+		buff_name_tracklist_entry:SetPoint ("topleft", buff_tracklist_label, "bottomleft", 0, -2)
+		add_tracklist_buff_button:SetPoint ("topleft", buff_name_tracklist_entry, "bottomleft", 0, -2)
 
 	local ALL_BUFFS = {}
 	local ALL_DEBUFFS = {}
 	
+	--options passed to the create aura panel
 	local width, height, row_height = options.width, options.height, options.row_height
+
 	
-	local buff_ignored = self:CreateSimpleListBox (f_auto, "$parentBuffIgnored", "Buffs Ignored", "The list is empty, select a spell from the buff list to ignore it.", f.db.aura_tracker.buff_banned, 
-	function (spellid)
-		f.db.aura_tracker.buff_banned [spellid] = nil;
-	end, 
-	{
-		icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, 
-		text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
-		height = height, 
-		row_height = row_height,
-		width = width, 
-		onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to un-ignore this aura", .2, 1, .2); GameTooltip:Show() end, 
-	})
+	--Debuffs on the black list
+		local debuff_ignored = self:CreateSimpleListBox (f_auto, "$parentDebuffIgnored", texts.DEBUFFS_IGNORED, "the list is empty", f.db.aura_tracker.debuff_banned, function (spellid)
+			--f.db.aura_tracker.debuff_banned [spellid] = nil; DF:QuickDispatch (change_callback);
+		end, 
+		{
+			icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, 
+			text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
+			height = height, 
+			row_height = row_height,
+			width = width, 
+			backdrop_color = {.8, .8, .8, 0.2},
+			panel_border_color = {.01, 0, 0, 1},
+			iconcoords = {.1, .9, .1, .9},
+			onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:Show() end, 
+			show_x_button = true,
+			x_button_func = 	function (spellId)
+				f.db.aura_tracker.debuff_banned [spellId] = nil; DF:QuickDispatch (change_callback);
+			end,
+		})	
 
-	local buff_available = self:CreateSimpleListBox (f_auto, "$parentBuffAvailable", "Buffs Available", "The list is empty, cast spells to fill it", ALL_BUFFS, function (spellid)
-		f.db.aura_tracker.buff_banned [spellid] = true; buff_ignored:Refresh()
-	end, 
-	{
-		icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, 
-		text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
-		height = height, 
-		row_height = row_height,
-		width = width, 
-		onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to ignore this aura", .2, 1, .2); GameTooltip:Show() end, 
-	})
-	
-	local debuff_ignored = self:CreateSimpleListBox (f_auto, "$parentDebuffIgnored", "Debuffs Ignored", "The list is empty, select a spell from the debuff list to ignore it.", f.db.aura_tracker.debuff_banned, function (spellid)
-		f.db.aura_tracker.debuff_banned [spellid] = nil;
-	end, 
-	{
-		icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, 
-		text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
-		height = height, 
-		row_height = row_height,
-		width = width, 
-		onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to un-ignore this aura", .2, 1, .2); GameTooltip:Show() end, 
-	})
-	
-	local debuff_available = self:CreateSimpleListBox (f_auto, "$parentDebuffAvailable", "Debuffs Available", "The list is empty, cast spells to fill it", ALL_DEBUFFS, function (spellid)
-		f.db.aura_tracker.debuff_banned [spellid] = true; debuff_ignored:Refresh()
-	end, {
-		icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, 
-		text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
-		height = height, 
-		row_height = row_height,
-		width = width, 
-		onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to ignore this aura", .2, 1, .2); GameTooltip:Show() end, 
-	})
-	
-	--como ira preencher ela no inicio e como ficara o lance dos profiles
+	--Buffs on the black list
+		local buff_ignored = self:CreateSimpleListBox (f_auto, "$parentBuffIgnored", texts.BUFFS_IGNORED, "the list is empty", f.db.aura_tracker.buff_banned, 
+		function (spellid)
+			--f.db.aura_tracker.buff_banned [spellid] = nil; DF:QuickDispatch (change_callback);
+		end, 
+		{
+			icon = function(spellid) return select (3, GetSpellInfo (spellid)) end,
+			text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
+			height = height,
+			row_height = row_height,
+			width = width,
+			backdrop_color = {.8, .8, .8, 0.2},
+			panel_border_color = {.02, 0, 0, 1},
+			iconcoords = {.1, .9, .1, .9},
+			onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:Show() end, 
+			show_x_button = true,
+			x_button_func = 	function (spellId)
+				f.db.aura_tracker.buff_banned [spellId] = nil; DF:QuickDispatch (change_callback);
+			end,
+		})
 
-	local y = -40
-	buff_available:SetPoint ("topleft", f_auto, "topleft", 0, y)
-	buff_ignored:SetPoint ("topleft", f_auto, "topleft", 6 + width, y)
-	debuff_available:SetPoint ("topleft", f_auto, "topleft", 12 + (width*2), y)
-	debuff_ignored:SetPoint ("topleft", f_auto, "topleft", 18 + (width*3), y)
-	
-	f.buff_available = buff_available
+	--Debuffs on the track list
+		local debuff_tracked = self:CreateSimpleListBox (f_auto, "$parentDebuffTracked", texts.DEBUFFS_TRACKED, "the list is empty", f.db.aura_tracker.debuff_tracked, function (spellid)
+			--f.db.aura_tracker.debuff_tracked [spellid] = nil; DF:QuickDispatch (change_callback);
+		end, 
+		{
+			icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, 
+			text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
+			height = height, 
+			row_height = row_height,
+			width = width, 
+			backdrop_color = {.8, .8, .8, 0.2},
+			panel_border_color = {0, .02, 0, 1},
+			iconcoords = {.1, .9, .1, .9},
+			onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:Show() end, 
+			show_x_button = true,
+			x_button_func = 	function (spellId)
+				f.db.aura_tracker.debuff_tracked [spellId] = nil; DF:QuickDispatch (change_callback);
+			end,
+		})
+		
+	--Buffs on the track list
+		local buff_tracked = self:CreateSimpleListBox (f_auto, "$parentBuffTracked", texts.BUFFS_TRACKED, "the list is empty", f.db.aura_tracker.buff_tracked, function (spellid)
+			--f.db.aura_tracker.buff_tracked [spellid] = nil; DF:QuickDispatch (change_callback);
+		end, 
+		{
+			icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, 
+			text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
+			height = height, 
+			row_height = row_height,
+			width = width, 
+			backdrop_color = {.8, .8, .8, 0.2},
+			panel_border_color = {0, .01, 0, 1},
+			iconcoords = {.1, .9, .1, .9},
+			onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:Show() end, 
+			show_x_button = true,
+			x_button_func = 	function (spellId)
+				f.db.aura_tracker.buff_tracked [spellId] = nil; DF:QuickDispatch (change_callback);
+			end,
+		})
+
+	debuff_ignored:SetPoint ("topleft", f_auto, "topleft", 0 + xLocation, y)
+	buff_ignored:SetPoint ("topleft", f_auto, "topleft", 8 + width + xLocation, y)
+	debuff_tracked:SetPoint ("topleft", f_auto, "topleft", 16 + (width*2) + xLocation, y)
+	buff_tracked:SetPoint ("topleft", f_auto, "topleft", 24 + (width*3) + xLocation, y)
+
 	f.buff_ignored = buff_ignored
-	f.debuff_available = debuff_available
 	f.debuff_ignored = debuff_ignored
+	f.buff_tracked = buff_tracked
+	f.debuff_tracked = debuff_tracked
 
-	local readCombatLog = CreateFrame ("frame", nil, f_auto)
-	readCombatLog:SetScript ("OnEvent", function (self, event, time, token, hidding, sourceGUID, sourceName, sourceFlag, sourceFlag2, targetGUID, targetName, targetFlag, targetFlag2, spellid, spellname, spellschool, auraType, amount)
-		if (auraType == "BUFF" and sourceGUID == readCombatLog.playerGUID) then
-			if (not ALL_BUFFS [spellid]) then
-				ALL_BUFFS [spellid] = true
-				buff_available:Refresh()
-			end
-		elseif (auraType == "DEBUFF" and sourceGUID == readCombatLog.playerGUID) then
-			if (not ALL_DEBUFFS [spellid]) then
-				ALL_DEBUFFS [spellid] = true
-				debuff_available:Refresh()
-			end
-		end
-	end)
-	
 	f_auto:SetScript ("OnShow", function()
 		for i = 1, BUFF_MAX_DISPLAY do
-			local name, rank, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HELPFUL")
+			local name, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HELPFUL")
 			if (name) then
 				ALL_BUFFS [spellId] = true
 			end
-			local name, rank, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HARMFUL")
+			local name, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HARMFUL")
 			if (name) then
 				ALL_DEBUFFS [spellId] = true
 			end
 		end
 		
-		buff_available:Refresh()
-		buff_ignored:Refresh()
-		debuff_available:Refresh()
+		buff_tracked:Refresh()
+		debuff_tracked:Refresh()
+		buff_ignored:Refresh()		
 		debuff_ignored:Refresh()
 		
-		readCombatLog.playerGUID = UnitGUID ("player")
-		readCombatLog:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
 	end)
 	f_auto:SetScript ("OnHide", function()
-		readCombatLog:UnregisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
+		--
 	end)
-	
+
 	--show the frame selecton on the f.db
-	on_select_tracking_option (_, _, f.db.aura_tracker.track_method)
+
+	if (f.db.aura_tracker.track_method == 0x1) then
+		on_switch_tracking_method (automatic_tracking_checkbox)
+	elseif (f.db.aura_tracker.track_method == 0x2) then
+		on_switch_tracking_method (manual_tracking_checkbox)
+	end
 	
 -------manual
 
@@ -250,7 +613,6 @@
 			GameTooltip:SetOwner (self, "ANCHOR_RIGHT");
 			GameTooltip:SetSpellByID (spellid)
 			GameTooltip:AddLine (" ")
-			GameTooltip:AddLine ("Click to untrack this aura", .2, 1, .2)
 			GameTooltip:Show()
 		end
 	end
@@ -259,9 +621,10 @@
 		self:SetBackdropColor (unpack (backdrop_color))
 		GameTooltip:Hide()
 	end
-	local line_onclick = function (self)
-		local spell = self.value
-		local data = self:GetParent():GetData()
+	
+	local onclick_remove_button = function (self)
+		local spell = self:GetParent().value
+		local data = self:GetParent():GetParent():GetData()
 		
 		for i = 1, #data do
 			if (data[i] == spell) then
@@ -270,27 +633,36 @@
 			end
 		end
 		
-		self:GetParent():Refresh()
+		self:GetParent():GetParent():Refresh()
 	end
 	
 	local scroll_createline = function (self, index)
 		local line = CreateFrame ("button", "$parentLine" .. index, self)
-		line:SetPoint ("topleft", self, "topleft", 0, -((index-1)*(scroll_line_height+1)))
-		line:SetSize (scroll_width, scroll_line_height)
+		line:SetPoint ("topleft", self, "topleft", 1, -((index-1)*(scroll_line_height+1)) - 1)
+		line:SetSize (scroll_width - 2, scroll_line_height)
 		line:SetScript ("OnEnter", line_onenter)
 		line:SetScript ("OnLeave", line_onleave)
-		line:SetScript ("OnClick", line_onclick)
 		
 		line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
 		line:SetBackdropColor (unpack (backdrop_color))
 		
 		local icon = line:CreateTexture ("$parentIcon", "overlay")
-		icon:SetSize (scroll_line_height, scroll_line_height)
+		icon:SetSize (scroll_line_height - 2, scroll_line_height - 2)
+		
 		local name = line:CreateFontString ("$parentName", "overlay", "GameFontNormal")
+
+		local remove_button = CreateFrame ("button", "$parentRemoveButton", line, "UIPanelCloseButton")
+		remove_button:SetSize (16, 16)
+		remove_button:SetScript ("OnClick", onclick_remove_button)
+		remove_button:SetPoint ("topright", line, "topright")
+		remove_button:GetNormalTexture():SetDesaturated (true)
+		
 		icon:SetPoint ("left", line, "left", 2, 0)
 		name:SetPoint ("left", icon, "right", 2, 0)
+		
 		line.icon = icon
 		line.name = name
+		line.removebutton = remove_button
 		
 		return line
 	end
@@ -306,6 +678,7 @@
 				if (name) then
 					line.name:SetText (name)
 					line.icon:SetTexture (icon)
+					line.icon:SetTexCoord (.1, .9, .1, .9)
 				else
 					line.name:SetText (aura)
 					line.icon:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]])
@@ -316,18 +689,16 @@
 	
 	local buffs_added = self:CreateScrollBox (f_manual, "$parentBuffsAdded", scroll_refresh, f.db.aura_tracker.buff, scroll_width, scroll_height, scroll_lines, scroll_line_height)
 	buffs_added:SetPoint ("topleft", f_manual, "topleft", 0, y)
-	buffs_added:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
-	buffs_added:SetBackdropColor (0, 0, 0, 0.2)
-	buffs_added:SetBackdropBorderColor (0, 0, 0, 1)
+	DF:ReskinSlider (buffs_added)
+	
 	for i = 1, scroll_lines do 
 		buffs_added:CreateLine (scroll_createline)
 	end
 	
 	local debuffs_added = self:CreateScrollBox (f_manual, "$parentDebuffsAdded", scroll_refresh, f.db.aura_tracker.debuff, scroll_width, scroll_height, scroll_lines, scroll_line_height)
 	debuffs_added:SetPoint ("topleft", f_manual, "topleft", width+30, y)
-	debuffs_added:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
-	debuffs_added:SetBackdropColor (0, 0, 0, 0.2)
-	debuffs_added:SetBackdropBorderColor (0, 0, 0, 1)
+	DF:ReskinSlider (debuffs_added)
+	
 	for i = 1, scroll_lines do 
 		debuffs_added:CreateLine (scroll_createline)
 	end
@@ -339,6 +710,7 @@
 	buffs_added_name:SetTemplate (DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
 	buffs_added_name:SetPoint ("bottomleft", buffs_added, "topleft", 0, 2)
 	buffs_added.Title = buffs_added_name
+	
 	local debuffs_added_name = DF:CreateLabel (debuffs_added, "Debuffs", 12, "silver")
 	debuffs_added_name:SetTemplate (DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
 	debuffs_added_name:SetPoint ("bottomleft", debuffs_added, "topleft", 0, 2)
@@ -347,36 +719,55 @@
 	-->  build the text entry to type the spellname
 	local new_buff_string = self:CreateLabel (f_manual, "Add Buff")
 	local new_debuff_string = self:CreateLabel (f_manual, "Add Debuff")
-	
 	local new_buff_entry = self:CreateTextEntry (f_manual, function()end, 200, 20, "NewBuffTextBox", _, _, options_dropdown_template)
 	local new_debuff_entry = self:CreateTextEntry (f_manual, function()end, 200, 20, "NewDebuffTextBox", _, _, options_dropdown_template)
 	
+	new_buff_entry:SetHook ("OnEditFocusGained", load_all_spells)
+	new_debuff_entry:SetHook ("OnEditFocusGained", load_all_spells)
+	new_buff_entry.tooltip = "Enter the buff name using lower case letters.\n\nYou can add several spells at once using |cFFFFFF00;|r to separate each spell name."
+	new_debuff_entry.tooltip = "Enter the debuff name using lower case letters.\n\nYou can add several spells at once using |cFFFFFF00;|r to separate each spell name."
+	
 	new_buff_entry:SetJustifyH ("left")
 	new_debuff_entry:SetJustifyH ("left")
 	
-	DF:SetAutoCompleteWithSpells (new_buff_entry)
-	DF:SetAutoCompleteWithSpells (new_debuff_entry)
+	local add_buff_button = self:CreateButton (f_manual, function()
 	
-	local add_buff_button = self:CreateButton (f_manual, function()
 		local text = new_buff_entry.text
 		new_buff_entry:SetText ("")
 		new_buff_entry:ClearFocus()
+		
 		if (text ~= "") then
 			--> check for more than one spellname
 			if (text:find (";")) then
-				for _, spellname in ipairs ({strsplit (";", text)}) do
-					spellname = self:trim (spellname)
-					if (string.len (spellname) > 0) then
-						tinsert (f.db.aura_tracker.buff, spellname)
+				for _, spellName in ipairs ({strsplit (";", text)}) do
+					spellName = self:trim (spellName)
+					spellName = lower (spellName)
+					if (string.len (spellName) > 0) then
+						local spellId = AllSpellsMap [spellName]
+						if (spellId) then
+							tinsert (f.db.aura_tracker.buff, spellId)
+						else
+							print ("spellId not found for spell:", spellName)
+						end
 					end
 				end
 			else
-				tinsert (f.db.aura_tracker.buff, text)
+				--get the spellId
+				local spellName = lower (text)
+				local spellId = AllSpellsMap [spellName]
+				if (not spellId) then
+					print ("spellIs for spell ", spellName, "not found")
+					return
+				end
+			
+				tinsert (f.db.aura_tracker.buff, spellId)
 			end
 			
 			buffs_added:Refresh()
 		end
+		
 	end, 100, 20, "Add Buff", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"))
+	
 	local add_debuff_button = self:CreateButton (f_manual, function()
 		local text = new_debuff_entry.text
 		new_debuff_entry:SetText ("")
@@ -384,29 +775,47 @@
 		if (text ~= "") then
 			--> check for more than one spellname
 			if (text:find (";")) then
-				for _, spellname in ipairs ({strsplit (";", text)}) do
-					spellname = self:trim (spellname)
-					if (string.len (spellname) > 0) then
-						tinsert (f.db.aura_tracker.debuff, spellname)
+				for _, spellName in ipairs ({strsplit (";", text)}) do
+					spellName = self:trim (spellName)
+					spellName = lower (spellName)
+					if (string.len (spellName) > 0) then
+						local spellId = AllSpellsMap [spellName]
+						if (spellId) then
+							tinsert (f.db.aura_tracker.debuff, spellId)
+						else
+							print ("spellId not found for spell:", spellName)
+						end
 					end
 				end
 			else
-				tinsert (f.db.aura_tracker.debuff, text)
+				--get the spellId
+				local spellName = lower (text)
+				local spellId = AllSpellsMap [spellName]
+				if (not spellId) then
+					print ("spellIs for spell ", spellName, "not found")
+					return
+				end
+			
+				tinsert (f.db.aura_tracker.debuff, spellId)
 			end
+			
 			debuffs_added:Refresh()
 		end
 	end, 100, 20, "Add Debuff", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"))
 	
 	local multiple_spells_label = DF:CreateLabel (buffs_added, "You can add multiple auras at once by separating them with ';'.\nExample: Fireball; Frostbolt; Flamestrike", 10, "gray")
-	multiple_spells_label:SetSize (350, 60)
+	multiple_spells_label:SetSize (350, 24)
 	multiple_spells_label:SetJustifyV ("top")
 	
 	local export_box = self:CreateTextEntry (f_manual, function()end, 242, 20, "ExportAuraTextBox", _, _, options_dropdown_template)
 	
 	local export_buff_button = self:CreateButton (f_manual, function()
 		local str = ""
-		for _, spellname in ipairs (f.db.aura_tracker.buff) do
-			str = str .. spellname .. "; "
+		for _, spellId in ipairs (f.db.aura_tracker.buff) do
+			local spellName = GetSpellInfo (spellId)
+			if (spellName) then
+				str = str .. spellName .. "; "
+			end
 		end
 		export_box.text = str
 		export_box:SetFocus (true)
@@ -416,30 +825,34 @@
 	
 	local export_debuff_button = self:CreateButton (f_manual, function()
 		local str = ""
-		for _, spellname in ipairs (f.db.aura_tracker.debuff) do
-			str = str .. spellname .. "; "
+		for _, spellId in ipairs (f.db.aura_tracker.debuff) do
+			local spellName = GetSpellInfo (spellId)
+			if (spellName) then
+				str = str .. spellName .. "; "
+			end
 		end
+		
 		export_box.text = str
 		export_box:SetFocus (true)
 		export_box:HighlightText()
 		
 	end, 120, 20, "Export Debuffs", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"))
 	
-	multiple_spells_label:SetPoint ("topleft", f_manual, "topleft", 480, -120)
-	
-	export_buff_button:SetPoint ("topleft", f_manual, "topleft", 480, -160)
-	export_debuff_button:SetPoint ("left",export_buff_button, "right", 2, 0)
-	export_box:SetPoint ("topleft", f_manual, "topleft", 480, -185)
-	
-	new_buff_string:SetPoint ("topleft", f_manual, "topleft", 480, -40)
-	new_buff_entry:SetPoint ("topleft", new_buff_string, "bottomleft", 0, -2)
+	new_buff_entry:SetPoint ("topleft", f_manual, "topleft", 480, y)
+	new_buff_string:SetPoint ("bottomleft", new_buff_entry, "topleft", 0, 2)
 	add_buff_button:SetPoint ("left", new_buff_entry, "right", 2, 0)
 	add_buff_button.tooltip = "Add the aura to be tracked.\n\nClick an aura on the list to remove it."
 	
-	new_debuff_string:SetPoint ("topleft", f_manual, "topleft", 480, -80)
+	new_debuff_string:SetPoint ("topleft", new_buff_entry, "bottomleft", 0, -6)
 	new_debuff_entry:SetPoint ("topleft", new_debuff_string, "bottomleft", 0, -2)
 	add_debuff_button:SetPoint ("left", new_debuff_entry, "right", 2, 0)
 	add_debuff_button.tooltip = "Add the aura to be tracked.\n\nClick an aura on the list to remove it."
+
+	multiple_spells_label:SetPoint ("topleft", new_debuff_entry, "bottomleft", 0, -6)
+	
+	export_buff_button:SetPoint ("topleft", multiple_spells_label, "bottomleft", 0, -12)
+	export_debuff_button:SetPoint ("left",export_buff_button, "right", 2, 0)
+	export_box:SetPoint ("topleft", export_buff_button, "bottomleft", 0, -6)
 	
 	buffs_added:Refresh()
 	debuffs_added:Refresh()
--- a/Libs/DF/button.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/button.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -404,6 +404,12 @@
 	end
 
 -- icon
+	function ButtonMetaFunctions:GetIconTexture()
+		if (self.icon) then
+			return self.icon:GetTexture()
+		end
+	end
+	
 	function ButtonMetaFunctions:SetIcon (texture, width, height, layout, texcoord, overlay, textdistance, leftpadding, textheight, short_method)
 		if (not self.icon) then
 			self.icon = self:CreateTexture (nil, "artwork")
@@ -1170,4 +1176,4 @@
 	
 	return button
 	
-end
\ No newline at end of file
+end
--- a/Libs/DF/button.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/button.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -39,4 +39,4 @@
 		</Scripts>
 		
 	</Button>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/DF/colors.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/colors.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -164,4 +164,4 @@
 		["yellow"] = {1, 1, 0, 1},
 		["yellowgreen"] = {0.603922, 0.803922, 0.196078, 1}
 	}
-end
\ No newline at end of file
+end
--- a/Libs/DF/cooltip.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/cooltip.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -121,6 +121,14 @@
 			["SelectedRightAnchorMod"] = true,
 		}
 		
+		CoolTip.AliasList = {
+			["VerticalOffset"] = "ButtonsYMod",
+			["VerticalPadding"] = "YSpacingMod",
+			["LineHeightSizeOffset"] = "ButtonHeightMod",
+			["FrameHeightSizeOffset"] = "HeighMod",
+			
+		}
+		
 		CoolTip.OptionsTable = {}
 	
 		--cprops
@@ -1824,14 +1832,18 @@
 			CoolTip:SetOption ("HeightAnchorMod", 0)
 		end
 		
-		function CoolTip:SetOption (option, value)
+		function CoolTip:SetOption (optionName, value)
+		
+			--> check for name alias
+			optionName = CoolTip.AliasList [optionName] or optionName
+		
 			--> check if this options exists
-			if (not CoolTip.OptionsList [option]) then
+			if (not CoolTip.OptionsList [optionName]) then
 				return --> error
 			end
-			
+		
 			--> set options
-			CoolTip.OptionsTable [option] = value
+			CoolTip.OptionsTable [optionName] = value
 		end
 
 ----------------------------------------------------------------------
@@ -3131,4 +3143,4 @@
 	
 end
 
-DF:CreateCoolTip()
\ No newline at end of file
+DF:CreateCoolTip()
--- a/Libs/DF/cooltip.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/cooltip.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -101,7 +101,7 @@
 				</Texture>
 				
 				<!-- banner image -->
-				<Texture name="$parent_UpperImage2" hidden="true" parentKey="upperImage2" file = "">
+				<Texture name="$parent_UpperImage2" hidden="true" parentKey="upperImage2">
 					<Anchors>
 						<Anchor point="CENTER" relativeTo="$parent" relativePoint="CENTER" x="0" y="-3"/>
 						<Anchor point="BOTTOM" relativeTo="$parent" relativePoint="TOP" x="0" y="-3"/>
@@ -111,7 +111,7 @@
 			
 			<Layer level="OVERLAY">
 				<!-- upper image2 -->
-				<Texture name="$parent_UpperImage" hidden="true" parentKey="upperImage" file = "">
+				<Texture name="$parent_UpperImage" hidden="true" parentKey="upperImage">
 					<Anchors>
 						<Anchor point="CENTER" relativeTo="$parent" relativePoint="CENTER" x="0" y="-3"/>
 						<Anchor point="BOTTOM" relativeTo="$parent" relativePoint="TOP" x="0" y="-3"/>
@@ -315,4 +315,4 @@
 	
 	<Script file="cooltip.lua"/>
 	
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/DF/dropdown.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/dropdown.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -537,6 +537,10 @@
 			GameCooltip2:SetOption ("TextFont", frame.table.descfont)
 		end
 		
+		if (frame.table.tooltipwidth) then
+			GameCooltip2:SetOption ("FixedWidth", frame.table.tooltipwidth)
+		end
+		
 		GameCooltip2:SetHost (frame, "topleft", "topright", 10, 0)
 		
 		GameCooltip2:ShowCooltip (nil, "tooltip")
--- a/Libs/DF/fw.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/fw.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -1,5 +1,5 @@
 
-local dversion = 68
+local dversion = 85
 local major, minor = "DetailsFramework-1.0", dversion
 local DF, oldminor = LibStub:NewLibrary (major, minor)
 
@@ -15,6 +15,10 @@
 local _type = type
 local _unpack = unpack
 local upper = string.upper
+local string_match = string.match
+
+SMALL_NUMBER = 0.000001
+ALPHA_BLEND_AMOUNT = 0.8400251
 
 --> will always give a very random name for our widgets
 local init_counter = math.random (1, 1000000)
@@ -117,6 +121,12 @@
 	"CreateBorder",
 	"FormatNumber",
 	"IntegerToTimer",
+	"QuickDispatch",
+	"CommaValue",
+	"RemoveRealmName",
+	"Trim",
+	"CreateGlowOverlay",
+	"CreateFrameShake",
 }
 
 DF.table = {}
@@ -181,6 +191,7 @@
 			t1 [key] = value
 		end
 	end
+	return t1
 end
 
 function DF.table.dump (t, s, deep)
@@ -258,6 +269,22 @@
 	end
 end
 
+function DF:CommaValue (value)
+	if (not value) then 
+		return "0" 
+	end
+	
+	value = floor (value)
+	
+	if (value == 0) then
+		return "0"
+	end
+	
+	--source http://richard.warburton.it
+	local left, num, right = string_match (value, '^([^%d]*%d)(%d*)(.-)$')
+	return left .. (num:reverse():gsub ('(%d%d%d)','%1,'):reverse()) .. right
+end
+
 function DF:IntegerToTimer (value)
 	return "" .. floor (value/60) .. ":" .. format ("%02.f", value%60)
 end
@@ -328,13 +355,17 @@
 	fontString:SetFont (fonte, size, outline)
 end
 
+function DF:Trim (s) --hello name conventions!
+	return DF:trim (s)
+end
+
 function DF:trim (s)
 	local from = s:match"^%s*()"
 	return from > #s and "" or s:match(".*%S", from)
 end
 
 function DF:Msg (msg)
-	print ("|cFFFFFFAA" .. self.__name .. "|r " .. msg)
+	print ("|cFFFFFFAA" .. (self.__name or "FW Msg:") .. "|r ", msg)
 end
 
 function DF:GetNpcIdFromGuid (guid)
@@ -345,6 +376,25 @@
 	return 0
 end
 
+function DF.SortOrder1 (t1, t2)
+	return t1[1] > t2[1]
+end
+function DF.SortOrder2 (t1, t2)
+	return t1[2] > t2[2]
+end
+function DF.SortOrder3 (t1, t2)
+	return t1[3] > t2[3]
+end
+function DF.SortOrder1R (t1, t2)
+	return t1[1] < t2[1]
+end
+function DF.SortOrder2R (t1, t2)
+	return t1[2] < t2[2]
+end
+function DF.SortOrder3R (t1, t2)
+	return t1[3] < t2[3]
+end
+
 local onFinish = function (self)
 	if (self.showWhenDone) then
 		self.frame:SetAlpha (1)
@@ -462,6 +512,77 @@
 		return v1 or "topleft", v2, v3 or "topleft", v4 or 0, v5 or 0
 	end
 	
+	local anchoring_functions = {
+		function (frame, anchorTo, offSetX, offSetY) --> 1 TOP LEFT
+			frame:ClearAllPoints()
+			frame:SetPoint ("bottomleft", anchorTo, "topleft", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 2 LEFT
+			frame:ClearAllPoints()
+			frame:SetPoint ("right", anchorTo, "left", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 3 BOTTOM LEFT
+			frame:ClearAllPoints()
+			frame:SetPoint ("topleft", anchorTo, "bottomleft", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 4 BOTTOM
+			frame:ClearAllPoints()
+			frame:SetPoint ("top", anchorTo, "bottom", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 5 BOTTOM RIGHT
+			frame:ClearAllPoints()
+			frame:SetPoint ("topright", anchorTo, "bottomright", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 6 RIGHT
+			frame:ClearAllPoints()
+			frame:SetPoint ("left", anchorTo, "right", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 7 TOP RIGHT
+			frame:ClearAllPoints()
+			frame:SetPoint ("bottomright", anchorTo, "topright", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 8 TOP
+			frame:ClearAllPoints()
+			frame:SetPoint ("bottom", anchorTo, "top", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 9 CENTER
+			frame:ClearAllPoints()
+			frame:SetPoint ("center", anchorTo, "center", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 10
+			frame:ClearAllPoints()
+			frame:SetPoint ("left", anchorTo, "left", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 11
+			frame:ClearAllPoints()
+			frame:SetPoint ("right", anchorTo, "right", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 12
+			frame:ClearAllPoints()
+			frame:SetPoint ("top", anchorTo, "top", offSetX, offSetY)
+		end,
+		
+		function (frame, anchorTo, offSetX, offSetY) --> 13
+			frame:ClearAllPoints()
+			frame:SetPoint ("bottom", anchorTo, "bottom", offSetX, offSetY)
+		end
+	}
+
+	function DF:SetAnchor (widget, config, anchorTo)
+		anchorTo = anchorTo or widget:GetParent()
+		anchoring_functions [config.side] (widget, anchorTo, config.x, config.y)
+	end	
 
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --> colors
@@ -550,6 +671,7 @@
 		local cur_x = x_offset
 		local cur_y = y_offset
 		local max_x = 0
+		local line_widgets_created = 0 --how many widgets has been created on this line loop pass
 		
 		height = abs ((height or parent:GetHeight()) - abs (y_offset) + 20)
 		height = height*-1
@@ -567,6 +689,7 @@
 				label.widget_type = "label"
 				label:SetPoint (cur_x, cur_y)
 				tinsert (parent.widget_list, label)
+				line_widgets_created = line_widgets_created + 1
 			
 			elseif (widget_table.type == "select" or widget_table.type == "dropdown") then
 				local dropdown = DF:NewDropDown (parent, nil, "$parentWidget" .. index, nil, 140, 18, widget_table.values, widget_table.get(), dropdown_template)
@@ -584,6 +707,7 @@
 				
 				tinsert (parent.widget_list, dropdown)
 				widget_created = dropdown
+				line_widgets_created = line_widgets_created + 1
 				
 			elseif (widget_table.type == "toggle" or widget_table.type == "switch") then
 				local switch = DF:NewSwitch (parent, nil, "$parentWidget" .. index, nil, 60, 20, nil, nil, widget_table.get(), nil, nil, nil, nil, switch_template)
@@ -607,6 +731,7 @@
 				
 				tinsert (parent.widget_list, switch)
 				widget_created = switch
+				line_widgets_created = line_widgets_created + 1
 				
 			elseif (widget_table.type == "range" or widget_table.type == "slider") then
 				local is_decimanls = widget_table.usedecimals
@@ -631,6 +756,7 @@
 				
 				tinsert (parent.widget_list, slider)
 				widget_created = slider
+				line_widgets_created = line_widgets_created + 1
 				
 			elseif (widget_table.type == "color" or widget_table.type == "color") then
 				local colorpick = DF:NewColorPickButton (parent, "$parentWidget" .. index, nil, widget_table.set, nil, button_template)
@@ -656,6 +782,7 @@
 				
 				tinsert (parent.widget_list, colorpick)
 				widget_created = colorpick
+				line_widgets_created = line_widgets_created + 1
 				
 			elseif (widget_table.type == "execute" or widget_table.type == "button") then
 			
@@ -675,7 +802,7 @@
 				
 				tinsert (parent.widget_list, button)
 				widget_created = button
-				
+				line_widgets_created = line_widgets_created + 1
 				
 			elseif (widget_table.type == "textentry") then
 				local textentry = DF:CreateTextEntry (parent, widget_table.func, 120, 18, nil, "$parentWidget" .. index, nil, button_template)
@@ -697,6 +824,7 @@
 				
 				tinsert (parent.widget_list, textentry)
 				widget_created = textentry
+				line_widgets_created = line_widgets_created + 1
 				
 			end
 			
@@ -713,6 +841,7 @@
 			if (widget_table.type == "breakline" or cur_y < height) then
 				cur_y = y_offset
 				cur_x = cur_x + max_x + 30
+				line_widgets_created = 0
 				max_x = 0
 			end
 		
@@ -1303,6 +1432,281 @@
 	return anim
 end
 
+local frameshake_shake_finished = function (parent, shakeObject)
+	if (shakeObject.IsPlaying) then
+		shakeObject.IsPlaying = false
+		
+		--> update the amount of shake running on this frame
+		parent.__frameshakes.enabled = parent.__frameshakes.enabled - 1
+		
+		--> restore the default anchors, in case where deltaTime was too small that didn't triggered an update
+		for i = 1, #shakeObject.Anchors do
+			local anchor = shakeObject.Anchors [i]
+			
+			if (#anchor == 3) then
+				local anchorTo, point1, point2 = unpack (anchor)
+				parent:SetPoint (anchorTo, point1, point2)
+				
+			elseif (#anchor == 5) then
+				local anchorName1, anchorTo, anchorName2, point1, point2 = unpack (anchor)
+				parent:SetPoint (anchorName1, anchorTo, anchorName2, point1, point2)
+			end
+		end
+	end
+end
+
+local frameshake_do_update = function (parent, shakeObject, deltaTime)
+
+	--> check delta time
+	deltaTime = deltaTime or 0
+	
+	--> update time left
+	shakeObject.TimeLeft = max (shakeObject.TimeLeft - deltaTime, 0)
+	
+	if (shakeObject.TimeLeft > 0) then
+	
+		--> update fade in and out
+		if (shakeObject.IsFadingIn) then
+			shakeObject.IsFadingInTime = shakeObject.IsFadingInTime + deltaTime
+		end
+		if (shakeObject.IsFadingOut) then
+			shakeObject.IsFadingOutTime = shakeObject.IsFadingOutTime + deltaTime
+		end
+
+		--> check if can disable fade in
+		if (shakeObject.IsFadingIn and shakeObject.IsFadingInTime > shakeObject.FadeInTime) then
+			shakeObject.IsFadingIn = false
+		end
+		
+		--> check if can enable fade out
+		if (not shakeObject.IsFadingOut and shakeObject.TimeLeft < shakeObject.FadeOutTime) then
+			shakeObject.IsFadingOut = true
+			shakeObject.IsFadingOutTime = shakeObject.FadeOutTime - shakeObject.TimeLeft
+		end
+		
+		--> update position
+		local scaleShake = min (shakeObject.IsFadingIn and (shakeObject.IsFadingInTime / shakeObject.FadeInTime) or 1, shakeObject.IsFadingOut and (1 - shakeObject.IsFadingOutTime / shakeObject.FadeOutTime) or 1)
+		
+		if (scaleShake > 0) then
+
+			--> delate the time by the frequency on both X and Y offsets
+			shakeObject.XSineOffset = shakeObject.XSineOffset + (deltaTime * shakeObject.Frequency)
+			shakeObject.YSineOffset = shakeObject.YSineOffset + (deltaTime * shakeObject.Frequency)
+			
+			--> calc the new position
+			local newX, newY
+			if (shakeObject.AbsoluteSineX) then
+				--absoluting only the sine wave, passing a negative scale will reverse the absolute direction
+				newX = shakeObject.Amplitude * abs (math.sin (shakeObject.XSineOffset)) * scaleShake * shakeObject.ScaleX
+			else
+				newX = shakeObject.Amplitude * math.sin (shakeObject.XSineOffset) * scaleShake * shakeObject.ScaleX
+			end
+			
+			if (shakeObject.AbsoluteSineY) then
+				newY = shakeObject.Amplitude * abs (math.sin (shakeObject.YSineOffset)) * scaleShake * shakeObject.ScaleY
+			else
+				newY = shakeObject.Amplitude * math.sin (shakeObject.YSineOffset) * scaleShake * shakeObject.ScaleY
+			end
+			
+			--> apply the offset to the frame anchors
+			for i = 1, #shakeObject.Anchors do
+				local anchor = shakeObject.Anchors [i]
+				
+				if (#anchor == 3) then
+					local anchorTo, point1, point2 = unpack (anchor)
+					parent:SetPoint (anchorTo, point1 + newX, point2 + newY)
+					
+				elseif (#anchor == 5) then
+					local anchorName1, anchorTo, anchorName2, point1, point2 = unpack (anchor)
+					parent:SetPoint (anchorName1, anchorTo, anchorName2, point1 + newX, point2 + newY)
+				end
+			end
+			
+		end
+	else
+		frameshake_shake_finished (parent, shakeObject)
+	end
+end
+
+local frameshake_update_all = function (parent, deltaTime)
+	--> check if there's a shake running
+	--print ("Shakes Enabled: ", parent.__frameshakes.enabled)
+	if (parent.__frameshakes.enabled > 0) then
+		--update all shakes
+		for i = 1, #parent.__frameshakes do
+			local shakeObject = parent.__frameshakes [i]
+			if (shakeObject.IsPlaying) then
+				frameshake_do_update (parent, shakeObject, deltaTime)
+			end
+		end
+	end
+end
+
+--> scale direction scales the X and Y coordinates, scale strength scales the amplitude and frequency
+local frameshake_play = function (parent, shakeObject, scaleDirection, scaleAmplitude, scaleFrequency, scaleDuration)
+
+	--> check if is already playing
+	if (shakeObject.TimeLeft > 0) then
+		--> reset the time left
+		shakeObject.TimeLeft = shakeObject.Duration
+		
+		if (shakeObject.IsFadingOut) then
+			if (shakeObject.FadeInTime > 0) then
+				shakeObject.IsFadingIn = true
+				--> scale the current fade out into fade in, so it starts the fade in at the point where it was fading out
+				shakeObject.IsFadingInTime = shakeObject.FadeInTime * (1 - shakeObject.IsFadingOutTime / shakeObject.FadeOutTime)
+			else
+				shakeObject.IsFadingIn = false
+				shakeObject.IsFadingInTime = 0
+			end
+			
+			--> disable fade out and enable fade in
+			shakeObject.IsFadingOut = false
+			shakeObject.IsFadingOutTime = 0
+		end
+		
+	else
+		--> create a new random offset
+		shakeObject.XSineOffset = math.pi * 2 * math.random()
+		shakeObject.YSineOffset = math.pi * 2 * math.random()
+		
+		--> store the initial position if case it needs a reset
+		shakeObject.StartedXSineOffset = shakeObject.XSineOffset
+		shakeObject.StartedYSineOffset = shakeObject.YSineOffset
+		
+		--> check if there's a fade in time
+		if (shakeObject.FadeInTime > 0) then
+			shakeObject.IsFadingIn = true
+		else
+			shakeObject.IsFadingIn = false
+		end
+		
+		shakeObject.IsFadingInTime = 0
+		shakeObject.IsFadingOut = false
+		shakeObject.IsFadingOutTime = 0
+		
+		--> apply custom scale
+		shakeObject.ScaleX = (scaleDirection or 1) * shakeObject.OriginalScaleX
+		shakeObject.ScaleY = (scaleDirection or 1) * shakeObject.OriginalScaleY
+		shakeObject.Frequency = (scaleFrequency or 1) * shakeObject.OriginalFrequency
+		shakeObject.Amplitude = (scaleAmplitude or 1) * shakeObject.OriginalAmplitude
+		shakeObject.Duration = (scaleDuration or 1) * shakeObject.OriginalDuration
+		
+		--> update the time left
+		shakeObject.TimeLeft = shakeObject.Duration
+		
+		--> check if is dynamic points
+		if (shakeObject.IsDynamicAnchor) then
+			wipe (shakeObject.Anchors)
+			for i = 1, parent:GetNumPoints() do
+				local p1, p2, p3, p4, p5 = parent:GetPoint (i)
+				shakeObject.Anchors [#shakeObject.Anchors+1] = {p1, p2, p3, p4, p5}
+			end
+		end
+		
+		--> update the amount of shake running on this frame
+		parent.__frameshakes.enabled = parent.__frameshakes.enabled + 1
+	end
+
+	shakeObject.IsPlaying = true
+	
+	frameshake_do_update (parent, shakeObject)
+end
+
+function DF:CreateFrameShake (parent, duration, amplitude, frequency, absoluteSineX, absoluteSineY, scaleX, scaleY, fadeInTime, fadeOutTime, anchorPoints)
+
+	--> create the shake table
+	local frameShake = {
+		Amplitude = amplitude or 2,
+		Frequency = frequency or 5,
+		Duration = duration or 0.3,
+		FadeInTime = fadeInTime or 0.01,
+		FadeOutTime = fadeOutTime or 0.01,
+		ScaleX  = scaleX or 0.2,
+		ScaleY = scaleY or 1,
+		AbsoluteSineX = absoluteSineX,
+		AbsoluteSineY = absoluteSineY,
+		--
+		IsPlaying = false,
+		TimeLeft = 0,
+	}
+	
+	frameShake.OriginalScaleX = frameShake.ScaleX
+	frameShake.OriginalScaleY = frameShake.ScaleY
+	frameShake.OriginalFrequency = frameShake.Frequency
+	frameShake.OriginalAmplitude = frameShake.Amplitude
+	frameShake.OriginalDuration = frameShake.Duration
+	
+	if (type (anchorPoints) ~= "table") then
+		frameShake.IsDynamicAnchor = true
+		frameShake.Anchors = {}
+	else 
+		frameShake.Anchors = anchorPoints
+	end
+	
+	--> inject frame shake table into the frame
+	if (not parent.__frameshakes) then
+		parent.__frameshakes = {
+			enabled = 0,
+		}
+		parent.PlayFrameShake = frameshake_play
+		parent.UpdateFrameShake = frameshake_do_update
+		parent.UpdateAllFrameShake = frameshake_update_all
+		parent:HookScript ("OnUpdate", frameshake_update_all)
+	end
+
+	tinsert (parent.__frameshakes, frameShake)
+	
+	return frameShake
+end
+
+
+-----------------------------
+--> glow overlay
+
+local play_glow_overlay = function (self)
+	self:Show()
+	if (self.animOut:IsPlaying()) then
+		self.animOut:Stop()
+	end
+	self.animIn:Play()
+end
+
+local stop_glow_overlay = function (self)
+	self.animOut:Stop()
+	self.animIn:Stop()
+	self:Hide()
+end
+
+local defaultColor = {1, 1, 1, 1}
+
+--this is most copied from the wow client code, few changes applied to customize it
+function DF:CreateGlowOverlay (parent, antsColor, glowColor)
+	local glowFrame = CreateFrame ("frame", parent:GetName() and "$parentGlow2" or "OverlayActionGlow" .. math.random (1, 10000000), parent, "ActionBarButtonSpellActivationAlert")
+	
+	glowFrame.Play = play_glow_overlay
+	glowFrame.Stop = stop_glow_overlay
+	
+	parent.overlay = glowFrame
+	local frameWidth, frameHeight = parent:GetSize()
+	
+	local scale = 1.4
+	
+	--Make the height/width available before the next frame:
+	parent.overlay:SetSize(frameWidth * scale, frameHeight * scale)
+	parent.overlay:SetPoint("TOPLEFT", parent, "TOPLEFT", -frameWidth * 0.2, frameHeight * 0.2)
+	parent.overlay:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT", frameWidth * 0.2, -frameHeight * 0.2)
+	
+	local r, g, b, a = DF:ParseColors (antsColor or defaultColor)
+	glowFrame.ants:SetVertexColor (r, g, b, a)
+	
+	local r, g, b, a = DF:ParseColors (glowColor or defaultColor)
+	glowFrame.outerGlow:SetVertexColor (r, g, b, a)
+	
+	glowFrame.outerGlow:SetScale (1.2)
+	
+	return glowFrame
+end
 
 -----------------------------
 --> borders
@@ -1327,6 +1731,34 @@
 	end
 end
 
+local SetBorderColor = function (self, r, g, b)
+	for _, texture in ipairs (self.Borders.Layer1) do
+		texture:SetColorTexture (r, g, b)
+	end
+	for _, texture in ipairs (self.Borders.Layer2) do
+		texture:SetColorTexture (r, g, b)
+	end
+	for _, texture in ipairs (self.Borders.Layer3) do
+		texture:SetColorTexture (r, g, b)
+	end
+end
+
+local SetLayerVisibility = function (self, layer1Shown, layer2Shown, layer3Shown)
+
+	for _, texture in ipairs (self.Borders.Layer1) do
+		texture:SetShown (layer1Shown)
+	end
+	
+	for _, texture in ipairs (self.Borders.Layer2) do
+		texture:SetShown (layer2Shown)
+	end
+	
+	for _, texture in ipairs (self.Borders.Layer3) do
+		texture:SetShown (layer3Shown)
+	end
+
+end
+
 function DF:CreateBorder (parent, alpha1, alpha2, alpha3)
 	
 	parent.Borders = {
@@ -1339,6 +1771,8 @@
 	}
 	
 	parent.SetBorderAlpha = SetBorderAlpha
+	parent.SetBorderColor = SetBorderColor
+	parent.SetLayerVisibility = SetLayerVisibility
 	
 	local border1 = parent:CreateTexture (nil, "background")
 	border1:SetPoint ("topleft", parent, "topleft", -1, 1)
@@ -1410,6 +1844,115 @@
 	
 end
 
+
+function DF:CreateBorderWithSpread (parent, alpha1, alpha2, alpha3, size, spread)
+	
+	parent.Borders = {
+		Layer1 = {},
+		Layer2 = {},
+		Layer3 = {},
+		Alpha1 = alpha1 or default_border_color1,
+		Alpha2 = alpha2 or default_border_color2,
+		Alpha3 = alpha3 or default_border_color3,
+	}
+	
+	parent.SetBorderAlpha = SetBorderAlpha
+	parent.SetBorderColor = SetBorderColor
+	parent.SetLayerVisibility = SetLayerVisibility
+	
+	--left
+	local border1 = parent:CreateTexture (nil, "background")
+	border1:SetPoint ("topleft", parent, "topleft", -1 + spread, 1 + (-spread))
+	border1:SetPoint ("bottomleft", parent, "bottomleft", -1 + spread, -1 + spread)
+	border1:SetColorTexture (0, 0, 0, alpha1 or default_border_color1)
+	border1:SetWidth (size)
+	
+	local border2 = parent:CreateTexture (nil, "background")
+	border2:SetPoint ("topleft", parent, "topleft", -2 + spread, 2 + (-spread))
+	border2:SetPoint ("bottomleft", parent, "bottomleft", -2 + spread, -2 + spread)
+	border2:SetColorTexture (0, 0, 0, alpha2 or default_border_color2)
+	border2:SetWidth (size)
+	
+	local border3 = parent:CreateTexture (nil, "background")
+	border3:SetPoint ("topleft", parent, "topleft", -3 + spread, 3 + (-spread))
+	border3:SetPoint ("bottomleft", parent, "bottomleft", -3 + spread, -3 + spread)
+	border3:SetColorTexture (0, 0, 0, alpha3 or default_border_color3)
+	border3:SetWidth (size)
+	
+	tinsert (parent.Borders.Layer1, border1)
+	tinsert (parent.Borders.Layer2, border2)
+	tinsert (parent.Borders.Layer3, border3)
+	
+	--top
+	local border1 = parent:CreateTexture (nil, "background")
+	border1:SetPoint ("topleft", parent, "topleft", 0 + spread, 1 + (-spread))
+	border1:SetPoint ("topright", parent, "topright", 1 + (-spread), 1 + (-spread))
+	border1:SetColorTexture (0, 0, 0, alpha1 or default_border_color1)
+	border1:SetHeight (size)
+	
+	local border2 = parent:CreateTexture (nil, "background")
+	border2:SetPoint ("topleft", parent, "topleft", -1 + spread, 2 + (-spread))
+	border2:SetPoint ("topright", parent, "topright", 2 + (-spread), 2 + (-spread))
+	border2:SetColorTexture (0, 0, 0, alpha2 or default_border_color2)
+	border2:SetHeight (size)
+	
+	local border3 = parent:CreateTexture (nil, "background")
+	border3:SetPoint ("topleft", parent, "topleft", -2 + spread, 3 + (-spread))
+	border3:SetPoint ("topright", parent, "topright", 3 + (-spread), 3 + (-spread))
+	border3:SetColorTexture (0, 0, 0, alpha3 or default_border_color3)
+	border3:SetHeight (size)
+	
+	tinsert (parent.Borders.Layer1, border1)
+	tinsert (parent.Borders.Layer2, border2)
+	tinsert (parent.Borders.Layer3, border3)	
+	
+	--right
+	local border1 = parent:CreateTexture (nil, "background")
+	border1:SetPoint ("topright", parent, "topright", 1 + (-spread), 0 + (-spread))
+	border1:SetPoint ("bottomright", parent, "bottomright", 1 + (-spread), -1 + spread)
+	border1:SetColorTexture (0, 0, 0, alpha1 or default_border_color1)
+	border1:SetWidth (size)
+	
+	local border2 = parent:CreateTexture (nil, "background")
+	border2:SetPoint ("topright", parent, "topright", 2 + (-spread), 1 + (-spread))
+	border2:SetPoint ("bottomright", parent, "bottomright", 2 + (-spread), -2 + spread)
+	border2:SetColorTexture (0, 0, 0, alpha2 or default_border_color2)
+	border2:SetWidth (size)
+	
+	local border3 = parent:CreateTexture (nil, "background")
+	border3:SetPoint ("topright", parent, "topright", 3 + (-spread), 2 + (-spread))
+	border3:SetPoint ("bottomright", parent, "bottomright", 3 + (-spread), -3 + spread)
+	border3:SetColorTexture (0, 0, 0, alpha3 or default_border_color3)
+	border3:SetWidth (size)
+	
+	tinsert (parent.Borders.Layer1, border1)
+	tinsert (parent.Borders.Layer2, border2)
+	tinsert (parent.Borders.Layer3, border3)	
+	
+	local border1 = parent:CreateTexture (nil, "background")
+	border1:SetPoint ("bottomleft", parent, "bottomleft", 0 + spread, -1 + spread)
+	border1:SetPoint ("bottomright", parent, "bottomright", 0 + (-spread), -1 + spread)
+	border1:SetColorTexture (0, 0, 0, alpha1 or default_border_color1)
+	border1:SetHeight (size)
+	
+	local border2 = parent:CreateTexture (nil, "background")
+	border2:SetPoint ("bottomleft", parent, "bottomleft", -1 + spread, -2 + spread)
+	border2:SetPoint ("bottomright", parent, "bottomright", 1 + (-spread), -2 + spread)
+	border2:SetColorTexture (0, 0, 0, alpha2 or default_border_color2)
+	border2:SetHeight (size)
+	
+	local border3 = parent:CreateTexture (nil, "background")
+	border3:SetPoint ("bottomleft", parent, "bottomleft", -2 + spread, -3 + spread)
+	border3:SetPoint ("bottomright", parent, "bottomright", 2 + (-spread), -3 + spread)
+	border3:SetColorTexture (0, 0, 0, alpha3 or default_border_color3)
+	border3:SetHeight (size)
+	
+	tinsert (parent.Borders.Layer1, border1)
+	tinsert (parent.Borders.Layer2, border2)
+	tinsert (parent.Borders.Layer3, border3)
+	
+end
+
 function DF:ReskinSlider (slider, heightOffset)
 	if (slider.slider) then
 		slider.cima:SetNormalTexture ([[Interface\Buttons\Arrow-Up-Up]])
@@ -1451,49 +1994,76 @@
 		slider.slider.thumb:SetTexCoord (482/512, 492/512, 104/512, 120/512)
 		slider.slider.thumb:SetSize (12, 12)
 		slider.slider.thumb:SetVertexColor (0.6, 0.6, 0.6, 0.95)
+		
 	else
+		--up button
+		do
+			local normalTexture = slider.ScrollBar.ScrollUpButton.Normal
+			normalTexture:SetTexture ([[Interface\Buttons\Arrow-Up-Up]])
+			normalTexture:SetTexCoord (0, 1, .2, 1)
+			
+			normalTexture:SetPoint ("topleft", slider.ScrollBar.ScrollUpButton, "topleft", 1, 0)
+			normalTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollUpButton, "bottomright", 1, 0)
+			
+			local pushedTexture = slider.ScrollBar.ScrollUpButton.Pushed
+			pushedTexture:SetTexture ([[Interface\Buttons\Arrow-Up-Down]])
+			pushedTexture:SetTexCoord (0, 1, .2, 1)
+			
+			pushedTexture:SetPoint ("topleft", slider.ScrollBar.ScrollUpButton, "topleft", 1, 0)
+			pushedTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollUpButton, "bottomright", 1, 0)
 
-		slider.ScrollBar.ScrollUpButton:SetNormalTexture ([[Interface\Buttons\Arrow-Up-Up]])
-		slider.ScrollBar.ScrollUpButton:GetNormalTexture():SetTexCoord (0, 1, 0, 1)
-		slider.ScrollBar.ScrollUpButton:SetPushedTexture ([[Interface\Buttons\Arrow-Up-Down]])
-		slider.ScrollBar.ScrollUpButton:GetPushedTexture():SetTexCoord (0, 1, 0, 1)
-		slider.ScrollBar.ScrollUpButton:SetDisabledTexture ([[Interface\Buttons\Arrow-Up-Disabled]])
-		slider.ScrollBar.ScrollUpButton:GetDisabledTexture():SetTexCoord (0, 1, 0, 1)
+			local disabledTexture = slider.ScrollBar.ScrollUpButton.Disabled
+			disabledTexture:SetTexture ([[Interface\Buttons\Arrow-Up-Disabled]])
+			disabledTexture:SetTexCoord (0, 1, .2, 1)
+			disabledTexture:SetAlpha (.5)
+			
+			disabledTexture:SetPoint ("topleft", slider.ScrollBar.ScrollUpButton, "topleft", 1, 0)
+			disabledTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollUpButton, "bottomright", 1, 0)
+			
+			slider.ScrollBar.ScrollUpButton:SetSize (16, 16)
+			slider.ScrollBar.ScrollUpButton:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = "Interface\\Tooltips\\UI-Tooltip-Background"})
+			slider.ScrollBar.ScrollUpButton:SetBackdropColor (0, 0, 0, 0.3)
+			slider.ScrollBar.ScrollUpButton:SetBackdropBorderColor (0, 0, 0, 1)
+			
+			--it was having problems with the texture anchor when calling ClearAllPoints() and setting new points different from the original
+			--now it is using the same points from the original with small offsets tp align correctly
+		end
+		
+		--down button
+		do
+			local normalTexture = slider.ScrollBar.ScrollDownButton.Normal
+			normalTexture:SetTexture ([[Interface\Buttons\Arrow-Down-Up]])
+			normalTexture:SetTexCoord (0, 1, 0, .8)
+			
+			normalTexture:SetPoint ("topleft", slider.ScrollBar.ScrollDownButton, "topleft", 1, -4)
+			normalTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollDownButton, "bottomright", 1, -4)
+			
+			local pushedTexture = slider.ScrollBar.ScrollDownButton.Pushed
+			pushedTexture:SetTexture ([[Interface\Buttons\Arrow-Down-Down]])
+			pushedTexture:SetTexCoord (0, 1, 0, .8)
+			
+			pushedTexture:SetPoint ("topleft", slider.ScrollBar.ScrollDownButton, "topleft", 1, -4)
+			pushedTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollDownButton, "bottomright", 1, -4)
+			
+			local disabledTexture = slider.ScrollBar.ScrollDownButton.Disabled
+			disabledTexture:SetTexture ([[Interface\Buttons\Arrow-Down-Disabled]])
+			disabledTexture:SetTexCoord (0, 1, 0, .8)
+			disabledTexture:SetAlpha (.5)
+			
+			disabledTexture:SetPoint ("topleft", slider.ScrollBar.ScrollDownButton, "topleft", 1, -4)
+			disabledTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollDownButton, "bottomright", 1, -4)
+			
+			slider.ScrollBar.ScrollDownButton:SetSize (16, 16)
+			slider.ScrollBar.ScrollDownButton:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = "Interface\\Tooltips\\UI-Tooltip-Background"})
+			slider.ScrollBar.ScrollDownButton:SetBackdropColor (0, 0, 0, 0.3)
+			slider.ScrollBar.ScrollDownButton:SetBackdropBorderColor (0, 0, 0, 1)
 
-		slider.ScrollBar.ScrollUpButton:SetSize (16, 16)
-		slider.ScrollBar.ScrollUpButton:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = "Interface\\Tooltips\\UI-Tooltip-Background"})
-		slider.ScrollBar.ScrollUpButton:SetBackdropColor (0, 0, 0, 0.3)
-		slider.ScrollBar.ScrollUpButton:SetBackdropBorderColor (0, 0, 0, 1)
-
-		slider.ScrollBar.ScrollUpButton:GetNormalTexture():ClearAllPoints()
-		slider.ScrollBar.ScrollUpButton:GetPushedTexture():ClearAllPoints()
-		slider.ScrollBar.ScrollUpButton:GetDisabledTexture():ClearAllPoints()
-		slider.ScrollBar.ScrollUpButton:GetNormalTexture():SetPoint ("center", slider.ScrollBar.ScrollUpButton, "center", 1, 1)
-		slider.ScrollBar.ScrollUpButton:GetPushedTexture():SetPoint ("center", slider.ScrollBar.ScrollUpButton, "center", 1, 1)
-		slider.ScrollBar.ScrollUpButton:GetDisabledTexture():SetPoint ("center", slider.ScrollBar.ScrollUpButton, "center", 1, 1)
-	
+			--<Anchor point="TOP" relativePoint="BOTTOM"/>
+			--slider.ScrollBar.ScrollDownButton:SetPoint ("top", slider.ScrollBar, "bottom", 0, 0)
+		end
+		
 		--
 		
-		slider.ScrollBar.ScrollDownButton:SetNormalTexture ([[Interface\Buttons\Arrow-Down-Up]])
-		slider.ScrollBar.ScrollDownButton:GetNormalTexture():SetTexCoord (0, 1, 0, 1)
-		slider.ScrollBar.ScrollDownButton:SetPushedTexture ([[Interface\Buttons\Arrow-Down-Down]])
-		slider.ScrollBar.ScrollDownButton:GetPushedTexture():SetTexCoord (0, 1, 0, 1)
-		slider.ScrollBar.ScrollDownButton:SetDisabledTexture ([[Interface\Buttons\Arrow-Down-Disabled]])
-		slider.ScrollBar.ScrollDownButton:GetDisabledTexture():SetTexCoord (0, 1, 0, 1)
-		
-		slider.ScrollBar.ScrollDownButton:SetSize (16, 16)
-		slider.ScrollBar.ScrollDownButton:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = "Interface\\Tooltips\\UI-Tooltip-Background"})
-		slider.ScrollBar.ScrollDownButton:SetBackdropColor (0, 0, 0, 0.3)
-		slider.ScrollBar.ScrollDownButton:SetBackdropBorderColor (0, 0, 0, 1)
-	
-		slider.ScrollBar.ScrollDownButton:GetNormalTexture():ClearAllPoints()
-		slider.ScrollBar.ScrollDownButton:GetPushedTexture():ClearAllPoints()
-		slider.ScrollBar.ScrollDownButton:GetDisabledTexture():ClearAllPoints()
-		slider.ScrollBar.ScrollDownButton:GetNormalTexture():SetPoint ("center", slider.ScrollBar.ScrollDownButton, "center", 1, -5)
-		slider.ScrollBar.ScrollDownButton:GetPushedTexture():SetPoint ("center", slider.ScrollBar.ScrollDownButton, "center", 1, -5)
-		slider.ScrollBar.ScrollDownButton:GetDisabledTexture():SetPoint ("center", slider.ScrollBar.ScrollDownButton, "center", 1, -5)
-	
-		--
 		slider.ScrollBar:SetPoint ("TOPLEFT", slider, "TOPRIGHT", 6, -16)
 		slider.ScrollBar:SetPoint ("BOTTOMLEFT", slider, "BOTTOMRIGHT", 6, 16 + (heightOffset and heightOffset*-1 or 0))
 		
@@ -1508,4 +2078,57 @@
 	end
 end
 
---doo elsee 
\ No newline at end of file
+function DF:GetCurrentSpec()
+	local specIndex = GetSpecialization()
+	if (specIndex) then
+		local specID = GetSpecializationInfo (specIndex)
+		if (specID and specID ~= 0) then
+			return specID
+		end
+	end
+end
+
+local specs_per_class = {
+	["DEMONHUNTER"] = {577, 581},
+	["DEATHKNIGHT"] = {250, 251, 252},
+	["WARRIOR"] = {71, 72, 73},
+	["MAGE"] = {62, 63, 64},
+	["ROGUE"] = {259, 260, 261},
+	["DRUID"] = {102, 103, 104, 105},
+	["HUNTER"] = {253, 254, 255},
+	["SHAMAN"] = {262, 263, 254},
+	["PRIEST"] = {256, 257, 258},
+	["WARLOCK"] = {265, 266, 267},
+	["PALADIN"] = {65, 66, 70},
+	["MONK"] = {268, 269, 270},
+}
+
+function DF:GetClassSpecIDs (class)
+	return specs_per_class [class]
+end
+
+local dispatch_error = function (context, errortext)
+	DF:Msg ( (context or "<no context>") .. " |cFFFF9900error|r: " .. (errortext or "<no error given>"))
+end
+
+--> safe call an external func with payload and without telling who is calling
+function DF:QuickDispatch (func, ...)
+	if (type (func) ~= "function") then
+		return
+	end
+	
+	local okay, errortext = pcall (func, ...)
+	
+	if (not okay) then
+		--> trigger an error msg
+		dispatch_error (_, errortext)
+		return
+	end
+	
+	return true
+end
+
+
+
+--doo elsee 
+--was doing double loops due to not enought height
--- a/Libs/DF/help.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/help.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -120,4 +120,4 @@
 	
 	return help
 	
-end
\ No newline at end of file
+end
--- a/Libs/DF/label.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/label.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -325,4 +325,4 @@
 	end
 	
 	return LabelObject
-end
\ No newline at end of file
+end
--- a/Libs/DF/load.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/load.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -8,6 +8,7 @@
 	<Script file="picture.lua"/>
 	<Script file="slider.lua"/>
 	<Script file="scrollbar.lua"/>
+	<Script file="spells.lua"/>
 	<Script file="math.lua"/>
 	
 	<Include file="tutorial_alert.xml"/>
@@ -21,4 +22,4 @@
 
 	<Script file="pictureedit.lua"/>
 	<Script file="auras.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Libs/DF/math.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -0,0 +1,108 @@
+
+
+local DF = _G ["DetailsFramework"]
+if (not DF or not DetailsFrameworkCanLoad) then
+	return 
+end
+
+local UnitExists = UnitExists
+local atan2 = math.atan2
+local pi = math.pi
+local abs = math.abs 
+
+SMALL_FLOAT = 0.000001
+
+--find distance between two players
+function DF:GetDistance_Unit (unit1, unit2)
+	if (UnitExists (unit1) and UnitExists (unit2)) then
+		local u1X, u1Y = UnitPosition (unit1)
+		local u2X, u2Y = UnitPosition (unit2)
+		
+		local dX = u2X - u1X
+		local dY = u2Y - u1Y
+		
+		return ((dX*dX) + (dY*dY)) ^ .5
+	end
+	return 0
+end
+
+--find distance between two points
+function DF:GetDistance_Point (x1, y1, x2, y2)
+	local dx = x2 - x1
+	local dy = y2 - y1
+	return ((dx * dx) + (dy * dy)) ^ .5
+end
+
+--find a rotation for an object from a point to another point
+function DF:FindLookAtRotation (x1, y1, x2, y2)
+	return atan2 (y2 - y1, x2 - x1) + pi
+end
+
+--find the value scale between two given values. e.g: value of 500 in a range 0-100 result in 10 in a scale for 0-10
+function DF:MapRangeClamped (inputX, inputY, outputX, outputY, value)
+	return DF:GetRangeValue (outputX, outputY, Clamp (DF:GetRangePercent (inputX, inputY, value), 0, 1))
+end
+
+--find the value scale between two given values. e.g: value of 75 in a range 0-100 result in 7.5 in a scale for 0-10
+function DF:MapRangeUnclamped (inputX, inputY, outputX, outputY, value)
+	return DF:GetRangeValue (outputX, outputY, DF:GetRangePercent (inputX, inputY, value))
+end
+
+--find the normalized percent of the value in the range. e.g range of 200-400 and a value of 250 result in 0.25
+function DF:GetRangePercent (minValue, maxValue, value)
+	return (value - minValue) / (maxValue - minValue)
+end
+
+--find the value in the range given from a normalized percent. e.g range of 200-400 and a percent of 0.8 result in 360
+function DF:GetRangeValue (minValue, maxValue, percent)
+	return Lerp (minValue, maxValue, percent)
+end
+
+--dot product of two 2D Vectors
+function DF:GetDotProduct (value1, value2)
+	return (value1.x * value2.x) + (value1.y * value2.y)
+end
+
+--normalized value 0-1 result in the value on the range given, e.g 200-400 range with a value of .5 result in 300
+function DF:LerpNorm (minValue, maxValue, value)
+	return (minValue + value * (maxValue - minValue))
+end
+
+--change the color by the deltaTime
+function DF:LerpLinearColor (deltaTime, interpSpeed, r1, g1, b1, r2, g2, b2)
+	deltaTime = deltaTime * interpSpeed
+	local r = r1 + (r2 - r1) * deltaTime
+	local g = g1 + (g2 - g1) * deltaTime
+	local b = b1 + (b2 - b1) * deltaTime
+	return r, g, b
+end
+
+--check if a number is near another number by a tolerance
+function DF:IsNearlyEqual (value1, value2, tolerance)
+	tolerance = tolerance or SMALL_FLOAT
+	return abs (value1 - value2) <= tolerance
+end
+
+--check if a number is near zero
+function DF:IsNearlyZero (value, tolerance)
+	tolerance = tolerance or SMALL_FLOAT
+	return abs (value) <= tolerance
+end
+
+--check if a number is within a two other numbers, if isInclusive is true, it'll  include the max value
+function DF:IsWithin (minValue, maxValue, value, isInclusive)
+	if (isInclusive) then
+		return ((value >= minValue) and (value <= maxValue))	
+	else
+		return ((value >= minValue) and (value < maxValue))
+	end
+end
+
+--dont allow a number ot be lower or bigger than a certain range
+function DF:Clamp (minValue, maxValue, value)
+	return value < minValue and minValue or value < maxValue and value or maxValue
+end
+
+function DF:ScaleBack ()
+
+end
--- a/Libs/DF/normal_bar.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/normal_bar.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -212,6 +212,11 @@
 
 		return _object._texture:SetVertexColor (_value1, _value2, _value3, _value4)
 	end
+	--> background color
+	local smember_backgroundcolor = function (_object, _value)
+		local _value1, _value2, _value3, _value4 = DF:ParseColors (_value)
+		return _object.background:SetVertexColor (_value1, _value2, _value3, _value4)
+	end
 	--> icon
 	local smember_icon = function (_object, _value)
 		if (type (_value) == "table") then
@@ -255,6 +260,20 @@
 		end
 		return
 	end
+	--> background texture
+	local smember_backgroundtexture = function (_object, _value)
+		if (_value:find ("\\")) then
+			_object.background:SetTexture (_value)
+		else
+			local file = SharedMedia:Fetch ("statusbar", _value)
+			if (file) then
+				_object.background:SetTexture (file)
+			else
+				_object.background:SetTexture (_value)
+			end
+		end
+		return
+	end
 	--> font face
 	local smember_textfont = function (_object, _value)
 		DF:SetFontFace (_object.textleft, _value)
@@ -286,8 +305,10 @@
 	BarMetaFunctions.SetMembers["righttext"] = smember_rtext
 	BarMetaFunctions.SetMembers["lefttext"] = smember_ltext
 	BarMetaFunctions.SetMembers["color"] = smember_color
+	BarMetaFunctions.SetMembers["backgroundcolor"] = smember_backgroundcolor
 	BarMetaFunctions.SetMembers["icon"] = smember_icon
 	BarMetaFunctions.SetMembers["texture"] = smember_texture
+	BarMetaFunctions.SetMembers["backgroundtexture"] = smember_backgroundtexture
 	BarMetaFunctions.SetMembers["fontsize"] = smember_textsize
 	BarMetaFunctions.SetMembers["fontface"] = smember_textfont
 	BarMetaFunctions.SetMembers["fontcolor"] = smember_textcolor
--- a/Libs/DF/normal_bar.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/normal_bar.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -95,4 +95,4 @@
 		</OnLoad>
 	</Scripts>
 	</StatusBar>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/DF/panel.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/panel.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -29,6 +29,40 @@
 
 local PanelMetaFunctions = _G [DF.GlobalWidgetControlNames ["panel"]]
 
+--> mixin for options functions
+DF.OptionsFunctions = {
+	SetOption = function (self, optionName, optionValue)
+		if (self.options) then
+			self.options [optionName] = optionValue
+		else
+			self.options = {}
+			self.options [optionName] = optionValue
+		end
+	end,
+	
+	GetOption = function (self, optionName)
+		return self.options and self.options [optionName]
+	end,
+	
+	GetAllOptions = function (self)
+		if (self.options) then
+			local optionsTable = {}
+			for key, _ in pairs (self.options) do
+				optionsTable [#optionsTable + 1] = key
+			end
+			return optionsTable
+		else
+			return {}
+		end
+	end,
+	
+	BuildOptionsTable = function (self, defaultOptions, userOptions)
+		self.options = self.options or {}
+		DF.table.deploy (self.options, userOptions or {})
+		DF.table.deploy (self.options, defaultOptions or {})
+	end
+}
+
 ------------------------------------------------------------------------------------------------------------
 --> metatables
 
@@ -1216,19 +1250,21 @@
 	
 		DF.IconPickFrame = CreateFrame ("frame", "DetailsFrameworkIconPickFrame", UIParent)
 		tinsert (UISpecialFrames, "DetailsFrameworkIconPickFrame")
-		DF.IconPickFrame:SetFrameStrata ("DIALOG")
+		DF.IconPickFrame:SetFrameStrata ("TOOLTIP")
 		
 		DF.IconPickFrame:SetPoint ("center", UIParent, "center")
 		DF.IconPickFrame:SetWidth (350)
-		DF.IconPickFrame:SetHeight (227)
+		DF.IconPickFrame:SetHeight (277)
 		DF.IconPickFrame:EnableMouse (true)
 		DF.IconPickFrame:SetMovable (true)
 		
+		DF:CreateTitleBar (DF.IconPickFrame, "Icon Picker")
+		
 		DF.IconPickFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
 
 		DF.IconPickFrame:SetBackdropBorderColor (0, 0, 0)
 		DF.IconPickFrame:SetBackdropColor (24/255, 24/255, 24/255, .8)
-		DF.IconPickFrame:SetFrameLevel (1)
+		DF.IconPickFrame:SetFrameLevel (5000)
 		
 		DF.IconPickFrame:SetScript ("OnMouseDown", function (self)
 			if (not self.isMoving) then
@@ -1249,16 +1285,29 @@
 		
 		DF.IconPickFrame.preview =  CreateFrame ("frame", nil, UIParent)
 		DF.IconPickFrame.preview:SetFrameStrata ("tooltip")
+		DF.IconPickFrame.preview:SetFrameLevel (6001)
 		DF.IconPickFrame.preview:SetSize (76, 76)
+		
+		local preview_image_bg = DF:NewImage (DF.IconPickFrame.preview, nil, 76, 76)
+		preview_image_bg:SetDrawLayer ("background", 0)
+		preview_image_bg:SetAllPoints (DF.IconPickFrame.preview)
+		preview_image_bg:SetColorTexture (0, 0, 0)
+		
 		local preview_image = DF:NewImage (DF.IconPickFrame.preview, nil, 76, 76)
 		preview_image:SetAllPoints (DF.IconPickFrame.preview)
+		
 		DF.IconPickFrame.preview.icon = preview_image
 		DF.IconPickFrame.preview:Hide()
 		
+		--serach
 		DF.IconPickFrame.searchLabel =  DF:NewLabel (DF.IconPickFrame, nil, "$parentSearchBoxLabel", nil, "search:", font, size, color)
-		DF.IconPickFrame.searchLabel:SetPoint ("topleft", DF.IconPickFrame, "topleft", 12, -20)
+		DF.IconPickFrame.searchLabel:SetPoint ("topleft", DF.IconPickFrame, "topleft", 12, -36)
+		DF.IconPickFrame.searchLabel:SetTemplate (DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE"))
+		
 		DF.IconPickFrame.search = DF:NewTextEntry (DF.IconPickFrame, nil, "$parentSearchBox", nil, 140, 20)
 		DF.IconPickFrame.search:SetPoint ("left", DF.IconPickFrame.searchLabel, "right", 2, 0)
+		DF.IconPickFrame.search:SetTemplate (DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
+		
 		DF.IconPickFrame.search:SetHook ("OnTextChanged", function() 
 			DF.IconPickFrame.searching = DF.IconPickFrame.search:GetText()
 			if (DF.IconPickFrame.searching == "") then
@@ -1273,12 +1322,48 @@
 			end
 		end)
 		
+		--manually enter the icon path
+		DF.IconPickFrame.customIcon = DF:CreateLabel (DF.IconPickFrame, "Icon Path:", DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE"))
+		DF.IconPickFrame.customIcon:SetPoint ("bottomleft", DF.IconPickFrame, "bottomleft", 12, 16)
+		
+		DF.IconPickFrame.customIconEntry = DF:CreateTextEntry (DF.IconPickFrame, function()end, 200, 20, "CustomIconEntry", _, _, DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
+		DF.IconPickFrame.customIconEntry:SetPoint ("left", DF.IconPickFrame.customIcon, "right", 2, 0)
+		
+		DF.IconPickFrame.customIconEntry:SetHook ("OnTextChanged", function() 
+			DF.IconPickFrame.preview:SetPoint ("bottom", DF.IconPickFrame.customIconEntry.widget, "top", 0, 2)
+			DF.IconPickFrame.preview.icon:SetTexture (DF.IconPickFrame.customIconEntry:GetText())
+			DF.IconPickFrame.preview:Show()
+		end)
+		
+		DF.IconPickFrame.customIconEntry:SetHook ("OnEnter", function() 
+			DF.IconPickFrame.preview:SetPoint ("bottom", DF.IconPickFrame.customIconEntry.widget, "top", 0, 2)
+			DF.IconPickFrame.preview.icon:SetTexture (DF.IconPickFrame.customIconEntry:GetText())
+			DF.IconPickFrame.preview:Show()
+		end)
+		
 		--> close button
 		local close_button = CreateFrame ("button", nil, DF.IconPickFrame, "UIPanelCloseButton")
 		close_button:SetWidth (32)
 		close_button:SetHeight (32)
 		close_button:SetPoint ("TOPRIGHT", DF.IconPickFrame, "TOPRIGHT", -8, -7)
 		close_button:SetFrameLevel (close_button:GetFrameLevel()+2)
+		close_button:SetAlpha (0) --just hide, it is used below
+		
+		--> accept custom icon button
+		local accept_custom_icon = function()
+			local path = DF.IconPickFrame.customIconEntry:GetText()
+			
+			DF:QuickDispatch (DF.IconPickFrame.callback, path, DF.IconPickFrame.param1, DF.IconPickFrame.param2)
+			
+			if (DF.IconPickFrame.click_close) then
+				close_button:Click()
+			end
+		end
+		
+		DF.IconPickFrame.customIconAccept = DF:CreateButton (DF.IconPickFrame, accept_custom_icon, 82, 20, "Accept", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE"))
+		DF.IconPickFrame.customIconAccept:SetPoint ("left", DF.IconPickFrame.customIconEntry, "right", 2, 0)
+		
+		--fill with icons
 		
 		local MACRO_ICON_FILENAMES = {}
 		local SPELLNAMES_CACHE = {}
@@ -1320,18 +1405,25 @@
 			GetLooseMacroIcons (MACRO_ICON_FILENAMES)
 			GetMacroIcons (MACRO_ICON_FILENAMES)
 			GetMacroItemIcons (MACRO_ICON_FILENAMES)
-
+			
+			--reset the custom icon text entry
+			DF.IconPickFrame.customIconEntry:SetText ("")
+			--reset the search text entry
+			DF.IconPickFrame.search:SetText ("")
 		end)
 		
 		DF.IconPickFrame:SetScript ("OnHide", function()
 			wipe (MACRO_ICON_FILENAMES)
+			DF.IconPickFrame.preview:Hide()
 			collectgarbage()
 		end)
 		
 		DF.IconPickFrame.buttons = {}
 		
 		local OnClickFunction = function (self) 
-			DF.IconPickFrame.callback (self.icon:GetTexture(), DF.IconPickFrame.param1, DF.IconPickFrame.param2)
+		
+			DF:QuickDispatch (DF.IconPickFrame.callback, self.icon:GetTexture(), DF.IconPickFrame.param1, DF.IconPickFrame.param2)
+			
 			if (DF.IconPickFrame.click_close) then
 				close_button:Click()
 			end
@@ -1362,7 +1454,7 @@
 			newcheck:SetScript ("OnClick", OnClickFunction)
 			newcheck.param1 = i+1
 			
-			newcheck:SetPoint ("topleft", DF.IconPickFrame, "topleft", 12 + (i*30), -40)
+			newcheck:SetPoint ("topleft", DF.IconPickFrame, "topleft", 12 + (i*30), -60)
 			newcheck:SetID (i+1)
 			DF.IconPickFrame.buttons [#DF.IconPickFrame.buttons+1] = newcheck
 			newcheck:SetScript ("OnEnter", onenter)
@@ -1455,6 +1547,7 @@
 		end
 		
 		local scroll = CreateFrame ("ScrollFrame", "DetailsFrameworkIconPickFrameScroll", DF.IconPickFrame, "ListScrollFrameTemplate")
+		DF:ReskinSlider (scroll)
 
 		local ChecksFrame_Update = function (self)
 
@@ -1527,7 +1620,7 @@
 
 		DF.IconPickFrame.updateFunc = ChecksFrame_Update
 		
-		scroll:SetPoint ("topleft", DF.IconPickFrame, "topleft", -18, -37)
+		scroll:SetPoint ("topleft", DF.IconPickFrame, "topleft", -18, -58)
 		scroll:SetWidth (330)
 		scroll:SetHeight (178)
 		scroll:SetScript ("OnVerticalScroll", function (self, offset) FauxScrollFrame_OnVerticalScroll (scroll, offset, 20, ChecksFrame_Update) end)
@@ -1609,9 +1702,12 @@
 local SimplePanel_frame_backdrop_color = {0, 0, 0, 0.9}
 local SimplePanel_frame_backdrop_border_color = {0, 0, 0, 1}
 
+--with_label was making the frame stay in place while its parent moves
+--the slider was anchoring to with_label and here here were anchoring the slider again
 function DF:CreateScaleBar (frame, config)
-	local scaleBar = DF:CreateSlider (frame, 120, 14, 0.6, 1.6, 0.1, config.scale, true, "ScaleBar", nil, "Scale:", DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE"), DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
-	scaleBar:SetPoint ("right", frame.Close, "left", -26, 0)
+	local scaleBar, text = DF:CreateSlider (frame, 120, 14, 0.6, 1.6, 0.1, config.scale, true, "ScaleBar", nil, "Scale:", DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE"), DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE"))
+	--scaleBar:SetPoint ("right", frame.Close, "left", -26, 0)
+	text:SetPoint ("topleft", frame, "topleft", 12, -7)
 	scaleBar:SetFrameLevel (DF.FRAMELEVEL_OVERLAY)
 	scaleBar.OnValueChanged = function (_, _, value)
 		config.scale = value
@@ -1622,6 +1718,10 @@
 	scaleBar:SetHook ("OnMouseUp", function()
 		frame:SetScale (config.scale)
 	end)
+	
+	scaleBar:SetAlpha (0.2)
+	
+	return scaleBar
 end
 
 local no_options = {}
@@ -3531,15 +3631,20 @@
 		tabButton.mainFrame = mainFrame
 		DF.TabContainerFunctions.CreateUnderlineGlow (tabButton)
 		
+		local right_click_to_back
 		if (i == 1) then
-			local right_click_to_back = DF:CreateLabel (f, "right click to close", 10, "gray")
+			right_click_to_back = DF:CreateLabel (f, "right click to close", 10, "gray")
 			right_click_to_back:SetPoint ("bottomright", f, "bottomright", -1, 0)
 			f.IsFrontPage = true
 		else
-			local right_click_to_back = DF:CreateLabel (f, "right click to go back to main menu", 10, "gray")
+			right_click_to_back = DF:CreateLabel (f, "right click to go back to main menu", 10, "gray")
 			right_click_to_back:SetPoint ("bottomright", f, "bottomright", -1, 0)
 		end
 		
+		if (options_table.hide_click_label) then
+			right_click_to_back:Hide()
+		end
+		
 		f:SetScript ("OnMouseDown", DF.TabContainerFunctions.OnMouseDown)
 		f:SetScript ("OnMouseUp", DF.TabContainerFunctions.OnMouseUp)
 		
@@ -3607,6 +3712,18 @@
 		widget:SetHook ("OnEnter", simple_list_box_onenter)
 		widget:SetHook ("OnLeave", simple_list_box_onleave)
 		widget.textcolor = self.options.textcolor
+		widget.textsize = self.options.text_size
+		widget.onleave_backdrop = self.options.backdrop_color
+		
+		widget.XButton = DF:CreateButton (widget, function()end, 16, 16)
+		widget.XButton:SetPoint ("topright", widget.widget, "topright")
+		widget.XButton:SetIcon ([[Interface\BUTTONS\UI-Panel-MinimizeButton-Up]], 16, 16, "overlay", nil, nil, 0, -4, 0, false)
+		widget.XButton.icon:SetDesaturated (true)
+		
+		if (not self.options.show_x_button) then
+			widget.XButton:Hide()
+		end
+		
 		tinsert (self.widgets, widget)
 	end
 	self.nextWidget = self.nextWidget + 1
@@ -3620,16 +3737,29 @@
 		local widget = self:GetOrCreateWidget()
 		widget:SetPoint ("topleft", self, "topleft", 1, -self.options.row_height * (self.nextWidget-2) - 4)
 		widget:SetPoint ("topright", self, "topright", -1, -self.options.row_height * (self.nextWidget-2) - 4)
+		
 		widget:SetClickFunction (self.func, value)
+		
+		if (self.options.show_x_button) then
+			widget.XButton:SetClickFunction (self.options.x_button_func, value)
+			widget.XButton.value = value
+			widget.XButton:Show()
+		else
+			widget.XButton:Hide()
+		end
+		
 		widget.value = value
 		
 		if (self.options.icon) then
 			if (type (self.options.icon) == "string" or type (self.options.icon) == "number") then
-				widget:SetIcon (self.options.icon, self.options.row_height, self.options.row_height)
+				local coords = type (self.options.iconcoords) == "table" and self.options.iconcoords or {0, 1, 0, 1}
+				widget:SetIcon (self.options.icon, self.options.row_height - 2, self.options.row_height - 2, "overlay", coords)
+				
 			elseif (type (self.options.icon) == "function") then
 				local icon = self.options.icon (value)
 				if (icon) then
-					widget:SetIcon (icon, self.options.row_height, self.options.row_height)
+					local coords = type (self.options.iconcoords) == "table" and self.options.iconcoords or {0, 1, 0, 1}
+					widget:SetIcon (icon, self.options.row_height - 2, self.options.row_height - 2, "overlay", coords)
 				end
 			end
 		else
@@ -3652,6 +3782,10 @@
 		end
 		
 		widget.value = value
+		
+		local r, g, b, a = DF:ParseColors (self.options.backdrop_color)
+		widget:SetBackdropColor (r, g, b, a)
+		
 		widget:Show()
 		amt = amt + 1
 	end
@@ -3669,7 +3803,12 @@
 	width = 230, 
 	icon = false, 
 	text = "",
+	text_size = 10,
 	textcolor = "wheat",
+	
+	backdrop_color = {1, 1, 1, .5},
+	panel_border_color = {0, 0, 0, 0.5},
+	
 	onenter = function (self, capsule)
 		if (capsule) then
 			capsule.textcolor = "white"
@@ -3697,16 +3836,27 @@
 	f.nextWidget = 1
 	f.list_table = list_table
 	f.func = function (self, button, value)
-		onclick (value)
+		--onclick (value)
+		DF:QuickDispatch (onclick, value)
 		f:Refresh()
 	end
 	f.widgets = {}
-	f:SetBackdrop (backdrop)
-	f:SetBackdropColor (0, 0, 0, 0.3)
-	f:SetBackdropBorderColor (0, 0, 0, 0.5)
+	
+	DF:ApplyStandardBackdrop (f)
+	
 	f.options = options or {}
 	self.table.deploy (f.options, default_options)
 	
+	if (f.options.x_button_func) then
+		local original_X_function = f.options.x_button_func
+		f.options.x_button_func = function (self, button, value)
+			DF:QuickDispatch (original_X_function, value)
+			f:Refresh()
+		end
+	end
+	
+	f:SetBackdropBorderColor (unpack (f.options.panel_border_color))
+	
 	f:SetSize (f.options.width + 2, f.options.height)
 	
 	local name = DF:CreateLabel (f, title, 12, "silver")
@@ -3899,6 +4049,8 @@
 function DF:CreateScrollBox (parent, name, refresh_func, data, width, height, line_amount, line_height, create_line_func, auto_amount, no_scroll)
 	local scroll = CreateFrame ("scrollframe", name, parent, "FauxScrollFrameTemplate")
 	
+	DF:ApplyStandardBackdrop (scroll)
+	
 	scroll:SetSize (width, height)
 	scroll.LineAmount = line_amount
 	scroll.LineHeight = line_height
@@ -3950,3 +4102,833 @@
 		return leftResizer, rightResizer
 	end
 end
+
+
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- ~keybind
+
+
+--------------------------------
+--> keybind frame ~key
+
+
+local ignoredKeys = {
+	["LSHIFT"] = true,
+	["RSHIFT"] = true,
+	["LCTRL"] = true,
+	["RCTRL"] = true,
+	["LALT"] = true,
+	["RALT"] = true,
+	["UNKNOWN"] = true,
+}
+
+local mouseKeys = {
+	["LeftButton"] = "type1",
+	["RightButton"] = "type2",
+	["MiddleButton"] = "type3",
+	["Button4"] = "type4",
+	["Button5"] = "type5",
+	["Button6"] = "type6",
+	["Button7"] = "type7",
+	["Button8"] = "type8",
+	["Button9"] = "type9",
+	["Button10"] = "type10",
+	["Button11"] = "type11",
+	["Button12"] = "type12",
+	["Button13"] = "type13",
+	["Button14"] = "type14",
+	["Button15"] = "type15",
+	["Button16"] = "type16",
+}
+
+local keysToMouse = {
+	["type1"] = "LeftButton",
+	["type2"] = "RightButton",
+	["type3"] = "MiddleButton",
+	["type4"] = "Button4",
+	["type5"] = "Button5",
+	["type6"] = "Button6",
+	["type7"] = "Button7",
+	["type8"] = "Button8",
+	["type9"] = "Button9",
+	["type10"] = "Button10",
+	["type11"] = "Button11",
+	["type12"] = "Button12",
+	["type13"] = "Button13",
+	["type14"] = "Button14",
+	["type15"] = "Button15",
+	["type16"] = "Button16",
+}
+
+local keybind_set_data = function (self, new_data_table)
+	self.Data = new_data_table
+	self.keybindScroll:UpdateScroll()
+end
+
+function DF:CreateKeybindBox (parent, name, data, callback, width, height, line_amount, line_height)
+	
+	local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")
+	local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
+	local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")
+	local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE")
+	local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")
+	
+	local SCROLL_ROLL_AMOUNT = line_amount
+	
+	--keybind set frame
+	local new_keybind_frame = CreateFrame ("frame", name, parent)
+	new_keybind_frame:SetSize (width, height)
+	
+	-- keybind scrollframe
+	local keybindScroll = CreateFrame ("scrollframe", "$parentScrollFrame", new_keybind_frame, "FauxScrollFrameTemplate")
+	keybindScroll:SetSize (1019, 348)
+	keybindScroll.Frames = {}
+	new_keybind_frame.keybindScroll = keybindScroll
+	
+	--waiting the player to press a key
+	new_keybind_frame.IsListening = false
+	
+	--check for valid data table
+	if (type (data) ~= "table") then
+		print ("error: data must be a table. DF > CreateKeybindBox()")
+		return
+	end
+
+	if (not next (data)) then
+		--> build data table for the character class
+		local _, unitClass = UnitClass ("player")
+		if (unitClass) then
+			local specIds = DF:GetClassSpecIDs (unitClass)
+			if (specIds) then
+				for _, specId in ipairs (specIds) do
+					data [specId] = {}
+				end
+			end
+		end
+	end
+	
+	new_keybind_frame.Data = data
+	new_keybind_frame.SetData = keybind_set_data
+	
+	new_keybind_frame.EditingSpec = DF:GetCurrentSpec()
+	new_keybind_frame.CurrentKeybindEditingSet = new_keybind_frame.Data [new_keybind_frame.EditingSpec]
+	
+	local allSpecButtons = {}
+	local switch_spec = function (self, button, specID)
+		new_keybind_frame.EditingSpec = specID
+		new_keybind_frame.CurrentKeybindEditingSet = new_keybind_frame.Data [specID]
+		
+		for _, button in ipairs (allSpecButtons) do
+			button.selectedTexture:Hide()
+		end
+		self.MyObject.selectedTexture:Show()
+		
+		--feedback ao jogador uma vez que as keybinds podem ter o mesmo valor
+		C_Timer.After (.04, function() new_keybind_frame:Hide() end)
+		C_Timer.After (.06, function() new_keybind_frame:Show() end)
+		
+		--atualiza a scroll
+		keybindScroll:UpdateScroll()
+	end
+
+	--choose which spec to use
+	local spec1 = DF:CreateButton (new_keybind_frame, switch_spec, 160, 20, "Spec1 Placeholder Text", 1, _, _, "SpecButton1", _, 0, options_button_template, options_text_template)
+	local spec2 = DF:CreateButton (new_keybind_frame, switch_spec, 160, 20, "Spec2 Placeholder Text", 1, _, _, "SpecButton2", _, 0, options_button_template, options_text_template)
+	local spec3 = DF:CreateButton (new_keybind_frame, switch_spec, 160, 20, "Spec3 Placeholder Text", 1, _, _, "SpecButton3", _, 0, options_button_template, options_text_template)
+	local spec4 = DF:CreateButton (new_keybind_frame, switch_spec, 160, 20, "Spec4 Placeholder Text", 1, _, _, "SpecButton4", _, 0, options_button_template, options_text_template)
+	
+	--format the button label and icon with the spec information
+	local className, class = UnitClass ("player")
+	local i = 1
+	local specIds = DF:GetClassSpecIDs (class)
+	
+	for index, specId in ipairs (specIds) do
+		local button = new_keybind_frame ["SpecButton" .. index]
+		local spec_id, spec_name, spec_description, spec_icon, spec_background, spec_role, spec_class = GetSpecializationInfoByID (specId)
+		button.text = spec_name
+		button:SetClickFunction (switch_spec, specId)
+		button:SetIcon (spec_icon)
+		button.specID = specId
+		
+		local selectedTexture = button:CreateTexture (nil, "background")
+		selectedTexture:SetAllPoints()
+		selectedTexture:SetColorTexture (1, 1, 1, 0.5)
+		if (specId ~= new_keybind_frame.EditingSpec) then
+			selectedTexture:Hide()
+		end
+		button.selectedTexture = selectedTexture
+		
+		tinsert (allSpecButtons, button)
+		i = i + 1
+	end
+	
+	local specsTitle = DF:CreateLabel (new_keybind_frame, "Config keys for spec:", 12, "silver")
+	specsTitle:SetPoint ("topleft", new_keybind_frame, "topleft", 10, mainStartY)
+	
+	keybindScroll:SetPoint ("topleft", specsTitle.widget, "bottomleft", 0, -120)
+	
+	spec1:SetPoint ("topleft", specsTitle, "bottomleft", 0, -10)
+	spec2:SetPoint ("topleft", specsTitle, "bottomleft", 0, -30)
+	spec3:SetPoint ("topleft", specsTitle, "bottomleft", 0, -50)
+	if (class == "DRUID") then
+		spec4:SetPoint ("topleft", specsTitle, "bottomleft", 0, -70)
+	end
+	
+	local enter_the_key = CreateFrame ("frame", nil, new_keybind_frame)
+	enter_the_key:SetFrameStrata ("tooltip")
+	enter_the_key:SetSize (200, 60)
+	enter_the_key:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1})
+	enter_the_key:SetBackdropColor (0, 0, 0, 1)
+	enter_the_key:SetBackdropBorderColor (1, 1, 1, 1)
+	enter_the_key.text = DF:CreateLabel (enter_the_key, "- Press a keyboard key to bind.\n- Click to bind a mouse button.\n- Press escape to cancel.", 11, "orange")
+	enter_the_key.text:SetPoint ("center", enter_the_key, "center")
+	enter_the_key:Hide()
+	
+	local registerKeybind = function (self, key) 
+		if (ignoredKeys [key]) then
+			return
+		end
+		if (key == "ESCAPE") then
+			enter_the_key:Hide()
+			new_keybind_frame.IsListening = false
+			new_keybind_frame:SetScript ("OnKeyDown", nil)
+			return
+		end
+		
+		local bind = (IsShiftKeyDown() and "SHIFT-" or "") .. (IsControlKeyDown() and "CTRL-" or "") .. (IsAltKeyDown() and "ALT-" or "")
+		bind = bind .. key
+	
+		--adiciona para a tabela de keybinds
+		local keybind = new_keybind_frame.CurrentKeybindEditingSet [self.keybindIndex]
+		keybind.key = bind
+		
+		new_keybind_frame.IsListening = false
+		new_keybind_frame:SetScript ("OnKeyDown", nil)
+		
+		enter_the_key:Hide()
+		new_keybind_frame.keybindScroll:UpdateScroll()
+		
+		DF:QuickDispatch (callback)
+	end
+	
+	local set_keybind_key = function (self, button, keybindIndex)
+		if (new_keybind_frame.IsListening) then
+			key = mouseKeys [button] or button
+			return registerKeybind (new_keybind_frame, key)
+		end
+		new_keybind_frame.IsListening = true
+		new_keybind_frame.keybindIndex = keybindIndex
+		new_keybind_frame:SetScript ("OnKeyDown", registerKeybind)
+		
+		enter_the_key:Show()
+		enter_the_key:SetPoint ("bottom", self, "top")
+	end
+	
+	local new_key_bind = function (self, button, specID)
+		tinsert (new_keybind_frame.CurrentKeybindEditingSet, {key = "-none-", action = "_target", actiontext = ""})
+		FauxScrollFrame_SetOffset (new_keybind_frame.keybindScroll, max (#new_keybind_frame.CurrentKeybindEditingSet-SCROLL_ROLL_AMOUNT, 0))
+		new_keybind_frame.keybindScroll:UpdateScroll()
+	end	
+	
+	local set_action_text = function (keybindIndex, _, text)
+		local keybind = new_keybind_frame.CurrentKeybindEditingSet [keybindIndex]
+		keybind.actiontext = text
+		DF:QuickDispatch (callback)
+	end
+	
+	local set_action_on_espace_press = function (textentry, capsule)
+		capsule = capsule or textentry.MyObject
+		local keybind = new_keybind_frame.CurrentKeybindEditingSet [capsule.CurIndex]
+		textentry:SetText (keybind.actiontext)
+		DF:QuickDispatch (callback)
+	end
+	
+	local lock_textentry = {
+		["_target"] = true,
+		["_taunt"] = true,
+		["_interrupt"] = true,
+		["_dispel"] = true,
+		["_spell"] = false,
+		["_macro"] = false,
+	}
+	
+	local change_key_action = function (self, keybindIndex, value)
+		local keybind = new_keybind_frame.CurrentKeybindEditingSet [keybindIndex]
+		keybind.action = value
+		new_keybind_frame.keybindScroll:UpdateScroll()
+		DF:QuickDispatch (callback)
+	end
+	local fill_action_dropdown = function()
+	
+		local locClass, class = UnitClass ("player")
+		
+		local taunt = ""
+		local interrupt = ""
+		local dispel = ""
+		
+		if (type (dispel) == "table") then
+			local dispelString = "\n"
+			for specID, spellid in pairs (dispel) do
+				local specid, specName = GetSpecializationInfoByID (specID)
+				local spellName = GetSpellInfo (spellid)
+				dispelString = dispelString .. "|cFFE5E5E5" .. specName .. "|r: |cFFFFFFFF" .. spellName .. "\n"
+			end
+			dispel = dispelString
+		else
+			dispel = ""
+		end
+		
+		return {
+			--{value = "_target", label = "Target", onclick = change_key_action, desc = "Target the unit"},
+			--{value = "_taunt", label = "Taunt", onclick = change_key_action, desc = "Cast the taunt spell for your class\n\n|cFFFFFFFFSpell: " .. taunt},
+			--{value = "_interrupt", label = "Interrupt", onclick = change_key_action, desc = "Cast the interrupt spell for your class\n\n|cFFFFFFFFSpell: " .. interrupt},
+			--{value = "_dispel", label = "Dispel", onclick = change_key_action, desc = "Cast the interrupt spell for your class\n\n|cFFFFFFFFSpell: " .. dispel},
+			{value = "_spell", label = "Cast Spell", onclick = change_key_action, desc = "Type the spell name in the text box"},
+			{value = "_macro", label = "Run Macro", onclick = change_key_action, desc = "Type your macro in the text box"},
+		}
+	end
+	
+	local copy_keybind = function (self, button, keybindIndex)
+		local keybind = new_keybind_frame.CurrentKeybindEditingSet [keybindIndex]
+		for specID, t in pairs (new_keybind_frame.Data) do
+			if (specID ~= new_keybind_frame.EditingSpec) then
+				local key = CopyTable (keybind)
+				local specid, specName = GetSpecializationInfoByID (specID)
+				tinsert (new_keybind_frame.Data [specID], key)
+				DF:Msg ("Keybind copied to " .. specName)
+			end
+		end
+		DF:QuickDispatch (callback)
+	end
+	
+	local delete_keybind = function (self, button, keybindIndex)
+		tremove (new_keybind_frame.CurrentKeybindEditingSet, keybindIndex)
+		new_keybind_frame.keybindScroll:UpdateScroll()
+		DF:QuickDispatch (callback)
+	end
+	
+	local newTitle = DF:CreateLabel (new_keybind_frame, "Create a new Keybind:", 12, "silver")
+	newTitle:SetPoint ("topleft", new_keybind_frame, "topleft", 200, mainStartY)
+	local createNewKeybind = DF:CreateButton (new_keybind_frame, new_key_bind, 160, 20, "New Key Bind", 1, _, _, "NewKeybindButton", _, 0, options_button_template, options_text_template)
+	createNewKeybind:SetPoint ("topleft", newTitle, "bottomleft", 0, -10)
+	--createNewKeybind:SetIcon ([[Interface\Buttons\UI-GuildButton-PublicNote-Up]])
+
+	local update_keybind_list = function (self)
+		
+		local keybinds = new_keybind_frame.CurrentKeybindEditingSet
+		FauxScrollFrame_Update (self, #keybinds, SCROLL_ROLL_AMOUNT, 21)
+		local offset = FauxScrollFrame_GetOffset (self)
+		
+		for i = 1, SCROLL_ROLL_AMOUNT do
+			local index = i + offset
+			local f = self.Frames [i]
+			local data = keybinds [index]
+
+			if (data) then
+				--index
+				f.Index.text = index
+				--keybind
+				local keyBindText = keysToMouse [data.key] or data.key
+				
+				keyBindText = keyBindText:gsub ("type1", "LeftButton")
+				keyBindText = keyBindText:gsub ("type2", "RightButton")
+				keyBindText = keyBindText:gsub ("type3", "MiddleButton")
+				
+				f.KeyBind.text = keyBindText
+				f.KeyBind:SetClickFunction (set_keybind_key, index, nil, "left")
+				f.KeyBind:SetClickFunction (set_keybind_key, index, nil, "right")
+				--action
+				f.ActionDrop:SetFixedParameter (index)
+				f.ActionDrop:Select (data.action)
+				--action text
+				f.ActionText.text = data.actiontext
+				f.ActionText:SetEnterFunction (set_action_text, index)
+				f.ActionText.CurIndex = index
+				
+				if (lock_textentry [data.action]) then
+					f.ActionText:Disable()
+				else
+					f.ActionText:Enable()
+				end
+				
+				--copy
+				f.Copy:SetClickFunction (copy_keybind, index)
+				--delete
+				f.Delete:SetClickFunction (delete_keybind, index)
+				
+				f:Show()
+			else
+				f:Hide()
+			end
+		end
+		
+		self:Show()
+	end
+	
+
+	
+	keybindScroll:SetScript ("OnVerticalScroll", function (self, offset)
+		FauxScrollFrame_OnVerticalScroll (self, offset, 21, update_keybind_list)
+	end)
+	keybindScroll.UpdateScroll = update_keybind_list
+	
+	local backdropColor = {.3, .3, .3, .3}
+	local backdropColorOnEnter = {.6, .6, .6, .6}
+	local on_enter = function (self)
+		self:SetBackdropColor (unpack (backdropColorOnEnter))
+	end
+	local on_leave = function (self)
+		self:SetBackdropColor (unpack (backdropColor))
+	end
+	
+	local font = "GameFontHighlightSmall"
+	
+	for i = 1, SCROLL_ROLL_AMOUNT do
+		local f = CreateFrame ("frame", "$KeyBindFrame" .. i, keybindScroll)
+		f:SetSize (1009, 20)
+		f:SetPoint ("topleft", keybindScroll, "topleft", 0, -(i-1)*29)
+		f:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
+		f:SetBackdropColor (unpack (backdropColor))
+		f:SetScript ("OnEnter", on_enter)
+		f:SetScript ("OnLeave", on_leave)
+		tinsert (keybindScroll.Frames, f)
+		
+		f.Index = DF:CreateLabel (f, "1")
+		f.KeyBind = DF:CreateButton (f, set_key_bind, 100, 20, "", _, _, _, "SetNewKeybindButton", _, 0, options_button_template, options_text_template)
+		f.ActionDrop = DF:CreateDropDown (f, fill_action_dropdown, 0, 120, 20, "ActionDropdown", _, options_dropdown_template)
+		f.ActionText = DF:CreateTextEntry (f, function()end, 660, 20, "TextBox", _, _, options_dropdown_template)
+		f.Copy = DF:CreateButton (f, copy_keybind, 20, 20, "", _, _, _, "CopyKeybindButton", _, 0, options_button_template, options_text_template)
+		f.Delete = DF:CreateButton (f, delete_keybind, 16, 20, "", _, _, _, "DeleteKeybindButton", _, 2, options_button_template, options_text_template)
+		
+		f.Index:SetPoint ("left", f, "left", 10, 0)
+		f.KeyBind:SetPoint ("left", f, "left", 43, 0)
+		f.ActionDrop:SetPoint ("left", f, "left", 150, 0)
+		f.ActionText:SetPoint ("left", f, "left", 276, 0)
+		f.Copy:SetPoint ("left", f, "left", 950, 0)
+		f.Delete:SetPoint ("left", f, "left", 990, 0)
+		
+		f.Copy:SetIcon ([[Interface\Buttons\UI-GuildButton-PublicNote-Up]], nil, nil, nil, nil, nil, nil, 4)
+		f.Delete:SetIcon ([[Interface\Buttons\UI-StopButton]], nil, nil, nil, nil, nil, nil, 4)
+		
+		f.Copy.tooltip = "copy this keybind to other specs"
+		f.Delete.tooltip = "erase this keybind"
+		
+		--editbox
+		f.ActionText:SetJustifyH ("left")
+		f.ActionText:SetHook ("OnEscapePressed", set_action_on_espace_press)
+		f.ActionText:SetHook ("OnEditFocusGained", function()
+			local playerSpells = {}
+			local tab, tabTex, offset, numSpells = GetSpellTabInfo (2)
+			for i = 1, numSpells do
+				local index = offset + i
+				local spellType, spellId = GetSpellBookItemInfo (index, "player")
+				if (spellType == "SPELL") then
+					local spellName = GetSpellInfo (spellId)
+					tinsert (playerSpells, spellName)
+				end
+			end
+			f.ActionText.WordList = playerSpells
+		end)
+		
+		f.ActionText:SetAsAutoComplete ("WordList")
+	end
+	
+	local header = CreateFrame ("frame", "$parentOptionsPanelFrameHeader", keybindScroll)
+	header:SetPoint ("bottomleft", keybindScroll, "topleft", 0, 2)
+	header:SetPoint ("bottomright", keybindScroll, "topright", 0, 2)
+	header:SetHeight (16)
+	
+	header.Index = DF:CreateLabel  (header, "Index", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+	header.Key = DF:CreateLabel  (header, "Key", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+	header.Action = DF:CreateLabel  (header, "Action", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+	header.Macro = DF:CreateLabel  (header, "Spell Name / Macro", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+	header.Copy = DF:CreateLabel  (header, "Copy", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+	header.Delete = DF:CreateLabel  (header, "Delete", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+	
+	header.Index:SetPoint ("left", header, "left", 10, 0)
+	header.Key:SetPoint ("left", header, "left", 43, 0)
+	header.Action:SetPoint ("left", header, "left", 150, 0)
+	header.Macro:SetPoint ("left", header, "left", 276, 0)
+	header.Copy:SetPoint ("left", header, "left", 950, 0)
+	header.Delete:SetPoint ("left", header, "left", 990, 0)
+
+	new_keybind_frame:SetScript ("OnShow", function()
+		
+		--new_keybind_frame.EditingSpec = EnemyGrid.CurrentSpec
+		--new_keybind_frame.CurrentKeybindEditingSet = EnemyGrid.CurrentKeybindSet
+		
+		for _, button in ipairs (allSpecButtons) do
+			if (new_keybind_frame.EditingSpec ~= button.specID) then
+				button.selectedTexture:Hide()
+			else
+				button.selectedTexture:Show()
+			end
+		end
+		
+		keybindScroll:UpdateScroll()
+	end)
+	
+	new_keybind_frame:SetScript ("OnHide", function()
+		if (new_keybind_frame.IsListening) then
+			new_keybind_frame.IsListening = false
+			new_keybind_frame:SetScript ("OnKeyDown", nil)
+		end
+	end)
+
+	return new_keybind_frame
+end
+
+function DF:BuildKeybindFunctions (data, prefix)
+
+	--~keybind
+	local classLoc, class = UnitClass ("player")
+	local bindingList = data
+	
+	local bindString = "self:ClearBindings();"
+	local bindKeyBindTypeFunc = [[local unitFrame = ...;]]
+	local bindMacroTextFunc = [[local unitFrame = ...;]]
+	local isMouseBinding
+	
+	for i = 1, #bindingList do
+		local bind = bindingList [i]
+		local bindType
+		
+		--which button to press
+		if (bind.key:find ("type")) then
+			local keyNumber = tonumber (bind.key:match ("%d"))
+			bindType = keyNumber
+			isMouseBinding = true
+		else
+			bindType = prefix .. "" .. i
+			bindString = bindString .. "self:SetBindingClick (0, '" .. bind.key .. "', self:GetName(), '" .. bindType .. "');"
+			bindType = "-" .. prefix .. "" .. i
+			isMouseBinding = nil
+		end
+		
+		--keybind type
+		local shift, alt, ctrl = bind.key:match ("SHIFT"), bind.key:match ("ALT"), bind.key:match ("CTRL")
+		local CommandKeys = alt and alt .. "-" or ""
+		CommandKeys = ctrl and CommandKeys .. ctrl .. "-" or CommandKeys
+		CommandKeys = shift and CommandKeys .. shift .. "-" or CommandKeys
+		
+		local keyBindType
+		if (isMouseBinding) then
+			keyBindType = [[unitFrame:SetAttribute ("@COMMANDtype@BINDTYPE", "macro");]]
+		else
+			keyBindType = [[unitFrame:SetAttribute ("type@BINDTYPE", "macro");]]
+		end
+		
+		keyBindType = keyBindType:gsub ("@BINDTYPE", bindType)
+		keyBindType = keyBindType:gsub ("@COMMAND", CommandKeys)
+		bindKeyBindTypeFunc = bindKeyBindTypeFunc .. keyBindType
+		
+		--spell or macro
+		if (bind.action == "_spell") then
+			local macroTextLine
+			if (isMouseBinding) then
+				macroTextLine = [[unitFrame:SetAttribute ("@COMMANDmacrotext@BINDTYPE", "/cast [@mouseover] @SPELL");]]
+			else
+				macroTextLine = [[unitFrame:SetAttribute ("macrotext@BINDTYPE", "/cast [@mouseover] @SPELL");]]
+			end
+			macroTextLine = macroTextLine:gsub ("@BINDTYPE", bindType)
+			macroTextLine = macroTextLine:gsub ("@SPELL", bind.actiontext)
+			macroTextLine = macroTextLine:gsub ("@COMMAND", CommandKeys)
+			bindMacroTextFunc = bindMacroTextFunc .. macroTextLine
+			
+		elseif (bind.action == "_macro") then
+			local macroTextLine
+			if (isMouseBinding) then
+				macroTextLine = [[unitFrame:SetAttribute ("@COMMANDmacrotext@BINDTYPE", "@MACRO");]]
+			else
+				macroTextLine = [[unitFrame:SetAttribute ("macrotext@BINDTYPE", "@MACRO");]]
+			end
+			macroTextLine = macroTextLine:gsub ("@BINDTYPE", bindType)
+			macroTextLine = macroTextLine:gsub ("@MACRO", bind.actiontext)
+			macroTextLine = macroTextLine:gsub ("@COMMAND", CommandKeys)
+			bindMacroTextFunc = bindMacroTextFunc .. macroTextLine
+			
+		end
+	end
+	
+	--~key
+	local bindTypeFuncLoaded = loadstring (bindKeyBindTypeFunc)
+	local bindMacroFuncLoaded = loadstring (bindMacroTextFunc)
+	
+	if (not bindMacroFuncLoaded or not bindTypeFuncLoaded) then
+		return
+	end
+	
+	return bindString, bindTypeFuncLoaded, bindMacroFuncLoaded
+end
+
+
+function DF:SetKeybindsOnProtectedFrame (frame, bind_string, bind_type_func, bind_macro_func)
+	
+	bind_type_func (frame)
+	bind_macro_func (frame)
+	frame:SetAttribute ("_onenter", bind_string)
+	
+end
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- ~standard backdrop
+
+function DF:ApplyStandardBackdrop (f, darkTheme, alphaScale)
+	alphaScale = alphaScale or 1.0
+
+	if (darkTheme) then
+		f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Cooldown\cooldown2]], tileSize = 32, tile = true})
+		f:SetBackdropBorderColor (0, 0, 0, 1)
+		f:SetBackdropColor (.54, .54, .54, .54 * alphaScale)
+	else
+		f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
+		f:SetBackdropBorderColor (0, 0, 0, 1)
+		f:SetBackdropColor (0, 0, 0, 0.2 * alphaScale)
+	end
+	
+	if (not f.__background) then
+		f.__background = f:CreateTexture (nil, "background")
+	end
+	
+	f.__background:SetColorTexture (0.2317647, 0.2317647, 0.2317647)
+	f.__background:SetVertexColor (0.27, 0.27, 0.27)
+	f.__background:SetAlpha (0.8 * alphaScale)
+	f.__background:SetVertTile (true)
+	f.__background:SetHorizTile (true)
+	f.__background:SetAllPoints()
+end
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- ~title bar
+
+DF.TitleFunctions = {
+
+	SetTitle = function (self, titleText, titleColor, font, size)
+		self.TitleLabel:SetText (titleText or self.TitleLabel:GetText())
+		
+		if (titleColor) then
+			local r, g, b, a = DF:ParseColors (titleColor)
+			self.TitleLabel:SetTextColor (r, g, b, a)
+		end
+		
+		if (font) then
+			DF:SetFontFace (self.TitleLabel, font)
+		end
+		
+		if (size) then
+			DF:SetFontSize (self.TitleLabel, size)
+		end
+	end
+	
+	
+}
+
+function DF:CreateTitleBar (f, titleText)
+
+	local titleBar = CreateFrame ("frame", f:GetName() and f:GetName() .. "TitleBar" or nil, f)
+	titleBar:SetPoint ("topleft", f, "topleft", 2, -3)
+	titleBar:SetPoint ("topright", f, "topright", -2, -3)
+	titleBar:SetHeight (20)
+	titleBar:SetBackdrop (SimplePanel_frame_backdrop) --it's an upload from this file
+	titleBar:SetBackdropColor (.2, .2, .2, 1)
+	titleBar:SetBackdropBorderColor (0, 0, 0, 1)
+	
+	local closeButton = CreateFrame ("button", titleBar:GetName() and titleBar:GetName() .. "CloseButton" or nil, titleBar)
+	closeButton:SetSize (16, 16)
+	closeButton:SetNormalTexture (DF.folder .. "icons")
+	closeButton:SetHighlightTexture (DF.folder .. "icons")
+	closeButton:SetPushedTexture (DF.folder .. "icons")
+	closeButton:GetNormalTexture():SetTexCoord (0, 16/128, 0, 1)
+	closeButton:GetHighlightTexture():SetTexCoord (0, 16/128, 0, 1)
+	closeButton:GetPushedTexture():SetTexCoord (0, 16/128, 0, 1)
+	closeButton:SetAlpha (0.7)
+	closeButton:SetScript ("OnClick", simple_panel_close_click) --upvalue from this file
+	
+	local titleLabel = titleBar:CreateFontString (titleBar:GetName() and titleBar:GetName() .. "TitleText" or nil, "overlay", "GameFontNormal")
+	titleLabel:SetTextColor (.8, .8, .8, 1)
+	titleLabel:SetText (titleText or "")
+	
+	--anchors
+	closeButton:SetPoint ("right", titleBar, "right", -2, 0)
+	titleLabel:SetPoint ("center", titleBar, "center")
+	
+	--members
+	f.TitleBar = titleBar
+	f.CloseButton = closeButton
+	f.TitleLabel = titleLabel
+	
+	DF:Mixin (f, DF.TitleFunctions)
+	
+	return titleBar
+end
+
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- ~icon row
+
+DF.IconRowFunctions = {
+	
+	GetIcon = function (self)
+		local iconFrame = self.IconPool [self.NextIcon]
+		
+		if (not iconFrame) then
+			local newIconFrame = CreateFrame ("cooldown", "$parentIconCooldown" .. self.NextIcon, self, "CooldownFrameTemplate")
+			newIconFrame:SetSize (self.options.icon_width, self.options.icon_height)
+			
+			newIconFrame.Texture = newIconFrame:CreateTexture (nil, "background")
+			newIconFrame.Texture:SetAllPoints()
+			
+			newIconFrame.Text = newIconFrame:CreateFontString (nil, "overlay", "GameFontNormal")
+			newIconFrame.Text:SetPoint ("center")
+			newIconFrame.Text:Hide()
+			
+			newIconFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1})
+			newIconFrame:SetBackdropBorderColor (0, 0, 0, 0)
+			newIconFrame:EnableMouse (false)
+			
+			self.IconPool [self.NextIcon] = newIconFrame
+			iconFrame = newIconFrame
+		end
+		
+		iconFrame:ClearAllPoints()
+		
+		local anchor = self.options.anchor
+		local anchorTo = self.NextIcon == 1 and self or self.IconPool [self.NextIcon - 1]
+		local xPadding = self.NextIcon == 1 and self.options.left_padding or self.options.icon_padding
+		local growDirection = self.options.grow_direction
+
+		if (growDirection == 1) then --grow to right
+			if (self.NextIcon == 1) then
+				iconFrame:SetPoint ("left", anchorTo, "left", xPadding, 0)
+			else
+				iconFrame:SetPoint ("left", anchorTo, "right", xPadding, 0)
+			end
+			
+		elseif (growDirection == 2) then --grow to left
+			if (self.NextIcon == 1) then
+				iconFrame:SetPoint ("right", anchorTo, "right", xPadding, 0)
+			else
+				iconFrame:SetPoint ("right", anchorTo, "left", xPadding, 0)
+			end
+			
+		end
+		
+		DF:SetFontColor (iconFrame.Text, self.options.text_color)
+		
+		self.NextIcon = self.NextIcon + 1
+		return iconFrame
+	end,
+	
+	SetIcon = function (self, spellId, borderColor, startTime, duration)
+		local spellName, _, spellIcon = GetSpellInfo (spellId)
+		
+		if (spellIcon) then
+			local iconFrame = self:GetIcon()
+			iconFrame.Texture:SetTexture (spellIcon)
+			iconFrame.Texture:SetTexCoord (unpack (self.options.texcoord))
+			
+			if (borderColor) then
+				iconFrame:SetBackdropBorderColor (Plater:ParseColors (borderColor))
+			else
+				iconFrame:SetBackdropBorderColor (0, 0, 0 ,0)
+			end			
+
+			if (startTime) then
+				CooldownFrame_Set (iconFrame, startTime, duration, true, true)
+				
+				if (self.options.show_text) then
+					iconFrame.Text:Show()
+					iconFrame.Text:SetText (floor (startTime + duration - GetTime()))
+				else
+					iconFrame.Text:Hide()
+				end
+			else
+				iconFrame.Text:Hide()
+			end
+
+			iconFrame:Show()
+			
+			--> update the size of the frame
+			self:SetWidth ((self.options.left_padding * 2) + (self.options.icon_padding * (self.NextIcon-2)) + (self.options.icon_width * (self.NextIcon - 1)))
+
+			--> show the frame
+			self:Show()
+			
+			return iconFrame
+		end
+	end,
+	
+	ClearIcons = function (self)
+		for i = 1, self.NextIcon -1 do
+			self.IconPool [i]:Hide()
+		end
+		self.NextIcon = 1
+		self:Hide()
+	end,
+	
+	GetIconGrowDirection = function (self)
+		local side = self.options.anchor.side
+		
+		if (side == 1) then
+			return 1
+		elseif (side == 2) then
+			return 2
+		elseif (side == 3) then
+			return 1		
+		elseif (side == 4) then
+			return 1
+		elseif (side == 5) then
+			return 2
+		elseif (side == 6) then
+			return 1
+		elseif (side == 7) then
+			return 2
+		elseif (side == 8) then
+			return 1
+		elseif (side == 9) then
+			return 1
+		elseif (side == 10) then
+			return 1
+		elseif (side == 11) then
+			return 2
+		elseif (side == 12) then
+			return 1
+		elseif (side == 13) then
+			return 1
+		end
+	end
+}
+
+local default_icon_row_options = {
+	icon_width = 20, 
+	icon_height = 20, 
+	texcoord = {.1, .9, .1, .9},
+	show_text = true,
+	text_color = {1, 1, 1, 1},
+	left_padding = 2, --distance between right and left
+	top_padding = 2, --distance between top and bottom 
+	icon_padding = 2, --distance between each icon
+	backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true},
+	backdrop_color = {0, 0, 0, 0.5},
+	backdrop_border_color = {0, 0, 0, 1},
+	anchor = {side = 6, x = 2, y = 0},
+	grow_direction = 1, --1 = to right 2 = to left
+}
+
+function DF:CreateIconRow (parent, name, options)
+	local f = CreateFrame ("frame", name, parent)
+	f.IconPool = {}
+	f.NextIcon = 1
+	
+	DF:Mixin (f, DF.IconRowFunctions)
+	DF:Mixin (f, DF.OptionsFunctions)
+	
+	f:BuildOptionsTable (default_icon_row_options, options)
+	
+	f:SetSize (f.options.icon_width, f.options.icon_height + (f.options.top_padding * 2))
+	f:SetBackdrop (f.options.backdrop)
+	f:SetBackdropColor (unpack (f.options.backdrop_color))
+	f:SetBackdropBorderColor (unpack (f.options.backdrop_border_color))
+	
+	return f
+end
--- a/Libs/DF/panel.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/panel.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -29,4 +29,4 @@
 	
 	</Frame>
 	
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/DF/picture.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/picture.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -295,4 +295,4 @@
 	setmetatable (ImageObject, ImageMetaFunctions)
 	
 	return ImageObject
-end
\ No newline at end of file
+end
--- a/Libs/DF/pictureedit.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/pictureedit.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -598,4 +598,4 @@
 			end
 
 		end
-		
\ No newline at end of file
+		
--- a/Libs/DF/scrollbar.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/scrollbar.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -126,7 +126,7 @@
 		self.precionado = false
 		self:SetScript ("OnUpdate", nil)
 	end)
-	--> isso aqui pra quando o slider ativar, o scroll fica na  posição zero
+	--> isso aqui pra quando o slider ativar, o scroll fica na  posi��o zero
 	botao_cima:SetScript ("OnEnable", function (self)
 		local current = new_slider:GetValue()
 		if (current == 0) then
@@ -232,4 +232,4 @@
 	end
 	
 	return new_slider
-end
\ No newline at end of file
+end
--- a/Libs/DF/slider.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/slider.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -338,7 +338,6 @@
 --> scripts
 
 	local OnEnter = function (slider)
-	
 		if (_rawget (slider.MyObject, "lockdown")) then
 			return
 		end
@@ -362,8 +361,8 @@
 			GameCooltip2:AddLine (slider.MyObject.have_tooltip)
 			GameCooltip2:ShowCooltip (slider, "tooltip")
 		else
-			GameCooltip2:Preset (1)
-			GameCooltip2:AddLine ("Right Click to Type the Value")
+			GameCooltip2:Preset (2)
+			GameCooltip2:AddLine ("Right Click to Type the Value", "", 1, "", "", 10)
 			GameCooltip2:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 16, 16, 0.015625, 0.15671875, 0.640625, 0.798828125)
 			GameCooltip2:ShowCooltip (slider, "tooltip")
 		end
@@ -396,7 +395,6 @@
 
 	local f = CreateFrame ("frame", "DetailsFrameworkSliderButtons1", UIParent)
 	f:Hide()
-	--f:SetBackdrop ({bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], tile = true, tileSize = 5})
 	f:SetHeight (18)
 	
 	local t = 0
@@ -413,8 +411,9 @@
 	function f:ShowMe (host)
 		f:SetPoint ("bottomleft", host, "topleft", -3, -5)
 		f:SetPoint ("bottomright", host, "topright", 3, -5)
-		f:SetFrameStrata (host:GetFrameStrata())
-		f:SetFrameLevel (host:GetFrameLevel())
+		--f:SetFrameStrata (host:GetFrameStrata())
+		f:SetFrameStrata ("FULLSCREEN")
+		f:SetFrameLevel (host:GetFrameLevel() + 1000)
 		f:Show()
 		if (f.is_going_hide) then
 			f:SetScript ("OnUpdate", nil)
@@ -1146,7 +1145,6 @@
 
 	SliderObject.slider:SetBackdrop ({edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", edgeSize = 8})
 	SliderObject.slider:SetBackdropColor (0.9, 0.7, 0.7, 1.0)
-	--SliderObject.slider:SetBackdropColor (0, 0, 0, 1)
 
 	SliderObject.thumb = SliderObject.slider:CreateTexture (nil, "artwork")
 	SliderObject.thumb:SetTexture ("Interface\\Buttons\\UI-ScrollBar-Knob")
@@ -1218,4 +1216,4 @@
 	
 	return SliderObject, with_label
 	
-end
\ No newline at end of file
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Libs/DF/spells.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -0,0 +1,596 @@
+
+local DF = _G ["DetailsFramework"]
+if (not DF or not DetailsFrameworkCanLoad) then
+	return 
+end
+
+DF.CooldownsBySpec = {
+	-- 1 attack cooldown
+	-- 2 personal defensive cooldown
+	-- 3 targetted defensive cooldown
+	-- 4 raid defensive cooldown
+	-- 5 personal utility cooldown
+
+	--MAGE
+		--arcane
+		[62]	= {
+			[12042] = 1, --Arcane Power
+			[55342] = 1, --Mirror Image
+			[45438] = 2, --Ice Block
+			[12051] = 5, --Evocation
+			[110960] = 5, --Greater Invisibility
+		},
+		--fire
+		[63] = {
+			[190319] = 1, --Combustion
+			[55342] = 1, --Mirror Image
+			[45438] = 2, --Ice Block
+			[66] = 5, --Invisibility
+		},
+		--frost
+		[64] = {
+			[12472] = 1, --Icy Veins
+			[205021] = 1, --Ray of Frost
+			[55342] = 1, --Mirror Image
+			[45438] = 2, --Ice Block
+			[66] = 5, --Invisibility
+			[235219] = 5, --Cold Snap
+		},
+	
+	--PRIEST
+		--discipline
+		[256] = {
+			[34433] = 1, --Shadowfiend
+			[123040] = 1, --Mindbender
+			[33206] = 3, --Pain Suppression
+			[62618] = 4, --Power Word: Barrier
+			[271466] = 4, --Luminous Barrier (talent)
+			[47536] = 5, --Rapture
+			[19236] = 5, --Desperate Prayer
+			[8122] = 5, --Psychic Scream
+		},
+		--holy
+		[257] = {
+			[200183] = 2, --Apotheosis
+			[47788] = 3, --Guardian Spirit
+			[64844] = 4, --Divine Hymn
+			[64901] = 4, --Symbol of Hope
+			[265202] = 4, --Holy Word: Salvation
+			[88625] = 5, --Holy Word: Chastise
+			[34861] = 5, --Holy Word: Sanctify
+			[2050] = 5, --Holy Word: Serenity
+			[19236] = 5, --Desperate Prayer
+			[8122] = 5, --Psychic Scream
+		},
+		--shadow priest
+		[258] = {
+			[34433] = 1, --Shadowfiend
+			[200174] = 1, --Mindbender
+			[193223] = 1, --Surrender to Madness
+			[47585] = 2, --Dispersion
+			[15286] = 4, --Vampiric Embrace
+			[64044] = 5, --Psychic Horror
+			[8122] = 5, --Psychic Scream
+		},
+	
+	--ROGUE
+		--assassination
+		[259] = {
+			[79140] = 1, --Vendetta
+			[1856] = 2, --Vanish
+			[5277] = 2, --Evasion
+			[31224] = 2, --Cloak of Shadows
+			[2094] = 5, --Blind
+			[114018] = 5, --Shroud of Concealment
+		},
+		--outlaw
+		[260] = {
+			[13750] = 1, --Adrenaline Rush
+			[51690] = 1, --Killing Spree (talent)
+			[199754] = 2, --Riposte
+			[31224] = 2, --Cloak of Shadows
+			[1856] = 2, --Vanish
+			[2094] = 5, --Blind
+			[114018] = 5, --Shroud of Concealment
+		},
+		--subtlety
+		[261] = {
+			[121471] = 1, --Shadow Blades
+			[31224] = 2, --Cloak of Shadows
+			[1856] = 2, --Vanish
+			[5277] = 2, --Evasion
+			[2094] = 5, --Blind
+			[114018] = 5, --Shroud of Concealment
+		},
+	
+	--WARLOCK
+		--affliction
+		[265] = {
+			[205180] = 1, --Summon Darkglare
+			[113860] = 1, --Dark Soul: Misery
+			[104773] = 2, --Unending Resolve
+			
+			[108416] = 2, --Dark Pact
+			
+			[30283] = 5, --Shadowfury
+			[6789] = 5, --Mortal Coil
+		},
+		--demo
+		[266] = {
+			[265187] = 1, --Summon Demonic Tyrant
+			[111898] = 1, --Grimoire: Felguard
+			[267217] = 1, --Nether Portal
+			
+			[104773] = 2, --Unending Resolve
+			[108416] = 2, --Dark Pact
+			
+			[30283] = 5, --Shadowfury
+			[6789] = 5, --Mortal Coil
+		},
+		--destro
+		[267] = {
+			[1122] = 1, --Summon Infernal
+			[113858] = 1, --Dark Soul: Instability
+			
+			[104773] = 2, --Unending Resolve
+			[108416] = 2, --Dark Pact
+			
+			[6789] = 5, --Mortal Coil
+			[30283] = 5, --Shadowfury
+		},
+	
+	--WARRIOR
+		--Arms
+		[71] = {
+			[107574] = 1, --Avatar
+			[227847] = 1, --Bladestorm
+			[152277] = 1, --Ravager (talent)
+			
+			[118038] = 2, --Die by the Sword
+			
+			[97462] = 4, --Rallying Cry
+			
+			[18499] = 5, --Berserker Rage
+			[5246] = 5, --Intimidating Shout
+		},
+		--Fury
+		[72] = {
+			[1719] = 1, --Recklessness
+			[46924] = 1, --Bladestorm (talent)
+			
+			[184364] = 2, --Enraged Regeneration
+			
+			[97462] = 4, --Rallying Cry
+			
+			[18499] = 5, --Berserker Rage
+			[5246] = 5, --Intimidating Shout
+		},
+		--Protection
+		[73] = {
+			[228920] = 1, --Ravager (talent)
+			[107574] = 1, --Avatar
+			
+			[12975] = 2, --Last Stand
+			[871] = 2, --Shield Wall
+			
+			[97462] = 4, --Rallying Cry
+			
+			[18499] = 5, --Berserker Rage
+			[5246] = 5, --Intimidating Shout
+		},
+	
+	--PALADIN
+		--holy
+		[65] = {
+			[31884] = 1, --Avenging Wrath
+			[216331] = 1, --Avenging Crusader (talent)
+			
+			[498] = 2, --Divine Protection
+			[642] = 2, --Divine Shield
+			[105809] = 2, --Holy Avenger (talent)
+
+			[1022] = 3, --Blessing of Protection
+			[633] = 3, --Lay on Hands
+			
+			[31821] = 4, --Aura Mastery
+			
+			[1044] = 5, --Blessing of Freedom
+			[853] = 5, --Hammer of Justice
+			[115750] = 5, --Blinding Light (talent)
+		},
+		
+		--protection
+		[66] = {
+			[31884] = 1, --Avenging Wrath
+			
+			[31850] = 2, --Ardent Defender
+			[86659] = 2, --Guardian of Ancient Kings
+			
+			[1022] = 3, --Blessing of Protection
+			[204018] = 3, --Blessing of Spellwarding (talent)
+			[6940] = 3, --Blessing of Sacrifice
+			
+			[204150] = 4, --Aegis of Light (talent)
+			
+			[1044] = 5, --Blessing of Freedom
+			[853] = 5, --Hammer of Justice
+			[115750] = 5, --Blinding Light (talent)
+		},
+		
+		--retribution
+		[70] = {
+			[31884] = 1, --Avenging Wrath
+			[231895] = 1, --Crusade (talent)
+			
+			[184662] = 2, --Shield of Vengeance
+			[642] = 2, --Divine Shield
+			
+			[1022] = 3, --Blessing of Protection
+			[633] = 3, --Lay on Hands
+			
+			[1044] = 5, --Blessing of Freedom
+			[853] = 5, --Hammer of Justice
+			[115750] = 5, --Blinding Light (talent)
+		},
+	
+	--DEMON HUNTER
+		--havoc
+		[577] = {
+			[200166] = 1, --Metamorphosis
+			[206491] = 1, --Nemesis (talent)
+
+			[196555] = 2, --Netherwalk (talent)
+			
+			[196718] = 4, --Darkness
+		},
+		--vengeance
+		[581] = {
+			[187827] = 2, --Metamorphosis
+			
+			[207684] = 5, --Sigil of Misery
+			[202137] = 5, --Sigil of Silence
+			[202138] = 5, --Sigil of Chains (talent)
+		},
+		
+	--DEATH KNIGHT
+		--unholy
+		[252] = {
+			[275699] = 1, --Apocalypse
+			[42650] = 1, --Army of the Dead
+			[49206] = 1, --Summon Gargoyle (talent)
+			
+			[48792] = 2, --Icebound Fortitude
+			[48743] = 2, --Death Pact (talent)
+			
+		},
+		--frost
+		[251] = {
+			[152279] = 1, --Breath of Sindragosa (talent)
+			[47568] = 1, --Empower Rune Weapon
+			[279302] = 1, --Frostwyrm's Fury (talent)
+			
+			[48792] = 2, --Icebound Fortitude
+			[48743] = 2, --Death Pact (talent)
+			
+			[207167] = 5, --Blinding Sleet (talent)
+		},
+		--blood
+		[250] = {
+			[49028] = 1, --Dancing Rune Weapon
+			
+			[55233] = 2, --Vampiric Blood
+			[48792] = 2, --Icebound Fortitude
+			
+			[108199] = 5, --Gorefiend's Grasp
+		},
+	
+	--DRUID
+		--balance
+		[102] = {
+			[194223] = 1, --Celestial Alignment
+			[102560] = 1, --Incarnation: Chosen of Elune (talent)
+			
+			[22812] = 2, --Barkskin
+			[108238] = 2, --Renewal (talent)
+			
+			[29166] = 3, --Innervate
+
+			[78675] = 5, --Solar Beam
+		},
+		--feral
+		[103] = {
+			[106951] = 1, --Berserk
+			[102543] = 1, --Incarnation: King of the Jungle (talent)
+			
+			[61336] = 2, --Survival Instincts
+			[108238] = 2, --Renewal (talent)
+			
+			[77764] = 4, --Stampeding Roar
+		},
+		--guardian
+		[104] = {
+			[22812] = 2, --Barkskin	
+			[61336] = 2, --Survival Instincts
+			[102558] = 2, --Incarnation: Guardian of Ursoc (talent)
+			
+			[77761] = 4, --Stampeding Roar
+			
+			[99] = 5, --Incapacitating Roar
+		},
+		--restoration
+		[105] = {
+			
+			[22812] = 2, --Barkskin
+			[108238] = 2, --Renewal (talent)
+			[33891] = 2, --Incarnation: Tree of Life (talent)
+			
+			[102342] = 3, --Ironbark
+			[29166] = 3, --Innervate
+			
+			[740] = 4, --Tranquility
+			[197721] = 4, --Flourish (talent)
+			
+			[102793] = 5, --Ursol's Vortex
+		},
+	
+	--HUNTER
+		--beast mastery
+		[253] = {
+			[193530] = 1, --Aspect of the Wild
+			[19574] = 1, --Bestial Wrath
+			[201430] = 1, --Stampede (talent)
+			[194407] = 1, --Spitting Cobra (talent)
+			
+			[186265] = 2, --Aspect of the Turtle
+			
+			[19577] = 5, --Intimidation
+		},
+		--marksmanship
+		[254] = {
+			[193526] = 1, --Trueshot
+			
+			[186265] = 2, --Aspect of the Turtle
+			[109304] = 2, --Exhilaration
+			[281195] = 2, --Survival of the Fittest
+			
+			[187650] = 5, --Freezing Trap
+		},
+		--survival
+		[255] = {
+			[266779] = 1, --Coordinated Assault
+			
+			[186265] = 2, --Aspect of the Turtle
+			[109304] = 2, --Exhilaration
+			
+			[19577] = 5, --Intimidation
+		},
+
+	--MONK
+		--brewmaster
+		[268] = {
+			[115203] = 2, --Fortifying Brew
+			[115176] = 2, --Zen Meditation
+			[122278] = 2, --Dampen Harm (talent)
+		},
+		--windwalker
+		[269] = {
+			[137639] = 1, --Storm, Earth, and Fire
+			[123904] = 1, --Invoke Xuen, the White Tiger (talent)
+			[152173] = 1, --Serenity (talent)
+			
+			[122470] = 2, --Touch of Karma
+			[122278] = 2, --Dampen Harm (talent)
+			[122783] = 2, --Diffuse Magic (talent)
+			
+			[119381] = 5, --Leg Sweep
+		},
+		--mistweaver
+		[270] = {
+			[122278] = 2, --Dampen Harm (talent)
+			[198664] = 2, --Invoke Chi-Ji, the Red Crane (talent)
+			[243435] = 2, --Fortifying Brew
+			[122783] = 2, --Diffuse Magic (talent)
+			
+			[116849] = 3, --Life Cocoon
+			
+			[115310] = 4, --Revival
+		},
+	
+	--SHAMAN
+		--elemental
+		[262] = {
+			[198067] = 1, --Fire Elemental
+			[192249] = 1, --Storm Elemental (talent)
+			[114050] = 1, --Ascendance (talent)
+			
+			[108271] = 2, --Astral Shift
+			
+			[108281] = 4, --Ancestral Guidance (talent)
+		},
+		--enhancement
+		[263] = {
+			[51533] = 1, --Feral Spirit
+			[114051] = 1, --Ascendance (talent)
+			
+			[108271] = 2, --Astral Shift
+		},
+		--restoration
+		[263] = {
+			[108271] = 2, --Astral Shift
+			[114052] = 2, --Ascendance (talent)
+			[98008] = 4, --Spirit Link Totem
+			[108280] = 4, --Healing Tide Totem
+			[207399] = 4, --Ancestral Protection Totem (talent)
+		},
+}
+
+DF.CrowdControlSpells = {
+	[5246] = "WARRIOR", --Intimidating Shout
+	[132168] = "WARRIOR", --Shockwave (debuff spellid)
+	[132169] = "WARRIOR", --Storm Bolt (talent debuff spellid)
+	
+	[118699] = "WARLOCK", --Fear (debuff spellid)
+	[6789] = "WARLOCK", --Mortal Coil
+	[30283] = "WARLOCK", --Shadowfury
+	[710] = "WARLOCK", --Banish
+
+	[118] = "MAGE", --Polymorph
+	[82691] = "MAGE", --Ring of Frost (debuff spellid)
+	[122] = "MAGE", --Frost Nova
+	[157997] = "MAGE", --Ice Nova
+	[31661] = "MAGE", --Dragon's Breath
+	
+	[205364] = "PRIEST", --Mind Control (talent)
+	[605] = "PRIEST", --Mind Control
+	[8122] = "PRIEST", --Psychic Scream
+	[9484] = "PRIEST", --Shackle Undead
+	[200196] = "PRIEST", --Holy Word: Chastise (debuff spellid)
+	[200200] = "PRIEST", --Holy Word: Chastise (talent debuff spellid)
+	[226943] = "PRIEST", --Mind Bomb (talent)
+	[64044] = "PRIEST", --Psychic Horror (talent)
+	
+	[2094] = "ROGUE", --Blind
+	[1833] = "ROGUE", --Cheap Shot
+	[408] = "ROGUE", --Kidney Shot
+	[6770] = "ROGUE", --Sap
+	[1776] = "ROGUE", --Gouge
+
+	[853] = "PALADIN", --Hammer of Justice
+	[20066] = "PALADIN", --Repentance (talent)
+	[105421] = "PALADIN", --Blinding Light (talent)
+	
+	[221562] = "DEATHKNIGHT", --Asphyxiate
+	[108194] = "DEATHKNIGHT", --Asphyxiate (talent)
+	[207167] = "DEATHKNIGHT", --Blinding Sleet
+	
+	[339] = "DRUID", --Entangling Roots
+	[2637] = "DRUID", --Hibernate
+	[61391] = "DRUID", --Typhoon
+	[102359] = "DRUID", --Mass Entanglement
+	[99] = "DRUID", --Incapacitating Roar
+	[236748] = "DRUID", --Intimidating Roar
+	[5211] = "DRUID", --Mighty Bash
+	[45334] = "DRUID", --Immobilized
+	[203123] = "DRUID", --Maim
+	[50259] = "DRUID", --Dazed (from Wild Charge)
+	[209753] = "DRUID", --Cyclone (from pvp talent)
+
+	[3355] = "HUNTER", --Freezing Trap
+	[19577] = "HUNTER", --Intimidation
+	[190927] = "HUNTER", --Harpoon
+	[162480] = "HUNTER", --Steel Trap
+	
+	[119381] = "MONK", --Leg Sweep
+	[115078] = "MONK", --Paralysis
+	[198909] = "MONK", --Song of Chi-Ji (talent)
+	[116706] = "MONK", --Disable
+	
+	[118905] = "SHAMAN", --Static Charge (Capacitor Totem)
+	[51514] = "SHAMAN", --Hex
+	[64695] = "SHAMAN", --Earthgrab (talent)
+	
+	[179057] = "DEMONHUNTER", --Chaos Nova
+	[217832] = "DEMONHUNTER", --Imprison
+	[200166] = "DEMONHUNTER", --Metamorphosis
+	[207685] = "DEMONHUNTER", --Sigil of Misery
+}
+
+DF.SpecIds = {
+	[577] = "DEMONHUNTER",
+	[581] = "DEMONHUNTER",
+
+	[250] = "DEATHKNIGHT",
+	[251] = "DEATHKNIGHT",
+	[252] = "DEATHKNIGHT",
+
+	[71] = "WARRIOR",
+	[72] = "WARRIOR",
+	[73] = "WARRIOR",
+
+	[62] = "MAGE",
+	[63] = "MAGE",
+	[64] = "MAGE",
+
+	[259] = "ROGUE",
+	[260] = "ROGUE",
+	[261] = "ROGUE",
+
+	[102] = "DRUID",
+	[103] = "DRUID",
+	[104] = "DRUID",
+	[105] = "DRUID",
+
+	[253] = "HUNTER",
+	[254] = "HUNTER",
+	[255] = "HUNTER",
+
+	[262] = "SHAMAN",
+	[263] = "SHAMAN",
+	[254] = "SHAMAN",
+
+	[256] = "PRIEST",
+	[257] = "PRIEST",
+	[258] = "PRIEST",
+
+	[265] = "WARLOCK",
+	[266] = "WARLOCK",
+	[267] = "WARLOCK",
+
+	[65] = "PALADIN",
+	[66] = "PALADIN",
+	[70] = "PALADIN",
+
+	[268] = "MONK",
+	[269] = "MONK",
+	[270] = "MONK",
+}
+
+DF.CooldownToClass = {}
+
+DF.CooldownsAttack = {}
+DF.CooldownsDeffense = {}
+DF.CooldownsExternals = {}
+DF.CooldownsRaid = {}
+
+DF.CooldownsAllDeffensive = {}
+
+for specId, cooldownTable in pairs (DF.CooldownsBySpec) do
+	
+	for spellId, cooldownType in pairs (cooldownTable) do
+		
+		if (cooldownType == 1) then
+			DF.CooldownsAttack [spellId] = true
+			
+		elseif (cooldownType == 2) then
+			DF.CooldownsDeffense [spellId] = true
+			DF.CooldownsAllDeffensive [spellId] = true
+			
+		elseif (cooldownType == 3) then
+			DF.CooldownsExternals [spellId] = true
+			DF.CooldownsAllDeffensive [spellId] = true
+			
+		elseif (cooldownType == 4) then
+			DF.CooldownsRaid [spellId] = true
+			DF.CooldownsAllDeffensive [spellId] = true
+			
+		elseif (cooldownType == 5) then
+			
+			
+		end
+		
+		DF.CooldownToClass [spellId] = DF.SpecIds [spellId]
+
+	end
+	
+end
+
+
+function DF:FindClassForCooldown (spellId)
+	for specId, cooldownTable in pairs (DF.CooldownsBySpec) do
+		local hasCooldown = cooldownTable [spellId]
+		if (hasCooldown) then
+			return DF.SpecIds [specId]
+		end
+	end
+end
+
--- a/Libs/DF/split_bar.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/split_bar.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -618,4 +618,4 @@
 	_setmetatable (SplitBarObject, SplitBarMetaFunctions)
 	
 	return SplitBarObject
-end
\ No newline at end of file
+end
--- a/Libs/DF/split_bar.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/split_bar.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -79,4 +79,4 @@
 		</Scripts>
 		
 	</StatusBar>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/DF/textentry.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/textentry.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -14,6 +14,7 @@
 local loadstring = loadstring --> lua local
 local _string_len = string.len --> lua local
 
+
 local cleanfunction = function() end
 local APITextEntryFunctions = false
 
@@ -712,69 +713,7 @@
 	return self.editbox:SetFocus (true)
 end
 
-function DF:NewSpecialLuaEditorEntry (parent, w, h, member, name, nointent)
-	
-	if (name:find ("$parent")) then
-		local parentName = DF.GetParentName (parent)
-		name = name:gsub ("$parent", parentName)
-	end
-	
-	local borderframe = CreateFrame ("Frame", name, parent)
-	borderframe:SetSize (w, h)
-	
-	if (member) then
-		parent [member] = borderframe
-	end
-	
-	local scrollframe = CreateFrame ("ScrollFrame", name, borderframe, "DetailsFrameworkEditBoxMultiLineTemplate")
-	
-	scrollframe:SetScript ("OnSizeChanged", function (self)
-		scrollframe.editbox:SetSize (self:GetSize())
-	end)
-	
-	scrollframe:SetPoint ("topleft", borderframe, "topleft", 10, -10)
-	scrollframe:SetPoint ("bottomright", borderframe, "bottomright", -30, 10)
-	
-	scrollframe.editbox:SetMultiLine (true)
-	scrollframe.editbox:SetJustifyH ("left")
-	scrollframe.editbox:SetJustifyV ("top")
-	scrollframe.editbox:SetMaxBytes (1024000)
-	scrollframe.editbox:SetMaxLetters (128000)
-	
-	borderframe.GetText = function_gettext
-	borderframe.SetText = function_settext
-	borderframe.ClearFocus = function_clearfocus
-	borderframe.SetFocus = function_setfocus
-	
-	borderframe.Enable = TextEntryMetaFunctions.Enable
-	borderframe.Disable = TextEntryMetaFunctions.Disable
-	
-	borderframe.SetTemplate = TextEntryMetaFunctions.SetTemplate
-	
-	if (not nointent) then
-		IndentationLib.enable (scrollframe.editbox, nil, 4)
-	end
-	
-	borderframe:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], 
-		tile = 1, tileSize = 16, edgeSize = 16, insets = {left = 5, right = 5, top = 5, bottom = 5}})
-	
-	scrollframe.editbox.current_bordercolor = {1, 1, 1, 0.7}
-	borderframe:SetBackdropBorderColor (1, 1, 1, 0.7)
-	borderframe:SetBackdropColor (0.090195, 0.090195, 0.188234, 1)
-	
-	borderframe.enabled_border_color = {borderframe:GetBackdropBorderColor()}
-	borderframe.enabled_backdrop_color = {borderframe:GetBackdropColor()}
-	borderframe.enabled_text_color = {scrollframe.editbox:GetTextColor()}
 
-	borderframe.onleave_backdrop = {scrollframe.editbox:GetBackdropColor()}
-	borderframe.onleave_backdrop_border_color = {scrollframe.editbox:GetBackdropBorderColor()}
-	
-	borderframe.scroll = scrollframe
-	borderframe.editbox = scrollframe.editbox
-	borderframe.editbox.borderframe = borderframe
-	
-	return borderframe
-end
 
 
 ------------------------------------------------------------------------------------
@@ -893,6 +832,7 @@
 		local character = text:sub (i, i)
 		if (character:match ("%a")) then
 			self.lastword = character .. self.lastword
+			--print (self.lastword)
 		else
 			break
 		end
@@ -901,7 +841,7 @@
 
 --On Text Changed
 local AutoComplete_OnTextChanged = function (editboxWidget, byUser, capsule)
-	capsule = capsule or editboxWidget.MyObject
+	capsule = capsule or editboxWidget.MyObject or editboxWidget
 	
 	local chars_now = editboxWidget:GetText():len()
 	if (not editboxWidget.ignore_textchange) then
@@ -921,7 +861,7 @@
 end
 
 local AutoComplete_OnSpacePressed = function (editboxWidget, capsule)
-	capsule = capsule or editboxWidget.MyObject
+	capsule = capsule or editboxWidget.MyObject or editboxWidget
 
 --	if (not gotMatch) then
 		--editboxWidget.end_selection = nil
@@ -934,12 +874,12 @@
 
 local AutoComplete_OnEnterPressed = function (editboxWidget)
 
-	local capsule = editboxWidget.MyObject
+	local capsule = editboxWidget.MyObject or editboxWidget
 	if (editboxWidget.end_selection) then
 		editboxWidget:SetCursorPosition (editboxWidget.end_selection)
 		editboxWidget:HighlightText (0, 0)
 		editboxWidget.end_selection = nil
-		--editboxWidget:Insert (" ") --estava causando a adição de uma palavra a mais quando o próximo catactere for um espaço
+		--editboxWidget:Insert (" ") --estava causando a adi��o de uma palavra a mais quando o pr�ximo catactere for um espa�o
 	else
 		if (editboxWidget:IsMultiLine()) then
 			editboxWidget:Insert ("\n")
@@ -959,26 +899,58 @@
 end
 
 local AutoComplete_OnEditFocusGained = function (editboxWidget)
-	local capsule = editboxWidget.MyObject
+	local capsule = editboxWidget.MyObject or editboxWidget
 	capsule:GetLastWord()
+	--print ("last word:", editboxWidget.lastword)
 	editboxWidget.end_selection = nil
 	editboxWidget.focusGained = true
 	capsule.characters_count = editboxWidget:GetText():len()	
 end
 
+local OptimizeAutoCompleteTable = function (self, wordList)
+	local optimizedTable = {}
+	
+	local lower = string.lower
+	local sub = string.sub
+	local len = string.len
+	
+	local subTables = 0
+	
+	for i = 1, #wordList do
+		local thisWord = wordList [i]
+		if (len (thisWord) > 0) then
+			thisWord = lower (thisWord)
+		
+			local firstCharacter = sub (thisWord, 1, 1)
+			
+			local charTable = optimizedTable [firstCharacter]
+			if (not charTable) then
+				charTable = {}
+				optimizedTable [firstCharacter] = charTable
+				
+				subTables = subTables + 1
+			end
+			
+			charTable [#charTable+1] = thisWord
+		end
+	end
+	
+	wordList.Optimized = optimizedTable
+end
+
 local AutoComplete_OnChar = function (editboxWidget, char, capsule)
 	if (char == "") then
 		return
 	end
 	
-	capsule = capsule or editboxWidget.MyObject
+	capsule = capsule or editboxWidget.MyObject or editboxWidget
  	editboxWidget.end_selection = nil
 	
 	if (editboxWidget.ignore_input) then
 		return
 	end
 	
-	--reseta a palavra se acabou de ganhar focus e apertou espaço
+	--reseta a palavra se acabou de ganhar focus e apertou espa�o
 	if (editboxWidget.focusGained and char == " ") then
 		capsule.lastword = ""
 		editboxWidget.focusGained = nil
@@ -993,13 +965,41 @@
 	end
 	
 	editboxWidget.ignore_input = true
+	
 	if (capsule.lastword:len() >= 2) then
 	
 		local wordList = capsule [capsule.poolName]
 		if (not wordList) then
-			if (DF.debug) then
-				error ("Details! Framework: Invalid word list table.")
+			error ("Details! Framework: TextEntry has AutoComplete but no word list table.")
+			return
+		end
+		
+		if (capsule.ShouldOptimizeAutoComplete) then
+			if (not wordList.Optimized) then
+				OptimizeAutoCompleteTable (capsule, wordList)
 			end
+			
+			local firstCharacter = string.lower (string.sub (capsule.lastword, 1, 1))
+			wordList = wordList.Optimized [firstCharacter]
+			
+			if (wordList) then
+				for i = 1, #wordList do
+					local thisWord = wordList [i]
+					if (thisWord and (thisWord:find ("^" .. capsule.lastword) or thisWord:lower():find ("^" .. capsule.lastword))) then
+						local rest = thisWord:gsub (capsule.lastword, "")
+						rest = rest:lower():gsub (capsule.lastword, "")
+						local cursor_pos = editboxWidget:GetCursorPosition()
+						editboxWidget:Insert (rest)
+						editboxWidget:HighlightText (cursor_pos, cursor_pos + rest:len())
+						editboxWidget:SetCursorPosition (cursor_pos)
+						editboxWidget.end_selection = cursor_pos + rest:len()
+						editboxWidget.ignore_textchange = true
+						break
+					end
+				end
+			end
+			
+			editboxWidget.ignore_input = false
 			return
 		end
 	
@@ -1017,32 +1017,1420 @@
 				break
 			end
 		end
+	end
 	
-	end
 	editboxWidget.ignore_input = false
 end
 
-function TextEntryMetaFunctions:SetAsAutoComplete (poolName)
+function TextEntryMetaFunctions:SetAsAutoComplete (poolName, poolTable, shouldOptimize)
 	
-	self.lastword = ""
-	self.characters_count = 0
-	self.poolName = poolName
-	self.GetLastWord = get_last_word --editbox:GetLastWord()
-	self.NoClearFocusOnEnterPressed = true --avoid auto clear focus
-	
-	self:SetHook ("OnEditFocusGained", AutoComplete_OnEditFocusGained)
-	self.editbox:HookScript ("OnEscapePressed", AutoComplete_OnEscapePressed)
-	
---	self:SetHook ("OnTextChanged", AutoComplete_OnTextChanged)
-	self:SetHook ("OnEnterPressed", AutoComplete_OnEnterPressed)
---	self:SetHook ("OnChar", AutoComplete_OnChar)
---	self:SetHook ("OnSpacePressed", AutoComplete_OnSpacePressed)
-	
-	self.editbox:SetScript ("OnTextChanged", AutoComplete_OnTextChanged)
---	self.editbox:SetScript ("OnEnterPressed", AutoComplete_OnEnterPressed)
-	self.editbox:SetScript ("OnChar", AutoComplete_OnChar)
-	self.editbox:SetScript ("OnSpacePressed", AutoComplete_OnSpacePressed)
+	if (not self.SetHook) then
+		--self is borderframe
+		self = self.editbox
+		self.editbox = self --compatible with fw functions
+		
+		self.lastword = ""
+		self.characters_count = 0
+		self.poolName = poolName
+		self.GetLastWord = get_last_word --editbox:GetLastWord()
+		self.NoClearFocusOnEnterPressed = true --avoid auto clear focus
+		self.ShouldOptimizeAutoComplete = shouldOptimize
+		
+		if (poolTable) then
+			self [poolName] = poolTable
+		end
+		
+		self:HookScript ("OnEditFocusGained", AutoComplete_OnEditFocusGained)
+		self:HookScript ("OnEnterPressed", AutoComplete_OnEnterPressed)
+		self:HookScript ("OnEscapePressed", AutoComplete_OnEscapePressed)
+		self:HookScript ("OnTextChanged", AutoComplete_OnTextChanged)
+		self:HookScript ("OnChar", AutoComplete_OnChar)
+		self:HookScript ("OnSpacePressed", AutoComplete_OnSpacePressed)
+	else
+		--fw textfield
+		self.lastword = ""
+		self.characters_count = 0
+		self.poolName = poolName
+		self.GetLastWord = get_last_word --editbox:GetLastWord()
+		self.NoClearFocusOnEnterPressed = true --avoid auto clear focus
+		self.ShouldOptimizeAutoComplete = shouldOptimize
+		
+		self:SetHook ("OnEditFocusGained", AutoComplete_OnEditFocusGained)
+		self:SetHook ("OnEnterPressed", AutoComplete_OnEnterPressed)
+		self.editbox:HookScript ("OnEscapePressed", AutoComplete_OnEscapePressed)
+		self.editbox:SetScript ("OnTextChanged", AutoComplete_OnTextChanged)
+		self.editbox:SetScript ("OnChar", AutoComplete_OnChar)
+		self.editbox:SetScript ("OnSpacePressed", AutoComplete_OnSpacePressed)
+	end
 
 end
 
--- endp
\ No newline at end of file
+function DF:NewSpecialLuaEditorEntry (parent, w, h, member, name, nointent)
+	
+	if (name:find ("$parent")) then
+		local parentName = DF.GetParentName (parent)
+		name = name:gsub ("$parent", parentName)
+	end
+	
+	local borderframe = CreateFrame ("Frame", name, parent)
+	borderframe:SetSize (w, h)
+	
+	if (member) then
+		parent [member] = borderframe
+	end
+	
+	local scrollframe = CreateFrame ("ScrollFrame", name, borderframe, "DetailsFrameworkEditBoxMultiLineTemplate")
+
+	borderframe.SetAsAutoComplete = TextEntryMetaFunctions.SetAsAutoComplete
+	
+	scrollframe:SetScript ("OnSizeChanged", function (self)
+		scrollframe.editbox:SetSize (self:GetSize())
+	end)
+	
+	scrollframe:SetPoint ("topleft", borderframe, "topleft", 10, -10)
+	scrollframe:SetPoint ("bottomright", borderframe, "bottomright", -30, 10)
+	
+	scrollframe.editbox:SetMultiLine (true)
+	scrollframe.editbox:SetJustifyH ("left")
+	scrollframe.editbox:SetJustifyV ("top")
+	scrollframe.editbox:SetMaxBytes (1024000)
+	scrollframe.editbox:SetMaxLetters (128000)
+	
+	borderframe.GetText = function_gettext
+	borderframe.SetText = function_settext
+	borderframe.ClearFocus = function_clearfocus
+	borderframe.SetFocus = function_setfocus
+	
+	borderframe.Enable = TextEntryMetaFunctions.Enable
+	borderframe.Disable = TextEntryMetaFunctions.Disable
+	
+	borderframe.SetTemplate = TextEntryMetaFunctions.SetTemplate
+	
+	if (not nointent) then
+		IndentationLib.enable (scrollframe.editbox, nil, 4)
+	end
+	
+	borderframe:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], 
+		tile = 1, tileSize = 16, edgeSize = 16, insets = {left = 5, right = 5, top = 5, bottom = 5}})
+	
+	scrollframe.editbox.current_bordercolor = {1, 1, 1, 0.7}
+	borderframe:SetBackdropBorderColor (1, 1, 1, 0.7)
+	borderframe:SetBackdropColor (0.090195, 0.090195, 0.188234, 1)
+	
+	borderframe.enabled_border_color = {borderframe:GetBackdropBorderColor()}
+	borderframe.enabled_backdrop_color = {borderframe:GetBackdropColor()}
+	borderframe.enabled_text_color = {scrollframe.editbox:GetTextColor()}
+
+	borderframe.onleave_backdrop = {scrollframe.editbox:GetBackdropColor()}
+	borderframe.onleave_backdrop_border_color = {scrollframe.editbox:GetBackdropBorderColor()}
+	
+	borderframe.scroll = scrollframe
+	borderframe.editbox = scrollframe.editbox
+	borderframe.editbox.borderframe = borderframe
+	
+	return borderframe
+end
+
+-- encryption table
+local base64chars = {[0]='A',[1]='B',[2]='C',[3]='D',[4]='E',[5]='F',[6]='G',[7]='H',[8]='I',[9]='J',[10]='K',[11]='L',[12]='M',[13]='N',[14]='O',[15]='P',[16]='Q',[17]='R',[18]='S',[19]='T',[20]='U',[21]='V',[22]='W',[23]='X',[24]='Y',[25]='Z',[26]='a',[27]='b',[28]='c',[29]='d',[30]='e',[31]='f',[32]='g',[33]='h',[34]='i',[35]='j',[36]='k',[37]='l',[38]='m',[39]='n',[40]='o',[41]='p',[42]='q',[43]='r',[44]='s',[45]='t',[46]='u',[47]='v',[48]='w',[49]='x',[50]='y',[51]='z',[52]='0',[53]='1',[54]='2',[55]='3',[56]='4',[57]='5',[58]='6',[59]='7',[60]='8',[61]='9',[62]='-',[63]='_'}
+
+-- decryption table
+local base64bytes = {['A']=0,['B']=1,['C']=2,['D']=3,['E']=4,['F']=5,['G']=6,['H']=7,['I']=8,['J']=9,['K']=10,['L']=11,['M']=12,['N']=13,['O']=14,['P']=15,['Q']=16,['R']=17,['S']=18,['T']=19,['U']=20,['V']=21,['W']=22,['X']=23,['Y']=24,['Z']=25,['a']=26,['b']=27,['c']=28,['d']=29,['e']=30,['f']=31,['g']=32,['h']=33,['i']=34,['j']=35,['k']=36,['l']=37,['m']=38,['n']=39,['o']=40,['p']=41,['q']=42,['r']=43,['s']=44,['t']=45,['u']=46,['v']=47,['w']=48,['x']=49,['y']=50,['z']=51,['0']=52,['1']=53,['2']=54,['3']=55,['4']=56,['5']=57,['6']=58,['7']=59,['8']=60,['9']=61,['-']=62,['_']=63,['=']=nil}
+
+-- shift left
+local function lsh (value,shift)
+	return (value*(2^shift)) % 256
+end
+
+-- shift right
+local function rsh (value,shift)
+	return math.floor(value/2^shift) % 256
+end
+
+-- return single bit (for OR)
+local function bit (x,b)
+	return (x % 2^b - x % 2^(b-1) > 0)
+end
+
+local function lor (x,y)
+	result = 0
+	for p=1,8 do result = result + (((bit(x,p) or bit(y,p)) == true) and 2^(p-1) or 0) end
+	return result
+end
+
+function DF.EncodeString (data)
+	local bytes = {}
+	local result = ""
+	for spos=0,string.len(data)-1,3 do
+		for byte=1,3 do bytes[byte] = string.byte(string.sub(data,(spos+byte))) or 0 end
+		result = string.format('%s%s%s%s%s',result,base64chars[rsh(bytes[1],2)],base64chars[lor(lsh((bytes[1] % 4),4), rsh(bytes[2],4))] or "=",((#data-spos) > 1) and base64chars[lor(lsh(bytes[2] % 16,2), rsh(bytes[3],6))] or "=",((#data-spos) > 2) and base64chars[(bytes[3] % 64)] or "=")
+	end
+	return result
+end
+
+function DF.DecodeString (data)
+	local chars = {}
+	local result=""
+	for dpos=0,string.len(data)-1,4 do
+		for char=1,4 do chars[char] = base64bytes[(string.sub(data,(dpos+char),(dpos+char)) or "=")] end
+		result = string.format('%s%s%s%s',result,string.char(lor(lsh(chars[1],2), rsh(chars[2],4))),(chars[3] ~= nil) and string.char(lor(lsh(chars[2],4), rsh(chars[3],2))) or "",(chars[4] ~= nil) and string.char(lor(lsh(chars[3],6) % 192, (chars[4]))) or "")
+	end
+	return result
+end
+
+
+DF.AutoCompleteAPI = {
+	"local",
+	"AddTrackedAchievement", -- [1]
+	"CanShowAchievementUI", -- [2]
+	"ClearAchievementComparisonUnit", -- [3]
+	"GetAchievementCategory", -- [4]
+	"GetAchievementComparisonInfo", -- [5]
+	"GetAchievementCriteriaInfo", -- [6]
+	"GetAchievementInfo", -- [7]
+	"GetAchievementInfoFromCriteria", -- [8]
+	"GetAchievementLink", -- [9]
+	"GetAchievementNumCriteria", -- [10]
+	"GetAchievementNumRewards", -- [11]
+	"GetCategoryInfo", -- [12]
+	"GetCategoryList", -- [13]
+	"GetCategoryNumAchievements", -- [14]
+	"GetComparisonAchievementPoints", -- [15]
+	"GetComparisonCategoryNumAchievements", -- [16]
+	"GetComparisonStatistic", -- [17]
+	"GetLatestCompletedAchievements", -- [18]
+	"GetLatestCompletedComparisonAchievements", -- [19]
+	"GetLatestUpdatedComparisonStatsGetLatestUpdatedStats", -- [20]
+	"GetNextAchievement", -- [21]
+	"GetNumComparisonCompletedAchievements", -- [22]
+	"GetNumCompletedAchievements", -- [23]
+	"GetPreviousAchievement", -- [24]
+	"GetStatistic", -- [25]
+	"GetStatisticsCategoryList", -- [26]
+	"GetTotalAchievementPoints", -- [27]
+	"GetTrackedAchievements", -- [28]
+	"GetNumTrackedAchievements", -- [29]
+	"RemoveTrackedAchievement", -- [30]
+	"SetAchievementComparisonUnit", -- [31]
+	"ActionButtonDown", -- [32]
+	"ActionButtonUp", -- [33]
+	"ActionHasRange", -- [34]
+	"CameraOrSelectOrMoveStart", -- [35]
+	"CameraOrSelectOrMoveStop", -- [36]
+	"ChangeActionBarPage", -- [37]
+	"GetActionBarPage", -- [38]
+	"GetActionBarToggles", -- [39]
+	"GetActionCooldown", -- [40]
+	"GetActionCount", -- [41]
+	"GetActionInfo", -- [42]
+	"GetActionText", -- [43]
+	"GetActionTexture", -- [44]
+	"GetBonusBarOffset", -- [45]
+	"GetMouseButtonClicked", -- [46]
+	"GetMultiCastBarOffset", -- [47]
+	"GetPossessInfo", -- [48]
+	"HasAction", -- [49]
+	"IsActionInRange", -- [50]
+	"IsAttackAction", -- [51]
+	"IsAutoRepeatAction", -- [52]
+	"IsCurrentAction", -- [53]
+	"IsConsumableAction", -- [54]
+	"IsEquippedAction", -- [55]
+	"IsUsableAction", -- [56]
+	"PetHasActionBar", -- [57]
+	"PickupAction", -- [58]
+	"PickupPetAction", -- [59]
+	"PlaceAction", -- [60]
+	"SetActionBarToggles", -- [61]
+	"StopAttack", -- [62]
+	"TurnOrActionStart", -- [63]
+	"TurnOrActionStop", -- [64]
+	"UseAction", -- [65]
+	"AcceptDuel", -- [66]
+	"AttackTarget", -- [67]
+	"CancelDuel", -- [68]
+	"CancelLogout", -- [69]
+	"ClearTutorials", -- [70]
+	"CancelSummon", -- [71]
+	"ConfirmSummon", -- [72]
+	"DescendStop", -- [73]
+	"Dismount", -- [74]
+	"FlagTutorial", -- [75]
+	"ForceQuit", -- [76]
+	"GetPVPTimer", -- [77]
+	"GetSummonConfirmAreaName", -- [78]
+	"GetSummonConfirmSummoner", -- [79]
+	"GetSummonConfirmTimeLeft", -- [80]
+	"RandomRoll", -- [81]
+	"SetPVP", -- [82]
+	"StartDuel", -- [84]
+	"TogglePVP", -- [85]
+	"ToggleSheath", -- [86]
+	"UseSoulstone", -- [87]
+	"CanSolveArtifact", -- [89]
+	"UIParent", -- [90]
+	"GetArtifactInfoByRace", -- [91]
+	"GetArtifactProgress", -- [92]
+	"GetNumArtifactsByRace", -- [93]
+	"GetSelectedArtifactInfo", -- [94]
+	"IsArtifactCompletionHistoryAvailable", -- [95]
+	"ItemAddedToArtifact", -- [96]
+	"RemoveItemFromArtifact", -- [97]
+	"RequestArtifactCompletionHistory", -- [98]
+	"SocketItemToArtifact", -- [99]
+	"AcceptArenaTeam", -- [101]
+	"ArenaTeamInviteByName", -- [102]
+	"ArenaTeamSetLeaderByName", -- [103]
+	"ArenaTeamLeave", -- [104]
+	"ArenaTeamRoster", -- [105]
+	"ArenaTeamUninviteByName", -- [106]
+	"ArenaTeamDisband", -- [107]
+	"DeclineArenaTeam", -- [108]
+	"GetArenaTeam", -- [109]
+	"GetArenaTeamGdfInf", -- [110]
+	"oGetArenaTeamRosterInfo", -- [111]
+	"GetBattlefieldTeamInfo", -- [112]
+	"GetCurrentArenaSeason", -- [113]
+	"GetInspectArenaTeamData", -- [114]
+	"GetNumArenaTeamMembers", -- [115]
+	"GetPreviousArenaSeason", -- [116]
+	"IsActiveBattlefieldArena", -- [117]
+	"IsArenaTeamCaptain", -- [118]
+	"IsInArenaTeam", -- [119]
+	"CalculateAuctionDeposit", -- [121]
+	"CanCancelAuction", -- [122]
+	"CancelSell", -- [123]
+	"CanSendAuctionQuery", -- [124]
+	"CancelAuction", -- [125]
+	"ClickAuctionSellItemButton", -- [126]
+	"CloseAuctionHouse", -- [127]
+	"GetAuctionHouseDepositRate", -- [128]
+	"GetAuctionInvTypes", -- [129]
+	"GetAuctionItemClasses", -- [130]
+	"GetAuctionItemInfo", -- [131]
+	"GetAuctionItemLink", -- [132]
+	"GetAuctionItemSubClasses", -- [133]
+	"GetAuctionItemTimeLeft", -- [134]
+	"GetAuctionSellItemInfo", -- [135]
+	"GetBidderAuctionItems", -- [136]
+	"GetNumAuctionItems", -- [137]
+	"GetOwnerAuctionItems", -- [138]
+	"GetSelectedAuctionItem", -- [139]
+	"IsAuctionSortReversed", -- [140]
+	"PlaceAuctionBid", -- [141]
+	"QueryAuctionItems", -- [142]
+	"SetAuctionsTabShowing", -- [143]
+	"SetSelectedAuctionItem", -- [144]
+	"SortAuctionItems", -- [145]
+	"StartAuction", -- [146]
+	"BankButtonIDToInvSlotID", -- [148]
+	"CloseBankFrame", -- [149]
+	"GetBankSlotCost", -- [150]
+	"GetNumBankSlots", -- [151]
+	"PurchaseSlot", -- [152]
+	"AcceptAreaSpiritHeal", -- [154]
+	"AcceptBattlefieldPort", -- [155]
+	"CancelAreaSpiritHeal", -- [156]
+	"CanJoinBattlefieldAsGroup", -- [157]
+	"CheckSpiritHealerDist", -- [158]
+	"GetAreaSpiritHealerTime", -- [159]
+	"GetBattlefieldEstimatedWaitTime", -- [160]
+	"GetBattlefieldFlagPosition", -- [161]
+	"GetBattlefieldInstanceExpiration", -- [162]
+	"GetBattlefieldInstanceRunTime", -- [163]
+	"GetBattlefieldMapIconScale", -- [164]
+	"GetBattlefieldPortExpiration", -- [165]
+	"GetBattlefieldPosition", -- [166]
+	"GetBattlefieldScore", -- [167]
+	"GetBattlefieldStatData", -- [168]
+	"GetBattlefieldStatInfo", -- [169]
+	"GetBattlefieldStatus", -- [170]
+	"GetBattlefieldTimeWaited", -- [171]
+	"GetBattlefieldWinner", -- [172]
+	"GetBattlegroundInfo", -- [173]
+	"GetNumBattlefieldFlagPositions", -- [174]
+	"GetNumBattlefieldPositions", -- [175]
+	"GetNumBattlefieldScores", -- [176]
+	"GetNumBattlefieldStats", -- [177]
+	"GetNumWorldStateUI", -- [178]
+	"GetWintergraspWaitTime", -- [179]
+	"GetWorldStateUIInfo", -- [180]
+	"IsPVPTimerRunning", -- [181]
+	"JoinBattlefield", -- [182]
+	"LeaveBattlefield", -- [183]
+	"ReportPlayerIsPVPAFK", -- [184]
+	"RequestBattlefieldPositions", -- [185]
+	"RequestBattlefieldScoreData", -- [186]
+	"RequestBattlegroundInstanceInfo", -- [187]
+	"SetBattlefieldScoreFaction", -- [188]
+	"GetBinding", -- [190]
+	"GetBindingAction", -- [191]
+	"GetBindingKey", -- [192]
+	"GetBindingText", -- [193]
+	"GetCurrentBindingSet", -- [194]
+	"GetNumBindings", -- [195]
+	"LoadBindings", -- [196]
+	"RunBinding", -- [197]
+	"SaveBindings", -- [198]
+	"SetBinding", -- [199]
+	"SetBindingSpell", -- [200]
+	"SetBindingClick", -- [201]
+	"SetBindingItem", -- [202]
+	"SetBindingMacro", -- [203]
+	"SetConsoleKey", -- [204]
+	"SetOverrideBinding", -- [205]
+	"SetOverrideBindingSpell", -- [206]
+	"SetOverrideBindingClick", -- [207]
+	"SetOverrideBindingItem", -- [208]
+	"SetOverrideBindingMacro", -- [209]
+	"ClearOverrideBindings", -- [210]
+	"SetMouselookOverrideBinding", -- [211]
+	"IsModifierKeyDown", -- [212]
+	"IsModifiedClick", -- [213]
+	"IsMouseButtonDown", -- [214]
+	"CancelUnitBuff", -- [216]
+	"CancelShapeshiftForm", -- [217]
+	"CancelItemTempEnchantment", -- [218]
+	"GetWeaponEnchantInfo", -- [219]
+	"UnitAura", -- [220]
+	"UnitBuff", -- [221]
+	"UnitDebuff", -- [222]
+	"AddChatWindowChannel", -- [224]
+	"ChannelBan", -- [225]
+	"ChannelInvite", -- [226]
+	"ChannelKick", -- [227]
+	"ChannelModerator", -- [228]
+	"ChannelMute", -- [229]
+	"ChannelToggleAnnouncements", -- [230]
+	"ChannelUnban", -- [231]
+	"ChannelUnmoderator", -- [232]
+	"ChannelUnmute", -- [233]
+	"DisplayChannelOwner", -- [234]
+	"DeclineInvite", -- [235]
+	"EnumerateServerChannels", -- [236]
+	"GetChannelList", -- [237]
+	"GetChannelName", -- [238]
+	"GetChatWindowChannels", -- [239]
+	"JoinChannelByName", -- [240]
+	"LeaveChannelByName", -- [241]
+	"ListChannelByName", -- [242]
+	"ListChannels", -- [243]
+	"RemoveChatWindowChannel", -- [244]
+	"SendChatMessage", -- [245]
+	"SetChannelOwner", -- [246]
+	"SetChannelPassword", -- [247]
+	"AcceptResurrect", -- [249]
+	"AcceptXPLoss", -- [250]
+	"CheckBinderDist", -- [251]
+	"ConfirmBinder", -- [252]
+	"DeclineResurrect", -- [253]
+	"DestroyTotem", -- [254]
+	"GetBindLocation", -- [255]
+	"GetComboPoints", -- [256]
+	"GetCorpseRecoveryDelay", -- [257]
+	"GetCurrentTitle", -- [258]
+	"GetMirrorTimerInfo", -- [259]
+	"GetMirrorTimerProgress", -- [260]
+	"GetMoney", -- [261]
+	"GetNumTitles", -- [262]
+	"GetPlayerFacing", -- [263]
+	"GetPVPDesired", -- [264]
+	"GetReleaseTimeRemaining", -- [265]
+	"GetResSicknessDuration", -- [266]
+	"GetRestState", -- [267]
+	"GetRuneCooldown", -- [268]
+	"GetRuneCount", -- [269]
+	"GetRuneType", -- [270]
+	"GetTimeToWellRested", -- [271]
+	"GetTitleName", -- [272]
+	"GetUnitPitch", -- [273]
+	"GetXPExhaustion", -- [274]
+	"HasFullControl", -- [275]
+	"HasSoulstone", -- [276]
+	"IsFalling", -- [277]
+	"IsFlying", -- [278]
+	"IsFlyableArea", -- [279]
+	"IsIndoors", -- [280]
+	"IsMounted", -- [281]
+	"IsOutdoors", -- [282]
+	"IsOutOfBounds", -- [283]
+	"IsResting", -- [284]
+	"IsStealthed", -- [285]
+	"IsSwimming", -- [286]
+	"IsTitleKnown", -- [287]
+	"IsXPUserDisabled", -- [288]
+	"NotWhileDeadError", -- [289]
+	"ResurrectHasSickness", -- [290]
+	"ResurrectHasTimer", -- [291]
+	"ResurrectGetOfferer", -- [292]
+	"RetrieveCorpse", -- [293]
+	"SetCurrentTitle", -- [294]
+	"TargetTotem", -- [295]
+	"GetArmorPenetration", -- [296]
+	"GetAttackPowerForStat", -- [297]
+	"GetAverageItemLevel", -- [298]
+	"GetBlockChance", -- [299]
+	"GetCombatRating", -- [300]
+	"GetCombatRatingBonus", -- [301]
+	"GetCritChance", -- [302]
+	"GetCritChanceFromAgility", -- [303]
+	"GetDodgeChance", -- [304]
+	"GetExpertise", -- [305]
+	"GetExpertisePercent", -- [306]
+	"GetManaRegen", -- [307]
+	"GetMaxCombatRatingBonus", -- [308]
+	"GetParryChance", -- [309]
+	"GetPetSpellBonusDamage", -- [310]
+	"GetPowerRegen", -- [311]
+	"GetSpellBonusDamage", -- [312]
+	"GetRangedCritChance", -- [313]
+	"GetSpellBonusHealing", -- [314]
+	"GetSpellCritChance", -- [315]
+	"GetShieldBlock", -- [316]
+	"GetSpellCritChanceFromIntellect", -- [317]
+	"GetSpellPenetration", -- [318]
+	"AddChatWindowChannel", -- [319]
+	"ChangeChatColor", -- [320]
+	"ChatFrame_AddChannel", -- [321]
+	"ChatFrame_AddMessageEventFilter", -- [322]
+	"ChatFrame_GetMessageEventFilters", -- [323]
+	"ChatFrame_OnHyperlinkShow", -- [324]
+	"ChatFrame_RemoveMessageEventFilter", -- [325]
+	"GetAutoCompleteResults", -- [326]
+	"GetChatTypeIndex", -- [327]
+	"GetChatWindowChannels", -- [328]
+	"GetChatWindowInfo", -- [329]
+	"GetChatWindowMessages", -- [330]
+	"JoinChannelByName", -- [331]
+	"LoggingChat", -- [332]
+	"LoggingCombat", -- [333]
+	"RemoveChatWindowChannel", -- [334]
+	"RemoveChatWindowMessages", -- [335]
+	"SetChatWindowAlpha", -- [336]
+	"SetChatWindowColor", -- [337]
+	"SetChatWindowDocked", -- [338]
+	"SetChatWindowLocked", -- [339]
+	"SetChatWindowName", -- [340]
+	"SetChatWindowShown", -- [341]
+	"SetChatWindowSize", -- [342]
+	"SetChatWindowUninteractable", -- [343]
+	"DoEmote", -- [345]
+	"GetDefaultLanguage", -- [346]
+	"GetLanguageByIndex", -- [347]
+	"GetNumLanguages", -- [348]
+	"GetRegisteredAddonMessagePrefixes", -- [349]
+	"IsAddonMessagePrefixRegistered", -- [350]
+	"RegisterAddonMessagePrefix", -- [352]
+	"SendAddonMessage", -- [353]
+	"SendChatMessage", -- [354]
+	"CallCompanion", -- [356]
+	"DismissCompanion", -- [357]
+	"GetCompanionInfo", -- [358]
+	"GetNumCompanions", -- [359]
+	"GetCompanionCooldown", -- [360]
+	"PickupCompanion", -- [361]
+	"SummonRandomCritter", -- [362]
+	"ContainerIDToInventoryID", -- [364]
+	"GetBagName", -- [365]
+	"GetContainerItemCooldown", -- [366]
+	"GetContainerItemDurability", -- [367]
+	"GetContainerItemGems", -- [368]
+	"GetContainerItemID", -- [369]
+	"GetContainerItemInfo", -- [370]
+	"GetContainerItemLink", -- [371]
+	"GetContainerNumSlots", -- [372]
+	"GetContainerItemQuestInfo", -- [373]
+	"GetContainerNumFreeSlots", -- [374]
+	"OpenAllBags", -- [376]
+	"CloseAllBags", -- [377]
+	"PickupBagFromSlot", -- [378]
+	"PickupContainerItem", -- [379]
+	"PutItemInBackpack", -- [380]
+	"PutItemInBag", -- [381]
+	"PutKeyInKeyRing", -- [382]
+	"SplitContainerItem", -- [383]
+	"ToggleBackpack", -- [384]
+	"ToggleBag", -- [385]
+	"GetCoinText", -- [388]
+	"GetCoinTextureString", -- [389]
+	"GetCurrencyInfo", -- [390]
+	"GetCurrencyListSize", -- [391]
+	"GetCurrencyListInfo", -- [392]
+	"ExpandCurrencyList", -- [393]
+	"SetCurrencyUnused", -- [394]
+	"GetNumWatchedTokens", -- [395]
+	"GetBackpackCurrencyInfo", -- [396]
+	"SetCurrencyBackpack", -- [397]
+	"AutoEquipCursorItem", -- [399]
+	"ClearCursor", -- [400]
+	"CursorCanGoInSlot", -- [401]
+	"CursorHasItem", -- [402]
+	"CursorHasMoney", -- [403]
+	"CursorHasSpell", -- [404]
+	"DeleteCursorItem", -- [405]
+	"DropCursorMoney", -- [406]
+	"DropItemOnUnit", -- [407]
+	"EquipCursorItem", -- [408]
+	"GetCursorInfo", -- [409]
+	"GetCursorPosition", -- [410]
+	"HideRepairCursor", -- [411]
+	"InRepairMode", -- [412]
+	"PickupAction", -- [413]
+	"PickupBagFromSlot", -- [414]
+	"PickupContainerItem", -- [415]
+	"PickupInventoryItem", -- [416]
+	"PickupItem", -- [417]
+	"PickupMacro", -- [418]
+	"PickupMerchantItem", -- [419]
+	"PickupPetAction", -- [420]
+	"PickupSpell", -- [421]
+	"PickupStablePet", -- [422]
+	"PickupTradeMoney", -- [423]
+	"PlaceAction", -- [424]
+	"PutItemInBackpack", -- [425]
+	"PutItemInBag", -- [426]
+	"ResetCursor", -- [427]
+	"SetCursor", -- [428]
+	"ShowContainerSellCursor", -- [429]
+	"ShowInspectCursor", -- [430]
+	"ShowInventorySellCursor", -- [431]
+	"ShowMerchantSellCursor", -- [432]
+	"ShowRepairCursor", -- [433]
+	"SplitContainerItem", -- [434]
+	"GetWeaponEnchantInfo", -- [435]
+	"ReplaceEnchant", -- [436]
+	"ReplaceTradeEnchant", -- [437]
+	"BindEnchant", -- [438]
+	"CollapseFactionHeader", -- [439]
+	"CollapseAllFactionHeaders", -- [440]
+	"ExpandFactionHeader", -- [441]
+	"ExpandAllFactionHeaders", -- [442]
+	"FactionToggleAtWar", -- [443]
+	"GetFactionInfo", -- [444]
+	"GetNumFactions", -- [445]
+	"GetSelectedFaction", -- [446]
+	"GetWatchedFactionInfo", -- [447]
+	"IsFactionInactive", -- [448]
+	"SetFactionActive", -- [449]
+	"SetFactionInactive", -- [450]
+	"SetSelectedFaction", -- [451]
+	"SetWatchedFactionIndex", -- [452]
+	"UnitFactionGroup", -- [453]
+	"CreateFrame", -- [454]
+	"CreateFont", -- [455]
+	"GetFramesRegisteredForEvent", -- [456]
+	"GetNumFrames", -- [457]
+	"EnumerateFrames", -- [458]
+	"GetMouseFocus", -- [459]
+	"ToggleDropDownMenu", -- [460]
+	"UIFrameFadeIn", -- [461]
+	"UIFrameFadeOut", -- [462]
+	"UIFrameFlash", -- [463]
+	"EasyMenu", -- [464]
+	"AddFriend", -- [466]
+	"AddOrRemoveFriend", -- [467]
+	"GetFriendInfo", -- [468]
+	"SetFriendNotes", -- [469]
+	"GetNumFriends", -- [470]
+	"GetSelectedFriend", -- [471]
+	"RemoveFriend", -- [472]
+	"SetSelectedFriend", -- [473]
+	"ShowFriends", -- [474]
+	"ToggleFriendsFrame", -- [475]
+	"GetNumGlyphSockets", -- [477]
+	"GetGlyphSocketInfo", -- [478]
+	"GetGlyphLink", -- [479]
+	"GlyphMatchesSocket", -- [480]
+	"PlaceGlyphInSocket", -- [481]
+	"RemoveGlyphFromSocket", -- [482]
+	"SpellCanTargetGlyph", -- [483]
+	"CanComplainChat", -- [485]
+	"CanComplainInboxItem", -- [486]
+	"ComplainChat", -- [487]
+	"ComplainInboxItem", -- [488]
+	"CloseGossip", -- [501]
+	"ForceGossip", -- [502]
+	"GetGossipActiveQuests", -- [503]
+	"GetGossipAvailableQuests", -- [504]
+	"GetGossipOptions", -- [505]
+	"GetGossipText", -- [506]
+	"GetNumGossipActiveQuests", -- [507]
+	"GetNumGossipAvailableQuests", -- [508]
+	"GetNumGossipOptions", -- [509]
+	"SelectGossipActiveQuest", -- [510]
+	"SelectGossipAvailableQuest", -- [511]
+	"SelectGossipOption", -- [512]
+	"AcceptGroup", -- [514]
+	"ConfirmReadyCheck", -- [515]
+	"ConvertToRaid", -- [516]
+	"DeclineGroup", -- [517]
+	"DoReadyCheck", -- [518]
+	"GetLootMethod", -- [519]
+	"GetLootThreshold", -- [520]
+	"GetMasterLootCandidate", -- [521]
+	"GetNumPartyMembers", -- [522]
+	"GetRealNumPartyMembers", -- [523]
+	"GetPartyLeaderIndex", -- [524]
+	"GetPartyMember", -- [525]
+	"InviteUnit", -- [526]
+	"IsPartyLeader", -- [527]
+	"LeaveParty", -- [528]
+	"PromoteToLeader", -- [529]
+	"SetLootMethod", -- [530]
+	"SetLootThreshold", -- [531]
+	"UninviteUnit", -- [532]
+	"UnitInParty", -- [533]
+	"UnitIsPartyLeader", -- [534]
+	"AcceptGuild", -- [536]
+	"BuyGuildCharter", -- [537]
+	"CanEditGuildEvent", -- [538]
+	"CanEditGuildInfo", -- [539]
+	"CanEditMOTD", -- [540]
+	"CanEditOfficerNote", -- [541]
+	"CanEditPublicNote", -- [542]
+	"CanGuildDemote", -- [543]
+	"CanGuildInvite", -- [544]
+	"CanGuildPromote", -- [545]
+	"CanGuildRemove", -- [546]
+	"CanViewOfficerNote", -- [547]
+	"CloseGuildRegistrar", -- [548]
+	"CloseGuildRoster", -- [549]
+	"CloseTabardCreation", -- [550]
+	"DeclineGuild", -- [551]
+	"GetGuildCharterCost", -- [552]
+	"GetGuildEventInfo", -- [553]
+	"GetGuildInfo", -- [554]
+	"GetGuildInfoText", -- [555]
+	"GetGuildRosterInfo", -- [556]
+	"GetGuildRosterLastOnline", -- [557]
+	"GetGuildRosterMOTD", -- [558]
+	"GetGuildRosterSelection", -- [559]
+	"GetGuildRosterShowOffline", -- [560]
+	"GetNumGuildEvents", -- [561]
+	"GetNumGuildMembers", -- [562]
+	"GetTabardCreationCost", -- [563]
+	"GetTabardInfo", -- [564]
+	"GuildControlAddRank", -- [565]
+	"GuildControlDelRank", -- [566]
+	"GuildControlGetNumRanks", -- [567]
+	"GuildControlGetRankFlags", -- [568]
+	"GuildControlGetRankName", -- [569]
+	"GuildControlSaveRank", -- [570]
+	"GuildControlSetRank", -- [571]
+	"GuildControlSetRankFlag", -- [572]
+	"GuildDemote", -- [573]
+	"GuildDisband", -- [574]
+	"GuildInfo", -- [575]
+	"GuildInvite", -- [576]
+	"GuildLeave", -- [577]
+	"GuildPromote", -- [578]
+	"GuildRoster", -- [579]
+	"GuildRosterSetOfficerNote", -- [580]
+	"GuildRosterSetPublicNote", -- [581]
+	"GuildSetMOTD", -- [582]
+	"GuildSetLeader", -- [583]
+	"GuildUninvite", -- [584]
+	"IsGuildLeader", -- [585]
+	"IsInGuild", -- [586]
+	"QueryGuildEventLog", -- [587]
+	"SetGuildInfoText", -- [588]
+	"SetGuildRosterSelection", -- [589]
+	"SetGuildRosterShowOffline", -- [590]
+	"SortGuildRoster", -- [591]
+	"UnitGetGuildXP", -- [592]
+	"AutoStoreGuildBankItem", -- [593]
+	"BuyGuildBankTab", -- [594]
+	"CanGuildBankRepair", -- [595]
+	"CanWithdrawGuildBankMoney", -- [596]
+	"CloseGuildBankFrame", -- [597]
+	"DepositGuildBankMoney", -- [598]
+	"GetCurrentGuildBankTab", -- [599]
+	"GetGuildBankItemInfo", -- [600]
+	"GetGuildBankItemLink", -- [601]
+	"GetGuildBankMoney", -- [602]
+	"GetGuildBankMoneyTransaction", -- [603]
+	"GetGuildBankTabCost", -- [604]
+	"GetGuildBankTabInfo", -- [605]
+	"GetGuildBankTabPermissions", -- [606]
+	"GetGuildBankText", -- [607]
+	"GetGuildBankTransaction", -- [608]
+	"GetGuildTabardFileNames", -- [611]
+	"GetNumGuildBankMoneyTransactions", -- [612]
+	"GetNumGuildBankTabs", -- [613]
+	"GetNumGuildBankTransactions", -- [614]
+	"PickupGuildBankItem", -- [615]
+	"PickupGuildBankMoney", -- [616]
+	"QueryGuildBankLog", -- [617]
+	"QueryGuildBankTab", -- [618]
+	"SetCurrentGuildBankTab", -- [619]
+	"SetGuildBankTabInfo", -- [620]
+	"SetGuildBankTabPermissions", -- [621]
+	"SplitGuildBankItem", -- [624]
+	"WithdrawGuildBankMoney", -- [625]
+	"GetHolidayBGHonorCurrencyBonuses", -- [627]
+	"GetInspectHonorData", -- [628]
+	"GetPVPLifetimeStats", -- [629]
+	"GetPVPRankInfo", -- [630]
+	"GetPVPRankProgress", -- [631]
+	"GetPVPSessionStats", -- [632]
+	"GetPVPYesterdayStats", -- [633]
+	"GetRandomBGHonorCurrencyBonuses", -- [634]
+	"HasInspectHonorData", -- [635]
+	"RequestInspectHonorData", -- [636]
+	"UnitPVPName", -- [637]
+	"UnitPVPRank", -- [638]
+	"AddIgnore", -- [640]
+	"AddOrDelIgnore", -- [641]
+	"DelIgnore", -- [642]
+	"GetIgnoreName", -- [643]
+	"GetNumIgnores", -- [644]
+	"GetSelectedIgnore", -- [645]
+	"SetSelectedIgnore", -- [646]
+	"CanInspect", -- [648]
+	"CheckInteractDistance", -- [649]
+	"ClearInspectPlayer", -- [650]
+	"GetInspectArenaTeamData", -- [651]
+	"HasInspectHonorData", -- [652]
+	"RequestInspectHonorData", -- [653]
+	"GetInspectHonorData", -- [654]
+	"NotifyInspect", -- [655]
+	"InspectUnit", -- [656]
+	"CanShowResetInstances", -- [658]
+	"GetBattlefieldInstanceExpiration", -- [659]
+	"GetBattlefieldInstanceInfo", -- [660]
+	"GetBattlefieldInstanceRunTime", -- [661]
+	"GetInstanceBootTimeRemaining", -- [662]
+	"GetInstanceInfo", -- [663]
+	"GetNumSavedInstances", -- [664]
+	"GetSavedInstanceInfo", -- [665]
+	"IsInInstance", -- [666]
+	"ResetInstances", -- [667]
+	"GetDungeonDifficulty", -- [668]
+	"SetDungeonDifficulty", -- [669]
+	"GetInstanceDifficulty", -- [670]
+	"GetInstanceLockTimeRemaining", -- [671]
+	"GetInstanceLockTimeRemainingEncounter", -- [672]
+	"AutoEquipCursorItem", -- [674]
+	"BankButtonIDToInvSlotID", -- [675]
+	"CancelPendingEquip", -- [676]
+	"ConfirmBindOnUse", -- [677]
+	"ContainerIDToInventoryID", -- [678]
+	"CursorCanGoInSlot", -- [679]
+	"EquipCursorItem", -- [680]
+	"EquipPendingItem", -- [681]
+	"GetInventoryAlertStatus", -- [682]
+	"GetInventoryItemBroken", -- [683]
+	"GetInventoryItemCooldown", -- [684]
+	"GetInventoryItemCount", -- [685]
+	"GetInventoryItemDurability", -- [686]
+	"GetInventoryItemGems", -- [687]
+	"GetInventoryItemID", -- [688]
+	"GetInventoryItemLink", -- [689]
+	"GetInventoryItemQuality", -- [690]
+	"GetInventoryItemTexture", -- [691]
+	"GetInventorySlotInfo", -- [692]
+	"GetWeaponEnchantInfo", -- [693]
+	"HasWandEquipped", -- [694]
+	"IsInventoryItemLocked", -- [695]
+	"KeyRingButtonIDToInvSlotID", -- [696]
+	"PickupBagFromSlot", -- [697]
+	"PickupInventoryItem", -- [698]
+	"UpdateInventoryAlertStatus", -- [699]
+	"UseInventoryItem", -- [700]
+	"EquipItemByName", -- [702]
+	"GetAuctionItemLink", -- [703]
+	"GetContainerItemLink", -- [704]
+	"GetItemCooldown", -- [705]
+	"GetItemCount", -- [706]
+	"GetItemFamily", -- [707]
+	"GetItemIcon", -- [708]
+	"GetItemInfo", -- [709]
+	"GetItemQualityColor", -- [710]
+	"GetItemSpell", -- [711]
+	"GetItemStats", -- [712]
+	"GetMerchantItemLink", -- [713]
+	"GetQuestItemLink", -- [714]
+	"GetQuestLogItemLink", -- [715]
+	"GetTradePlayerItemLink", -- [716]
+	"GetTradeSkillItemLink", -- [717]
+	"GetTradeSkillReagentItemLink", -- [718]
+	"GetTradeTargetItemLink", -- [719]
+	"IsUsableItem", -- [720]
+	"IsConsumableItem", -- [721]
+	"IsCurrentItem", -- [722]
+	"IsEquippedItem", -- [723]
+	"IsEquippableItem", -- [724]
+	"IsEquippedItemType", -- [725]
+	"IsItemInRange", -- [726]
+	"ItemHasRange", -- [727]
+	"OffhandHasWeapon", -- [728]
+	"SplitContainerItem", -- [729]
+	"SetItemRef", -- [730]
+	"AcceptSockets", -- [731]
+	"ClickSocketButton", -- [732]
+	"CloseSocketInfo", -- [733]
+	"GetSocketItemInfo", -- [734]
+	"GetSocketItemRefundable", -- [735]
+	"GetSocketItemBoundTradeable", -- [736]
+	"GetNumSockets", -- [737]
+	"GetSocketTypes", -- [738]
+	"GetExistingSocketInfo", -- [739]
+	"GetExistingSocketLink", -- [740]
+	"GetNewSocketInfo", -- [741]
+	"GetNewSocketLink", -- [742]
+	"SocketInventoryItem", -- [743]
+	"SocketContainerItem", -- [744]
+	"CloseItemText", -- [745]
+	"ItemTextGetCreator", -- [746]
+	"ItemTextGetItem", -- [747]
+	"ItemTextGetMaterial", -- [748]
+	"ItemTextGetPage", -- [749]
+	"ItemTextGetText", -- [750]
+	"ItemTextHasNextPage", -- [751]
+	"ItemTextNextPage", -- [752]
+	"ItemTextPrevPage", -- [753]
+	"GetMinimapZoneText", -- [755]
+	"GetRealZoneText", -- [756]
+	"GetSubZoneText", -- [757]
+	"GetZonePVPInfo", -- [758]
+	"GetZoneText", -- [759]
+	"CompleteLFGRoleCheck", -- [760]
+	"GetLFGDeserterExpiration", -- [761]
+	"GetLFGRandomCooldownExpiration", -- [762]
+	"GetLFGBootProposal", -- [763]
+	"GetLFGMode", -- [764]
+	"GetLFGQueueStats", -- [765]
+	"GetLFGRoles", -- [766]
+	"GetLFGRoleUpdate", -- [767]
+	"GetLFGRoleUpdateSlot", -- [768]
+	"SetLFGBootVote", -- [769]
+	"SetLFGComment", -- [770]
+	"SetLFGRoles", -- [771]
+	"UninviteUnit", -- [772]
+	"UnitGroupRolesAssigned", -- [773]
+	"UnitHasLFGDeserter", -- [774]
+	"UnitHasLFGRandomCooldown", -- [775]
+	"CloseLoot", -- [777]
+	"ConfirmBindOnUse", -- [778]
+	"ConfirmLootRoll", -- [779]
+	"ConfirmLootSlot", -- [780]
+	"GetLootMethod", -- [781]
+	"GetLootRollItemInfo", -- [782]
+	"GetLootRollItemLink", -- [783]
+	"GetLootRollTimeLeft", -- [784]
+	"GetLootSlotInfo", -- [785]
+	"GetLootSlotLink", -- [786]
+	"GetLootThreshold", -- [787]
+	"GetMasterLootCandidate", -- [788]
+	"GetNumLootItems", -- [789]
+	"GetOptOutOfLoot", -- [790]
+	"GiveMasterLoot", -- [791]
+	"IsFishingLoot", -- [792]
+	"LootSlot", -- [793]
+	"LootSlotIsCoin", -- [794]
+	"LootSlotIsCurrency", -- [795]
+	"LootSlotIsItem", -- [796]
+	"RollOnLoot", -- [797]
+	"SetLootMethod", -- [798]
+	"SetLootPortrait", -- [799]
+	"SetLootThreshold", -- [800]
+	"SetOptOutOfLoot", -- [801]
+	"CursorHasMacro", -- [804]
+	"DeleteMacro", -- [805]
+	"GetMacroBody", -- [807]
+	"GetMacroIconInfo", -- [808]
+	"GetMacroItemIconInfo", -- [809]
+	"GetMacroIndexByName", -- [810]
+	"GetMacroInfo", -- [811]
+	"GetNumMacroIcons", -- [812]
+	"GetNumMacroItemIcons", -- [813]
+	"GetNumMacros", -- [814]
+	"PickupMacro", -- [815]
+	"RunMacro", -- [816]
+	"RunMacroText", -- [817]
+	"SecureCmdOptionParse", -- [818]
+	"StopMacro", -- [819]
+	"AutoLootMailItem", -- [821]
+	"CheckInbox", -- [822]
+	"ClearSendMail", -- [823]
+	"ClickSendMailItemButton", -- [824]
+	"CloseMail", -- [825]
+	"DeleteInboxItem", -- [826]
+	"GetCoinIcon", -- [827]
+	"GetInboxHeaderInfo", -- [828]
+	"GetInboxItem", -- [829]
+	"GetInboxItemLink", -- [830]
+	"GetInboxNumItems", -- [831]
+	"GetInboxText", -- [832]
+	"GetInboxInvoiceInfo", -- [833]
+	"GetNumPackages", -- [834]
+	"GetNumStationeries", -- [835]
+	"GetPackageInfo", -- [836]
+	"GetSelectedStationeryTexture", -- [837]
+	"GetSendMailCOD", -- [838]
+	"GetSendMailItem", -- [839]
+	"GetSendMailItemLink", -- [840]
+	"GetSendMailMoney", -- [841]
+	"GetSendMailPrice", -- [842]
+	"GetStationeryInfo", -- [843]
+	"HasNewMail", -- [844]
+	"InboxItemCanDelete", -- [845]
+	"ReturnInboxItem", -- [846]
+	"SelectPackage", -- [847]
+	"SelectStationery", -- [848]
+	"SendMail", -- [849]
+	"SetSendMailCOD", -- [850]
+	"SetSendMailMoney", -- [851]
+	"TakeInboxItem", -- [852]
+	"TakeInboxMoney", -- [853]
+	"TakeInboxTextItem", -- [854]
+	"ClickLandmark", -- [856]
+	"GetCorpseMapPosition", -- [857]
+	"GetCurrentMapContinent", -- [858]
+	"GetCurrentMapDungeonLevel", -- [859]
+	"GetNumDungeonMapLevels", -- [860]
+	"GetCurrentMapAreaID", -- [861]
+	"GetCurrentMapZone", -- [862]
+	"GetMapContinents", -- [863]
+	"GetMapDebugObjectInfo", -- [864]
+	"GetMapInfo", -- [865]
+	"GetMapLandmarkInfo", -- [866]
+	"GetMapOverlayInfo", -- [867]
+	"GetMapZones", -- [868]
+	"GetNumMapDebugObjects", -- [869]
+	"GetNumMapLandmarks", -- [870]
+	"GetNumMapOverlays", -- [871]
+	"GetPlayerMapPosition", -- [872]
+	"ProcessMapClick", -- [873]
+	"RequestBattlefieldPositions", -- [874]
+	"SetDungeonMapLevel", -- [875]
+	"SetMapByID", -- [876]
+	"SetMapToCurrentZone", -- [877]
+	"SetMapZoom", -- [878]
+	"SetupFullscreenScale", -- [879]
+	"UpdateMapHighlight", -- [880]
+	"CreateWorldMapArrowFrame", -- [881]
+	"UpdateWorldMapArrowFrames", -- [882]
+	"ShowWorldMapArrowFrame", -- [883]
+	"PositionWorldMapArrowFrame", -- [884]
+	"ZoomOut", -- [885]
+	"BuyMerchantItem", -- [887]
+	"BuybackItem", -- [888]
+	"CanMerchantRepair", -- [889]
+	"CloseMerchant", -- [890]
+	"GetBuybackItemInfo", -- [891]
+	"GetBuybackItemLink", -- [892]
+	"GetMerchantItemCostInfo", -- [893]
+	"GetMerchantItemCostItem", -- [894]
+	"GetMerchantItemInfo", -- [895]
+	"GetMerchantItemLink", -- [896]
+	"GetMerchantItemMaxStack", -- [897]
+	"GetMerchantNumItems", -- [898]
+	"GetRepairAllCost", -- [899]
+	"HideRepairCursor", -- [900]
+	"InRepairMode", -- [901]
+	"PickupMerchantItem", -- [902]
+	"RepairAllItems", -- [903]
+	"ShowMerchantSellCursor", -- [904]
+	"ShowRepairCursor", -- [905]
+	"GetNumBuybackItems", -- [906]
+	"CastPetAction", -- [908]
+	"ClosePetStables", -- [909]
+	"DropItemOnUnit", -- [910]
+	"GetPetActionCooldown", -- [911]
+	"GetPetActionInfo", -- [912]
+	"GetPetActionSlotUsable", -- [913]
+	"GetPetActionsUsable", -- [914]
+	"GetPetExperience", -- [915]
+	"GetPetFoodTypes", -- [916]
+	"GetPetHappiness", -- [917]
+	"GetPetIcon", -- [918]
+	"GetPetTimeRemaining", -- [919]
+	"GetStablePetFoodTypes", -- [920]
+	"GetStablePetInfo", -- [921]
+	"HasPetSpells", -- [922]
+	"HasPetUI", -- [923]
+	"PetAbandon", -- [924]
+	"PetAggressiveMode", -- [925]
+	"PetAttack", -- [926]
+	"IsPetAttackActive", -- [927]
+	"PetStopAttack", -- [928]
+	"PetCanBeAbandoned", -- [929]
+	"PetCanBeDismissed", -- [930]
+	"PetCanBeRenamed", -- [931]
+	"PetDefensiveMode", -- [932]
+	"PetDismiss", -- [933]
+	"PetFollow", -- [934]
+	"PetHasActionBar", -- [935]
+	"PetPassiveMode", -- [936]
+	"PetRename", -- [937]
+	"PetWait", -- [938]
+	"PickupPetAction", -- [939]
+	"PickupStablePet", -- [940]
+	"SetPetStablePaperdoll", -- [941]
+	"TogglePetAutocast", -- [942]
+	"ToggleSpellAutocast", -- [943]
+	"GetSpellAutocast", -- [944]
+	"AddQuestWatch", -- [946]
+	"GetActiveLevel", -- [947]
+	"GetActiveTitle", -- [948]
+	"GetAvailableLevel", -- [949]
+	"GetAvailableTitle", -- [950]
+	"GetAvailableQuestInfo", -- [951]
+	"GetGreetingText", -- [952]
+	"GetNumQuestLeaderBoards", -- [953]
+	"GetNumQuestWatches", -- [954]
+	"GetObjectiveText", -- [955]
+	"GetProgressText", -- [956]
+	"GetQuestGreenRange", -- [957]
+	"GetQuestIndexForWatch", -- [958]
+	"GetQuestLink", -- [959]
+	"GetQuestLogGroupNum", -- [960]
+	"GetQuestLogLeaderBoard", -- [961]
+	"GetQuestLogTitle", -- [962]
+	"GetQuestReward", -- [963]
+	"GetRewardArenaPoints", -- [964]
+	"GetRewardHonor", -- [965]
+	"GetRewardMoney", -- [966]
+	"GetRewardSpell", -- [967]
+	"GetRewardTalents", -- [968]
+	"GetRewardText", -- [969]
+	"GetRewardTitle", -- [970]
+	"GetRewardXP", -- [971]
+	"IsQuestWatched", -- [972]
+	"IsUnitOnQuest", -- [973]
+	"QuestFlagsPVP", -- [974]
+	"QuestGetAutoAccept", -- [975]
+	"RemoveQuestWatch", -- [976]
+	"ShiftQuestWatches", -- [977]
+	"SortQuestWatches", -- [978]
+	"QueryQuestsCompleted", -- [979]
+	"GetQuestsCompleted", -- [980]
+	"QuestIsDaily", -- [981]
+	"QuestIsWeekly", -- [982]
+	"ClearRaidMarker", -- [984]
+	"ConvertToRaid", -- [985]
+	"ConvertToParty", -- [986]
+	"DemoteAssistant", -- [987]
+	"GetAllowLowLevelRaid", -- [988]
+	"GetNumRaidMembers", -- [989]
+	"GetRealNumRaidMembers", -- [990]
+	"GetPartyAssignment", -- [991]
+	"GetPartyAssignment", -- [992]
+	"GetRaidRosterInfo", -- [993]
+	"GetRaidTargetIndex", -- [994]
+	"GetReadyCheckStatus", -- [995]
+	"InitiateRolePoll", -- [996]
+	"IsRaidLeader", -- [997]
+	"IsRaidOfficer", -- [998]
+	"PlaceRaidMarker", -- [999]
+	"PromoteToAssistant", -- [1000]
+	"RequestRaidInfo", -- [1001]
+	"SetPartyAssignment", -- [1002]
+	"SetAllowLowLevelRaid", -- [1003]
+	"SetRaidRosterSelection", -- [1004]
+	"SetRaidSubgroup", -- [1005]
+	"SwapRaidSubgroup", -- [1006]
+	"SetRaidTarget", -- [1007]
+	"UnitInRaid", -- [1008]
+	"LFGGetDungeonInfoByID", -- [1009]
+	"GetInstanceLockTimeRemainingEncounter", -- [1010]
+	"RefreshLFGList", -- [1011]
+	"SearchLFGGetEncounterResults", -- [1012]
+	"SearchLFGGetJoinedID", -- [1013]
+	"SearchLFGGetNumResults", -- [1014]
+	"SearchLFGGetPartyResults", -- [1015]
+	"SearchLFGGetResults", -- [1016]
+	"SearchLFGJoin", -- [1017]
+	"SearchLFGLeave", -- [1018]
+	"SearchLFGSort", -- [1019]
+	"SetLFGComment", -- [1020]
+	"ClearAllLFGDungeons", -- [1021]
+	"JoinLFG", -- [1022]
+	"LeaveLFG", -- [1023]
+	"RequestLFDPartyLockInfo", -- [1024]
+	"RequestLFDPlayerLockInfo", -- [1025]
+	"SetLFGDungeon", -- [1026]
+	"SetLFGDungeonEnabled", -- [1027]
+	"SetLFGHeaderCollapsed", -- [1028]
+	"GetAddOnCPUUsage", -- [1029]
+	"GetAddOnMemoryUsage", -- [1030]
+	"GetEventCPUUsage", -- [1031]
+	"GetFrameCPUUsage", -- [1032]
+	"GetFunctionCPUUsage", -- [1033]
+	"GetScriptCPUUsage", -- [1034]
+	"ResetCPUUsage", -- [1035]
+	"UpdateAddOnCPUUsage", -- [1036]
+	"UpdateAddOnMemoryUsage", -- [1037]
+	"issecure", -- [1038]
+	"forceinsecure", -- [1039]
+	"issecurevariable", -- [1040]
+	"securecall", -- [1041]
+	"hooksecurefunc", -- [1042]
+	"InCombatLockdown", -- [1043]
+	"CombatTextSetActiveUnit", -- [1046]
+	"DownloadSettings", -- [1047]
+	"GetCVar", -- [1048]
+	"GetCVarDefault", -- [1049]
+	"GetCVarBool", -- [1050]
+	"GetCVarInfo", -- [1051]
+	"GetCurrentMultisampleFormat", -- [1052]
+	"GetCurrentResolution", -- [1053]
+	"GetGamma", -- [1054]
+	"GetMultisampleFormats", -- [1055]
+	"GetRefreshRates", -- [1056]
+	"GetScreenResolutions", -- [1057]
+	"GetVideoCaps", -- [1058]
+	"IsThreatWarningEnabled", -- [1059]
+	"RegisterCVar", -- [1060]
+	"ResetPerformanceValues", -- [1061]
+	"ResetTutorials", -- [1062]
+	"SetCVar", -- [1063]
+	"SetEuropeanNumbers", -- [1064]
+	"SetGamma", -- [1065]
+	"SetLayoutMode", -- [1066]
+	"SetMultisampleFormat", -- [1067]
+	"SetScreenResolution", -- [1068]
+	"ShowCloak", -- [1069]
+	"ShowHelm", -- [1070]
+	"ShowNumericThreat", -- [1071]
+	"ShowingCloak", -- [1072]
+	"ShowingHelm", -- [1073]
+	"UploadSettings", -- [1074]
+	"AbandonSkill", -- [1076]
+	"CastShapeshiftForm", -- [1078]
+	"CastSpell", -- [1079]
+	"CastSpellByName", -- [1080]
+	"GetMultiCastTotemSpells", -- [1081]
+	"GetNumShapeshiftForms", -- [1082]
+	"GetNumSpellTabs", -- [1083]
+	"GetShapeshiftForm", -- [1084]
+	"GetShapeshiftFormCooldown", -- [1085]
+	"GetShapeshiftFormInfo", -- [1086]
+	"GetSpellAutocast", -- [1087]
+	"GetSpellBookItemInfo", -- [1088]
+	"GetSpellBookItemName", -- [1089]
+	"GetSpellCooldown", -- [1090]
+	"GetSpellDescription", -- [1091]
+	"GetSpellInfo", -- [1092]
+	"GetSpellLink", -- [1093]
+	"GetSpellTabInfo", -- [1094]
+	"GetSpellTexture", -- [1095]
+	"GetTotemInfo", -- [1096]
+	"IsAttackSpell", -- [1097]
+	"IsAutoRepeatSpell", -- [1098]
+	"IsPassiveSpell", -- [1099]
+	"IsSpellInRange", -- [1100]
+	"IsUsableSpell", -- [1101]
+	"PickupSpell", -- [1102]
+	"QueryCastSequence", -- [1103]
+	"SetMultiCastSpell", -- [1104]
+	"SpellCanTargetUnit", -- [1105]
+	"SpellHasRange", -- [1106]
+	"SpellIsTargeting", -- [1107]
+	"SpellStopCasting", -- [1108]
+	"SpellStopTargeting", -- [1109]
+	"SpellTargetUnit", -- [1110]
+	"ToggleSpellAutocast", -- [1111]
+	"UnitCastingInfo", -- [1112]
+	"UnitChannelInfo", -- [1113]
+	"ConsoleExec", -- [1115]
+	"DetectWowMouse", -- [1116]
+	"GetBuildInfo", -- [1117]
+	"geterrorhandler", -- [1118]
+	"GetCurrentKeyBoardFocus", -- [1119]
+	"GetExistingLocales", -- [1120]
+	"GetFramerate", -- [1121]
+	"GetGameTime", -- [1122]
+	"GetLocale", -- [1123]
+	"GetCursorPosition", -- [1124]
+	"GetNetStats", -- [1125]
+	"GetRealmName", -- [1126]
+	"GetScreenHeight", -- [1127]
+	"GetScreenWidth", -- [1128]
+	"GetText", -- [1129]
+	"GetTime", -- [1130]
+	"IsAltKeyDown", -- [1131]
+	"InCinematic", -- [1132]
+	"IsControlKeyDown", -- [1133]
+	"IsDebugBuild", -- [1134]
+	"IsDesaturateSupported", -- [1135]
+	"IsLeftAltKeyDown", -- [1136]
+	"IsLeftControlKeyDown", -- [1137]
+	"IsLeftShiftKeyDown", -- [1138]
+	"IsLinuxClient", -- [1139]
+	"IsLoggedIn", -- [1140]
+	"IsMacClient", -- [1141]
+	"IsRightAltKeyDown", -- [1142]
+	"IsRightControlKeyDown", -- [1143]
+	"IsRightShiftKeyDown", -- [1144]
+	"IsShiftKeyDown", -- [1145]
+	"IsStereoVideoAvailable", -- [1146]
+	"IsWindowsClient", -- [1147]
+	"OpeningCinematic", -- [1148]
+	"PlayMusic", -- [1149]
+	"PlaySound", -- [1150]
+	"PlaySoundFile", -- [1151]
+	"ReloadUI", -- [1152]
+	"RepopMe", -- [1153]
+	"RequestTimePlayed", -- [1154]
+	"RestartGx", -- [1155]
+	"RunScript", -- [1156]
+	"Screenshot", -- [1157]
+	"SetAutoDeclineGuildInvites", -- [1158]
+	"seterrorhandler", -- [1159]
+	"StopCinematic", -- [1160]
+	"StopMusic", -- [1161]
+	"UIParentLoadAddOn", -- [1162]
+	"TakeScreenshot", -- [1163]
+	"BuyTrainerService", -- [1168]
+	"CheckTalentMasterDist", -- [1169]
+	"ConfirmTalentWipe", -- [1170]
+	"GetActiveTalentGroup", -- [1171]
+	"GetNumTalentTabs", -- [1172]
+	"GetNumTalents", -- [1173]
+	"GetTalentInfo", -- [1174]
+	"GetTalentLink", -- [1175]
+	"GetTalentPrereqs", -- [1176]
+	"GetTalentTabInfo", -- [1177]
+	"LearnTalent", -- [1178]
+	"SetActiveTalentGroup", -- [1179]
+	"GetNumTalentGroups", -- [1180]
+	"GetActiveTalentGroup", -- [1181]
+	"AddPreviewTalentPoints", -- [1182]
+	"GetGroupPreviewTalentPointsSpent", -- [1183]
+	"GetPreviewTalentPointsSpent", -- [1184]
+	"GetUnspentTalentPoints", -- [1185]
+	"LearnPreviewTalents", -- [1186]
+	"ResetGroupPreviewTalentPoints", -- [1187]
+	"ResetPreviewTalentPoints", -- [1188]
+	"AssistUnit", -- [1190]
+	"AttackTarget", -- [1191]
+	"ClearTarget", -- [1192]
+	"ClickTargetTradeButton", -- [1193]
+	"TargetLastEnemy", -- [1194]
+	"TargetLastTarget", -- [1195]
+	"TargetNearestEnemy", -- [1196]
+	"TargetNearestEnemyPlayer", -- [1197]
+	"TargetNearestFriend", -- [1198]
+	"TargetNearestFriendPlayer", -- [1199]
+	"TargetNearestPartyMember", -- [1200]
+	"TargetNearestRaidMember", -- [1201]
+	"TargetUnit", -- [1202]
+	"ToggleBackpack", -- [1204]
+	"ToggleBag", -- [1205]
+	"ToggleCharacter", -- [1206]
+	"ToggleFriendsFrame", -- [1207]
+	"ToggleSpellBook", -- [1208]
+	"TradeSkill", -- [1209]
+	"CloseTradeSkill", -- [1210]
+	"CollapseTradeSkillSubClass", -- [1211]
+	"PickupPlayerMoney", -- [1212]
+	"PickupTradeMoney", -- [1213]
+	"SetTradeMoney", -- [1214]
+	"ReplaceTradeEnchant", -- [1215]
+	"AssistUnit", -- [1217]
+	"CheckInteractDistance", -- [1218]
+	"DropItemOnUnit", -- [1219]
+	"FollowUnit", -- [1220]
+	"FocusUnit", -- [1221]
+	"ClearFocus", -- [1222]
+	"GetUnitName", -- [1223]
+	"GetUnitPitch", -- [1224]
+	"GetUnitSpeed", -- [1225]
+	"InviteUnit", -- [1226]
+	"IsUnitOnQuest", -- [1227]
+	"SpellCanTargetUnit", -- [1228]
+	"SpellTargetUnit", -- [1229]
+	"TargetUnit", -- [1230]
+	"UnitAffectingCombat", -- [1231]
+	"UnitArmor", -- [1232]
+	"UnitAttackBothHands", -- [1233]
+	"UnitAttackPower", -- [1234]
+	"UnitAttackSpeed", -- [1235]
+	"UnitAura", -- [1236]
+	"UnitBuff", -- [1237]
+	"UnitCanAssist", -- [1238]
+	"UnitCanAttack", -- [1239]
+	"UnitCanCooperate", -- [1240]
+	"UnitClass", -- [1241]
+	"UnitClassification", -- [1242]
+	"UnitCreatureFamily", -- [1243]
+	"UnitCreatureType", -- [1244]
+	"UnitDamage", -- [1245]
+	"UnitDebuff", -- [1246]
+	"UnitDefense", -- [1247]
+	"UnitDetailedThreatSituation", -- [1248]
+	"UnitExists", -- [1249]
+	"UnitFactionGroup", -- [1250]
+	"UnitGroupRolesAssigned", -- [1251]
+	"UnitGUID", -- [1252]
+	"GetPlayerInfoByGUID", -- [1253]
+	"UnitHasLFGDeserter", -- [1254]
+	"UnitHasLFGRandomCooldown", -- [1255]
+	"UnitHasRelicSlot", -- [1256]
+	"UnitHealth", -- [1257]
+	"UnitHealthMax", -- [1258]
+	"UnitInParty", -- [1259]
+	"UnitInRaid", -- [1260]
+	"UnitInBattleground", -- [1261]
+	"UnitIsInMyGuild", -- [1262]
+	"UnitInRange", -- [1263]
+	"UnitIsAFK", -- [1264]
+	"UnitIsCharmed", -- [1265]
+	"UnitIsConnected", -- [1266]
+	"UnitIsCorpse", -- [1267]
+	"UnitIsDead", -- [1268]
+	"UnitIsDeadOrGhost", -- [1269]
+	"UnitIsDND", -- [1270]
+	"UnitIsEnemy", -- [1271]
+	"UnitIsFeignDeath", -- [1272]
+	"UnitIsFriend", -- [1273]
+	"UnitIsGhost", -- [1274]
+	"UnitIsPVP", -- [1275]
+	"UnitIsPVPFreeForAll", -- [1276]
+	"UnitIsPVPSanctuary", -- [1277]
+	"UnitIsPartyLeader", -- [1278]
+	"UnitIsPlayer", -- [1279]
+	"UnitIsPossessed", -- [1280]
+	"UnitIsRaidOfficer", -- [1281]
+	"UnitIsSameServer", -- [1282]
+	"UnitIsTapped", -- [1283]
+	"UnitIsTappedByPlayer", -- [1284]
+	"UnitIsTappedByAllThreatList", -- [1285]
+	"UnitIsTrivial", -- [1286]
+	"UnitIsUnit", -- [1287]
+	"UnitIsVisible", -- [1288]
+	"UnitLevel", -- [1289]
+	"UnitMana", -- [1290]
+	"UnitManaMax", -- [1291]
+	"UnitName", -- [1292]
+	"UnitOnTaxi", -- [1293]
+	"UnitPlayerControlled", -- [1294]
+	"UnitPlayerOrPetInParty", -- [1295]
+	"UnitPlayerOrPetInRaid", -- [1296]
+	"UnitPVPName", -- [1297]
+	"UnitPVPRank", -- [1298]
+	"UnitPower", -- [1299]
+	"UnitPowerMax", -- [1300]
+	"UnitPowerType", -- [1301]
+	"UnitRace", -- [1302]
+	"UnitRangedAttack", -- [1303]
+	"UnitRangedAttackPower", -- [1304]
+	"UnitRangedDamage", -- [1305]
+	"UnitReaction", -- [1306]
+	"UnitResistance", -- [1307]
+	"UnitSelectionColor", -- [1308]
+	"UnitSex", -- [1309]
+	"UnitStat", -- [1310]
+	"UnitThreatSituation", -- [1311]
+	"UnitUsingVehicle", -- [1312]
+	"GetThreatStatusColor", -- [1313]
+	"UnitXP", -- [1314]
+	"UnitXPMax", -- [1315]
+	"SetPortraitTexture", -- [1316]
+	"SetPortraitToTexture", -- [1317]
+	"tinsert", -- [1318]
+}
+
+-- endp
--- a/Libs/DF/textentry.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/textentry.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -59,4 +59,4 @@
 			</EditBox>
 		</ScrollChild>
 	</ScrollFrame>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/DF/tutorial_alert.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/DF/tutorial_alert.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -244,4 +244,4 @@
 			</Frame>
 		</Frames>
 	</Frame>
-</Ui>
\ No newline at end of file
+</Ui>
--- a/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -1,39 +1,12 @@
---[[
-Name: DBIcon-1.0
-Revision: $Rev: 34 $
-Author(s): Rabbit (rabbit.magtheridon@gmail.com)
-Description: Allows addons to register to recieve a lightweight minimap icon as an alternative to more heavy LDB displays.
-Dependencies: LibStub
-License: GPL v2 or later.
-]]
-
---[[
-Copyright (C) 2008-2011 Rabbit
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-]]
 
 -----------------------------------------------------------------------
--- DBIcon-1.0
+-- LibDBIcon-1.0
 --
--- Disclaimer: Most of this code was ripped from Barrel but fixed, streamlined
---             and cleaned up a lot so that it no longer sucks.
+-- Allows addons to easily create a lightweight minimap icon as an alternative to heavier LDB displays.
 --
 
 local DBICON10 = "LibDBIcon-1.0"
-local DBICON10_MINOR = tonumber(("$Rev: 34 $"):match("(%d+)"))
+local DBICON10_MINOR = 36 -- Bump on changes
 if not LibStub then error(DBICON10 .. " requires LibStub.") end
 local ldb = LibStub("LibDataBroker-1.1", true)
 if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end
@@ -45,8 +18,9 @@
 lib.callbackRegistered = lib.callbackRegistered or nil
 lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib)
 lib.notCreated = lib.notCreated or {}
+lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate")
 
-function lib:IconCallback(event, name, key, value, dataobj)
+function lib:IconCallback(event, name, key, value)
 	if lib.objects[name] then
 		if key == "icon" then
 			lib.objects[name].icon:SetTexture(value)
@@ -73,7 +47,6 @@
 	lib.callbackRegistered = true
 end
 
--- Tooltip code ripped from StatBlockCore by Funkydude
 local function getAnchors(frame)
 	local x, y = frame:GetCenter()
 	if not x or not y then return "CENTER" end
@@ -86,10 +59,10 @@
 	if self.isMoving then return end
 	local obj = self.dataObject
 	if obj.OnTooltipShow then
-		GameTooltip:SetOwner(self, "ANCHOR_NONE")
-		GameTooltip:SetPoint(getAnchors(self))
-		obj.OnTooltipShow(GameTooltip)
-		GameTooltip:Show()
+		lib.tooltip:SetOwner(self, "ANCHOR_NONE")
+		lib.tooltip:SetPoint(getAnchors(self))
+		obj.OnTooltipShow(lib.tooltip)
+		lib.tooltip:Show()
 	elseif obj.OnEnter then
 		obj.OnEnter(self)
 	end
@@ -97,13 +70,13 @@
 
 local function onLeave(self)
 	local obj = self.dataObject
-	GameTooltip:Hide()
+	lib.tooltip:Hide()
 	if obj.OnLeave then obj.OnLeave(self) end
 end
 
 --------------------------------------------------------------------------------
 
-local onClick, onMouseUp, onMouseDown, onDragStart, onDragStop, onDragEnd, updatePosition
+local onClick, onMouseUp, onMouseDown, onDragStart, onDragStop, updatePosition
 
 do
 	local minimapShapes = {
@@ -165,7 +138,7 @@
 		self.icon:UpdateCoord()
 		self:SetScript("OnUpdate", onUpdate)
 		self.isMoving = true
-		GameTooltip:Hide()
+		lib.tooltip:Hide()
 	end
 end
 
@@ -197,14 +170,14 @@
 	button:SetFrameLevel(8)
 	button:RegisterForClicks("anyUp")
 	button:RegisterForDrag("LeftButton")
-	button:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
+	button:SetHighlightTexture(136477) --"Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight"
 	local overlay = button:CreateTexture(nil, "OVERLAY")
 	overlay:SetSize(53, 53)
-	overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
+	overlay:SetTexture(136430) --"Interface\\Minimap\\MiniMap-TrackingBorder"
 	overlay:SetPoint("TOPLEFT")
 	local background = button:CreateTexture(nil, "BACKGROUND")
 	background:SetSize(20, 20)
-	background:SetTexture("Interface\\Minimap\\UI-Minimap-Background")
+	background:SetTexture(136467) --"Interface\\Minimap\\UI-Minimap-Background"
 	background:SetPoint("TOPLEFT", 7, -5)
 	local icon = button:CreateTexture(nil, "ARTWORK")
 	icon:SetSize(17, 17)
--- a/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -2,7 +2,7 @@
 assert(LibStub, "LibDataBroker-1.1 requires LibStub")
 assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0")
 
-local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 3)
+local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 4)
 if not lib then return end
 oldminor = oldminor or 0
 
@@ -64,3 +64,27 @@
 		return self.namestorage[dataobject]
 	end
 end
+
+if oldminor < 4 then
+	local next = pairs(attributestorage)
+	function lib:pairs(dataobject_or_name)
+		local t = type(dataobject_or_name)
+		assert(t == "string" or t == "table", "Usage: ldb:pairs('dataobjectname') or ldb:pairs(dataobject)")
+
+		local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
+		assert(attributestorage[dataobj], "Data object not found")
+
+		return next, attributestorage[dataobj], nil
+	end
+
+	local ipairs_iter = ipairs(attributestorage)
+	function lib:ipairs(dataobject_or_name)
+		local t = type(dataobject_or_name)
+		assert(t == "string" or t == "table", "Usage: ldb:ipairs('dataobjectname') or ldb:ipairs(dataobject)")
+
+		local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
+		assert(attributestorage[dataobj], "Data object not found")
+
+		return ipairs_iter, attributestorage[dataobj], 0
+	end
+end
--- a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua	Fri Jul 20 19:04:12 2018 -0300
@@ -1,6 +1,6 @@
 --[[
 Name: LibSharedMedia-3.0
-Revision: $Revision: 69 $
+Revision: $Revision: 91 $
 Author: Elkano (elkano@gmx.de)
 Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
 Website: http://www.wowace.com/projects/libsharedmedia-3-0/
@@ -9,7 +9,7 @@
 License: LGPL v2.1
 ]]
 
-local MAJOR, MINOR = "LibSharedMedia-3.0", 4030402 -- increase manualy on changes
+local MAJOR, MINOR = "LibSharedMedia-3.0", 6010002 -- 6.1.0 v2 / increase manually on changes
 local lib = LibStub:NewLibrary(MAJOR, MINOR)
 
 if not lib then return end
@@ -60,9 +60,13 @@
 -- BACKGROUND
 if not lib.MediaTable.background then lib.MediaTable.background = {} end
 lib.MediaTable.background["None"]									= [[]]
+lib.MediaTable.background["Blizzard Collections Background"]		= [[Interface\Collections\CollectionsBackgroundTile]]
 lib.MediaTable.background["Blizzard Dialog Background"]				= [[Interface\DialogFrame\UI-DialogBox-Background]]
 lib.MediaTable.background["Blizzard Dialog Background Dark"]		= [[Interface\DialogFrame\UI-DialogBox-Background-Dark]]
 lib.MediaTable.background["Blizzard Dialog Background Gold"]		= [[Interface\DialogFrame\UI-DialogBox-Gold-Background]]
+lib.MediaTable.background["Blizzard Garrison Background"]			= [[Interface\Garrison\GarrisonUIBackground]]
+lib.MediaTable.background["Blizzard Garrison Background 2"]			= [[Interface\Garrison\GarrisonUIBackground2]]
+lib.MediaTable.background["Blizzard Garrison Background 3"]			= [[Interface\Garrison\GarrisonMissionUIInfoBoxBackgroundTile]]
 lib.MediaTable.background["Blizzard Low Health"]					= [[Interface\FullScreenTextures\LowHealth]]
 lib.MediaTable.background["Blizzard Marble"]						= [[Interface\FrameGeneral\UI-Background-Marble]]
 lib.MediaTable.background["Blizzard Out of Control"]				= [[Interface\FullScreenTextures\OutOfControl]]
@@ -88,6 +92,36 @@
 -- FONT
 if not lib.MediaTable.font then lib.MediaTable.font = {} end
 local SML_MT_font = lib.MediaTable.font
+--[[
+All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4
+Fonts were checked using langcover.pl from DejaVu fonts (http://sourceforge.net/projects/dejavu/) and FontForge (http://fontforge.org/)
+latin means check for: de, en, es, fr, it, pt
+
+file				name							latin	koKR	ruRU	zhCN	zhTW
+2002.ttf			2002							X		X		X		-		-
+2002B.ttf			2002 Bold						X		X		X		-		-
+ARHei.ttf			AR CrystalzcuheiGBK Demibold	X		-		X		X		X
+ARIALN.TTF			Arial Narrow					X		-		X		-		-
+ARKai_C.ttf			AR ZhongkaiGBK Medium (Combat)	X		-		X		X		X
+ARKai_T.ttf			AR ZhongkaiGBK Medium			X		-		X		X		X
+bHEI00M.ttf			AR Heiti2 Medium B5				-		-		-		-		X
+bHEI01B.ttf			AR Heiti2 Bold B5				-		-		-		-		X
+bKAI00M.ttf			AR Kaiti Medium B5				-		-		-		-		X
+bLEI00D.ttf			AR Leisu Demi B5				-		-		-		-		X
+FRIZQT__.TTF		Friz Quadrata TT				X		-		-		-		-
+FRIZQT___CYR.TTF	FrizQuadrataCTT					x		-		X		-		-
+K_Damage.TTF		YDIWingsM						-		X		X		-		-
+K_Pagetext.TTF		MoK								X		X		X		-		-
+MORPHEUS.TTF		Morpheus						X		-		-		-		-
+MORPHEUS_CYR.TTF	Morpheus						X		-		X		-		-
+NIM_____.ttf		Nimrod MT						X		-		X		-		-
+SKURRI.TTF			Skurri							X		-		-		-		-
+SKURRI_CYR.TTF		Skurri							X		-		X		-		-
+
+WARNING: Although FRIZQT___CYR is available on western clients, it doesn't support special European characters e.g. é, ï, ö
+Due to this, we cannot use it as a replacement for FRIZQT__.TTF
+]]
+
 if locale == "koKR" then
 	LOCALE_MASK = lib.LOCALE_BIT_koKR
 --
@@ -120,11 +154,17 @@
 elseif locale == "ruRU" then
 	LOCALE_MASK = lib.LOCALE_BIT_ruRU
 --
-	SML_MT_font["Arial Narrow"]			= [[Fonts\ARIALN.TTF]]
-	SML_MT_font["Friz Quadrata TT"]		= [[Fonts\FRIZQT__.TTF]]
-	SML_MT_font["Morpheus"]				= [[Fonts\MORPHEUS.TTF]]
-	SML_MT_font["Nimrod MT"]			= [[Fonts\NIM_____.ttf]]
-	SML_MT_font["Skurri"]				= [[Fonts\SKURRI.TTF]]
+	SML_MT_font["2002"]								= [[Fonts\2002.TTF]]
+	SML_MT_font["2002 Bold"]						= [[Fonts\2002B.TTF]]
+	SML_MT_font["AR CrystalzcuheiGBK Demibold"]		= [[Fonts\ARHei.TTF]]
+	SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]	= [[Fonts\ARKai_C.TTF]]
+	SML_MT_font["AR ZhongkaiGBK Medium"]			= [[Fonts\ARKai_T.TTF]]
+	SML_MT_font["Arial Narrow"]						= [[Fonts\ARIALN.TTF]]
+	SML_MT_font["Friz Quadrata TT"]					= [[Fonts\FRIZQT___CYR.TTF]]
+	SML_MT_font["MoK"]								= [[Fonts\K_Pagetext.TTF]]
+	SML_MT_font["Morpheus"]							= [[Fonts\MORPHEUS_CYR.TTF]]
+	SML_MT_font["Nimrod MT"]						= [[Fonts\NIM_____.ttf]]
+	SML_MT_font["Skurri"]							= [[Fonts\SKURRI_CYR.TTF]]
 --
 	lib.DefaultMedia.font = "Friz Quadrata TT"
 --
@@ -132,10 +172,17 @@
 	LOCALE_MASK = lib.LOCALE_BIT_western
 	locale_is_western = true
 --
-	SML_MT_font["Arial Narrow"]			= [[Fonts\ARIALN.TTF]]
-	SML_MT_font["Friz Quadrata TT"]		= [[Fonts\FRIZQT__.TTF]]
-	SML_MT_font["Morpheus"]				= [[Fonts\MORPHEUS.TTF]]
-	SML_MT_font["Skurri"]				= [[Fonts\SKURRI.TTF]]
+	SML_MT_font["2002"]								= [[Fonts\2002.TTF]]
+	SML_MT_font["2002 Bold"]						= [[Fonts\2002B.TTF]]
+	SML_MT_font["AR CrystalzcuheiGBK Demibold"]		= [[Fonts\ARHei.TTF]]
+	SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]	= [[Fonts\ARKai_C.TTF]]
+	SML_MT_font["AR ZhongkaiGBK Medium"]			= [[Fonts\ARKai_T.TTF]]
+	SML_MT_font["Arial Narrow"]						= [[Fonts\ARIALN.TTF]]
+	SML_MT_font["Friz Quadrata TT"]					= [[Fonts\FRIZQT__.TTF]]
+	SML_MT_font["MoK"]								= [[Fonts\K_Pagetext.TTF]]
+	SML_MT_font["Morpheus"]							= [[Fonts\MORPHEUS_CYR.TTF]]
+	SML_MT_font["Nimrod MT"]						= [[Fonts\NIM_____.ttf]]
+	SML_MT_font["Skurri"]							= [[Fonts\SKURRI_CYR.TTF]]
 --
 	lib.DefaultMedia.font = "Friz Quadrata TT"
 --
@@ -145,6 +192,7 @@
 if not lib.MediaTable.statusbar then lib.MediaTable.statusbar = {} end
 lib.MediaTable.statusbar["Blizzard"]						= [[Interface\TargetingFrame\UI-StatusBar]]
 lib.MediaTable.statusbar["Blizzard Character Skills Bar"]	= [[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]]
+lib.MediaTable.statusbar["Blizzard Raid Bar"]				= [[Interface\RaidFrame\Raid-Bar-Hp-Fill]]
 lib.DefaultMedia.statusbar = "Blizzard"
 
 -- SOUND
@@ -174,7 +222,14 @@
 		error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key))
 	end
 	mediatype = mediatype:lower()
-	if mediatype == lib.MediaType.FONT  and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end
+	if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end
+	if mediatype == lib.MediaType.SOUND and type(data) == "string" then
+		local path = data:lower()
+		-- Only ogg and mp3 are valid sounds.
+		if not path:find(".ogg", nil, true) and not path:find(".mp3", nil, true) then
+			return false
+		end
+	end
 	if not mediaTable[mediatype] then mediaTable[mediatype] = {} end
 	local mtable = mediaTable[mediatype]
 	if mtable[key] then return false end
--- a/Libs/LibSharedMedia-3.0/lib.xml	Sun Mar 11 10:50:42 2018 -0300
+++ b/Libs/LibSharedMedia-3.0/lib.xml	Fri Jul 20 19:04:12 2018 -0300
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Script file="LibSharedMedia-3.0.lua" />
-</Ui>
\ No newline at end of file
+</Ui>