IRF_Options = AceLibrary("AceAddon-2.0"):new("AceConsole-2.0")
local self = IRF_Options
local mother = InvenRaidFrames
local SM = LibStub("LibSharedMedia-3.0")
local Waterfall = AceLibrary("Waterfall-1.0")
local FuBarPlugin = AceLibrary:HasInstance("FuBarPlugin-2.0") and AceLibrary("FuBarPlugin-2.0")
local HealComm = LibStub("LibHealComm-3.0", true)

local consoleOptions = {
	type = "group",
	name = "http://wow.inven.co.kr",
	desc = "인벤 레이드 프레임",
	args = {
		basic = {
			type = "group",
			name = "기본",
			desc = "애드온의 기본적인 설정을 합니다.",
			order = 10,
			args = {
				use = {
					type = "group",
					name = "사용",
					desc = "애드온의 사용에 대한 설정을 합니다.",
					order = 10,
					args = {
						solo = {
							type = "text",
							name = "사용",
							desc = "솔로잉, 파티, 공격대 시 사용여부를 선택합니다.",
							get = function()
								return mother.db.profile.use
							end,
							set = function(v)
								mother.db.profile.use = v
								mother:RosterUpdate()
								mother:UpdateGroupAttribute()
							end,
							validate = { "항상", "파티", "공격대" },
							order = 10,
						},
						lock = {
							type = "toggle",
							name = "프레임 고정",
							desc = "프레임을 고정시킵니다.",
							get = function()
								return mother.db.profile.lock
							end,
							set = function()
								mother.db.profile.lock = not mother.db.profile.lock
							end,
							order = 15,
						},
						hideparty = {
							type = "toggle",
							name = "공격대 참여시 파티 프레임 숨기기",
							desc = "공격대 참여시 파티 프레임을 숨깁니다.",
							get = function() return GetCVar("hidePartyInRaid") == "1" end,
							set = function()
								if GetCVar("hidePartyInRaid") == "1" then
									SetCVar("hidePartyInRaid", "0")
								else
									SetCVar("hidePartyInRaid", "1")
								end
							end,
							order = 20,
						},
						tooltip = {
							type = "text",
							name = "툴팁 표시",
							desc = "툴팁 표시 여부를 설정합니다.",
							get = function()
								return mother.db.profile.tooltip
							end,
							set = function(v)
								mother.db.profile.tooltip = v
							end,
							validate = { "항상 표시", "비전투 중에만", "표시 안함" },
							order = 50,
						},
						update = {
							type = "range",
							name = "업데이트 속도",
							desc = "프레임의 업데이트 속도를 설정합니다. 낮게 설정하면 반응속도는 빠르지만 렉이 생길 수 있습니다. (권장 속도: 0.1)",
							get = function()
								return mother.db.profile.updateTime
							end,
							set = function(v)
								mother.db.profile.updateTime = v
								mother:SetUpdateTime()
							end,
							min = 0.01, max = 0.5, step = 0.01,
							order = 60,
						},
						showIRF = {
							type = "execute",
							name = "IRF 사용/비사용",
							desc = "IRF를 사용하거나 사용하지 않습니다.",
							order = 90,
							func = function()
								mother.db.char.showIRF = not mother.db.char.showIRF
								mother:RosterUpdate()
							end,
						},
						profile = {
							type = "execute",
							name = "프로필 설정",
							desc = "프로필 설정창을 열고 닫습니다.",
							order = 100,
							func = function()
								if InterfaceOptionsFrame:GetWidth() < 640 then
									InterfaceOptionsFrame:SetWidth(640)
								end
								InterfaceOptionsFrame_OpenToFrame(mother.optFrame)
								if Waterfall:IsOpen("InvenRaidFrames") then
									self:ToggleMenu()
								end
							end,
						},
					},
				},
				display = {
					type = "group",
					name = "정렬 및 배치",
					desc = "공격대 그룹의 정렬 및 배치에 대한 설정을 합니다.",
					order = 20,
					args = {
						types = {
							type = "text",
							name = "정렬 방식",
							desc = "파티 및 직업별 배치를 합니다.",
							get = function() return mother.db.profile.ordertype end,
							set = function(v)
								mother.db.profile.ordertype = v
								Waterfall:Refresh("InvenRaidFrames")
								mother:TagUpdate()
								mother:UpdateGroupAttribute()
								mother:ClearMemory()
							end,
							validate = { "파티", "직업" },
							order = 10,
						},
						memberorder = {
							type = "text",
							name = "파티원 배치 방식",
							desc = "파티 내 인원을 가로 또는 세로로 배치합니다.",
							get = function() return mother.db.profile.memberorder end,
							set = function(v)
								mother.db.profile.memberorder = v
								mother:TagUpdate()
								mother:UpdateGroupAttribute()
								mother:ClearMemory()
							end,
							order = 20,
							validate = { "가로", "세로" },
							hidden = function() return mother.db.profile.ordertype == "직업" end,
						},
						grouporder = {
							type = "text",
							name = "파티 정렬 방식",
							desc = "공격대 파티의 정렬 방향을 설정합니다.",
							get = function() return mother.db.profile.grouporder end,
							set = function(v)
								mother.db.profile.grouporder = v
								mother:UpdateGroupAttribute()
								mother:ClearMemory()
							end,
							order = 30,
							validate = { "가로", "세로" },
							hidden = function() return mother.db.profile.ordertype == "직업" end,
						},
						groupnum = {
							type = "range",
							name = "파티 수",
							desc = "배치되는 방향의 파티 수를 설정합니다.",
							get = function() return mother.db.profile.groupnum end,
							set = function(v)
								mother.db.profile.groupnum = v
								mother:UpdateGroupAttribute()
								mother:ClearMemory()
							end,
							order = 40,
							min = 1, max = 8, step = 1,
							hidden = function() return mother.db.profile.ordertype == "직업" end,
						},
						group = {
							type = "text",
							name = "인원 표시 제한",
							desc = "표시될 최대 파티 수를 설정합니다. 자동으로 설정하면 인스턴스 던전 진입시 자동으로 인던 진입 제한에 따라 뒷파티는 숨깁니다. 예를 들어 25인 공격대 던전인 검은 사원에 입장했을때, 1~5파티(25명)까지만 표시하고 남은 6~8파티에 있는 인원은 화면에 표시하지 않습니다.",
							get = function()
								return mother.db.profile.showGroup
							end,
							set = function(v)
								mother.db.profile.showGroup = v
								mother:UpdateGroupSetPoint()
								mother:UpdateUnit()
								mother:ClearMemory()
							end,
							validate = { "자동", "5인", "10인", "15인", "20인", "25인", "40인" },
							order = 50,
							hidden = function() return mother.db.profile.ordertype == "직업" end,
						},
						showtag = {
							type = "toggle",
							name = "파티 태그 보이기",
							desc = "파티 위에 파티원의 그룹 번호를 가지는 태그를 표시합니다.",
							get = function() return mother.db.profile.tag end,
							set = function()
								mother.db.profile.tag = not mother.db.profile.tag
								mother:UpdateGroupSetPoint()
								mother:TagUpdate()
							end,
							order = 60,
							hidden = function() return mother.db.profile.ordertype == "직업" end,
						},
						hidetemp = {
							type = "toggle",
							name = "파티 내 빈 공백 제거",
							desc = "파티 내 인원이 5명이 아니라면 비는 파티원 자리를 남기지 않고 다음 파티을 붙입니다.",
							get = function() return mother.db.profile.hidetemp end,
							set = function()
								mother.db.profile.hidetemp = not mother.db.profile.hidetemp
								mother:UpdateGroupSetPoint()
							end,
							order = 70,
							hidden = function() return mother.db.profile.ordertype == "직업" end,
						},
						memberorder2 = {
							type = "text",
							name = "인원 정렬 방식",
							desc = "직업별 인원 정렬 방식을 설정합니다.",
							get = function() return mother.db.profile.memberorder2 end,
							set = function(v)
								mother.db.profile.memberorder2 = v
								mother:UpdateGroupAttribute()
								mother:ClearMemory()
							end,
							order = 80,
							validate = { "가로", "세로", "직업 단위 가로", "직업 단위 세로" },
							hidden = function() return mother.db.profile.ordertype == "파티" end,
						},
						membernum = {
							type = "range",
							name = "인원 수",
							desc = "배치되는 방향의 인원 수를 설정합니다.",
							get = function() return mother.db.profile.membernum end,
							set = function(v)
								mother.db.profile.membernum = v
								mother:UpdateGroupAttribute()
								mother:ClearMemory()
							end,
							order = 90,
							min = 1, max = 25, step = 1,
							hidden = function() return mother.db.profile.ordertype == "파티" end,
						},
						party = {
							type = "toggle",
							name = "자기 파티 표시",
							desc = "공격대 참여시 제일 상단에 자신의 파티를 표시합니다.",
							get = function()
								return mother.db.profile.useparty
							end,
							set = function()
								mother.db.profile.useparty = not mother.db.profile.useparty
								mother:UpdateGroupAttribute()
								mother:UpdateUnit()
							end,
							order = 300,
							hidden = function() return mother.db.profile.ordertype == "직업" end,
						},
						party2 = {
							type = "toggle",
							name = "자기 파티 표시",
							desc = "공격대 참여시 제일 상단에 자신의 파티를 표시합니다.",
							get = function()
								return mother.db.profile.useparty
							end,
							set = function()
								mother.db.profile.useparty = not mother.db.profile.useparty
								mother:UpdateGroupAttribute()
								mother:UpdateUnit()
							end,
							order = 95,
							hidden = function() return mother.db.profile.ordertype == "파티" end,
						},
					},
				},
				pet = {
					type = "group",
					name = "소환수",
					desc = "소환수 모듈에 대한 설정을 합니다.",
					order = 30,
					hidden = function() return not mother:HasModule("Pet") end,
					args = {
						use = {
							type = "toggle",
							name = "표시",
							desc = "별도의 프레임으로 제공되는 소환수 모듈을 사용합니다.",
							get = function()
								return mother.db.char.pet
							end,
							set = function()
								mother.db.char.pet = not mother.db.char.pet
								if mother:EnableModule("Pet") then
									IRF_Pet:CheckStatus()
								end
							end,
							order = 10,
						},
						orderline = {
							type = "text",
							name = "정렬 방식",
							desc = "소환수의 정렬 방향을 설정합니다.",
							get = function() return mother.db.profile.petorder end,
							set = function(v)
								mother.db.profile.petorder = v
								if IRF_Pet then
									mother:RunLeaveCombat("UpdatePetOrder", IRF_Pet, "SetOrder")
								end
							end,
							order = 20,
							validate = { "가로", "세로" },
							disabled = function() return not mother.db.char.pet end,
						},
						line = {
							type = "range",
							name = "배치 수",
							desc = "배치되는 방향의 소환수 수를 설정합니다.",
							get = function() return mother.db.profile.petline end,
							set = function(v)
								mother.db.profile.petline = v
								if IRF_Pet then
									mother:RunLeaveCombat("UpdatePetOrder", IRF_Pet, "SetOrder")
								end
							end,
							order = 30,
							min = 1, max = 25, step = 1,
							disabled = function() return not mother.db.char.pet end,
						},
					},
				},
				minimapbutton = {
					type = "group",
					name = "미니맵 버튼",
					desc = "미니맵 버튼에 대한 설정을 합니다.",
					order = 100,
					args = {
						show = {
							type = "toggle",
							name = "미니맵 버튼 보이기",
							desc = "미니맵 버튼을 보이고 숨깁니다.",
							order = 200,
							get = function() return mother.db.profile.showMM end,
							set = function()
								mother.db.profile.showMM = not mother.db.profile.showMM
								if not IRF_FuBar then
									mother:ToggleMinimapButton()
								end
							end,
							hidden = function() return FuBar and IRF_FuBar end,
						},
						lock = {
							type = "toggle",
							name = "미니맵 버튼 잠그기",
							desc = "미니맵 버튼을 잠급니다.",
							order = 210,
							get = function() return not mother.db.profile.LibMMButton.dragable end,
							set = function()
								mother.db.profile.LibMMButton.dragable = not mother.db.profile.LibMMButton.dragable
							end,
							hidden = function() return FuBar and IRF_FuBar end,
						},
					},
					hidden = function() return FuBar and IRF_FuBar end,
				},
				fubar = {
					type = "group",
					name = "미니맵 버튼 및 푸바 설정",
					desc = "미니맵 버튼 및 푸바 메뉴를 설정합니다.",
					args = {},
					order = 110,
					hidden = function() return not(FuBar and IRF_FuBar) end,
				},
			},
		},
		layout = {
			type = "group",
			name = "외형",
			desc = "애드온의 외형을 설정합니다.",
			order = 20,
			args = {
				frame = {
					type = "group",
					name = "프레임",
					desc = "프레임의 외형을 설정합니다.",
					order = 5,
					args = {
						texture = {
							type = "text",
							name = "텍스쳐",
							desc = "체력바의 텍스쳐 모양을 설정합니다.",
							get = function()
								return mother.db.profile.barTexture
							end,
							set = function(v)
								mother.db.profile.barTexture = v
								mother:SetBar()
							end,
							validate = SM:List("statusbar"),
							columns = 2,
							order = 10,
						},
						width = {
							type = "range",
							name = "너비 조절",
							desc = "프레임의 너비를 조절합니다.",
							get = function()
								return mother.db.profile.unitWidth
							end,
							set = function(v)
								if not InCombatLockdown() then
									mother.db.profile.unitWidth = v
									mother:SetUnitSize()
									mother:UpdateGroupAttribute()
									mother:UpdateGroupSetPoint()
									mother:UpdateUnit()
								end
							end,
							min = 65, max = 200, step = 1,
							order = 20,
						},
						height = {
							type = "range",
							name = "높이 조절",
							desc = "프레임의 높이를 조절합니다.",
							get = function()
								return mother.db.profile.unitHeight
							end,
							set = function(v)
								if not InCombatLockdown() then
									mother.db.profile.unitHeight = v
									mother:SetUnitSize()
									mother:UpdateGroupAttribute()
									mother:UpdateGroupSetPoint()
									mother:UpdateUnit()
								end
							end,
							min = 32, max = 64, step = 1,
							order = 30,
						},
						scale = {
							type = "range",
							name = "크기 조절",
							desc = "프레임의 크기를 조절합니다.",
							get = function()
								return mother.db.profile.scale
							end,
							set = function(v)
								mother.db.profile.scale = v
								mother:RunLeaveCombat("UpdateMainScale", mother.vars.group.m, "SetScale", v)
								mother:RunLeaveCombat("UpdateBorderScale", mother.vars.group.m.border, "SetScale", v)
								mother:RunLeaveCombat("UpdateScale", mother, "SendMessage", "InvenRaidFrames_UpdateScale")
							end,
							min = 0.5, max = 2, step = 0.01,
							order = 40,
						},
						offset = {
							type = "range",
							name = "플레이어간 간격",
							desc = "플레이어간 간격을 설정합니다.",
							get = function() return mother.db.profile.offset end,
							set = function(v)
								mother.db.profile.offset = v
								mother:UpdateGroupAttribute()
								if IRF_Pet then
									mother:RunLeaveCombat("UpdatePetOffset", IRF_Pet, "SetOffset")
								end
							end,
							order = 50,
							min = 0, max = 30, step = 1,
						},
						moalpha = {
							type = "range",
							name = "마우스 오버 투명도",
							desc = "마우스 오버로 하이라이트되는 프레임의 투명도를 설정합니다.",
							get = function() return mother.db.profile.moalpha end,
							set = function(v)
								mother.db.profile.moalpha = v
								mother.highlightFrame:SetAlpha(mother.db.profile.moalpha)
							end,
							order = 60,
							min = 0, max = 1, step = 0.01,
						},
						bg = {
							type = "color",
							name = "프레임 배경 및 투명도",
							desc = "플레이어 프레임의 뒷 배경의 색상 및 투명도를 설정합니다.",
							get = function() return unpack(mother.db.profile.color.unitbg) end,
							set = function(r, g, b, a)
								mother.db.profile.color.unitbg = { r, g, b, a }
								mother:SetUnitForm()
							end,
							order = 70,
							min = 0, max = 1, step = 0.01, hasAlpha = true,
						},
					},
				},
				healthbar = {
					type = "group",
					name = "체력바",
					desc = "체력바에 대한 설정을 합니다.",
					order = 10,
					args = {
						quickhealth = {
							type = "toggle",
							name = "빠른 체력 반영 사용",
							desc = "LibQuickHealth-2.0을 사용하여 보다 빠른 체력 반영 기능을 사용합니다. 변경 사항은 재접속 후 적용됩니다.",
							get = function() return mother.db.profile.useQuickHealth end,
							set = function()
								mother.db.profile.useQuickHealth = not mother.db.profile.useQuickHealth
							end,
							order = 10,
						},
						classcolor = {
							type = "toggle",
							name = "직업별 체력바 색상",
							desc = "직업별 색상에 따라 체력바 색상을 변경합니다.",
							get = function()
								return mother.db.profile.classcolor
							end,
							set = function()
								mother.db.profile.classcolor = not mother.db.profile.classcolor
								mother.vars.range = {}
								mother:UpdateUnit()
							end,
							order = 20,
						},
						smooth = {
							type = "toggle",
							name = "부드러운 색상 변화",
							desc = "체력 저하에 따라 체력바 색상을 빨간색으로 변화시킵니다.",
							order = 30,
							get = function() return mother.db.profile.redcolor end,
							set = function() mother.db.profile.redcolor = not mother.db.profile.redcolor mother:UpdateUnit() end,
							disabled = function() return mother.db.profile.classcolor end,
						},
						health = {
							type = "color",
							name = "색상",
							desc = "체력바의 색상을 설정합니다.",
							order = 40,
							get = function() return unpack(mother.db.profile.color.health) end,
							set = function(r, g, b)
								mother.db.profile.color.health = { r, g, b }
								mother:UpdateUnit()
							end,
							disabled = function() return mother.db.profile.classcolor end,
						},
						hpalpha = {
							type = "range",
							name = "투명도",
							desc = "체력바의 투명도를 조절합니다.",
							get = function()
								return mother.db.profile.healthAlpha
							end,
							set = function(v)
								mother.db.profile.healthAlpha = v
								mother.vars.range = {}
								mother:SetBar()
								mother:UpdateRange()
							end,
							min = 0,
							max = 1,
							step = 0.01,
							order = 50,
						},
						hpbgalpha = {
							type = "range",
							name = "배경 투명도",
							desc = "체력바의 배경 투명도를 조절합니다.",
							get = function()
								return mother.db.profile.healthBGAlpha
							end,
							set = function(v)
								mother.db.profile.healthBGAlpha = v
								mother:SetBar()
							end,
							min = 0,
							max = 0.5,
							step = 0.01,
							order = 60,
						},
					},
				},
				manabar = {
					type = "group",
					name = "마나바",
					desc = "마나바에 대한 설정을 합니다.",
					order = 20,
					args = {
						per = {
							type = "range",
							name = "비율",
							desc = "프레임에서 마나바가 차지하는 비율을 설정합니다. 0으로 설정하면 마나바가 보이지 않습니다.",
							order = 10,
							get = function() return mother.db.profile.manaper end,
							set = function(v)
								if not InCombatLockdown() then
									mother.db.profile.manaper = v
									mother:SetUnitSize()
								end
							end,
							min = 0, max = 1, step = 0.01,
						},
						mana = {
							type = "color",
							name = "마나",
							desc = "마나 색상을 설정합니다",
							order = 20,
							get = function() return unpack(mother.db.profile.color.mana) end,
							set = function(r, g, b)
								mother.db.profile.color.mana = { r, g, b }
								mother:UpdateUnit()
							end,
							disabled = function() return mother.db.profile.manaper == 0 end,
						},
						rage = {
							type = "color",
							name = "분노",
							desc = "분노 색상을 설정합니다",
							order = 30,
							get = function() return unpack(mother.db.profile.color.rage) end,
							set = function(r, g, b)
								mother.db.profile.color.rage = { r, g, b }
								mother:UpdateUnit()
							end,
							disabled = function() return mother.db.profile.manaper == 0 end,
						},
						energy = {
							type = "color",
							name = "기력",
							desc = "기력 색상을 설정합니다",
							order = 40,
							get = function() return unpack(mother.db.profile.color.energy) end,
							set = function(r, g, b)
								mother.db.profile.color.energy = { r, g, b }
								mother:UpdateUnit()
							end,
							disabled = function() return mother.db.profile.manaper == 0 end,
						},
						focus = {
							type = "color",
							name = "집중력",
							desc = "사냥꾼 소환수의 집중력 색상을 설정합니다.",
							order = 50,
							get = function() return unpack(mother.db.profile.color.focus) end,
							set = function(r, g, b)
								mother.db.profile.color.focus = { r, g, b }
								mother:UpdateUnit()
							end,
							disabled = function() return mother.db.profile.manaper == 0 end,
							hidden = function() return not mother:HasModule("Pet") end,
						},
					},
				},
				text = {
					type = "group",
					name = "글자",
					desc = "체력바 위에 표시되는 플레이어의 이름에 대한 설정을 합니다.",
					order = 30,
					args = {
						font = {
							type = "text",
							name = "폰트",
							desc = "폰트를 설정합니다.",
							order = 10,
							get = function() return mother.db.profile.font end,
							set = function(v)
								mother.db.profile.font = v
								mother:SetFont()
							end,
							validate = SM:List("font"),
						},
						size = {
							type = "range",
							name = "크기",
							desc = "폰트의 크기를 조절합니다.",
							get = function() return mother.db.profile.fontSize end,
							set = function(v)
								mother.db.profile.fontSize = v
								mother:SetFont()
							end,
							min = 10, max = 14, step = 1,
							order = 20,
						},
						attribute = {
							type = "text",
							name = "속성",
							desc = "폰트의 속성을 설정합니다.",
							order = 30,
							get = function() return mother.db.profile.fontAttribute end,
							set = function(v)
								mother.db.profile.fontAttribute = v
								mother:SetFont()
							end,
							validate = { "그림자", "외각선", "굵은 외각선", "예리하게 + 그림자", "예리하게 + 외각선", "예리하게 + 굵은 외각선", "없음" },
						},
						namelen = {
							type = "text",
							name = "이름 글자 수",
							desc = "화면에 표시될 최대 이름 글자 수를 설정합니다.",
							get = function()
								return mother.db.profile.namelen
							end,
							set = function(v)
								mother.db.profile.namelen = v
								mother:UpdateUnit()
							end,
							validate = { "3", "4", "5", "6", "7", "8" },
							order = 40,
						},

					},
				},
				classcolor = {
					type = "group",
					name = "직업별 색상",
					desc = "직업별의 색상을 설정합니다.",
					order = 40,
					args = {
						warrior = {
							type = "color",
							name = "전사",
							desc = "전사 직업의 색상을 바꿉니다.",
							order = 10,
							get = function() return unpack(mother.db.profile.color.WARRIOR) end,
							set = function(r, g, b)
								mother.db.profile.color.WARRIOR = { r, g, b }
								mother:UpdateUnit()
							end,
						},
						rogue = {
							type = "color",
							name = "도적",
							desc = "도적 직업의 색상을 바꿉니다.",
							order = 11,
							get = function() return unpack(mother.db.profile.color.ROGUE) end,
							set = function(r, g, b)
								mother.db.profile.color.ROGUE = { r, g, b }
								mother:UpdateUnit()
							end,
						},
						priest = {
							type = "color",
							name = "사제",
							desc = "사제 직업의 색상을 바꿉니다.",
							order = 12,
							get = function() return unpack(mother.db.profile.color.PRIEST) end,
							set = function(r, g, b)
								mother.db.profile.color.PRIEST = { r, g, b }
								mother:UpdateUnit()
							end,
						},
						mage = {
							type = "color",
							name = "마법사",
							desc = "마법사 직업의 색상을 바꿉니다.",
							order = 13,
							get = function() return unpack(mother.db.profile.color.MAGE) end,
							set = function(r, g, b)
								mother.db.profile.color.MAGE = { r, g, b }
								mother:UpdateUnit()
							end,
						},
						warlock = {
							type = "color",
							name = "흑마법사",
							desc = "흑마법사 직업의 색상을 바꿉니다.",
							order = 14,
							get = function() return unpack(mother.db.profile.color.WARLOCK) end,
							set = function(r, g, b)
								mother.db.profile.color.WARLOCK = { r, g, b }
								mother:UpdateUnit()
							end,
						},
						hunter = {
							type = "color",
							name = "사냥꾼",
							desc = "사냥꾼 직업의 색상을 바꿉니다.",
							order = 13,
							get = function() return unpack(mother.db.profile.color.HUNTER) end,
							set = function(r, g, b)
								mother.db.profile.color.HUNTER = { r, g, b }
								mother:UpdateUnit()
							end,
						},
						druid = {
							type = "color",
							name = "드루이드",
							desc = "드루이드 직업의 색상을 바꿉니다.",
							order = 14,
							get = function() return unpack(mother.db.profile.color.DRUID) end,
							set = function(r, g, b)
								mother.db.profile.color.DRUID = { r, g, b }
								mother:UpdateUnit()
							end,
						},
						shaman = {
							type = "color",
							name = "주술사",
							desc = "주술사 직업의 색상을 바꿉니다.",
							order = 15,
							get = function() return unpack(mother.db.profile.color.SHAMAN) end,
							set = function(r, g, b)
								mother.db.profile.color.SHAMAN = { r, g, b }
								mother:UpdateUnit()
							end,
						},
						paladin = {
							type = "color",
							name = "성기사",
							desc = "성기사 직업의 색상을 바꿉니다.",
							order = 16,
							get = function() return unpack(mother.db.profile.color.PALADIN) end,
							set = function(r, g, b)
								mother.db.profile.color.PALADIN = { r, g, b }
								mother:UpdateUnit()
							end,
						},
						deathknight = {
							type = "color",
							name = "죽음의 기사",
							desc = "죽음의 기사 직업의 색상을 바꿉니다.",
							order = 16,
							get = function() return unpack(mother.db.profile.color.DEATHKNIGHT) end,
							set = function(r, g, b)
								mother.db.profile.color.DEATHKNIGHT = { r, g, b }
								mother:UpdateUnit()
							end,
						},
					},
				},
				backgroup = {
					type = "group",
					name = "배경",
					desc = "배경의 외형을 설정합니다.",
					order = 50,
					args = {
						show = {
							type = "toggle",
							name = "배경 보이기",
							desc = "배경을 보이거나 숨깁니다.",
							get = function()
								return mother.db.profile.showbg
							end,
							set = function()
								mother.db.profile.showbg = not mother.db.profile.showbg
								mother:UpdateBorder()
								if mother:IsEnableModule("Pet") then
									IRF_Pet:UpdateBorder()
								end
							end,
							order = 5,
						},
						alpha = {
							type = "range",
							name = "배경 투명도",
							desc = "배경의 투명도를 조절합니다.",
							get = function()
								return mother.db.profile.borderAlpha
							end,
							set = function(v)
								mother.db.profile.borderAlpha = v
								mother.vars.group.m.border:SetAlpha(v)
								if IRF_Pet then
									IRF_Pet:SetBorder()
								end
							end,
							min = 0, max = 1, step = 0.01,
							order = 10,
							disabled = function() return not mother.db.profile.showbg end,
						},
						main = {
							type = "color",
							name = "배경 색상",
							desc = "배경 색상을 설정합니다.",
							order = 20,
							get = function() return unpack(mother.db.profile.color.bg) end,
							set = function(r, g, b, a)
								mother.db.profile.color.bg = { r, g, b, a }
								mother.vars.group.m.border:SetBackdropColor(r, g, b, a)
								if IRF_Pet then
									IRF_Pet:SetBorder()
								end
							end,
							hasAlpha = true,
							disabled = function() return not mother.db.profile.showbg end,
						},
						border = {
							type = "color",
							name = "테두리 색상",
							desc = "테두리의 색상을 설정합니다.",
							order = 30,
							get = function() return unpack(mother.db.profile.color.border) end,
							set = function(r, g, b, a)
								mother.db.profile.color.border = { r, g, b, a }
								mother.vars.group.m.border:SetBackdropBorderColor(r, g, b, a)
								if IRF_Pet then
									IRF_Pet:SetBorder()
								end
							end,
							hasAlpha = true,
							disabled = function() return not mother.db.profile.showbg end,
						},
					},
				},
			},
		},
		funct = {
			type = "group",
			name = "기능",
			desc = "애드온의 기능을 설정합니다.",
			order = 30,
			args = {
				outline = {
					type = "group",
					name = "외각선",
					desc = "플레이어 프레임 주위에 있는 외각선의 기능을 설정합니다.",
					order = 20,
					args = {
						use = {
							type = "text",
							name = "동작",
							desc = "외각선의 작동 기능을 설정합니다.",
							order = 10,
							get = function() return mother.db.profile.outline end,
							set = function(v)
								mother.db.profile.outline = v
								for _, f in pairs(mother.vars.frames) do
									f.border:SetBackdropBorderColor(0, 0, 0, mother.db.profile.bgAlpha)
								end
								mother:ClearOutline()
								mother:UpdateAggro()
								Waterfall:Refresh("InvenRaidFrames")
							end,
							validate = { "디버프", "어그로", "대상", "마우스 오버", "체력 저하", "사용 안함" },
						},
						dorder = {
							type = "group",
							name = "디버프 표시 종류",
							desc = "디버프 표시 종류에 대한 설정을 합니다.",
							order = 20,
							hidden = function() return mother.db.profile.outline ~= "디버프" end,
							args = {
								curse = {
									type = "toggle",
									name = "저주 디버프 표시",
									desc = "저주 디버프를 표시합니다.",
									order = 10,
									get = function() return InvenRaidFramesDispelDB.outline.Curse end,
									set = function()
										InvenRaidFramesDispelDB.outline.Curse = not InvenRaidFramesDispelDB.outline.Curse
										mother:UpdateUnit()
									end,
								},
								magic = {
									type = "toggle",
									name = "마법 디버프 표시",
									desc = "마법 디버프를 표시합니다.",
									order = 20,
									get = function() return InvenRaidFramesDispelDB.outline.Magic end,
									set = function()
										InvenRaidFramesDispelDB.outline.Magic = not InvenRaidFramesDispelDB.outline.Magic
										mother:UpdateUnit()
									end,
								},
								disease = {
									type = "toggle",
									name = "질병 디버프 표시",
									desc = "질병 디버프를 표시합니다.",
									order = 30,
									get = function() return InvenRaidFramesDispelDB.outline.Disease end,
									set = function()
										InvenRaidFramesDispelDB.outline.Disease = not InvenRaidFramesDispelDB.outline.Disease
										mother:UpdateUnit()
									end,
								},
								poison = {
									type = "toggle",
									name = "독 디버프 표시",
									desc = "독 디버프를 표시합니다.",
									order = 40,
									get = function() return InvenRaidFramesDispelDB.outline.Poison end,
									set = function()
										InvenRaidFramesDispelDB.outline.Poison = not InvenRaidFramesDispelDB.outline.Poison
										mother:UpdateUnit()
									end,
								},
								normal = {
									type = "toggle",
									name = "무속성 디버프 표시",
									desc = "무속성 디버프를 표시합니다.",
									order = 50,
									get = function() return InvenRaidFramesDispelDB.outline.Normal end,
									set = function()
										InvenRaidFramesDispelDB.outline.Normal = not InvenRaidFramesDispelDB.outline.Normal
										mother:UpdateUnit()
									end,
								},
							},
						},
						dcolor = {
							type = "group",
							name = "디버프 표시 색상",
							desc = "디버프 표시 색상에 대한 설정을 합니다.",
							order = 30,
							hidden = function() return mother.db.profile.outline ~= "디버프" end,
							args = {
								cursecolor = {
									type = "color",
									name = "저주 디버프 색상",
									desc = "저주 디버프의 색상을 설정합니다",
									order = 10,
									get = function() return unpack(mother.db.profile.color.Curse) end,
									set = function(r, g, b)
										mother.db.profile.color.Curse = { r, g, b }
										mother:UpdateUnit()
									end,
								},
								magiccolor = {
									type = "color",
									name = "마법 디버프 색상",
									desc = "마법 디버프의 색상을 설정합니다",
									order = 20,
									get = function() return unpack(mother.db.profile.color.Magic) end,
									set = function(r, g, b)
										mother.db.profile.color.Magic = { r, g, b }
										mother:UpdateUnit()
									end,
								},
								diseasecolor = {
									type = "color",
									name = "질병 디버프 색상",
									desc = "질병 디버프의 색상을 설정합니다",
									order = 30,
									get = function() return unpack(mother.db.profile.color.Disease) end,
									set = function(r, g, b)
										mother.db.profile.color.Disease = { r, g, b }
										mother:UpdateUnit()
									end,
								},
								poisoncolor = {
									type = "color",
									name = "독 디버프 색상",
									desc = "독 디버프의 색상을 설정합니다",
									order = 40,
									get = function() return unpack(mother.db.profile.color.Poison) end,
									set = function(r, g, b)
										mother.db.profile.color.Poison = { r, g, b }
										mother:UpdateUnit()
									end,
								},
								normalcolor = {
									type = "color",
									name = "무속성 디버프 색상",
									desc = "무속성 디버프의 색상을 설정합니다",
									order = 50,
									get = function() return unpack(mother.db.profile.color.Normal) end,
									set = function(r, g, b)
										mother.db.profile.color.Normal = { r, g, b }
										mother:UpdateUnit()
									end,
								},
							},
						},
						aggrocolor = {
							type = "color",
							name = "어그로 색상",
							desc = "어그로 획득시 외각선의 색상을 설정합니다.",
							order = 40,
							get = function() return unpack(mother.db.profile.color.aggro) end,
							set = function(r, g, b)
								mother.db.profile.color.aggro = { r, g, b }
								mother.db.profile.color.aggro2 = self:GetHexColor(r, g, b)
								for _, f in pairs(mother.vars.frames) do
									f.border:SetBackdropBorderColor(0, 0, 0, mother.db.profile.bgAlpha)
								end
								mother:UpdateAggro()
								mother:UpdateUnit()
							end,
							hidden = function() return mother.db.profile.outline ~= "어그로" end,
						},
						color = {
							type = "color",
							name = "외각선 색상",
							desc = "외각선의 색상을 설정합니다.",
							order = 50,
							get = function() return unpack(mother.db.profile.color.outline) end,
							set = function(r, g, b)
								mother.db.profile.color.outline = { r, g, b, 1 }
								for _, f in pairs(mother.vars.frames) do
									f.border:SetBackdropBorderColor(0, 0, 0, mother.db.profile.bgAlpha)
								end
								mother:UpdateAggro()
							end,
							hidden = function() return mother.db.profile.outline ~= "대상" and mother.db.profile.outline ~= "마우스 오버" and mother.db.profile.outline ~= "체력 저하" end,
						},
						hpper = {
							type = "range",
							name = "체력 저하 경고 체력량",
							desc = "지정한 체력 퍼센트 이하로 떨어지면 외각선을 표시합니다. 이 기능은 전투중일 때만 작동합니다.",
							order = 60,
							get = function() return mother.db.profile.lowhp end,
							set = function(v)
								mother.db.profile.lowhp = v
								mother:UpdateUnit()
							end,
							min = 0, max = 100, step = 1,
						},
					},
				},
				range = {
					type = "group",
					name = "사정 거리",
					desc = "사정 거리에 대한 설정을 합니다. 사제, 드루이드, 주술사, 성기사는 40m를 기준으로 하며 마법사, 흑마법사는 30m로 기준으로 합니다. 또 전사, 도적, 사냥꾼은 28m를 기준으로 산정합니다.",
					order = 30,
					args = {
						alpha = {
							type = "range",
							name = "사정 거리 밖 투명도",
							desc = "사정 거리가 벗어난 플레이어의 투명도를 조절합니다.",
							get = function()
								return mother.db.profile.rangeAlpha
							end,
							set = function(v)
								mother.db.profile.rangeAlpha = v
								mother.vars.range = {}
								mother:UpdateRange()
							end,
							min = 0, max = 1, step = 0.01,
							order = 10,
						},
						textalpha = {
							type = "toggle",
							name = "이름 투명도 적용",
							desc = "사정 거리 밖 투명도에 따라 이름 글자의 투명도를 같이 투명하게 합니다.",
							get = function()
								return mother.db.profile.textAlpha
							end,
							set = function()
								mother.db.profile.textAlpha = not mother.db.profile.textAlpha
								mother.vars.range = {}
								mother:UpdateRange()
							end,
							order = 20,
						},
						manaalpha = {
							type = "toggle",
							name = "마나바 투명도 적용",
							desc = "사정 거리 밖 투명도에 따라 마나바의 투명도를 같이 투명하게 합니다.",
							get = function()
								return mother.db.profile.manaAlpha
							end,
							set = function()
								mother.db.profile.manaAlpha = not mother.db.profile.manaAlpha
								mother.vars.range = {}
								mother:UpdateRange()
							end,
							order = 20,
						},
					},
				},
				buff = {
					type = "group",
					name = "버프 확인",
					desc = "자신이 시전 할 수 있는 버프 확인에 대한 설정을 합니다.",
					order = 45,
					args = {},
				},
				ibuff = {
					type = "group",
					name = "생존기 표시",
					desc = "플레이어가 시전한 생존 기술(방패의 벽, 얼음 방패 등)을 프레임에 표시합니다.",
					order = 60,
					args = {
						use = {
							type = "toggle",
							name = "사용",
							desc = "플레이어가 시전한 생존기술(방패의 벽, 얼음 방패 등)을 플레이어의 이름과 대체합니다.",
							order = 10,
							get = function() return mother.db.profile.spspell end,
							set = function() mother.db.profile.spspell = not mother.db.profile.spspell mother:UpdateUnit() end,
						},
					},
				},
				debuff = {
					type = "group",
					name = "디버프 아이콘 표시",
					desc = "디버프 아이콘 표시에 대한 설정을 합니다.",
					order = 100,
					args = {
						use = {
							type = "toggle",
							name = "사용",
							desc = "디버프 아이콘 모듈을 사용합니다.",
							order = 10,
							get = function() return mother.db.profile.usedebuff end,
							set = function()
								mother.db.profile.usedebuff = not mother.db.profile.usedebuff
								if mother.db.profile.usedebuff then
									if mother:IsEnableModule("Debuff") then
										IRF_Debuff:Update()
									else
										mother:EnableModule("Debuff")
									end

								elseif mother:IsEnableModule("Debuff") then
									IRF_Debuff:Update()
								end
							end,
						},
						seticon = {
							type = "text",
							name = "이이콘 표시 방식",
							desc = "디버프를 아이콘 또는 색상으로 표시 여부를 설정합니다.",
							order = 20,
							get = function() return mother.db.profile.debufftype end,
							set = function(v)
								mother.db.profile.debufftype = v
								Waterfall:Refresh("InvenRaidFrames")
								if mother:IsEnableModule("Debuff") then
									IRF_Debuff:Update()
								end
							end,
							validate = { "디버프 아이콘", "색상 아이콘" },
							disabled = function() return not mother.db.profile.usedebuff end,
						},
						count = {
							type = "toggle",
							name = "중첩 횟수 표시",
							desc = "디버프 아이콘의 중첩 횟수를 표시합니다.",
							order = 25,
							get = function() return mother.db.profile.debuffcount end,
							set = function()
								mother.db.profile.debuffcount = not mother.db.profile.debuffcount
								if mother:IsEnableModule("Debuff") then
									IRF_Debuff:Update()
								end
							end,
							disabled = function() return not(mother.db.profile.usedebuff and mother.db.profile.debufftype == "디버프 아이콘") end,
						},
						num = {
							type = "text",
							name = "디버프 아이콘 표시 수",
							desc = "프레임 내에 표시될 디버프 아이콘의 수를 설정합니다.",
							order = 30,
							get = function() return mother.db.profile.debuffnum end,
							set = function(v)
								mother.db.profile.debuffnum = v
								if mother:IsEnableModule("Debuff") then
									IRF_Debuff:Update()
								elseif mother:HasModule("Debuff") then
									mother:UpdateUnit()
								end
							end,
							validate = { "1", "2", "3", "4" },
							disabled = function() return not mother.db.profile.usedebuff end,
						},
						location = {
							type = "text",
							name = "위치",
							desc = "디버프 아이콘의 위치를 설정합니다.",
							order = 40,
							get = function() return mother.db.profile.debuffloc2 end,
							set = function(v)
								mother.db.profile.debuffloc2 = v
								if mother:IsEnableModule("Debuff") then
									IRF_Debuff:SetLocation()
								end
							end,
							validate = { "좌측", "중앙", "우측", "상단", "하단", "좌측 상단", "좌측 하단", "우측 상단", "우측 하단" },
							disabled = function() return not mother.db.profile.usedebuff end,
						},
						size = {
							type = "range",
							name = "디버프 아이콘 크기",
							desc = "디버프 아이콘의 크기를 변경합니다.",
							order = 50,
							get = function() return mother.db.profile.debuffsize2 end,
							set = function(v)
								mother.db.profile.debuffsize2 = v
								if mother:IsEnableModule("Debuff") then
									IRF_Debuff:SetSize()
								end

							end,
							min = 8, max = 28, step = 1,
							disabled = function() return not mother.db.profile.usedebuff end,
						},
						alhpa = {
							type = "range",
							name = "투명도",
							desc = "디버프 아이콘의 투명도를 설정합니다.",
							order = 60,
							get = function() return mother.db.profile.debuffAlpha2 end,
							set = function(v)
								mother.db.profile.debuffAlpha2 = v
								if mother:IsEnableModule("Debuff") then
									IRF_Debuff.vars.frame:SetAlpha(mother.db.profile.debuffAlpha2)
								end
							end,
							min = 0, max = 1, step = 0.01,
							disabled = function() return not mother.db.profile.usedebuff end,
						},
						dorder = {
							type = "group",
							name = "디버프 표시 종류",
							desc = "디버프 표시 종류에 대한 설정을 합니다.",
							order = 70,
							disabled = function() return not mother.db.profile.usedebuff end,
							args = {
								curse = {
									type = "toggle",
									name = "저주 디버프 표시",
									desc = "저주 디버프를 표시합니다.",
									order = 10,
									get = function() return InvenRaidFramesDispelDB.Curse end,
									set = function()
										InvenRaidFramesDispelDB.Curse = not InvenRaidFramesDispelDB.Curse
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
								magic = {
									type = "toggle",
									name = "마법 디버프 표시",
									desc = "마법 디버프를 표시합니다.",
									order = 20,
									get = function() return InvenRaidFramesDispelDB.Magic end,
									set = function()
										InvenRaidFramesDispelDB.Magic = not InvenRaidFramesDispelDB.Magic
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
								disease = {
									type = "toggle",
									name = "질병 디버프 표시",
									desc = "질병 디버프를 표시합니다.",
									order = 30,
									get = function() return InvenRaidFramesDispelDB.Disease end,
									set = function()
										InvenRaidFramesDispelDB.Disease = not InvenRaidFramesDispelDB.Disease
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
								poison = {
									type = "toggle",
									name = "독 디버프 표시",
									desc = "독 디버프를 표시합니다.",
									order = 40,
									get = function() return InvenRaidFramesDispelDB.Poison end,
									set = function()
										InvenRaidFramesDispelDB.Poison = not InvenRaidFramesDispelDB.Poison
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
								normal = {
									type = "toggle",
									name = "무속성 디버프 표시",
									desc = "무속성 디버프를 표시합니다.",
									order = 50,
									get = function() return InvenRaidFramesDispelDB.Normal end,
									set = function()
										InvenRaidFramesDispelDB.Normal = not InvenRaidFramesDispelDB.Normal
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
							},
						},
						dcolor = {
							type = "group",
							name = "디버프 표시 색상",
							desc = "디버프 표시 색상에 대한 설정을 합니다.",
							order = 80,
							disabled = function() return not mother.db.profile.usedebuff end,
							hidden = function() return mother.db.profile.debufftype ~= "색상 아이콘" end,
							args = {
								cursecolor = {
									type = "color",
									name = "저주 디버프 색상",
									desc = "저주 디버프의 색상을 설정합니다",
									order = 10,
									get = function() return unpack(mother.db.profile.color.Curse) end,
									set = function(r, g, b)
										mother.db.profile.color.Curse = { r, g, b }
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
								magiccolor = {
									type = "color",
									name = "마법 디버프 색상",
									desc = "마법 디버프의 색상을 설정합니다",
									order = 20,
									get = function() return unpack(mother.db.profile.color.Magic) end,
									set = function(r, g, b)
										mother.db.profile.color.Magic = { r, g, b }
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
								diseasecolor = {
									type = "color",
									name = "질병 디버프 색상",
									desc = "질병 디버프의 색상을 설정합니다",
									order = 30,
									get = function() return unpack(mother.db.profile.color.Disease) end,
									set = function(r, g, b)
										mother.db.profile.color.Disease = { r, g, b }
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
								poisoncolor = {
									type = "color",
									name = "독 디버프 색상",
									desc = "독 디버프의 색상을 설정합니다",
									order = 40,
									get = function() return unpack(mother.db.profile.color.Poison) end,
									set = function(r, g, b)
										mother.db.profile.color.Poison = { r, g, b }
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
								normalcolor = {
									type = "color",
									name = "무속성 디버프 색상",
									desc = "무속성 디버프의 색상을 설정합니다",
									order = 50,
									get = function() return unpack(mother.db.profile.color.Normal) end,
									set = function(r, g, b)
										mother.db.profile.color.Normal = { r, g, b }
										mother:UpdateUnit()
										if mother:IsEnableModule("Debuff") then
											IRF_Debuff:Update()
										end
									end,
									disabled = function() return not mother.db.profile.usedebuff end,
								},
							},
						},
					},
				},
				debuffhealth = {
					type = "group",
					name = "디버프 체력바 표시",
					desc = "디버프에 따른 체력바의 색상 변화를 설정 합니다.",
					order = 110,
					args = {
						use = {
							type = "toggle",
							name = "사용",
							desc = "디버프의 종류에 따라 프레임의 체력바 색상을 변화시킵니다.",
							get = function() return mother.db.profile.debuffcolor end,
							set = function()
								mother.db.profile.debuffcolor = not mother.db.profile.debuffcolor
								mother:UpdateUnit()
							end,
							order = 10,
						},
						mana = {
							type = "toggle",
							name = "마나바 색상 적용하기",
							desc = "디버프의 종류에 따라 프레임의 마나바 색상을 변화 시킵니다.",
							get = function() return mother.db.profile.dmanabar end,
							set = function()
								mother.db.profile.dmanabar = not mother.db.profile.dmanabar
								mother:UpdateUnit()
							end,
							order = 15,
							disabled = function() return not mother.db.profile.debuffcolor end,
						},
						dorder = {
							type = "group",
							name = "디버프 표시 종류",
							desc = "디버프 표시 종류에 대한 설정을 합니다.",
							order = 20,
							disabled = function() return not mother.db.profile.debuffcolor end,
							args = {
								curse = {
									type = "toggle",
									name = "저주 디버프 표시",
									desc = "저주 디버프를 표시합니다.",
									order = 10,
									get = function() return InvenRaidFramesDispelDB.outline.Curse end,
									set = function()
										InvenRaidFramesDispelDB.outline.Curse = not InvenRaidFramesDispelDB.outline.Curse
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
								magic = {
									type = "toggle",
									name = "마법 디버프 표시",
									desc = "마법 디버프를 표시합니다.",
									order = 20,
									get = function() return InvenRaidFramesDispelDB.outline.Magic end,
									set = function()
										InvenRaidFramesDispelDB.outline.Magic = not InvenRaidFramesDispelDB.outline.Magic
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
								disease = {
									type = "toggle",
									name = "질병 디버프 표시",
									desc = "질병 디버프를 표시합니다.",
									order = 30,
									get = function() return InvenRaidFramesDispelDB.outline.Disease end,
									set = function()
										InvenRaidFramesDispelDB.outline.Disease = not InvenRaidFramesDispelDB.outline.Disease
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
								poison = {
									type = "toggle",
									name = "독 디버프 표시",
									desc = "독 디버프를 표시합니다.",
									order = 40,
									get = function() return InvenRaidFramesDispelDB.outline.Poison end,
									set = function()
										InvenRaidFramesDispelDB.outline.Poison = not InvenRaidFramesDispelDB.outline.Poison
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
								normal = {
									type = "toggle",
									name = "무속성 디버프 표시",
									desc = "무속성 디버프를 표시합니다.",
									order = 50,
									get = function() return InvenRaidFramesDispelDB.outline.Normal end,
									set = function()
										InvenRaidFramesDispelDB.outline.Normal = not InvenRaidFramesDispelDB.outline.Normal
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
							},
						},
						dcolor = {
							type = "group",
							name = "디버프 표시 색상",
							desc = "디버프 표시 색상에 대한 설정을 합니다.",
							order = 30,
							disabled = function() return not mother.db.profile.debuffcolor end,
							args = {
								cursecolor = {
									type = "color",
									name = "저주 디버프 색상",
									desc = "저주 디버프의 색상을 설정합니다",
									order = 10,
									get = function() return unpack(mother.db.profile.color.Curse) end,
									set = function(r, g, b)
										mother.db.profile.color.Curse = { r, g, b }
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
								magiccolor = {
									type = "color",
									name = "마법 디버프 색상",
									desc = "마법 디버프의 색상을 설정합니다",
									order = 20,
									get = function() return unpack(mother.db.profile.color.Magic) end,
									set = function(r, g, b)
										mother.db.profile.color.Magic = { r, g, b }
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
								diseasecolor = {
									type = "color",
									name = "질병 디버프 색상",
									desc = "질병 디버프의 색상을 설정합니다",
									order = 30,
									get = function() return unpack(mother.db.profile.color.Disease) end,
									set = function(r, g, b)
										mother.db.profile.color.Disease = { r, g, b }
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
								poisoncolor = {
									type = "color",
									name = "독 디버프 색상",
									desc = "독 디버프의 색상을 설정합니다",
									order = 40,
									get = function() return unpack(mother.db.profile.color.Poison) end,
									set = function(r, g, b)
										mother.db.profile.color.Poison = { r, g, b }
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
								normalcolor = {
									type = "color",
									name = "무속성 디버프 색상",
									desc = "무속성 디버프의 색상을 설정합니다",
									order = 50,
									get = function() return unpack(mother.db.profile.color.Normal) end,
									set = function(r, g, b)
										mother.db.profile.color.Normal = { r, g, b }
										mother:UpdateUnit()
									end,
									disabled = function() return not mother.db.profile.debuffcolor end,
								},
							},
						},
					},
				},
				debuffsound = {
					type = "group",
					name = "디버프 경보",
					desc = "디버프 획득시 소리를 재생합니다.",
					order = 90,
					args ={
						use = {
							type = "toggle",
							name = "사용",
							desc = "디버프 획득시 소리를 재생하는 기능을 사용합니다.",
							order = 10,
							get = function() return mother.db.char.debuffsound.use end,
							set = function()
								mother.db.char.debuffsound.use = not mother.db.char.debuffsound.use
							end,
						},
						range = {
							type = "text",
							name = "체크 범위",
							desc = "디버프가 걸린 사람의 사정거리 및 자기 자신에 따라 소리 재생 여부를 설정합니다.",
							order = 20,
							get = function() return mother.db.char.debuffsound.range end,
							set = function(v)
								mother.db.char.debuffsound.range = v
							end,
							validate = { "모두", "자신만", "사정거리 안", "사정거리 밖" },
							disabled = function() return not mother.db.char.debuffsound.use end,
						},
						update = {
							type = "range",
							name = "소리 재생 빈도",
							desc = "한번 소리가 난후 다음 소리가 나기 까지의 딜레이를 설정합니다. 크게 설정할수록 소리가 재생되는 빈도가 줄어듭니다.",
							order = 25,
							get = function() return mother.db.char.debuffsound.update end,
							set = function(v)
								mother.db.char.debuffsound.update = v
							end,
							disabled = function() return not mother.db.char.debuffsound.use end,
							min = 0, max = 10, step = 0.5,
						},

						dorder = {
							type = "group",
							name = "디버프 소리 재생 종류",
							desc = "디버프 소리 재생 종류에 대한 설정을 합니다.",
							order = 30,
							disabled = function() return not mother.db.char.debuffsound.use end,
							args = {
								curse = {
									type = "toggle",
									name = "저주 디버프 소리 재생",
									desc = "저주 디버프가 걸렸을때 소리를 재생합니다.",
									order = 10,
									get = function() return mother.db.char.debuffsound.Curse end,
									set = function()
										mother.db.char.debuffsound.Curse = not mother.db.char.debuffsound.Curse
									end,
									disabled = function() return not mother.db.char.debuffsound.use end,
								},
								magic = {
									type = "toggle",
									name = "마법 디버프 소리 재생",
									desc = "마법 디버프가 걸렸을때 소리를 재생합니다.",
									order = 20,
									get = function() return mother.db.char.debuffsound.Magic end,
									set = function()
										mother.db.char.debuffsound.Magic = not mother.db.char.debuffsound.Magic
									end,
									disabled = function() return not mother.db.char.debuffsound.use end,
								},
								disease = {
									type = "toggle",
									name = "질병 디버프 소리 재생",
									desc = "질병 디버프가 걸렸을때 소리를 재생합니다.",
									order = 30,
									get = function() return mother.db.char.debuffsound.Disease end,
									set = function()
										mother.db.char.debuffsound.Disease = not mother.db.char.debuffsound.Disease
									end,
									disabled = function() return not mother.db.char.debuffsound.use end,
								},
								poison = {
									type = "toggle",
									name = "독 디버프 소리 재생",
									desc = "독 디버프가 걸렸을때 소리를 재생합니다.",
									order = 40,
									get = function() return mother.db.char.debuffsound.Poison end,
									set = function()
										mother.db.char.debuffsound.Poison = not mother.db.char.debuffsound.Poison
									end,
									disabled = function() return not mother.db.char.debuffsound.use end,
								},
								normal = {
									type = "toggle",
									name = "무속성 디버프 소리 재생",
									desc = "무속성 디버프가 걸렸을때 소리를 재생합니다.",
									order = 50,
									get = function() return mother.db.char.debuffsound.Normal end,
									set = function()
										mother.db.char.debuffsound.Normal = not mother.db.char.debuffsound.Normal
									end,
									disabled = function() return not mother.db.char.debuffsound.use end,
								},
							},
						},
						dsound = {
							type = "group",
							name = "디버프 별 소리 설정",
							desc = "디버프 별 소리를 설정합니다",
							order = 40,
							disabled = function() return not mother.db.char.debuffsound.use end,
							args = {
								curse = {
									type = "text",
									name = "저주 디버프 소리",
									desc = "저주 디버프가 걸렸을때 소리를 설정합니다.",
									order = 10,
									get = function() return mother.db.char.debuffsound.sound.Curse end,
									set = function(v)
										mother.db.char.debuffsound.sound.Curse = v
										PlaySoundFile(SM:Fetch("sound", v))
									end,
									validate = SM:List("sound"),
									disabled = function() return not mother.db.char.debuffsound.use or not mother.db.char.debuffsound.Curse end,
								},
								magic = {
									type = "text",
									name = "마법 디버프 소리",
									desc = "마법 디버프가 걸렸을때 소리를 설정합니다.",
									order = 20,
									get = function() return mother.db.char.debuffsound.sound.Magic end,
									set = function(v)
										mother.db.char.debuffsound.sound.Magic = v
										PlaySoundFile(SM:Fetch("sound", v))
									end,
									validate = SM:List("sound"),
									disabled = function() return not mother.db.char.debuffsound.use or not mother.db.char.debuffsound.Magic end,
								},
								disease = {
									type = "text",
									name = "질병 디버프 소리",
									desc = "질병 디버프가 걸렸을때 소리를 설정합니다.",
									order = 30,
									get = function() return mother.db.char.debuffsound.sound.Disease end,
									set = function(v)
										mother.db.char.debuffsound.sound.Disease = v
										PlaySoundFile(SM:Fetch("sound", v))
									end,
									validate = SM:List("sound"),
									disabled = function() return not mother.db.char.debuffsound.use or not mother.db.char.debuffsound.Disease end,
								},
								poison = {
									type = "text",
									name = "독 디버프 소리",
									desc = "독 디버프가 걸렸을때 소리를 설정합니다.",
									order = 40,
									get = function() return mother.db.char.debuffsound.sound.Poison end,
									set = function(v)
										mother.db.char.debuffsound.sound.Poison = v
										PlaySoundFile(SM:Fetch("sound", v))
									end,
									validate = SM:List("sound"),
									disabled = function() return not mother.db.char.debuffsound.use or not mother.db.char.debuffsound.Poison end,
								},
								normal = {
									type = "text",
									name = "무속성 디버프 소리",
									desc = "무속성 디버프가 걸렸을때 소리를 설정합니다.",
									order = 50,
									get = function() return mother.db.char.debuffsound.sound.Normal end,
									set = function(v)
										mother.db.char.debuffsound.sound.Normal = v
										PlaySoundFile(SM:Fetch("sound", v))
									end,
									validate = SM:List("sound"),
									disabled = function() return not mother.db.char.debuffsound.use or not mother.db.char.debuffsound.Normal end,
								},
							},
						},
						usezone = {
							type = "group",
							name = "사용할 지역",
							desc = "디버프 경보 기능을 사용할 지역을 설정합니다.",
							order = 50,
							disabled = function() return not mother.db.char.debuffsound.use end,
							args = {
								zone1 = {
									type = "toggle",
									name = "필드에서 사용하기",
									desc = "필드에서 디버프 경보 기능을 사용합니다.",
									order = 10,
									get = function() return mother.db.char.debuffsound.zone1 end,
									set = function()
										mother.db.char.debuffsound.zone1 = not mother.db.char.debuffsound.zone1
									end,
									disabled = function() return not mother.db.char.debuffsound.use end,
								},
								zone2 = {
									type = "toggle",
									name = "인던에서 사용하기",
									desc = "인던에서 디버프 경보 기능을 사용합니다.",
									order = 20,
									get = function() return mother.db.char.debuffsound.zone2 end,
									set = function()
										mother.db.char.debuffsound.zone2 = not mother.db.char.debuffsound.zone2
									end,
									disabled = function() return not mother.db.char.debuffsound.use end,
								},
								zone3 = {
									type = "toggle",
									name = "투기장에서 사용하기",
									desc = "투기장에서 디버프 경보 기능을 사용합니다.",
									order = 30,
									get = function() return mother.db.char.debuffsound.zone3 end,
									set = function()
										mother.db.char.debuffsound.zone3 = not mother.db.char.debuffsound.zone3
									end,
									disabled = function() return not mother.db.char.debuffsound.use end,
								},
								zone4 = {
									type = "toggle",
									name = "전장에서 사용하기",
									desc = "전장에서 디버프 경보 기능을 사용합니다.",
									order = 40,
									get = function() return mother.db.char.debuffsound.zone4 end,
									set = function()
										mother.db.char.debuffsound.zone4 = not mother.db.char.debuffsound.zone4
									end,
									disabled = function() return not mother.db.char.debuffsound.use end,
								},
							},
						},
					},
				},
				attackunit = {
					type = "group",
					name = "적대적인 대상 표시",
					desc = "정신 지배나 결투 등으로 적대적이된 플레이어의 체력바 색상을 붉은색으로 변경합니다.",
					order = 130,
					args = {
						use = {
							type = "toggle",
							name = "사용",
							desc = "정신 지배나 결투 등으로 적대적이된 플레이어의 체력바 색상을 붉은색으로 변경합니다. 이 경우 사정 거리 체크는 28m가 기준이됩니다.",
							order = 10,
							get = function() return mother.db.profile.attack end,
							set = function() mother.db.profile.attack = not mother.db.profile.attack mother:UpdateUnit() end,
						},
					},
				},
				raiddebuff = {
					type = "group",
					name = "레이드 디버프 표시",
					desc = "레이드 디버프에 대한 설정을 합니다.",
					order = 120,
					args = {
						raiddebuff = {
							type = "toggle",
							name = "사용",
							desc = "공격대 던전에서 중요한 디버프를 프레임에 표시합니다.",
							order = 10,
							get = function() return mother.db.profile.raiddebuff end,
							set = function() mother.db.profile.raiddebuff = not mother.db.profile.raiddebuff mother:UpdateUnit() end,
						},
						location = {
							type = "text",
							name = "위치",
							desc = "공격대 던전에서 중요한 디버프의 아이콘 위치를 설정합니다.",
							order = 20,
							get = function() return mother.db.profile.debuffloc end,
							set = function(v)
								mother.db.profile.debuffloc = v
								for _, f in pairs(mother.vars.frames) do
									f.raidDebuff:ClearAllPoints()
									mother:SetDebuffIconPoint(f)
								end
							end,
							validate = { "좌측", "중앙", "우측", "상단", "하단", "좌측 상단", "좌측 하단", "우측 상단", "우측 하단" },
							disabled = function() return not mother.db.profile.raiddebuff end,
						},
						size = {
							type = "range",
							name = "크기",
							desc = "공격대 던전에서 중요한 디버프의 아이콘 크기를 변경합니다.",
							order = 30,
							get = function() return mother.db.profile.debuffsize end,
							set = function(v)
								mother.db.profile.debuffsize = v
								for _, f in pairs(mother.vars.frames) do
									f.raidDebuff:ClearAllPoints()
									mother:SetDebuffIconPoint(f)
								end
							end,
							min = 12, max = 28, step = 1,
							disabled = function() return not mother.db.profile.raiddebuff end,
						},
						alhpa = {
							type = "range",
							name = "투명도",
							desc = "공격대 던전에서 중요한 디버프의 아이콘 투명도를 설정합니다.",
							order = 40,
							get = function() return mother.db.profile.debuffAlpha end,
							set = function(v)
								mother.db.profile.debuffAlpha = v
								for _, f in pairs(mother.vars.frames) do
									f.raidDebuff:SetAlpha(v)
								end
							end,
							min = 0, max = 1, step = 0.01,
							disabled = function() return not mother.db.profile.raiddebuff end,
						},
					},
				},
				spelltimer = {
					type = "group",
					name = "주문 타이머",
					desc = "체력바 위에 자신이 다른 플레이어에게 시전한 주문을 표시합니다.",
					order = 50,
					args = {},
				},
				aggro = {
					type = "group",
					name = "어그로",
					desc = "공격대원의 어그로에 대한 설정을 합니다.",
					order = 10,
					args = {
						show = {
							type = "toggle",
							name = "어그로 화살표 표시",
							desc = "몬스터의 대상이 된 플에이어의 이름 왼쪽에 붉은 화살표로 대상이 됨을 표시합니다.",
							order = 10,
							get = function() return mother.db.profile.showaggro end,
							set = function()
								mother.db.profile.showaggro = not mother.db.profile.showaggro
								mother:UpdateUnit()
							end,
						},
						aggrocolor = {
							type = "color",
							name = "어그로 색상",
							desc = "어그로 획득시 화살표의 색상을 설정합니다.",
							order = 20,
							get = function() return unpack(mother.db.profile.color.aggro) end,
							set = function(r, g, b)
								mother.db.profile.color.aggro = { r, g, b }
								mother.db.profile.color.aggro2 = self:GetHexColor(r, g, b)
								for _, f in pairs(mother.vars.frames) do
									f.border:SetBackdropBorderColor(0, 0, 0, mother.db.profile.bgAlpha)
								end
								mother:UpdateAggro()
								mother:UpdateUnit()
							end,
							disabled = function() return not mother.db.profile.showaggro end,
						},
						sound = {
							type = "text",
							name = "자신의 어그로에 대한 소리 재생하기",
							desc = "자신이 어그로를 얻거나 잃으면 소리를 재생합니다.",
							order = 30,
							get = function() return mother.db.char.aggrosound end,
							set = function(v)
								mother.db.char.aggrosound = v
								Waterfall:Refresh("InvenRaidFrames")
							end,
							validate = { "항상", "사용 안함", "파티", "공격대", "소환수" },
						},
						gain = {
							type = "text",
							name = "어그로 획득시 소리 재생",
							desc = "자신이 어그로를 획득하면 재생할 소리를 설정합니다.",
							get = function() return mother.db.profile.aggrogain end,
							set = function(v)
								mother.db.profile.aggrogain = v
								PlaySoundFile(SM:Fetch("sound", v))
							end,
							validate = SM:List("sound"),
							columns = 2,
							order = 40,
							disabled = function() return mother.db.char.aggrosound == "사용 안함" end,
						},
						lost = {
							type = "text",
							name = "어그로 손실시 소리 재생",
							desc = "자신이 어그로를 손실하면 재생할 소리를 설정합니다.",
							get = function() return mother.db.profile.aggrolost end,
							set = function(v)
								mother.db.profile.aggrolost = v
								PlaySoundFile(SM:Fetch("sound", v))
							end,
							validate = SM:List("sound"),
							columns = 2,
							order = 50,
							disabled = function() return mother.db.char.aggrosound == "사용 안함" end,
						},
					},
				},
				raidicon = {
					type = "group",
					name = "전술 목표 아이콘",
					desc = "전술 목표 아이콘에 대한 설정을 합니다.",
					order = 140,
					args = {
						unit = {
							type = "toggle",
							name = "전술 목표 아이콘 표시",
							desc = "플레이어에게 찍힌 전술 목표 아이콘을 표시합니다.",
							order = 10,
							get = function() return mother.db.profile.raidicon end,
							set = function()
								mother.db.profile.raidicon = not mother.db.profile.raidicon
								mother:RAID_TARGET_UPDATE()
							end,
						},
						target = {
							type = "toggle",
							name = "대상의 전술 목표 아이콘 표시",
							desc = "플레이어가 선택한 대상에게 찍힌 전술 목표 아이콘을 표시합니다.",
							order = 20,
							get = function() return mother.db.profile.raidicontarget end,
							set = function()
								mother.db.profile.raidicontarget = not mother.db.profile.raidicontarget
								mother:RAID_TARGET_UPDATE()
							end,
						},
						location = {
							type = "text",
							name = "아이콘 위치",
							desc = "전술 목표 아이콘의 위치를 설정합니다.",
							order = 70,
							get = function() return mother.db.profile.raidiconloc end,
							set = function(v)
								mother.db.profile.raidiconloc = v
								for _, f in pairs(mother.vars.frames) do
									mother:ControlRaidIcon(f)
								end
							end,
							validate = { "좌측", "중앙", "우측", "상단", "하단", "좌측 상단", "좌측 하단", "우측 상단", "우측 하단" },
							disabled = function() return not(mother.db.profile.raidicon or mother.db.profile.raidicontarget) end,
						},
						size = {
							type = "range",
							name = "아이콘 크기",
							desc = "전술 목표 아이콘의 크기를 설정합니다.",
							order = 50,
							get = function() return mother.db.profile.raidiconsize end,
							set = function(v)
								mother.db.profile.raidiconsize = v
								for _, f in pairs(mother.vars.frames) do
									f.raidIcon:SetWidth(v)
									f.raidIcon:SetHeight(v)
									f.raidIconTarget:SetWidth(v)
									f.raidIconTarget:SetHeight(v)
								end
							end,
							min = 10, max = 28, step = 1,
							disabled = function() return not(mother.db.profile.raidicon or mother.db.profile.raidicontarget) end,
						},
					},
				},
				losthp = {
					type = "group",
					name = "손실 생명력",
					desc = "손실된 생명력을 체력바에 표시합니다.",
					order = 40,
					args = {
						show = {
							type = "text",
							name = "조건",
							desc = "손실된 생명력을 체력바에 표시할 조건을 설정합니다.",
							get = function() return mother.db.profile.losthp end,
							set = function(v)
								mother.db.profile.losthp = v
								Waterfall:Refresh("InvenRaidFrames")
								mother:UpdateUnit()
							end,
							validate = { "항상", "표시 안함", "사정거리 안", "사정거리 밖" },
							order = 10,
						},
						display = {
							type = "text",
							name = "표시 방식",
							desc = "손실된 생명력을 체력바에 표시할 방법을 설정합니다. 이름과 대체 옵션을 선택하면 손실 생명력이 있으면 손실 생명력을 표시하고 없다면 이름을 표시합니다.",
							get = function() return mother.db.profile.losthp2 end,
							set = function(v)
								mother.db.profile.losthp2 = v
								mother:UpdateUnit()
							end,
							validate = { "한줄 표시", "두줄 표시", "이름과 대체" },
							order = 20,
							disabled = function() return mother.db.profile.losthp == "표시 안함" end,
						},
						short = {
							type = "toggle",
							name = "손실 생명력 짧게 표시",
							desc = "손실 생명력을 짧게 표시합니다. 만약 8200의 체력 저하가 있다면 이를 8.2로 표시합니다.",
							get = function() return mother.db.profile.losthp3 end,
							set = function()
								mother.db.profile.losthp3 = not mother.db.profile.losthp3
								mother:UpdateUnit()
							end,
							order = 30,
							disabled = function() return mother.db.profile.losthp == "표시 안함" end,
						},
						usecolor = {
							type = "toggle",
							name = "손실 생명력 색상 적용",
							desc = "손실 생명력에 색상을 적용합니다.",
							get = function() return mother.db.profile.losthpcolor end,
							set = function()
								mother.db.profile.losthpcolor = not mother.db.profile.losthpcolor
								mother:UpdateUnit()
							end,
							order = 40,
							disabled = function() return mother.db.profile.losthp == "표시 안함" end,
						},
						color = {
							type = "color",
							name = "손실 생명력 색상",
							desc = "손실 생명력의 색상을 설정합니다.",
							order = 50,
							get = function() return unpack(mother.db.profile.color.losthp) end,
							set = function(r, g, b)
								mother.db.profile.color.losthp = { r, g, b }
								mother.db.profile.color.losthp2 = self:GetHexColor(r, g, b)
								mother:UpdateUnit()
							end,
							disabled = function() return mother.db.profile.losthp == "표시 안함" or not mother.db.profile.losthpcolor end,
						},
					},
				},
				incommheal = {
					type = "group",
					name = "들어오는 치유",
					desc = "LibHealComm-3.0 라이브러리를 사용해서 다른 사람이 치유하는 대상과 예상 치유량을 알 수 있습니다. 이 기능은 Grid, Pitbull, SraidFrames와 공유합니다.",
					order = 70,
					args = {
						alpha = {
							type = "range",
							name = "들어오는 치유 체력바 투명도",
							desc = "플레이어에게 들어오는 치유량을 표시하는 바의 투명도를 조절합니다.",
							get = function()
								return mother.db.profile.healAlpha
							end,
							set = function(v)
								mother.db.profile.healAlpha = v
								mother:SetBar()
							end,
							min = 0, max = 0.5, step = 0.01,
							order = 10,
						},
						yourheal = {
							type = "toggle",
							name = "들어오는 치유 체력바에 자신의 치유량을 합산",
							desc = "들어오는 치유 계산에 자신의 치유량을 합산합니다.",
							get = function() return mother.db.profile.yourHeal end,
							set = function()
								mother.db.profile.yourHeal = not mother.db.profile.yourHeal
							end,
							order = 20,
						},
						shown2 = {
							type = "toggle",
							name = "자신의 치유 아이콘 표시",
							desc = "다른 사람이 플레이어를 치유하는 아이콘을 보이거나 숨깁니다.",
							order = 30,
							get = function() return mother.db.profile.inheal2 end,
							set = function() mother.db.profile.inheal2 = not mother.db.profile.inheal2 end,
						},
						hcolor2 = {
							type = "color",
							name = "자신의 치유 아이콘 색상",
							desc = "자신이 치유하고 있는 대상의 아이콘 색상을 설정합니다.",
							order = 40,
							get = function() return unpack(mother.db.profile.color.healicon2) end,
							set = function(r, g, b)
								mother.db.profile.color.healicon2 = { r, g, b }
							end,
							disabled = function() return not mother.db.profile.inheal2 end,
						},
						shown = {
							type = "toggle",
							name = "타인의 치유 아이콘 표시",
							desc = "다른 사람이 플레이어를 치유하는 아이콘을 표시합니다.",
							order = 50,
							get = function() return mother.db.profile.inheal end,
							set = function() mother.db.profile.inheal = not mother.db.profile.inheal end,
						},
						hcolor = {
							type = "color",
							name = "타인의 치유 아이콘 색상",
							desc = "다른 사람이 치유하고 있는 대상의 아이콘 색상을 설정합니다.",
							order = 60,
							get = function() return unpack(mother.db.profile.color.healicon) end,
							set = function(r, g, b)
								mother.db.profile.color.healicon = { r, g, b }
							end,
							disabled = function() return not mother.db.profile.inheal end,
						},
						location = {
							type = "text",
							name = "아이콘 위치",
							desc = "들어오는 치유 표시 아이콘의 위치를 설정합니다.",
							order = 70,
							get = function() return mother.db.profile.healloc end,
							set = function(v)
								mother.db.profile.healloc = v
								for _, f in pairs(mother.vars.frames) do
									f.healIcon:ClearAllPoints()
									mother:SetHealIconPoint(f)
								end
							end,
							validate = { "좌측", "중앙", "우측", "상단", "하단", "좌측 상단", "좌측 하단", "우측 상단", "우측 하단" },
							disabled = function() return not (mother.db.profile.inheal or mother.db.profile.inheal2) end,
						},

					},
				},
				readycheck = {
					type = "group",
					name = "전투 준비 상황",
					desc = "전투 준비 상황에 대한 설정을 합니다. 파티장이나 공격대장 또는 공격대 승급자만 보여집니다.",
					order = 80,
					hidden = function() return not mother:HasModule("ReadyCheck") end,
					args = {
						use = {
							type = "toggle",
							name = "사용",
							desc = "전투 준비 상황 아이콘을 프레임에 표시합니다. 파티장이나 공격대장 또는 공격대 승급자만 보여집니다.",
							order = 10,
							get = function() return mother.db.profile.readycheck end,
							set = function()
								mother.db.profile.readycheck = not mother.db.profile.readycheck
								mother:SetMinimapButtonText()
								Waterfall:Refresh("InvenRaidFrames")
								if mother:IsEnableModule("ReadyCheck") then
									if mother.db.profile.readycheck then
										IRF_ReadyCheck:OnEnable()
									else
										IRF_ReadyCheck:OnDisable()
									end
								end
							end,
						},
						location = {
							type = "text",
							name = "아이콘 위치",
							desc = "전투 준비 상황 아이콘의 위치를 설정합니다.",
							order = 20,
							get = function() return mother.db.profile.readycheckloc end,
							set = function(v)
								mother.db.profile.readycheckloc = v
								if mother:IsEnableModule("ReadyCheck") then
									IRF_ReadyCheck:Update()
								end
							end,
							validate = { "좌측", "중앙", "우측", "상단", "하단", "좌측 상단", "좌측 하단", "우측 상단", "우측 하단" },
							disabled = function() return not mother.db.profile.readycheck end,
						},
						size = {
							type = "range",
							name = "아이콘 크기",
							desc = "전투 준비 상황 아이콘의 크기를 설정합니다.",
							order = 25,
							get = function() return mother.db.profile.readychecksize end,
							set = function(v)
								mother.db.profile.readychecksize = v
								if mother:IsEnableModule("ReadyCheck") then
									IRF_ReadyCheck:Update()
								end
							end,
							min = 10, max = 30, step = 1,
							disabled = function() return not mother.db.profile.readycheck end,
						},
						finished = {
							type = "range",
							name = "종료 후 유지 시간",
							desc = "전투 준비 상황 확인 완료 후 아이콘을 유지할 시간을 설정합니다. (기본값: 10초)",
							order = 30,
							get = function() return mother.db.profile.readycheckft1 end,
							set = function(v) mother.db.profile.readycheckft1 = v end,
							min = 0, max = 10, step = 0.5,
							disabled = function() return not mother.db.profile.readycheck end,
						},
						fade = {
							type = "range",
							name = "유지 시간 종료후 사라짐 시간",
							desc = "전투 준비 상황 확인 완료 후 아이콘을 유지된 다음 서서히 사라질 시간을 설정합니다. 0으로 설정하면 즉시 사라집니다. (기본값: 1.5초)",
							order = 40,
							get = function() return mother.db.profile.readycheckft2 end,
							set = function(v) mother.db.profile.readycheckft2 = v end,
							min = 0, max = 5, step = 0.5,
							disabled = function() return not mother.db.profile.readycheck end,
						},
					},
				},
			},
		},
	},
}

function IRF_Options:OnInit()
	if not HealComm then
		consoleOptions.args.funct.args.incommheal = nil
	end
	Waterfall:Register("InvenRaidFrames", "aceOptions", consoleOptions, "title", "인벤 레이드 프레임 v"..mother.version, "treeType", "SECTIONS", "colorR", 0.2, "colorG", 0.2, "colorB", 1)
	local f = CreateFrame("Frame", "BRFColorPickerAnchor", UIParent)
	f:SetFrameStrata("DIALOG")
	f:SetToplevel(true)
	f:SetWidth(10)
	f:SetHeight(10)
	f:SetPoint("CENTER", UIParent, "CENTER")
	if FuBarPlugin and IRF_FuBar then
		consoleOptions.args.basic.args.fubar.args = FuBarPlugin:GetAceOptionsDataTable(IRF_FuBar)
	end
	self:CreateSpellTimerOption()
	self:CreateClickHealOption()
	self:CreateClassOrderMenu()
	if mother:HasModule("Buff") then
		self:CreateBuffOption()
	end
	collectgarbage()
end

local function ColorPickerFrameControl(parent)
	ColorPickerFrame:SetParent(parent)
	ColorPickerFrame:ClearAllPoints()
	ColorPickerFrame:SetPoint("CENTER", parent, "CENTER")
	local lv = ColorPickerFrame:GetFrameLevel() + 1
	ColorPickerCancelButton:SetFrameLevel(lv)
	ColorPickerOkayButton:SetFrameLevel(lv)
	OpacitySliderFrame:SetFrameLevel(lv)
	OpacityFrame:SetFrameLevel(lv)
	if parent ~= UIParent then
		parent:SetToplevel(true)
	end
end

function IRF_Options:ToggleMenu()
	if Waterfall:IsOpen("InvenRaidFrames") then
		Waterfall:Close("InvenRaidFrames")
		ColorPickerFrameControl(UIParent)
		collectgarbage()
	else
		Waterfall:Open("InvenRaidFrames")
		ColorPickerFrameControl(BRFColorPickerAnchor)
	end
end

function IRF_Options:CreateSpellTimerOption()
	local s = mother.vars.classDB.spell
	if mother.vars.classDB.spellTimer and #(mother.vars.classDB.spellTimer) > 0 then
		local t = { {}, {}, {} }
		local pw
		for p, v in pairs(s) do
			tinsert(t[abs(v)], p)
		end
		consoleOptions.args.funct.args.spelltimer.args.use = {
			type = "text",
			name = "주문 타이머 사용",
			desc = "주문 타이머의 사용에 대한 설정을 합니다.",
			order = 1,
			get = function() return mother.db.char.spelltimer end,
			set = function(v)
				mother.db.char.spelltimer = v
				Waterfall:Refresh("InvenRaidFrames")
				if mother:IsEnableModule("SpellTimer") then
					IRF_SpellTimer:SetMode()
				end
				mother:UpdateUnit()
			end,
			validate = { "아이콘", "텍스트", "사용 안함" },
			hidden = function() return mother.vars.class ~= "드루이드" and mother.vars.class ~= "사제" end,
		}
		consoleOptions.args.funct.args.spelltimer.args.use2 = {
			type = "toggle",
			name = "주문 타이머 사용",
			desc = "주문 타이머의 사용에 대한 설정을 합니다.",
			order = 2,
			get = function() return mother.db.char.spelltimer2 end,
			set = function()
				mother.db.char.spelltimer2 = not mother.db.char.spelltimer2
				if mother:IsEnableModule("SpellTimer") then
					IRF_SpellTimer:SetMode()
				end
				mother:UpdateUnit()
			end,
			hidden = function() return mother.vars.class == "드루이드" or mother.vars.class == "사제" end,
		}
		for i = 1, 3 do
			if #(t[i]) > 0 then
				local spells = table.concat(t[i], ", ")
				if spells == "회복의 기원" then
					pw = i
				end
				consoleOptions.args.funct.args.spelltimer.args["spell"..i] = {
					type = "toggle",
					name = spells.." 표시",
					desc = spells.."|1을;를; 프레임에 표시합니다.\n(몇몇 주문은 자신이 시전한것만 표시합니다)",
					order = i * 10,
					get = function() return mother.db.char.showSpell[i] end,
					set = function()
						mother.db.char.showSpell[i] = not mother.db.char.showSpell[i]
						if mother:IsEnableModule("SpellTimer") then
							IRF_SpellTimer:SetMode()
						end
						mother:UpdateUnit()
					end,
					hidden = function()
						if mother.vars.class == "드루이드" or mother.vars.class == "사제" then
							if mother.db.char.spelltimer == "아이콘" then
								return false
							else
								return true
							end
						elseif mother.db.char.spelltimer2 then
							return false
						else
							return true
						end
					end,
				}
				if mother.vars.class ~= "주술사" then
					consoleOptions.args.funct.args.spelltimer.args["spell"..i.."time"] = {
						type = "toggle",
						name = spells.."의 남은 시간 표시",
						desc = spells.."의 남은 시간을 표시합니다.",
						order = i * 10 + 5,
						get = function() return mother.db.char.showSpellTime[i] end,
						set = function()
							mother.db.char.showSpellTime[i] = not mother.db.char.showSpellTime[i]
							if mother:IsEnableModule("SpellTimer") then
								IRF_SpellTimer:SetMode()
							end
							mother:UpdateUnit()
						end,
						disabled = function() return not mother.db.char.showSpell[i] end,
						hidden = function()
							if mother.vars.class == "드루이드" or mother.vars.class == "사제" then
								if mother.db.char.spelltimer == "아이콘" then
									return false
								else
									return true
								end
							elseif mother.db.char.spelltimer2 then
								return false
							else
								return true
							end
						end,
					}
				end
			end
		end
		if mother.vars.class == "사제" and pw then
			consoleOptions.args.funct.args.spelltimer.args.pwcount = {
				type = "toggle",
				name = "회복의 기원 중첩 횟수 표시",
				desc = "회복의 기원의 중첩 횟수를 표시합니다.",
				order = 40,
				get = function() return mother.db.char.pmCount end,
				set = function()
					mother.db.char.pmCount = not mother.db.char.pmCount
					if mother:IsEnableModule("SpellTimer") then
						IRF_SpellTimer:SetMode()
					end
					mother:UpdateUnit()
				end,
				disabled = function() return not mother.db.char.showSpell[pw] end,
				hidden = function()
					if mother.vars.class == "드루이드" or mother.vars.class == "사제" then
						if mother.db.char.spelltimer == "아이콘" then
							return false
						else
							return true
						end
					elseif mother.db.char.spelltimer2 then
						return false
					else
						return true
					end
				end,
			}
		end
	else
		consoleOptions.args.funct.args.spelltimer = nil
	end
end

function IRF_Options:CreateClickHealOption()
	local v = { "대상 선택", "메뉴", "없음" }
	local b = { "좌클릭", "우클릭", "휠클릭", "마우스 버튼 4", "마우스 버튼 5", "마우스 버튼 6", "마우스 버튼 7", "마우스 버튼 8", "마우스 버튼 9" }
	local k = { "", "Alt + ", "Ctrl + ", "Shift + ", "Alt + Ctrl + ", "Shift + Alt + ", "Shift + Ctrl + " }
	local m = { "", "ALT-", "CTRL-", "SHIFT-", "ALT-CTRL-", "ALT-SHIFT-", "CTRL-SHIFT-" }
	local n = { "none", "alt", "ctrl", "shift", "altctrl", "shiftalt", "shiftctrl" }
	consoleOptions.args.clickheal = {
		type = "group",
		name = "클릭 캐스팅",
		desc = "프레임 클릭으로 주문을 시전하게 합니다.\n|cffff0000전투중에 변경된 설정은 전투 종료후 적용됩니다.|r",
		order = 100,
		args = {
			macro = {
				type = "group",
				name = "매크로",
				desc = "클릭 캐스팅에서 사용할 매크로를 관리합니다.",
				order = 200,
				args = {
					add = {
						type = "text",
						name = "매크로 등록",
						desc = "클릭 캐스팅에서 사용할 매크로를 추가합니다. 매크로 이름을 입력하세요.",
						order = 1,
						usage = "",
						get = function() return "" end,
						set = function(v) mother:AddMacro(v) end,
					},
				},
			},
		},
	}
	for i = 1, #(b) do
		local bt = "button"..i
		consoleOptions.args.clickheal.args[bt] = {
			type = "group",
			name = b[i],
			desc = "프레임을 "..b[i].."|1으로;로; 클릭했을때 시전할 주문을 설정합니다.",
			order = i * 10,
			args = {},
		}
		for j = 1, #(k) do
			local bb = m[j].."BUTTON"..i
			local cc = k[j]..b[i]
			consoleOptions.args.clickheal.args[bt].args[ n[j] ] = {
				type = "text",
				name = cc,
				desc = "프레임을 "..cc.."|1으로;로; 클릭했을때 시전할 주문을 설정합니다.",
				order = j,
				get = function() return mother.db.char.clickheal[bb] end,
				set = function(v) mother:SetClickHealValue(bb, v) end,
				validate = { "대상 선택", "메뉴", "없음" },
				columns = 2,
			}
		end
	end
	self:UpdateClickHealValidate()
end

function IRF_Options:UpdateClickHealValidate()
	consoleOptions.args.clickheal.args.macro.args.del = (#(mother.db.char.macro) > 0) and {
		type = "group",
		name = "매크로 삭제",
		desc = "클릭 캐스팅에서 사용할 매크로를 삭제합니다.",
		order = 2,
		args = {},
	} or nil
	for i = 1, #(mother.db.char.macro) do
		consoleOptions.args.clickheal.args.macro.args.del.args["macro"..i] = {
			type = "execute",
			name = mother.db.char.macro[i],
			desc = "클릭하면 목록에서 삭제됩니다.",
			func = function()
				mother:DelMacro(i)
				Waterfall:Refresh("InvenRaidFrames")
			end,
		}
	end
	for i = 1, 9 do
		local id = "button"..i
		for p, v in pairs(consoleOptions.args.clickheal.args[id].args) do
			consoleOptions.args.clickheal.args[id].args[p].validate = mother.clickhealValidate
		end
	end
end

function IRF_Options:CreateClassOrderMenu()
	for i = 1, 10 do
		consoleOptions.args.basic.args.display.args["class"..i] = {
			type=  "text",
			name = i.." 순위",
			desc = "직업별 배치 순서를 정합니다.",
			order = 90 + (i * 10),
			hidden = function() return mother.db.profile.ordertype == "파티" end,
			validate = { "전사", "드루이드", "성기사", "사제", "주술사", "도적", "마법사", "흑마법사", "사냥꾼", "죽음의 기사" },
			get = function() return mother.db.profile.classorders[i] end,
			set = function(v)
				self:UpdateClassOrder(i, v)
			end,
		}
	end

end

local prev = { unpack(mother.db.profile.classorders) }
local trans = { ["전사"] = "WARRIOR", ["드루이드"] = "DRUID", ["성기사"] = "PALADIN", ["사제"] = "PRIEST", ["주술사"] = "SHAMAN", ["도적"] = "ROGUE", ["마법사"] = "MAGE", ["흑마법사"] = "WARLOCK", ["사냥꾼"] = "HUNTER", ["죽음의 기사"] = "DEATHKNIGHT" }

function IRF_Options:UpdateClassOrder(id, v)
	mother.db.profile.classorders[id] = v
	for i = 1, 10 do
		if id ~= i and mother.db.profile.classorders[i] == v then
			mother.db.profile.classorders[i] = prev[id]
			break
		end
	end
	local new = table.concat(mother.db.profile.classorders, ",")
	for p, v in pairs(trans) do
		new = gsub(new, p, v)
	end
	new = gsub(new, "흑MAGE", "WARLOCK")
	prev = { unpack(mother.db.profile.classorders) }
	local prevt = table.concat(prev, ",")
	mother.db.profile.classorder = new
	if mother.db.profile.classorder ~= prevt then
		Waterfall:Refresh("InvenRaidFrames")
		mother:UpdateGroupAttribute()
		mother:UpdateGroupSetPoint()
		mother:ClearMemory()
	end
end

function IRF_Options:CreateBuffOption()
	local b = mother.vars.buffcheck
	if not b or (b and #(b) == 0) then
		consoleOptions.args.funct.args.buff = nil
		return
	end
	consoleOptions.args.funct.args.buff.args = {
		use = {
			type = "toggle",
			name = "사용",
			desc = "자신이 시전 가능한 버프를 확인 하는 추가 모듈을 사용합니다.",
			get = function() return mother.db.char.checkbuff.use end,
			set = function()
				mother.db.char.checkbuff.use = not mother.db.char.checkbuff.use
				mother:BuffModule()
			end,
			order = 10,
		},
		mode = {
			type = "toggle",
			name = "단축키 토글로 버프 확인하기",
			desc = "단축키 토글로 버프를 확인합니다. 단축키는 단축키 설정 내 인벤 레이드 프레임 항목에서 설정할 수 있습니다.",
			get = function() return mother.db.char.checkbuff.togglemode end,
			set = function()
				mother.db.char.checkbuff.togglemode = not mother.db.char.checkbuff.togglemode
				if mother:IsEnableModule("Buff") then
					IRF_Buff:Update()
				end
			end,
			disabled = function() return not mother.db.char.checkbuff.use end,
			order = 15,
		},
		show = {
			type = "toggle",
			name = "버프가 없을 경우 아이콘 표시하기",
			desc = "위 목록에서 선택한 버프가 해당 플레이어에게 없을 경우 아이콘을 표시합니다.",
			order = 20,
			get = function() return mother.db.char.checkbuff.spring end,
			set = function()
				mother.db.char.checkbuff.spring = not mother.db.char.checkbuff.spring
				if mother:IsEnableModule("Buff") then
					IRF_Buff:Update()
				end
			end,
			disabled = function() return not mother.db.char.checkbuff.use end,
			hidden = function() return mother.vars.class == "흑마법사" or mother.vars.class == "주술사" or mother.db.char.checkbuff.togglemode end,
		},
		combat = {
			type = "toggle",
			name = "전투 중 아이콘 표시하기",
			desc = "전투 중에도 버프 유무에 따른 아이콘을 표시합니다.",
			order = 30,
			get = function() return mother.db.char.checkbuff.combat end,
			set = function()
				mother.db.char.checkbuff.combat = not mother.db.char.checkbuff.combat
				if mother:IsEnableModule("Buff") then
					IRF_Buff:Update()
				end
			end,
			disabled = function() return not mother.db.char.checkbuff.use end,
			hidden = function() return mother.vars.class == "흑마법사" or mother.vars.class == "주술사" or mother.db.char.checkbuff.togglemode end,
		},
		pet = {
			type = "toggle",
			name = "소환수 버프 확인하기",
			desc = "소환수의 버프 확인 유무를 설정합니다.",
			order = 35,
			get = function() return mother.db.char.checkbuff.pet end,
			set = function()
				mother.db.char.checkbuff.pet = not mother.db.char.checkbuff.pet
				if mother:IsEnableModule("Buff") then
					IRF_Buff:Update()
				end
			end,
			disabled = function() return not mother.db.char.checkbuff.use end,
			hidden = function() return not(mother.db.char.pet and mother:HasModule("Pet")) or mother.db.char.checkbuff.togglemode end,
		},
		location = {
			type = "text",
			name = "위치",
			desc = "버프 아이콘의 위치를 설정합니다.",
			order = 40,
			get = function() return mother.db.char.checkbuff.pos end,
			set = function(v)
				mother.db.char.checkbuff.pos = v
				if mother:IsEnableModule("Buff") then
					IRF_Buff:SetLocation()
				end
			end,
			validate = { "좌측", "중앙", "우측", "상단", "하단", "좌측 상단", "좌측 하단", "우측 상단", "우측 하단" },
			disabled = function() return not mother.db.char.checkbuff.use end,
		},
		size = {
			type = "range",
			name = "아이콘 크기",
			desc = "버프 아이콘의 크기를 변경합니다.",
			order = 50,
			get = function() return mother.db.char.checkbuff.size end,
			set = function(v)
				mother.db.char.checkbuff.size = v
				if mother:IsEnableModule("Buff") then
					IRF_Buff:SetSize()
				end

			end,
			min = 8, max = 28, step = 1,
			disabled = function() return not mother.db.char.checkbuff.use end,
		},
		alhpa = {
			type = "range",
			name = "투명도",
			desc = "버프 아이콘의 투명도를 설정합니다.",
			order = 60,
			get = function() return mother.db.char.checkbuff.alpha end,
			set = function(v)
				mother.db.char.checkbuff.alpha = v
				if mother:IsEnableModule("Buff") then
					IRF_Buff.vars.frame:SetAlpha(v)
				end
			end,
			min = 0, max = 1, step = 0.01,
			disabled = function() return not mother.db.char.checkbuff.use end,
		},
		buff = {
			type = "group",
			name = "확인할 버프",
			desc = "확인할 버프를 설정합니다.",
			order = 70,
			args = {},
			disabled = function() return not mother.db.char.checkbuff.use end,
		},
		usezone = {
			type = "group",
			name = "사용할 지역",
			desc = "버프 확인 모듈을 사용할 지역을 설정합니다.",
			order = 80,
			args = {},
			disabled = function() return not mother.db.char.checkbuff.use end,
			hidden = function() return mother.db.char.checkbuff.togglemode end,
		},
	}
	if mother.vars.class == "성기사" then
		local list = { "전사", "도적", "사제", "마법사", "흑마법사", "사냥꾼", "드루이드", "주술사", "성기사" }
		for i = 1, #(list) do
			consoleOptions.args.funct.args.buff.args.buff.args["class"..i] = {
				type = "text",
				name = list[i].." 축복 설정",
				desc = list[i].."에게 줄 축복을 설정합니다.",
				order = i * 10,
				get = function() return InvenRaidFramesBuffCheckDB[list[i]] end,
				set = function(v)
					InvenRaidFramesBuffCheckDB[list[i]] = v
					if mother:IsEnableModule("Buff") then
						IRF_Buff:Update()
					end
				end,
				validate = { "확인 안함", "빛의 축복", "구원의 축복", "왕의 축복", "힘의 축복", "지혜의 축복", "성역의 축복" },
				disabled = function() return not mother.db.char.checkbuff.use end,
			}
		end
	else
		for i = 1, #(b) do
			local n = "buff"..(i - 1)
			consoleOptions.args.funct.args.buff.args.buff.args[n] = {
				type = "toggle",
				name = b[i].." 버프 확인하기",
				desc = "자신이 시전 가능한 버프 확인 목록에 "..b[i].."|1을;를; 추가합니다.",
				order = i * 10,
				get = function() return InvenRaidFramesBuffCheckDB[b[i]] end,
				set = function()
					InvenRaidFramesBuffCheckDB[b[i]] = not InvenRaidFramesBuffCheckDB[b[i]]
					if mother:IsEnableModule("Buff") then
						IRF_Buff:Update()
					end
				end,
				disabled = function() return not mother.db.char.checkbuff.use end,
			}

		end
	end
	local zone = { "필드", "인던", "투기장", "전장" }
	for i = 1, #(zone) do
		consoleOptions.args.funct.args.buff.args.usezone.args["zone"..i] = {
			type = "toggle",
			name = zone[i].."에서 사용하기",
			desc = zone[i].."에서 버프 확인 모듈을 사용합니다.",
			order = i * 10,
			get = function() return mother.db.char.checkbuff["zone"..i] end,
			set = function()
				mother.db.char.checkbuff["zone"..i] = not mother.db.char.checkbuff["zone"..i]
				if mother:IsEnableModule("Buff") then
					IRF_Buff:Update()
				end
			end,
			disabled = function() return not mother.db.char.checkbuff.use end,
		}
	end
end

function IRF_Options:GetHexColor(r, g, b)
    return format("|cff%2x%2x%2x", min(r * 255, 255), min(g * 255, 255), min(b * 255, 255))
end

IRF_Options:OnInit()