Module:grc-decl/decl/staticdata

Hello, you have come here looking for the meaning of the word Module:grc-decl/decl/staticdata. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:grc-decl/decl/staticdata, but we will also tell you about its etymology, its characteristics and you will know how to say Module:grc-decl/decl/staticdata in singular and plural. Everything you need to know about the word Module:grc-decl/decl/staticdata you have here. The definition of the word Module:grc-decl/decl/staticdata will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:grc-decl/decl/staticdata, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.

This module contains the data that is used to determine the declension category from the forms that are supplied to the declension template, and the declension and accent type for each gender of an adjective.

Recognized nominative–genitive combinations for nouns

  • longest nominative ending: 5 characters
  • nominative -ᾱ
    • genitive -ᾱς: 1st-alp (alp_pax)
    • genitive -ας: 1st-alp (alp_pax)
  • nominative -ᾰ
    • genitive -ᾱς: 1st-als (als_prx)
    • genitive -ας: 1st-als (als_prx)
    • genitive -ης: 1st-ets (ets_prx)
  • nominative -ᾱς
    • genitive -ᾱ: 1st-M-alp (M_alp_pax)
    • genitive : 1st-M-alp (M_alp_pax)
    • genitive -ου: 1st-M-alp (M_alp_pax)
  • nominative -ᾰς
    • genitive -ᾰος: 3rd-N-ᾰσ-open (?)
    • genitive -αος: 3rd-N-ᾰσ-open (?)
    • genitive -ως: 3rd-N-ᾰσ (N_as_prx)
  • nominative -ας
    • genitive -ᾱ: 1st-M-alp (M_alp_pax)
    • genitive : 1st-M-alp (M_alp_pax)
    • genitive -ᾰος: 3rd-N-ᾰσ-open (?)
    • genitive -αος: 3rd-N-ᾰσ-open (?)
    • genitive -ου: 1st-M-alp (M_alp_pax)
    • genitive -ως: 3rd-N-ᾰσ (N_as_prx)
  • nominative -ες
    • genitive -ους: 3rd-N-εσ (N_es_adj)
  • nominative -ευς
    • genitive -εως: 3rd-ευς (eus)
    • genitive -ως: 3rd-ευς-con (eus_con)
  • nominative
    • genitive -ης: 1st-eta (eta_pax)
  • nominative -ης
    • genitive -εος: 3rd-εσ-open (es_adj_prx_open)
    • genitive -ου: 1st-M-eta (M_eta_pax)
    • genitive -ους: 3rd-εσ (es_adj)
  • nominative -ῐ
    • genitive -εως: 3rd-N-weak-ι (N_weak_i_prx)
    • genitive -ῐος: 3rd-N-pure-ι (N_pure_i_prx)
    • genitive -ιος: 3rd-N-pure-ι (N_pure_i_prx)
  • nominative -ῐ
  • nominative -ῐς
    • genitive -εως: 3rd-weak-ι (weak_i_prx)
    • genitive -ῐος: 3rd-pure-ι (pure_i_prx)
    • genitive -ιος: 3rd-pure-ι (pure_i_prx)
  • nominative -ις-ῐς
  • nominative -κλεης
    • genitive -κλεους: 3rd-κλῆς-open (kles_open)
  • nominative -κλης
    • genitive -κλεους: 3rd-κλῆς (kles)
  • nominative -ον
    • genitive -ου: 2nd-N (second_N)
  • nominative -ος
    • genitive -εος: 3rd-N-ος-open (N_es_prx_open)
    • genitive -ου: 2nd (second)
    • genitive -ους: 3rd-N-ος (N_es_prx)
  • nominative -ουν
    • genitive -ου: 2nd-N-con (second_N_con)
  • nominative -ους
    • genitive -ου: 2nd-con (second_con)
  • nominative -ῠ
    • genitive -εως: 3rd-N-weak-υ (N_weak_u)
    • genitive -ῠος: 3rd-N-pure-υ (N_pure_u_prx)
    • genitive -υος: 3rd-N-pure-υ (N_pure_u_prx)
  • nominative -ῠ
  • nominative -ῡς
    • genitive -ῠος: 3rd-pure-υ-long (pure_u_long_prx)
    • genitive -υος: 3rd-pure-υ-long (pure_u_long_prx)
  • nominative -ῠς
    • genitive -εως: 3rd-weak-υ (weak_u)
    • genitive -ῠος: 3rd-pure-υ (pure_u)
    • genitive -υος: 3rd-pure-υ (pure_u)
  • nominative
    • genitive -ους: 3rd-οι (oi)
  • nominative -ων
    • genitive : 2nd-N-att (second_N_att_prx)
  • nominative -ως
    • genitive : 2nd-att (second_att)

Recognized masculine–feminine or masculine–neuter combinations for adjectives

  • longest masculine ending: 3 characters
  • masculine -ᾱς
    • feminine -αινᾰ: 1&3-ᾰν
    • feminine -αινα: 1&3-ᾰν
    • feminine -ᾱσᾰ: 1&3-ᾰντ
    • feminine -ασα: 1&3-ᾰντ
  • masculine -ας-ᾱς
  • masculine -εις
    • feminine -εισᾰ: 1&3-εντ
    • feminine -εισα: 1&3-εντ
    • feminine -εσσᾰ: 1&3-εσσ
    • feminine -εσσα: 1&3-εσσ
  • masculine -ην
    • feminine -εινᾰ: 1&3-εν
    • feminine -εινα: 1&3-εν
  • masculine -ης
    • feminine -ες: 3rd-εσ
  • masculine -ος
    • feminine -ᾱ: 1&2-alp
    • feminine : 1&2-alp
    • feminine : 1&2-eta
    • neuter -ον: 2nd
  • masculine -ους
    • feminine -ᾱ: 1&2-alp-con
    • feminine : 1&2-alp-con
    • feminine : 1&2-eta-con
    • feminine -ουσᾰ: 1&3-ουντ
    • feminine -ουσα: 1&3-ουντ
  • masculine -ῠς
    • feminine -ειᾰ: 1&3-ups
    • feminine -εια: 1&3-ups
  • masculine -ῡς
    • feminine -ῡσᾰ: 1&3-ῠντ
    • feminine -υσα: 1&3-ῠντ
  • masculine -υς
    • feminine -ειᾰ: 1&3-ups
    • feminine -εια: 1&3-ups
    • feminine -ῡσᾰ: 1&3-ῠντ
    • feminine -υσα: 1&3-ῠντ
  • masculine -ων
    • feminine -ουσᾰ: 1&3-οντ
    • feminine -ουσα: 1&3-οντ
    • feminine -ωσᾰ: 1&3-ωντ
    • feminine -ωσα: 1&3-ωντ
  • masculine -ως
    • feminine -υιᾰ: 1&3-οτ
    • feminine -υια: 1&3-οτ
    • feminine -ων: 2nd-att

--[[
	Abbreviations and codes used in declension names:
	- accent
		- nothing: oxytone
		- pax: paroxytone
		- prx: proparoxytone
		- con: perispomenon
	- contraction
		- con: contracted (perispomenon)
		- open: uncontracted
	- the characteristics of the ending (historically the stem)
		- 1st declension
			- alp: long alpha
			- eta: eta
			- als: long alpha, but short alpha in nominative and accusative singular
			- als: eta, but short alpha in nominative and accusative singular
		- 3rd declension
			- pure: begins with ι or υ throughout
			- weak: begins with ι or υ alternating with ε or η
]]

local export = {
	adjinflections = {},
	adjinflections_con = {},
}

local module_path = 'Module:grc-decl/sandbox/decl/staticdata'
local m_paradigms = mw.loadData(module_path .. "/paradigms")

local ustring = mw.ustring
local U = ustring.char
local sub = ustring.sub
local gsub = ustring.gsub
local toNFC = ustring.toNFC
local toNFD = ustring.toNFD

--[[
	Creates a version of an ending with macrons removed, and with macrons or breves switched.
	The switching is pointless for endings containing more than one macron or breve:
	for instance, ᾱσᾰ becomes ᾰσᾱ.
]]
local function mess_with_length(text)
	-- local text = toNFD(text)
	local macron = U(0x304)
	local breve = U(0x306)
	
	local unmarked_length = gsub(text, "", "")
	local opposite_length = gsub(
		text,
		"",
		{  = breve,  = macron }
	)
	
	return unmarked_length, opposite_length
end

-- Adds a key with macrons or breves removed to the table.
local function add_unmarked_form(list, key, value)
	if type(list) ~= "table" then
		return list
	end
	
	-- key = toNFD(key)
	local unmarked_length, opposite_length = mess_with_length(key)
	if unmarked_length ~= key and not list then
		list = list or value
	end
	
	list = list or value
	
	return list
end

--[=[
	Noun declension categories that ]
	uses to determine the declension category of the nominative and genitive forms
	that are supplied to the template.
]=]
local infl_categories = {
	 = m_paradigms.alp_pax,
	 = m_paradigms.eta_pax,
	 = m_paradigms.als_prx,
	 = m_paradigms.ets_prx,
	 = m_paradigms.M_alp_pax,
	 = m_paradigms.M_alp_con, -- add 2 for unique key
	 = m_paradigms.M_eta_pax,
	 = m_paradigms.second,
	 = m_paradigms.second_con,
	 = m_paradigms.second_N,
	 = m_paradigms.second_N_con,
	 = m_paradigms.second_att,
	 = m_paradigms.second_N_att_prx,
	 = m_paradigms.es_adj,
	 = m_paradigms.es_adj_prx_open,
	 = m_paradigms.N_es_adj,
	 = m_paradigms.N_es_prx,
	 = m_paradigms.N_es_prx_open,
	 = m_paradigms.N_as_prx,
	 = m_paradigms.N_as_prx_open,
	 = m_paradigms.kles,
	 = m_paradigms.kles_open, -- add 2 for unique key
	 = m_paradigms.weak_i_prx,
	 = m_paradigms.weak_u,
	 = m_paradigms.N_weak_i_prx,
	 = m_paradigms.N_weak_u,
	 = m_paradigms.pure_i_prx,
	 = m_paradigms.N_pure_i_prx,
	 = m_paradigms.pure_u_long_prx,
	 = m_paradigms.pure_u,
	 = m_paradigms.N_pure_u_prx,
	 = m_paradigms.eus,
	 = m_paradigms.eus_con,
	 = m_paradigms.oi,
}

-- Used by the function that generates the list of declension categories on the documentation page.
export.conversion = {
	 = 'alp_pax',
	 = 'eta_pax',
	 = 'als_prx',
	 = 'ets_prx',
	 = 'M_alp_pax',
	 = 'M_alp_con',
	 = 'M_eta_pax',
	 = 'second',
	 = 'second_con',
	 = 'second_N',
	 = 'second_N_con',
	 = 'second_att',
	 = 'second_N_att_prx',
	 = 'es_adj',
	 = 'es_adj_prx_open',
	 = 'N_es_adj',
	 = 'N_es_prx',
	 = 'N_es_prx_open',
	 = 'N_as_prx',
	 = 'kles',
	 = 'kles_open',
	 = 'weak_i_prx',
	 = 'weak_u',
	 = 'N_weak_i_prx',
	 = 'N_weak_u',
	 = 'pure_i_prx',
	 = 'N_pure_i_prx',
	 = 'pure_u_long_prx',
	 = 'pure_u',
	 = 'N_pure_u_prx',
	 = 'eus',
	 = 'eus_con',
	 = 'oi',
}

infl_info = {}
export.ambig_forms = {}

-- Constructs a table for nouns with the same structure as the one for adjectives.
local strip_tone = require("Module:grc-accent").strip_tone
local longest_nominative_ending = 0
for name, decl in pairs(infl_categories) do
	local nom = strip_tone(sub(decl.NS, 2))
	local gen = strip_tone(sub(strip_tone(decl.GS), 2))
	
	longest_nominative_ending = math.max(longest_nominative_ending, mw.ustring.len(mw.ustring.toNFC(nom)))
	
	if not infl_info then
		infl_info = {}
	end
	
	if type(infl_info) == "table" then
		if infl_info then
			error('Conflict in noun declensions; two declensions with nominative ' .. nom ..
					' and genitive ' .. gen .. '.')
		end
		
		name = gsub(name, "%d$", "")
		
		infl_info = name
	end
end
infl_info.longest_nominative_ending = longest_nominative_ending

for nominative, list in pairs(infl_info) do
	local unmarked_length, opposite_length = mess_with_length(nominative)
	local data_for_opposite
	
	if unmarked_length ~= opposite_length then
		data_for_opposite = infl_info or infl_info
		if not data_for_opposite then
			infl_info = nominative
		end
	end
	
	if type(list) == "table" then
		local new_list = {}
		
		for gen, name in pairs(list) do
			local unmarked_length, opposite_length = mess_with_length(gen)
			if unmarked_length ~= gen and not list then
				new_list = name
			end
			
			new_list = name
		end
		list = new_list
		
		local combined_gens = {}
		
		if data_for_opposite and not infl_info then
			local is_ambig = false
			for gen, name in pairs(list) do
				combined_gens = name
			end
			
			for gen, name in pairs(data_for_opposite or {}) do
				local gen_unmarked_length, gen_opposite_length = mess_with_length(gen)
				if list or list then
					--[[
						If there are two declension types with the same nominative
						and genitive endings aside from the length of the nominative,
						then strip the macron or breve from both forms and record them.
					]]
					is_ambig = true
				end
				
				combined_gens = add_unmarked_form(combined_gens, gen, name)
			end
			
			if is_ambig then
				--[[
					Remove length marks and record all the nominative–genitive pairs
					that were found.
				]]
				local nom = mess_with_length(nominative)
				
				for gen, name in pairs(combined_gens) do
					gen = mess_with_length(gen)
					export.ambig_forms = export.ambig_forms or {}
					export.ambig_forms = true
				end
			else
				infl_info = combined_gens
			end
		end
		
		infl_info = list
	end
end

local infl_info_adj = {
	 = {
		 = '1&2-alp',
		 = '1&2-eta',
		 = '2nd',
	},
	 = {
		 = '1&2-alp-con',
		 = '1&2-eta-con',
		 = '1&3-ουντ',
	},
	 = {  = '1&3-ups' },
--	 = 'ῠς',
	 = {
		 = '1&3-οτ',
		 = '2nd-att',
	},
	 = {
		 = '1&3-ᾰν',
		 = '1&3-ᾰντ',
	},
	 = {  = '1&3-εν' },
	 = {
		 = '1&3-εντ',
		 = '1&3-εσσ',
	},
	 = {
		 = '1&3-οντ',
		 = '1&3-ωντ',
	},
	 = {  = '1&3-ῠντ' },
	 = {  = '3rd-εσ' },
}

export.ambig_forms_adj = {}
--[[
	 = '',
]]

for masculine, list in pairs(infl_info_adj) do
	if type(list) == "table" then
		-- Decompose masculine and feminine (or neuter) endings.
		local new_fems = {}
		local fems_changed = false
		for feminine, name in pairs(list) do
			new_feminine = toNFD(feminine)
			if new_feminine ~= feminine then
				fems_changed = true
			end
			new_fems = name
		end
		list = new_fems
		
		new_masculine = toNFD(masculine)
		
		if fems_changed or new_masculine ~= masculine then
			-- Delete existing entry
			infl_info_adj = nil
			-- Create decomposed one.
			infl_info_adj = list
		end
	elseif type(list) == "string" then
		if not infl_info_adj then
			error(masculine .. ' has been redirected to the form ' .. list .. ', which does not exist.')
		end
	end
end

local longest_masculine_ending = 0
for masculine, list in pairs(infl_info_adj) do
	local unmarked_length, opposite_length = mess_with_length(masculine)
	local data_for_opposite
	
	longest_masculine_ending =
		math.max(longest_masculine_ending, mw.ustring.len(mw.ustring.toNFC(masculine)))
	
	if unmarked_length ~= opposite_length then
		data_for_opposite = infl_info_adj or infl_info_adj
		if not data_for_opposite then
			infl_info_adj = masculine
		end
	end
	
	local new_list = {}
	for fem, name in pairs(list) do
		local unmarked_length, opposite_length = mess_with_length(fem)
		if unmarked_length ~= fem and not list then
			new_list = name
		end
		
		new_list = name
	end
	list = new_list
	
	local combined_fems = {}
	
	if data_for_opposite and not infl_info_adj then
		for fem, name in pairs(list) do
			combined_fems = name
		end
		
		for fem, name in pairs(data_for_opposite or {}) do
			if list then
				--[[
					If there are declension types with the same masculine and
					feminine endings, aside from the length (not currently true),
					then strip the macron or breve and log them.
				]]
				local key = mess_with_length(masculine)
				local value = mess_with_length(fem)
				export.ambig_forms_adj = value
				combined_fems = nil
				break
			end
			
			combined_fems = add_unmarked_form(combined_fems, fem, name)
		end
		
		if combined_fems then
			infl_info_adj = combined_fems
		end
	end
	
	infl_info_adj = list
end
infl_info_adj.longest_masculine_ending = longest_masculine_ending

--[[
	Mapping from adjectival declension codes to the declension type used for the masculine (1),
	feminine (2), and neuter (3), along with any suffixes added to the stem in the masculine
	and neuter (a1) or feminine (a2).
]]

export.headers = {
	 = '] and ] declension',
	 = '] and ] declension',
	 = ']',
	 = ']',
	 = ']',
	 = 'Irregular declension',
}

for k, header in pairs(m_paradigms.headers) do
	if export.headers then
		if export.headers ~= header then
			error('Two headers with same name: ' .. export.header .. ', ' .. header .. '.')
		end
	else
		export.headers = header
	end
end

--First-and-second-declension adjectives
export.adjinflections = { '2nd', '1st-alp', '2nd-N', adeclheader = '1&2' }
export.adjinflections = { '2nd', '1st-alp', '2nd-N', a1 = 'ε', a2 = 'ε', adeclheader = '1&2' } -- avoid collisions
export.adjinflections = { '2nd', '1st-eta', '2nd-N', adeclheader = '1&2' }
export.adjinflections = { '2nd', '1st-alp', '2nd-N', a1 = 'ε', a2 = 'ε', adeclheader = '1&2' }

-- First-and-third-declension adjectives
export.adjinflections = { '3rd-weak-υ', '1st-als', '3rd-N-weak-υ', a2 = 'ει', adeclheader = '1&3' }
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'ᾰν', a2 = 'αιν', adeclheader = '1&3' }
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'εν', a2 = 'ειν', adeclheader = '1&3' }
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'εντ', a2 = 'εσσ', adeclheader = '1&3' }

--]
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'οντ', a2 = 'ουσ', adeclheader = '1&3' }
-- perfect active:
export.adjinflections = { '3rd-cons', '1st-als', '3rd-N-cons', a1 = 'οτ', a2 = 'υι', adeclheader = '1&3' }
-- From roots with reflex of *h₁, and in the aorist passive:
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'εντ', a2 = 'εισ', adeclheader = '1&3' }
-- From roots with reflex of *h₂, and 1st aorist active:
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'ᾰντ', a2 = 'ᾱσ', adeclheader = '1&3' }
-- From roots with reflex of *h₃, and thematic active:
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'οντ', a2 = 'ουσ', adeclheader = '1&3' }
-- έω/όω contract; this category does not appear in infl_info_adj, because it
-- has to be assigned specifically in ], if
-- masculine singular has acute on ultima (is perispomenon):
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'ουντ', a2 = 'ουσ', adeclheader = '1&3' }
-- νῡμι active:
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'ῠντ', a2 = 'ῡσ', adeclheader = '1&3' }
-- άω contract:
export.adjinflections = { '3rd-cons', '1st-ets', '3rd-N-cons', a1 = 'ωντ', a2 = 'ωσ', adeclheader = '1&3' }

-- Masculine and feminine identical
export.adjinflections = { '2nd', nil, '2nd-N', adeclheader = '2nd' }
export.adjinflections = { '2nd-att', nil, '2nd-N-att', adeclheader = 'Attic' }
export.adjinflections = { '3rd-cons', nil, '3rd-N-cons', adeclheader = '3rd' }
export.adjinflections = { '3rd-εσ-open', nil, '3rd-N-εσ-open', adeclheader = '3rd' }

export.adjinflections = { '2nd-con', '1st-alp', '2nd-N-con', adeclheader = '1&2' }
export.adjinflections = { '2nd-con', '1st-eta', '2nd-N-con', adeclheader = '1&2' }
export.adjinflections = { '3rd-εσ', nil, '3rd-N-εσ', adeclheader = '3rd' }

export.adjinflections_con = export.adjinflections
export.adjinflections_con = export.adjinflections
export.adjinflections_con = export.adjinflections

export.infl_info = {}
export.infl_info.noun = infl_info
export.infl_info.adj = infl_info_adj


export.irregular = {}
export.irregular.noun = {}

export.irregular.noun.masculine_feminine = {
	full = {
		false, 'NS', 'GS', 'DS', 'AS', 'VS',
		'ND', 'GD',
		'NP', 'GP', 'DP', 'AP'
	},
	S  = { false, 'NS', 'GS', 'DS', 'AS', 'VS' },
	D  = { false, 'ND', 'GD' },
	P  = { false, 'NP', 'GP', 'DP', 'AP' },
	SP = {
		false, 'NS', 'GS', 'DS', 'AS', 'VS',
		'NP', 'GP', 'DP', 'AP'
	},
	DP = {
		false, 'ND', 'GD',
		'NP', 'GP', 'DP', 'AP'
	},
}

export.irregular.noun.neuter = {
	full = { false, 'NS', 'GS', 'DS', 'ND', 'GD', 'NP', 'GP', 'DP',
		redirects = {
			AS = 'NS', VS = 'NS', AP = 'NP'
		},
	},
	DP = { false, 'ND', 'GD', 'NP', 'GP', 'DP',
		redirects = {
			AP = 'NP',
		},
	},
	SP = { false, 'NS', 'GS', 'DS', 'NP', 'GP', 'DP',
		redirects = {
			AS = 'NS', VS = 'NS', AP = 'NP'
		}
	},
	S = { false, 'NS', 'GS', 'DS',
		redirects = {
			AS = 'NS', VS = 'NS',
		},
	},
	D = { false, 'DS', 'DG' },
	P = { false, 'NP', 'GP', 'DP',
		redirects = {
			AP = 'NP'
		},
	},
}

export.irregular.adjective = {
	full = {
		false, 'MNS', 'MGS', 'MDS', 'MAS', 'MVS', 'MND', 'MGD', 'MNP', 'MGP', 'MDP', 'MAP',
		'FNS', 'FGS', 'FDS', 'FAS', 'FVS', 'FND', 'FGD', 'FNP', 'FGP', 'FDP', 'FAP',
		'NNS', 'NNP',
		redirects = {
			NGS = 'MGS', NDS = 'MDS', NAS = 'NNS', NVS = 'NNS',
			NND = 'MND', NGD = 'MGD',
			NGP = 'MGP', NDP = 'MDP', NAP = 'NNP'
		},
	},
	SP = {
		false, 'MNS', 'MGS', 'MDS', 'MAS', 'MVS', 'MNP', 'MGP', 'MDP', 'MAP',
		'FNS', 'FGS', 'FDS', 'FAS', 'FVS', 'FNP', 'FGP', 'FDP', 'FAP',
		'NNS', 'NNP',
		redirects = {
			NGS = 'MGS', NDS = 'MDS', NAS = 'NNS', NVS = 'NNS',
			NGP = 'MGP', NDP = 'MDP', NAP = 'NNP'
		},
	},
	S = {
		false, 'MNS', 'MGS', 'MDS', 'MAS', 'MVS',
		'FNS', 'FGS', 'FDS', 'FAS', 'FVS',
		'NNS',
		redirects = { NGS = 'MGS', NDS = 'MDS', NAS = 'NNS', NVS = 'NNS', },
	},
	-- Unlikely ever to be used.
	D = {
		false, 'MND', 'MGD',
		'FND', 'FGD',
		redirects = { NND = 'MGD', NGD = 'MGD', }
	},
	P = {
		false, 'MNP', 'MGP', 'MDP', 'MAP',
		'FNP', 'FGP', 'FDP', 'FAP',
		'NNP',
		redirects = { NGP = 'MGP', NDP = 'MDP', NAP = 'NNP' },
	},
}

return export