<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mariogalaxy.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lord-Giganticus</id>
	<title>Super Mario Galaxy wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://mariogalaxy.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lord-Giganticus"/>
	<link rel="alternate" type="text/html" href="https://mariogalaxy.org/wiki/Special:Contributions/Lord-Giganticus"/>
	<updated>2026-04-19T09:49:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=User:Lord-Giganticus&amp;diff=372</id>
		<title>User:Lord-Giganticus</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=User:Lord-Giganticus&amp;diff=372"/>
		<updated>2024-05-13T03:48:54Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The guy who knows *WAYYY* to much about thp. Owns some rare disks and like morbin&lt;br /&gt;
&lt;br /&gt;
0x{{#invoke:ConvertNumeric|decToHex|69}}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:ConvertNumeric&amp;diff=371</id>
		<title>Module:ConvertNumeric</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:ConvertNumeric&amp;diff=371"/>
		<updated>2024-05-13T03:47:40Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;-- Module for converting between different representations of numbers. See talk page for user documentation. -- For unit tests see: Module:ConvertNumeric/testcases -- When editing, preview with: Module_talk:ConvertNumeric/testcases -- First, edit Module:ConvertNumeric/sandbox, then preview with Module_talk:ConvertNumeric/sandbox/testcases require(&amp;#039;strict&amp;#039;)  local ones_position = { 	[0] = &amp;#039;zero&amp;#039;, 	[1] = &amp;#039;one&amp;#039;, 	[2] = &amp;#039;two&amp;#039;, 	[3] = &amp;#039;three&amp;#039;, 	[4] = &amp;#039;four&amp;#039;,...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Module for converting between different representations of numbers. See talk page for user documentation.&lt;br /&gt;
-- For unit tests see: [[Module:ConvertNumeric/testcases]]&lt;br /&gt;
-- When editing, preview with: [[Module_talk:ConvertNumeric/testcases]]&lt;br /&gt;
-- First, edit [[Module:ConvertNumeric/sandbox]], then preview with [[Module_talk:ConvertNumeric/sandbox/testcases]]&lt;br /&gt;
require(&#039;strict&#039;)&lt;br /&gt;
&lt;br /&gt;
local ones_position = {&lt;br /&gt;
	[0] = &#039;zero&#039;,&lt;br /&gt;
	[1] = &#039;one&#039;,&lt;br /&gt;
	[2] = &#039;two&#039;,&lt;br /&gt;
	[3] = &#039;three&#039;,&lt;br /&gt;
	[4] = &#039;four&#039;,&lt;br /&gt;
	[5] = &#039;five&#039;,&lt;br /&gt;
	[6] = &#039;six&#039;,&lt;br /&gt;
	[7] = &#039;seven&#039;,&lt;br /&gt;
	[8] = &#039;eight&#039;,&lt;br /&gt;
	[9] = &#039;nine&#039;,&lt;br /&gt;
	[10] = &#039;ten&#039;,&lt;br /&gt;
	[11] = &#039;eleven&#039;,&lt;br /&gt;
	[12] = &#039;twelve&#039;,&lt;br /&gt;
	[13] = &#039;thirteen&#039;,&lt;br /&gt;
	[14] = &#039;fourteen&#039;,&lt;br /&gt;
	[15] = &#039;fifteen&#039;,&lt;br /&gt;
	[16] = &#039;sixteen&#039;,&lt;br /&gt;
	[17] = &#039;seventeen&#039;,&lt;br /&gt;
	[18] = &#039;eighteen&#039;,&lt;br /&gt;
	[19] = &#039;nineteen&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local ones_position_ord = {&lt;br /&gt;
	[0] = &#039;zeroth&#039;,&lt;br /&gt;
	[1] = &#039;first&#039;,&lt;br /&gt;
	[2] = &#039;second&#039;,&lt;br /&gt;
	[3] = &#039;third&#039;,&lt;br /&gt;
	[4] = &#039;fourth&#039;,&lt;br /&gt;
	[5] = &#039;fifth&#039;,&lt;br /&gt;
	[6] = &#039;sixth&#039;,&lt;br /&gt;
	[7] = &#039;seventh&#039;,&lt;br /&gt;
	[8] = &#039;eighth&#039;,&lt;br /&gt;
	[9] = &#039;ninth&#039;,&lt;br /&gt;
	[10] = &#039;tenth&#039;,&lt;br /&gt;
	[11] = &#039;eleventh&#039;,&lt;br /&gt;
	[12] = &#039;twelfth&#039;,&lt;br /&gt;
	[13] = &#039;thirteenth&#039;,&lt;br /&gt;
	[14] = &#039;fourteenth&#039;,&lt;br /&gt;
	[15] = &#039;fifteenth&#039;,&lt;br /&gt;
	[16] = &#039;sixteenth&#039;,&lt;br /&gt;
	[17] = &#039;seventeenth&#039;,&lt;br /&gt;
	[18] = &#039;eighteenth&#039;,&lt;br /&gt;
	[19] = &#039;nineteenth&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local ones_position_plural = {&lt;br /&gt;
	[0] = &#039;zeros&#039;,&lt;br /&gt;
	[1] = &#039;ones&#039;,&lt;br /&gt;
	[2] = &#039;twos&#039;,&lt;br /&gt;
	[3] = &#039;threes&#039;,&lt;br /&gt;
	[4] = &#039;fours&#039;,&lt;br /&gt;
	[5] = &#039;fives&#039;,&lt;br /&gt;
	[6] = &#039;sixes&#039;,&lt;br /&gt;
	[7] = &#039;sevens&#039;,&lt;br /&gt;
	[8] = &#039;eights&#039;,&lt;br /&gt;
	[9] = &#039;nines&#039;,&lt;br /&gt;
	[10] = &#039;tens&#039;,&lt;br /&gt;
	[11] = &#039;elevens&#039;,&lt;br /&gt;
	[12] = &#039;twelves&#039;,&lt;br /&gt;
	[13] = &#039;thirteens&#039;,&lt;br /&gt;
	[14] = &#039;fourteens&#039;,&lt;br /&gt;
	[15] = &#039;fifteens&#039;,&lt;br /&gt;
	[16] = &#039;sixteens&#039;,&lt;br /&gt;
	[17] = &#039;seventeens&#039;,&lt;br /&gt;
	[18] = &#039;eighteens&#039;,&lt;br /&gt;
	[19] = &#039;nineteens&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local tens_position = {&lt;br /&gt;
	[2] = &#039;twenty&#039;,&lt;br /&gt;
	[3] = &#039;thirty&#039;,&lt;br /&gt;
	[4] = &#039;forty&#039;,&lt;br /&gt;
	[5] = &#039;fifty&#039;,&lt;br /&gt;
	[6] = &#039;sixty&#039;,&lt;br /&gt;
	[7] = &#039;seventy&#039;,&lt;br /&gt;
	[8] = &#039;eighty&#039;,&lt;br /&gt;
	[9] = &#039;ninety&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local tens_position_ord = {&lt;br /&gt;
	[2] = &#039;twentieth&#039;,&lt;br /&gt;
	[3] = &#039;thirtieth&#039;,&lt;br /&gt;
	[4] = &#039;fortieth&#039;,&lt;br /&gt;
	[5] = &#039;fiftieth&#039;,&lt;br /&gt;
	[6] = &#039;sixtieth&#039;,&lt;br /&gt;
	[7] = &#039;seventieth&#039;,&lt;br /&gt;
	[8] = &#039;eightieth&#039;,&lt;br /&gt;
	[9] = &#039;ninetieth&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local tens_position_plural = {&lt;br /&gt;
	[2] = &#039;twenties&#039;,&lt;br /&gt;
	[3] = &#039;thirties&#039;,&lt;br /&gt;
	[4] = &#039;forties&#039;,&lt;br /&gt;
	[5] = &#039;fifties&#039;,&lt;br /&gt;
	[6] = &#039;sixties&#039;,&lt;br /&gt;
	[7] = &#039;seventies&#039;,&lt;br /&gt;
	[8] = &#039;eighties&#039;,&lt;br /&gt;
	[9] = &#039;nineties&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local groups = {&lt;br /&gt;
	[1] = &#039;thousand&#039;,&lt;br /&gt;
	[2] = &#039;million&#039;,&lt;br /&gt;
	[3] = &#039;billion&#039;,&lt;br /&gt;
	[4] = &#039;trillion&#039;,&lt;br /&gt;
	[5] = &#039;quadrillion&#039;,&lt;br /&gt;
	[6] = &#039;quintillion&#039;,&lt;br /&gt;
	[7] = &#039;sextillion&#039;,&lt;br /&gt;
	[8] = &#039;septillion&#039;,&lt;br /&gt;
	[9] = &#039;octillion&#039;,&lt;br /&gt;
	[10] = &#039;nonillion&#039;,&lt;br /&gt;
	[11] = &#039;decillion&#039;,&lt;br /&gt;
	[12] = &#039;undecillion&#039;,&lt;br /&gt;
	[13] = &#039;duodecillion&#039;,&lt;br /&gt;
	[14] = &#039;tredecillion&#039;,&lt;br /&gt;
	[15] = &#039;quattuordecillion&#039;,&lt;br /&gt;
	[16] = &#039;quindecillion&#039;,&lt;br /&gt;
	[17] = &#039;sexdecillion&#039;,&lt;br /&gt;
	[18] = &#039;septendecillion&#039;,&lt;br /&gt;
	[19] = &#039;octodecillion&#039;,&lt;br /&gt;
	[20] = &#039;novemdecillion&#039;,&lt;br /&gt;
	[21] = &#039;vigintillion&#039;,&lt;br /&gt;
	[22] = &#039;unvigintillion&#039;,&lt;br /&gt;
	[23] = &#039;duovigintillion&#039;,&lt;br /&gt;
	[24] = &#039;tresvigintillion&#039;,&lt;br /&gt;
	[25] = &#039;quattuorvigintillion&#039;,&lt;br /&gt;
	[26] = &#039;quinquavigintillion&#039;,&lt;br /&gt;
	[27] = &#039;sesvigintillion&#039;,&lt;br /&gt;
	[28] = &#039;septemvigintillion&#039;,&lt;br /&gt;
	[29] = &#039;octovigintillion&#039;,&lt;br /&gt;
	[30] = &#039;novemvigintillion&#039;,&lt;br /&gt;
	[31] = &#039;trigintillion&#039;,&lt;br /&gt;
	[32] = &#039;untrigintillion&#039;,&lt;br /&gt;
	[33] = &#039;duotrigintillion&#039;,&lt;br /&gt;
	[34] = &#039;trestrigintillion&#039;,&lt;br /&gt;
	[35] = &#039;quattuortrigintillion&#039;,&lt;br /&gt;
	[36] = &#039;quinquatrigintillion&#039;,&lt;br /&gt;
	[37] = &#039;sestrigintillion&#039;,&lt;br /&gt;
	[38] = &#039;septentrigintillion&#039;,&lt;br /&gt;
	[39] = &#039;octotrigintillion&#039;,&lt;br /&gt;
	[40] = &#039;noventrigintillion&#039;,&lt;br /&gt;
	[41] = &#039;quadragintillion&#039;,&lt;br /&gt;
	[51] = &#039;quinquagintillion&#039;,&lt;br /&gt;
	[61] = &#039;sexagintillion&#039;,&lt;br /&gt;
	[71] = &#039;septuagintillion&#039;,&lt;br /&gt;
	[81] = &#039;octogintillion&#039;,&lt;br /&gt;
	[91] = &#039;nonagintillion&#039;,&lt;br /&gt;
	[101] = &#039;centillion&#039;,&lt;br /&gt;
	[102] = &#039;uncentillion&#039;,&lt;br /&gt;
	[103] = &#039;duocentillion&#039;,&lt;br /&gt;
	[104] = &#039;trescentillion&#039;,&lt;br /&gt;
	[111] = &#039;decicentillion&#039;,&lt;br /&gt;
	[112] = &#039;undecicentillion&#039;,&lt;br /&gt;
	[121] = &#039;viginticentillion&#039;,&lt;br /&gt;
	[122] = &#039;unviginticentillion&#039;,&lt;br /&gt;
	[131] = &#039;trigintacentillion&#039;,&lt;br /&gt;
	[141] = &#039;quadragintacentillion&#039;,&lt;br /&gt;
	[151] = &#039;quinquagintacentillion&#039;,&lt;br /&gt;
	[161] = &#039;sexagintacentillion&#039;,&lt;br /&gt;
	[171] = &#039;septuagintacentillion&#039;,&lt;br /&gt;
	[181] = &#039;octogintacentillion&#039;,&lt;br /&gt;
	[191] = &#039;nonagintacentillion&#039;,&lt;br /&gt;
	[201] = &#039;ducentillion&#039;,&lt;br /&gt;
	[301] = &#039;trecentillion&#039;,&lt;br /&gt;
	[401] = &#039;quadringentillion&#039;,&lt;br /&gt;
	[501] = &#039;quingentillion&#039;,&lt;br /&gt;
	[601] = &#039;sescentillion&#039;,&lt;br /&gt;
	[701] = &#039;septingentillion&#039;,&lt;br /&gt;
	[801] = &#039;octingentillion&#039;,&lt;br /&gt;
	[901] = &#039;nongentillion&#039;,&lt;br /&gt;
	[1001] = &#039;millinillion&#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local roman_numerals = {&lt;br /&gt;
	I = 1,&lt;br /&gt;
	V = 5,&lt;br /&gt;
	X = 10,&lt;br /&gt;
	L = 50,&lt;br /&gt;
	C = 100,&lt;br /&gt;
	D = 500,&lt;br /&gt;
	M = 1000&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local engord_tens_end  = {&lt;br /&gt;
	[&#039;twentieth&#039;]	= 20,&lt;br /&gt;
	[&#039;thirtieth&#039;]	= 30,&lt;br /&gt;
	[&#039;fortieth&#039;]	= 40,&lt;br /&gt;
	[&#039;fiftieth&#039;]	= 50,&lt;br /&gt;
	[&#039;sixtieth&#039;]	= 60,&lt;br /&gt;
	[&#039;seventieth&#039;]	= 70,&lt;br /&gt;
	[&#039;eightieth&#039;]	= 80,&lt;br /&gt;
	[&#039;ninetieth&#039;]	= 90,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local eng_tens_cont = {&lt;br /&gt;
	[&#039;twenty&#039;]	= 20,&lt;br /&gt;
	[&#039;thirty&#039;]	= 30,&lt;br /&gt;
	[&#039;forty&#039;]	= 40,&lt;br /&gt;
	[&#039;fifty&#039;]	= 50,&lt;br /&gt;
	[&#039;sixty&#039;]	= 60,&lt;br /&gt;
	[&#039;seventy&#039;]	= 70,&lt;br /&gt;
	[&#039;eighty&#039;]	= 80,&lt;br /&gt;
	[&#039;ninety&#039;]	= 90,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Converts a given valid roman numeral (and some invalid roman numerals) to a number. Returns { -1, errorstring } on error.&lt;br /&gt;
local function roman_to_numeral(roman)&lt;br /&gt;
	if type(roman) ~= &amp;quot;string&amp;quot; then return -1, &amp;quot;roman numeral not a string&amp;quot; end&lt;br /&gt;
	local rev = roman:reverse()&lt;br /&gt;
	local raising = true&lt;br /&gt;
	local last = 0&lt;br /&gt;
	local result = 0&lt;br /&gt;
	for i = 1, #rev do&lt;br /&gt;
		local c = rev:sub(i, i)&lt;br /&gt;
		local next = roman_numerals[c]&lt;br /&gt;
		if next == nil then return -1, &amp;quot;roman numeral contains illegal character &amp;quot; .. c end&lt;br /&gt;
		if next &amp;gt; last then&lt;br /&gt;
			result = result + next&lt;br /&gt;
			raising = true&lt;br /&gt;
		elseif next &amp;lt; last then&lt;br /&gt;
			result = result - next&lt;br /&gt;
			raising = false&lt;br /&gt;
		elseif raising then&lt;br /&gt;
			result = result + next&lt;br /&gt;
		else&lt;br /&gt;
			result = result - next&lt;br /&gt;
		end&lt;br /&gt;
		last = next&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Converts a given integer between 0 and 100 to English text (e.g. 47 -&amp;gt; forty-seven).&lt;br /&gt;
local function numeral_to_english_less_100(num, ordinal, plural, zero)&lt;br /&gt;
	local terminal_ones, terminal_tens&lt;br /&gt;
	if ordinal then&lt;br /&gt;
		terminal_ones = ones_position_ord&lt;br /&gt;
		terminal_tens = tens_position_ord&lt;br /&gt;
	elseif plural then&lt;br /&gt;
		terminal_ones = ones_position_plural&lt;br /&gt;
		terminal_tens = tens_position_plural&lt;br /&gt;
	else&lt;br /&gt;
		terminal_ones = ones_position&lt;br /&gt;
		terminal_tens = tens_position&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if num == 0 and zero ~= nil then&lt;br /&gt;
		return zero&lt;br /&gt;
	elseif num &amp;lt; 20 then&lt;br /&gt;
		return terminal_ones[num]&lt;br /&gt;
	elseif num % 10 == 0 then&lt;br /&gt;
		return terminal_tens[num / 10]&lt;br /&gt;
	else&lt;br /&gt;
		return tens_position[math.floor(num / 10)] .. &#039;-&#039; .. terminal_ones[num % 10]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function standard_suffix(ordinal, plural)&lt;br /&gt;
	if ordinal then return &#039;th&#039; end&lt;br /&gt;
	if plural then return &#039;s&#039; end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Converts a given integer (in string form) between 0 and 1000 to English text (e.g. 47 -&amp;gt; forty-seven).&lt;br /&gt;
local function numeral_to_english_less_1000(num, use_and, ordinal, plural, zero)&lt;br /&gt;
	num = tonumber(num)&lt;br /&gt;
	if num &amp;lt; 100 then&lt;br /&gt;
		return numeral_to_english_less_100(num, ordinal, plural, zero)&lt;br /&gt;
	elseif num % 100 == 0 then&lt;br /&gt;
		return ones_position[num/100] .. &#039; hundred&#039; .. standard_suffix(ordinal, plural)&lt;br /&gt;
	else&lt;br /&gt;
		return ones_position[math.floor(num/100)] .. &#039; hundred &#039; .. (use_and and &#039;and &#039; or &#039;&#039;) .. numeral_to_english_less_100(num % 100, ordinal, plural, zero)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Converts an ordinal in English text from &#039;zeroth&#039; to &#039;ninety-ninth&#039; inclusive to a number [0–99], else -1.&lt;br /&gt;
local function english_to_ordinal(english)&lt;br /&gt;
	local eng = string.lower(english or &#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local engord_lt20 = {} -- ones_position_ord{} keys &amp;amp; values swapped&lt;br /&gt;
	for k, v in pairs( ones_position_ord ) do&lt;br /&gt;
		engord_lt20[v] = k&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if engord_lt20[eng] then&lt;br /&gt;
		return engord_lt20[eng] -- e.g. first -&amp;gt; 1&lt;br /&gt;
	elseif engord_tens_end[eng] then&lt;br /&gt;
		return engord_tens_end[eng] -- e.g. ninetieth -&amp;gt; 90&lt;br /&gt;
	else&lt;br /&gt;
		local tens, ones = string.match(eng, &#039;^([a-z]+)[%s%-]+([a-z]+)$&#039;)&lt;br /&gt;
		if tens and ones then&lt;br /&gt;
			local tens_cont = eng_tens_cont[tens]&lt;br /&gt;
			local ones_end  = engord_lt20[ones]&lt;br /&gt;
			if tens_cont and ones_end then&lt;br /&gt;
				return tens_cont + ones_end -- e.g. ninety-ninth -&amp;gt; 99&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return -1 -- Failed&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Converts a number in English text from &#039;zero&#039; to &#039;ninety-nine&#039; inclusive to a number [0–99], else -1.&lt;br /&gt;
local function english_to_numeral(english)&lt;br /&gt;
	local eng = string.lower(english or &#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local eng_lt20 = { [&#039;single&#039;] = 1 } -- ones_position{} keys &amp;amp; values swapped&lt;br /&gt;
	for k, v in pairs( ones_position ) do&lt;br /&gt;
		eng_lt20[v] = k&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if eng_lt20[eng] then&lt;br /&gt;
		return eng_lt20[eng] -- e.g. one -&amp;gt; 1&lt;br /&gt;
	elseif eng_tens_cont[eng] then&lt;br /&gt;
		return eng_tens_cont[eng] -- e.g. ninety -&amp;gt; 90&lt;br /&gt;
	else&lt;br /&gt;
		local tens, ones = string.match(eng, &#039;^([a-z]+)[%s%-]+([a-z]+)$&#039;)&lt;br /&gt;
		if tens and ones then&lt;br /&gt;
			local tens_cont = eng_tens_cont[tens]&lt;br /&gt;
			local ones_end  = eng_lt20[ones]&lt;br /&gt;
			if tens_cont and ones_end then&lt;br /&gt;
				return tens_cont + ones_end -- e.g. ninety-nine -&amp;gt; 99&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return -1 -- Failed&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Converts a number expressed as a string in scientific notation to a string in standard decimal notation&lt;br /&gt;
-- e.g. 1.23E5 -&amp;gt; 123000, 1.23E-5 = .0000123. Conversion is exact, no rounding is performed.&lt;br /&gt;
local function scientific_notation_to_decimal(num)&lt;br /&gt;
	local exponent, subs = num:gsub(&amp;quot;^%-?%d*%.?%d*%-?[Ee]([+%-]?%d+)$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	if subs == 0 then return num end  -- Input not in scientific notation, just return unmodified&lt;br /&gt;
	exponent = tonumber(exponent)&lt;br /&gt;
&lt;br /&gt;
	local negative = num:find(&amp;quot;^%-&amp;quot;)&lt;br /&gt;
	local _, decimal_pos = num:find(&amp;quot;%.&amp;quot;)&lt;br /&gt;
	-- Mantissa will consist of all decimal digits with no decimal point&lt;br /&gt;
	local mantissa = num:gsub(&amp;quot;^%-?(%d*)%.?(%d*)%-?[Ee][+%-]?%d+$&amp;quot;, &amp;quot;%1%2&amp;quot;)&lt;br /&gt;
	if negative and decimal_pos then decimal_pos = decimal_pos - 1 end&lt;br /&gt;
	if not decimal_pos then decimal_pos = #mantissa + 1 end&lt;br /&gt;
&lt;br /&gt;
	-- Remove leading zeros unless decimal point is in first position&lt;br /&gt;
	while decimal_pos &amp;gt; 1 and mantissa:sub(1,1) == &#039;0&#039; do&lt;br /&gt;
		mantissa = mantissa:sub(2)&lt;br /&gt;
		decimal_pos = decimal_pos - 1&lt;br /&gt;
	end&lt;br /&gt;
	-- Shift decimal point right for exponent &amp;gt; 0&lt;br /&gt;
	while exponent &amp;gt; 0 do&lt;br /&gt;
		decimal_pos = decimal_pos + 1&lt;br /&gt;
		exponent = exponent - 1&lt;br /&gt;
		if decimal_pos &amp;gt; #mantissa + 1 then mantissa = mantissa .. &#039;0&#039; end&lt;br /&gt;
		-- Remove leading zeros unless decimal point is in first position&lt;br /&gt;
		while decimal_pos &amp;gt; 1 and mantissa:sub(1,1) == &#039;0&#039; do&lt;br /&gt;
			mantissa = mantissa:sub(2)&lt;br /&gt;
			decimal_pos = decimal_pos - 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Shift decimal point left for exponent &amp;lt; 0&lt;br /&gt;
	while exponent &amp;lt; 0 do&lt;br /&gt;
		if decimal_pos == 1 then&lt;br /&gt;
			mantissa = &#039;0&#039; .. mantissa&lt;br /&gt;
		else&lt;br /&gt;
			decimal_pos = decimal_pos - 1&lt;br /&gt;
		end&lt;br /&gt;
		exponent = exponent + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Insert decimal point in correct position and return&lt;br /&gt;
	return (negative and &#039;-&#039; or &#039;&#039;) .. mantissa:sub(1, decimal_pos - 1) .. &#039;.&#039; .. mantissa:sub(decimal_pos)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Rounds a number to the nearest integer (NOT USED)&lt;br /&gt;
local function round_num(x)&lt;br /&gt;
	if x%1 &amp;gt;= 0.5 then&lt;br /&gt;
		return math.ceil(x)&lt;br /&gt;
	else&lt;br /&gt;
		return math.floor(x)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Rounds a number to the nearest two-word number (round = up, down, or &amp;quot;on&amp;quot; for round to nearest).&lt;br /&gt;
-- Numbers with two digits before the decimal will be rounded to an integer as specified by round.&lt;br /&gt;
-- Larger numbers will be rounded to a number with only one nonzero digit in front and all other digits zero.&lt;br /&gt;
-- Negative sign is preserved and does not count towards word limit.&lt;br /&gt;
local function round_for_english(num, round)&lt;br /&gt;
	-- If an integer with at most two digits, just return&lt;br /&gt;
	if num:find(&amp;quot;^%-?%d?%d%.?$&amp;quot;) then return num end&lt;br /&gt;
&lt;br /&gt;
	local negative = num:find(&amp;quot;^%-&amp;quot;)&lt;br /&gt;
	if negative then&lt;br /&gt;
		-- We&#039;re rounding magnitude so flip it&lt;br /&gt;
		if round == &#039;up&#039; then round = &#039;down&#039; elseif round == &#039;down&#039; then round = &#039;up&#039; end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If at most two digits before decimal, round to integer and return&lt;br /&gt;
	local _, _, small_int, trailing_digits, round_digit = num:find(&amp;quot;^%-?(%d?%d?)%.((%d)%d*)$&amp;quot;)&lt;br /&gt;
	if small_int then&lt;br /&gt;
		if small_int == &#039;&#039; then small_int = &#039;0&#039; end&lt;br /&gt;
		if (round == &#039;up&#039; and trailing_digits:find(&#039;[1-9]&#039;)) or (round == &#039;on&#039; and tonumber(round_digit) &amp;gt;= 5) then&lt;br /&gt;
			small_int = tostring(tonumber(small_int) + 1)&lt;br /&gt;
		end&lt;br /&gt;
		return (negative and &#039;-&#039; or &#039;&#039;) .. small_int&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- When rounding up, any number with &amp;gt; 1 nonzero digit will round up (e.g. 1000000.001 rounds up to 2000000)&lt;br /&gt;
	local nonzero_digits = 0&lt;br /&gt;
	for digit in num:gfind(&amp;quot;[1-9]&amp;quot;) do&lt;br /&gt;
		nonzero_digits = nonzero_digits + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	num = num:gsub(&amp;quot;%.%d*$&amp;quot;, &amp;quot;&amp;quot;) -- Remove decimal part&lt;br /&gt;
	-- Second digit used to determine which way to round lead digit&lt;br /&gt;
	local _, _, lead_digit, round_digit, round_digit_2, rest = num:find(&amp;quot;^%-?(%d)(%d)(%d)(%d*)$&amp;quot;)&lt;br /&gt;
	if tonumber(lead_digit .. round_digit) &amp;lt; 20 and (1 + #rest) % 3 == 0 then&lt;br /&gt;
		-- In English numbers &amp;lt; 20 are one word so put 2 digits in lead and round based on 3rd&lt;br /&gt;
		lead_digit = lead_digit .. round_digit&lt;br /&gt;
		round_digit = round_digit_2&lt;br /&gt;
	else&lt;br /&gt;
		rest = round_digit_2 .. rest&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (round == &#039;up&#039; and nonzero_digits &amp;gt; 1) or (round == &#039;on&#039; and tonumber(round_digit) &amp;gt;= 5) then&lt;br /&gt;
		lead_digit = tostring(tonumber(lead_digit) + 1)&lt;br /&gt;
	end&lt;br /&gt;
	-- All digits but lead digit will turn to zero&lt;br /&gt;
	rest = rest:gsub(&amp;quot;%d&amp;quot;, &amp;quot;0&amp;quot;)&lt;br /&gt;
	return (negative and &#039;-&#039; or &#039;&#039;) .. lead_digit .. &#039;0&#039; .. rest&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local denominators = {&lt;br /&gt;
	[2] = { &#039;half&#039;, plural = &#039;halves&#039; },&lt;br /&gt;
	[3] = { &#039;third&#039; },&lt;br /&gt;
	[4] = { &#039;quarter&#039;, us = &#039;fourth&#039; },&lt;br /&gt;
	[5] = { &#039;fifth&#039; },&lt;br /&gt;
	[6] = { &#039;sixth&#039; },&lt;br /&gt;
	[8] = { &#039;eighth&#039; },&lt;br /&gt;
	[9] = { &#039;ninth&#039; },&lt;br /&gt;
	[10] = { &#039;tenth&#039; },&lt;br /&gt;
	[16] = { &#039;sixteenth&#039; },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Return status, fraction where:&lt;br /&gt;
-- status is a string:&lt;br /&gt;
--     &amp;quot;finished&amp;quot; if there is a fraction with no whole number;&lt;br /&gt;
--     &amp;quot;ok&amp;quot; if fraction is empty or valid;&lt;br /&gt;
--     &amp;quot;unsupported&amp;quot; if bad fraction;&lt;br /&gt;
-- fraction is a string giving (numerator / denominator) as English text, or is &amp;quot;&amp;quot;.&lt;br /&gt;
-- Only unsigned fractions with a very limited range of values are supported,&lt;br /&gt;
-- except that if whole is empty, the numerator can use &amp;quot;-&amp;quot; to indicate negative.&lt;br /&gt;
-- whole (string or nil): nil or &amp;quot;&amp;quot; if no number before the fraction&lt;br /&gt;
-- numerator (string or nil): numerator, if any (default = 1 if a denominator is given)&lt;br /&gt;
-- denominator (string or nil): denominator, if any&lt;br /&gt;
-- sp_us (boolean): true if sp=us&lt;br /&gt;
-- negative_word (string): word to use for negative sign, if whole is empty&lt;br /&gt;
-- use_one (boolean): false: 2+1/2 → &amp;quot;two and a half&amp;quot;; true: &amp;quot;two and one-half&amp;quot;&lt;br /&gt;
local function fraction_to_english(whole, numerator, denominator, sp_us, negative_word, use_one)&lt;br /&gt;
	if numerator or denominator then&lt;br /&gt;
		local finished = (whole == nil or whole == &#039;&#039;)&lt;br /&gt;
		local sign = &#039;&#039;&lt;br /&gt;
		if numerator then&lt;br /&gt;
			if finished and numerator:sub(1, 1) == &#039;-&#039; then&lt;br /&gt;
				numerator = numerator:sub(2)&lt;br /&gt;
				sign = negative_word .. &#039; &#039;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			numerator = &#039;1&#039;&lt;br /&gt;
		end&lt;br /&gt;
		if not numerator:match(&#039;^%d+$&#039;) or not denominator or not denominator:match(&#039;^%d+$&#039;) then&lt;br /&gt;
			return &#039;unsupported&#039;, &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		numerator = tonumber(numerator)&lt;br /&gt;
		denominator = tonumber(denominator)&lt;br /&gt;
		local dendata = denominators[denominator]&lt;br /&gt;
		if not (dendata and 1 &amp;lt;= numerator and numerator &amp;lt;= 99) then&lt;br /&gt;
			return &#039;unsupported&#039;, &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		local numstr, denstr&lt;br /&gt;
		local sep = &#039;-&#039;&lt;br /&gt;
		if numerator == 1 then&lt;br /&gt;
			denstr = sp_us and dendata.us or dendata[1]&lt;br /&gt;
			if finished or use_one then&lt;br /&gt;
				numstr = &#039;one&#039;&lt;br /&gt;
			elseif denstr:match(&#039;^[aeiou]&#039;) then&lt;br /&gt;
				numstr = &#039;an&#039;&lt;br /&gt;
				sep = &#039; &#039;&lt;br /&gt;
			else&lt;br /&gt;
				numstr = &#039;a&#039;&lt;br /&gt;
				sep = &#039; &#039;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			numstr = numeral_to_english_less_100(numerator)&lt;br /&gt;
			denstr = dendata.plural&lt;br /&gt;
			if not denstr then&lt;br /&gt;
				denstr = (sp_us and dendata.us or dendata[1]) .. &#039;s&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if finished then&lt;br /&gt;
			return &#039;finished&#039;, sign .. numstr .. sep .. denstr&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;ok&#039;, &#039; and &#039; .. numstr .. sep .. denstr&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;ok&#039;, &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Takes a decimal number and converts it to English text.&lt;br /&gt;
-- Return nil if a fraction cannot be converted (only some numbers are supported for fractions).&lt;br /&gt;
-- num (string or nil): the number to convert.&lt;br /&gt;
--      Can be an arbitrarily large decimal, such as &amp;quot;-123456789123456789.345&amp;quot;, and&lt;br /&gt;
--      can use scientific notation (e.g. &amp;quot;1.23E5&amp;quot;).&lt;br /&gt;
--      May fail for very large numbers not listed in &amp;quot;groups&amp;quot; such as &amp;quot;1E4000&amp;quot;.&lt;br /&gt;
--      num is nil if there is no whole number before a fraction.&lt;br /&gt;
-- numerator (string or nil): numerator of fraction (nil if no fraction)&lt;br /&gt;
-- denominator (string or nil): denominator of fraction (nil if no fraction)&lt;br /&gt;
-- capitalize (boolean): whether to capitalize the result (e.g. &#039;One&#039; instead of &#039;one&#039;)&lt;br /&gt;
-- use_and (boolean): whether to use the word &#039;and&#039; between tens/ones place and higher places&lt;br /&gt;
-- hyphenate (boolean): whether to hyphenate all words in the result, useful as an adjective&lt;br /&gt;
-- ordinal (boolean): whether to produce an ordinal (e.g. &#039;first&#039; instead of &#039;one&#039;)&lt;br /&gt;
-- plural (boolean): whether to pluralize the resulting number&lt;br /&gt;
-- links: nil: do not add any links; &#039;on&#039;: link &amp;quot;billion&amp;quot; and larger to Orders of magnitude article;&lt;br /&gt;
--        any other text: list of numbers to link (e.g. &amp;quot;billion,quadrillion&amp;quot;)&lt;br /&gt;
-- negative_word: word to use for negative sign (typically &#039;negative&#039; or &#039;minus&#039;; nil to use default)&lt;br /&gt;
-- round: nil or &#039;&#039;: no rounding; &#039;on&#039;: round to nearest two-word number; &#039;up&#039;/&#039;down&#039;: round up/down to two-word number&lt;br /&gt;
-- zero: word to use for value &#039;0&#039; (nil to use default)&lt;br /&gt;
-- use_one (boolean): false: 2+1/2 → &amp;quot;two and a half&amp;quot;; true: &amp;quot;two and one-half&amp;quot;&lt;br /&gt;
local function _numeral_to_english(num, numerator, denominator, capitalize, use_and, hyphenate, ordinal, plural, links, negative_word, round, zero, use_one)&lt;br /&gt;
	if not negative_word then&lt;br /&gt;
		if use_and then&lt;br /&gt;
			-- TODO Should &#039;minus&#039; be used when do not have sp=us?&lt;br /&gt;
			--      If so, need to update testcases, and need to fix &amp;quot;minus zero&amp;quot;.&lt;br /&gt;
			-- negative_word = &#039;minus&#039;&lt;br /&gt;
			negative_word = &#039;negative&#039;&lt;br /&gt;
		else&lt;br /&gt;
			negative_word = &#039;negative&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local status, fraction_text = fraction_to_english(num, numerator, denominator, not use_and, negative_word, use_one)&lt;br /&gt;
	if status == &#039;unsupported&#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if status == &#039;finished&#039; then&lt;br /&gt;
		-- Input is a fraction with no whole number.&lt;br /&gt;
		-- Hack to avoid executing stuff that depends on num being a number.&lt;br /&gt;
		local s = fraction_text&lt;br /&gt;
		if hyphenate then s = s:gsub(&amp;quot;%s&amp;quot;, &amp;quot;-&amp;quot;) end&lt;br /&gt;
		if capitalize then s = s:gsub(&amp;quot;^%l&amp;quot;, string.upper) end&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	num = scientific_notation_to_decimal(num)&lt;br /&gt;
	if round and round ~= &#039;&#039; then&lt;br /&gt;
		if round ~= &#039;on&#039; and round ~= &#039;up&#039; and round ~= &#039;down&#039; then&lt;br /&gt;
			error(&amp;quot;Invalid rounding mode&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		num = round_for_english(num, round)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Separate into negative sign, num (digits before decimal), decimal_places (digits after decimal)&lt;br /&gt;
	local MINUS = &#039;−&#039;  -- Unicode U+2212 MINUS SIGN (may be in values from [[Module:Convert]])&lt;br /&gt;
	if num:sub(1, #MINUS) == MINUS then&lt;br /&gt;
		num = &#039;-&#039; .. num:sub(#MINUS + 1)  -- replace MINUS with &#039;-&#039;&lt;br /&gt;
	elseif num:sub(1, 1) == &#039;+&#039; then&lt;br /&gt;
		num = num:sub(2)  -- ignore any &#039;+&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local negative = num:find(&amp;quot;^%-&amp;quot;)&lt;br /&gt;
	local decimal_places, subs = num:gsub(&amp;quot;^%-?%d*%.(%d+)$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	if subs == 0 then decimal_places = nil end&lt;br /&gt;
	num, subs = num:gsub(&amp;quot;^%-?(%d*)%.?%d*$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	if num == &#039;&#039; and decimal_places then num = &#039;0&#039; end&lt;br /&gt;
	if subs == 0 or num == &#039;&#039; then error(&amp;quot;Invalid decimal numeral&amp;quot;) end&lt;br /&gt;
&lt;br /&gt;
	-- For each group of 3 digits except the last one, print with appropriate group name (e.g. million)&lt;br /&gt;
	local s = &#039;&#039;&lt;br /&gt;
	while #num &amp;gt; 3 do&lt;br /&gt;
		if s ~= &#039;&#039; then s = s .. &#039; &#039; end&lt;br /&gt;
		local group_num = math.floor((#num - 1) / 3)&lt;br /&gt;
		local group = groups[group_num]&lt;br /&gt;
		local group_digits = #num - group_num*3&lt;br /&gt;
		s = s .. numeral_to_english_less_1000(num:sub(1, group_digits), false, false, false, zero) .. &#039; &#039;&lt;br /&gt;
		if links and (((links == &#039;on&#039; and group_num &amp;gt;= 3) or links:find(group)) and group_num &amp;lt;= 13) then&lt;br /&gt;
			s = s .. &#039;[[Orders_of_magnitude_(numbers)#10&#039; .. group_num*3 .. &#039;|&#039; .. group .. &#039;]]&#039;&lt;br /&gt;
		else&lt;br /&gt;
			s = s .. group&lt;br /&gt;
		end&lt;br /&gt;
		num = num:sub(1 + group_digits)&lt;br /&gt;
		num = num:gsub(&amp;quot;^0*&amp;quot;, &amp;quot;&amp;quot;)  -- Trim leading zeros&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Handle final three digits of integer part&lt;br /&gt;
	if s ~= &#039;&#039; and num ~= &#039;&#039; then&lt;br /&gt;
		if #num &amp;lt;= 2 and use_and then&lt;br /&gt;
			s = s .. &#039; and &#039;&lt;br /&gt;
		else&lt;br /&gt;
			s = s .. &#039; &#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if s == &#039;&#039; or num ~= &#039;&#039; then&lt;br /&gt;
		s = s .. numeral_to_english_less_1000(num, use_and, ordinal, plural, zero)&lt;br /&gt;
	elseif ordinal or plural then&lt;br /&gt;
		-- Round numbers like &amp;quot;one million&amp;quot; take standard suffixes for ordinal/plural&lt;br /&gt;
		s = s .. standard_suffix(ordinal, plural)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- For decimal places (if any) output &amp;quot;point&amp;quot; followed by spelling out digit by digit&lt;br /&gt;
	if decimal_places then&lt;br /&gt;
		s = s .. &#039; point&#039;&lt;br /&gt;
		for i = 1, #decimal_places do&lt;br /&gt;
			s = s .. &#039; &#039; .. ones_position[tonumber(decimal_places:sub(i,i))]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	s = s:gsub(&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;)   -- Trim whitespace&lt;br /&gt;
	if ordinal and plural then s = s .. &#039;s&#039; end  -- s suffix works for all ordinals&lt;br /&gt;
	if negative and s ~= zero then s = negative_word .. &#039; &#039; .. s end&lt;br /&gt;
	s = s:gsub(&amp;quot;negative zero&amp;quot;, &amp;quot;zero&amp;quot;)&lt;br /&gt;
	s = s .. fraction_text&lt;br /&gt;
	if hyphenate then s = s:gsub(&amp;quot;%s&amp;quot;, &amp;quot;-&amp;quot;) end&lt;br /&gt;
	if capitalize then s = s:gsub(&amp;quot;^%l&amp;quot;, string.upper) end&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _numeral_to_english2(args)&lt;br /&gt;
	local num = tostring(args.num)&lt;br /&gt;
&lt;br /&gt;
	num = num:gsub(&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;)   -- Trim whitespace&lt;br /&gt;
	num = num:gsub(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)   -- Remove commas&lt;br /&gt;
	num = num:gsub(&amp;quot;^&amp;lt;span[^&amp;lt;&amp;gt;]*&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;, &amp;quot;&amp;quot;) -- Generated by Template:age&lt;br /&gt;
	if num ~= &#039;&#039; then  -- a fraction may have an empty whole number&lt;br /&gt;
		if not num:find(&amp;quot;^%-?%d*%.?%d*%-?[Ee]?[+%-]?%d*$&amp;quot;) then&lt;br /&gt;
			-- Input not in a valid format, try to eval it as an expr to see&lt;br /&gt;
			-- if that produces a number (e.g. &amp;quot;3 + 5&amp;quot; will become &amp;quot;8&amp;quot;).&lt;br /&gt;
			local noerr, result = pcall(mw.ext.ParserFunctions.expr, num)&lt;br /&gt;
			if noerr then&lt;br /&gt;
				num = result&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Call helper function passing args&lt;br /&gt;
	return _numeral_to_english(&lt;br /&gt;
		num,&lt;br /&gt;
		args[&#039;numerator&#039;],&lt;br /&gt;
		args[&#039;denominator&#039;],&lt;br /&gt;
		args[&#039;capitalize&#039;],&lt;br /&gt;
		args[&#039;use_and&#039;],&lt;br /&gt;
		args[&#039;hyphenate&#039;],&lt;br /&gt;
		args[&#039;ordinal&#039;],&lt;br /&gt;
		args[&#039;plural&#039;],&lt;br /&gt;
		args[&#039;links&#039;],&lt;br /&gt;
		args[&#039;negative_word&#039;],&lt;br /&gt;
		args[&#039;round&#039;],&lt;br /&gt;
		args[&#039;zero&#039;],&lt;br /&gt;
		args[&#039;use_one&#039;]&lt;br /&gt;
	) or &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {  -- Functions that can be called from another module&lt;br /&gt;
	roman_to_numeral = roman_to_numeral,&lt;br /&gt;
	spell_number = _numeral_to_english,&lt;br /&gt;
	spell_number2 = _numeral_to_english2,&lt;br /&gt;
	english_to_ordinal = english_to_ordinal,&lt;br /&gt;
	english_to_numeral = english_to_numeral,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p._roman_to_numeral(frame) -- Callable via {{#invoke:ConvertNumeric|_roman_to_numeral|VI}}&lt;br /&gt;
	return roman_to_numeral(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._english_to_ordinal(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_ordinal|First}}&lt;br /&gt;
	return english_to_ordinal(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._english_to_numeral(frame) -- callable via {{#invoke:ConvertNumeric|_english_to_numeral|One}}&lt;br /&gt;
	return english_to_numeral(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.numeral_to_english(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	-- Tail call to helper function passing args from frame&lt;br /&gt;
	return _numeral_to_english2{&lt;br /&gt;
		[&#039;num&#039;] = args[1],&lt;br /&gt;
		[&#039;numerator&#039;] = args[&#039;numerator&#039;],&lt;br /&gt;
		[&#039;denominator&#039;] = args[&#039;denominator&#039;],&lt;br /&gt;
		[&#039;capitalize&#039;] = args[&#039;case&#039;] == &#039;U&#039; or args[&#039;case&#039;] == &#039;u&#039;,&lt;br /&gt;
		[&#039;use_and&#039;] = args[&#039;sp&#039;] ~= &#039;us&#039;,&lt;br /&gt;
		[&#039;hyphenate&#039;] = args[&#039;adj&#039;] == &#039;on&#039;,&lt;br /&gt;
		[&#039;ordinal&#039;] = args[&#039;ord&#039;] == &#039;on&#039;,&lt;br /&gt;
		[&#039;plural&#039;] = args[&#039;pl&#039;] == &#039;on&#039;,&lt;br /&gt;
		[&#039;links&#039;] = args[&#039;lk&#039;],&lt;br /&gt;
		[&#039;negative_word&#039;] = args[&#039;negative&#039;],&lt;br /&gt;
		[&#039;round&#039;] = args[&#039;round&#039;],&lt;br /&gt;
		[&#039;zero&#039;] = args[&#039;zero&#039;],&lt;br /&gt;
		[&#039;use_one&#039;] = args[&#039;one&#039;] == &#039;one&#039;  -- experiment: using &#039;|one=one&#039; makes fraction 2+1/2 give &amp;quot;two and one-half&amp;quot; instead of &amp;quot;two and a half&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---- recursive function for p.decToHex&lt;br /&gt;
local function decToHexDigit(dec)&lt;br /&gt;
	local dig = {&amp;quot;0&amp;quot;,&amp;quot;1&amp;quot;,&amp;quot;2&amp;quot;,&amp;quot;3&amp;quot;,&amp;quot;4&amp;quot;,&amp;quot;5&amp;quot;,&amp;quot;6&amp;quot;,&amp;quot;7&amp;quot;,&amp;quot;8&amp;quot;,&amp;quot;9&amp;quot;,&amp;quot;A&amp;quot;,&amp;quot;B&amp;quot;,&amp;quot;C&amp;quot;,&amp;quot;D&amp;quot;,&amp;quot;E&amp;quot;,&amp;quot;F&amp;quot;}&lt;br /&gt;
	local div = math.floor(dec/16)&lt;br /&gt;
	local mod = dec-(16*div)&lt;br /&gt;
	if div &amp;gt;= 1 then return decToHexDigit(div)..dig[mod+1] else return dig[mod+1] end&lt;br /&gt;
end -- I think this is supposed to be done with a tail call but first I want something that works at all&lt;br /&gt;
&lt;br /&gt;
---- finds all the decimal numbers in the input text and hexes each of them&lt;br /&gt;
function p.decToHex(frame)&lt;br /&gt;
	local args=frame.args&lt;br /&gt;
	local parent=frame.getParent(frame)&lt;br /&gt;
	local pargs={}&lt;br /&gt;
	if parent then pargs=parent.args end&lt;br /&gt;
	local text=args[1] or pargs[1] or &amp;quot;&amp;quot;&lt;br /&gt;
	local minlength=args.minlength or pargs.minlength or 1&lt;br /&gt;
	minlength=tonumber(minlength)&lt;br /&gt;
	local prowl=mw.ustring.gmatch(text,&amp;quot;(.-)(%d+)&amp;quot;)&lt;br /&gt;
	local output=&amp;quot;&amp;quot;&lt;br /&gt;
	repeat&lt;br /&gt;
		local chaff,dec=prowl()&lt;br /&gt;
		if not(dec) then break end&lt;br /&gt;
		local hex=decToHexDigit(dec)&lt;br /&gt;
		while (mw.ustring.len(hex)&amp;lt;minlength) do hex=&amp;quot;0&amp;quot;..hex end&lt;br /&gt;
		output=output..chaff..hex&lt;br /&gt;
	until false&lt;br /&gt;
	local chaff=mw.ustring.match(text,&amp;quot;(%D+)$&amp;quot;) or &amp;quot;&amp;quot;&lt;br /&gt;
	return output..chaff&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Starlight&amp;diff=258</id>
		<title>Starlight</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Starlight&amp;diff=258"/>
		<updated>2023-03-09T16:10:20Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Protected &amp;quot;Starlight&amp;quot;: Let&amp;#039;s not cause more issues with this dead program. ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Starlight was a WIP tool made by Super Hackio that ultimately was canned due to drama and others not working on the project.&lt;br /&gt;
&lt;br /&gt;
= Basic Info =&lt;br /&gt;
&lt;br /&gt;
Starlight&#039;s developers were:&lt;br /&gt;
* Super Hackio (Lead Developer)&lt;br /&gt;
* JuPaHe64 (3d renderer/graphics)&lt;br /&gt;
* Someone (Object Database/misc)&lt;br /&gt;
* Lord-Giganticus (Build scripts/misc)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Much like Whitehole, Starlight needed to know where your Game&#039;s file were, and then could open the galaxy with basic info.&lt;br /&gt;
Starlight had a feature where certain animations like thomps falling, would actually play, it was very basic but it was an interesting concept.&lt;br /&gt;
The program had basic placement and moving features, and a handful of small things finished.&lt;br /&gt;
&lt;br /&gt;
= Bugs =&lt;br /&gt;
Despite only being used by a handful of people, the program does have some interesting bugs.&lt;br /&gt;
* Certain models would NOT render correctly at ALL. (Likely due to GL_EditorFramework)&lt;br /&gt;
* It was possible to corrupt the BCSV by accident sometimes.&lt;br /&gt;
&lt;br /&gt;
= Other issues =&lt;br /&gt;
Despite never being finished there are some technical non-bug issues worth noting.&lt;br /&gt;
* Starlight was on the DotNet Framework, which at the time was being phased out with NET 5 (and NET 6 on its way). Hack.IO has yet to be updated to NET 5,6,or 7.&lt;br /&gt;
* GL_EditorFramework (the 3d library) was a very old library (also stuck on DotNet Framework) and by the time JuPa &amp;quot;released&amp;quot; EditTK, Starlight had been canned.&lt;br /&gt;
* Had Starlight gotten more reviews from people outside the development team, it could&#039;ve seen a public release.&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Starlight&amp;diff=257</id>
		<title>Starlight</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Starlight&amp;diff=257"/>
		<updated>2023-03-09T16:08:47Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;Starlight was a WIP tool made by Super Hackio that ultimately was canned due to drama and others not working on the project.  = Basic Info =  Starlight&amp;#039;s developers were: * Super Hackio (Lead Developer) * JuPaHe64 (3d renderer/graphics) * Someone (Object Database/misc) * Lord-Giganticus (Build scripts/misc)   Much like Whitehole, Starlight needed to know where your Game&amp;#039;s file were, and then could open the galaxy with basic info. Starlight had a feature where certain ani...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Starlight was a WIP tool made by Super Hackio that ultimately was canned due to drama and others not working on the project.&lt;br /&gt;
&lt;br /&gt;
= Basic Info =&lt;br /&gt;
&lt;br /&gt;
Starlight&#039;s developers were:&lt;br /&gt;
* Super Hackio (Lead Developer)&lt;br /&gt;
* JuPaHe64 (3d renderer/graphics)&lt;br /&gt;
* Someone (Object Database/misc)&lt;br /&gt;
* Lord-Giganticus (Build scripts/misc)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Much like Whitehole, Starlight needed to know where your Game&#039;s file were, and then could open the galaxy with basic info.&lt;br /&gt;
Starlight had a feature where certain animations like thomps falling, would actually play, it was very basic but it was an interesting concept.&lt;br /&gt;
The program had basic placement and moving features, and a handful of small things finished.&lt;br /&gt;
&lt;br /&gt;
= Bugs =&lt;br /&gt;
Despite only being used by a handful of people, the program does have some interesting bugs.&lt;br /&gt;
* Certain models would NOT render correctly at ALL. (Likely due to GL_EditorFramework)&lt;br /&gt;
* It was possible to corrupt the BCSV by accident sometimes.&lt;br /&gt;
&lt;br /&gt;
= Other issues =&lt;br /&gt;
Despite never being finished there are some technical non-bug issues worth noting.&lt;br /&gt;
* Starlight was on the DotNet Framework, which at the time was being phased out with NET 5 (and NET 6 on its way). Hack.IO has yet to be updated to NET 5,6,or 7.&lt;br /&gt;
* GL_EditorFramework (the 3d library) was a very old library (also stuck on DotNet Framework) and by the time JuPa &amp;quot;released&amp;quot; EditTK, Starlight had been canned.&lt;br /&gt;
* Had Starlight gotten more reviews from people outside the development team, it could&#039;ve seen a public release.&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Template:Infobox/scenario&amp;diff=252</id>
		<title>Template:Infobox/scenario</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Template:Infobox/scenario&amp;diff=252"/>
		<updated>2023-03-07T21:53:59Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;max-width:75%; background:656565;&amp;quot; rules=all |- ! colspan=3 | Star info |- ! Name !! Star No. !! Access Requirement |- | {{{Name}}} || {{{Number}}} || {{{Access}}} |}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;max-width:75%; background:656565;&amp;quot; rules=all&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | Star info&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Star No. !! Access Requirement&lt;br /&gt;
|-&lt;br /&gt;
| {{{Name}}} || {{{Number}}} || {{{Access}}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Yaz0&amp;diff=242</id>
		<title>Yaz0</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Yaz0&amp;diff=242"/>
		<updated>2023-03-05T21:44:05Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:File formats]]&lt;br /&gt;
{{Reference|Link=various sources|Trust=This info may not be 100% correct.}}&lt;br /&gt;
&#039;&#039;&#039;Yaz0&#039;&#039;&#039; is the compression format used by both Galaxy 1 and 2. Almost every game that has used the encryption stores the file in a szs extension&lt;br /&gt;
&lt;br /&gt;
= Format Specifications =&lt;br /&gt;
Below you&#039;ll find helpful tables on how the file is structured&lt;br /&gt;
== Header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || char[4] || &amp;quot;Yaz0&amp;quot; in ASCII&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || u32 || The size of the file decompressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || u8[8] || Padding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Decoding =&lt;br /&gt;
To decode the file, most programs run a loop checking the size and use a source position, a command byte, and a destination position.&lt;br /&gt;
The source position starts at 0x10 (16), right after the header.&lt;br /&gt;
&lt;br /&gt;
= Encoding =&lt;br /&gt;
Encoding is a bit more difficult than decoding, often doing byte and bit manipulation. The header is still written first with the actual file data starting at 0x10 (16), right after the header&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Yaz0&amp;diff=232</id>
		<title>Yaz0</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Yaz0&amp;diff=232"/>
		<updated>2023-03-05T18:12:08Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: make the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:File formats]]&lt;br /&gt;
{{Reference|Link=various sources|Trust=This info may not be 100% correct.}}&lt;br /&gt;
&#039;&#039;&#039;Yaz0&#039;&#039;&#039; is the encryption format used by both Galaxy 1 and 2. Almost every game that has used the encryption stores the file in a szs extension&lt;br /&gt;
&lt;br /&gt;
= Format Specifications =&lt;br /&gt;
Below you&#039;ll find helpful tables on how the file is structured&lt;br /&gt;
== Header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || char[4] || &amp;quot;Yaz0&amp;quot; in ASCII&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || u32 || The size of the file decompressed&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || u8[8] || Padding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Decoding =&lt;br /&gt;
To decode the file, most programs run a loop checking the size and use a source position, a command byte, and a destination position.&lt;br /&gt;
The source position starts at 0x10 (16), right after the header.&lt;br /&gt;
&lt;br /&gt;
= Encoding =&lt;br /&gt;
Encoding is a bit more difficult than decoding, often doing byte and bit manipulation. The header is still written first with the actual file data starting at 0x10 (16), right after the header&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Category:File_formats&amp;diff=231</id>
		<title>Category:File formats</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Category:File_formats&amp;diff=231"/>
		<updated>2023-03-05T17:45:36Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this category belongs all file formats that are used and supported in the Super Mario Galaxy games. Detailed information about a file format can be found by clicking on its file extension.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Extension !! Magic !! Class name !! Games !! Description&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Common&lt;br /&gt;
|-&lt;br /&gt;
| [[RARC|arc]] || RARC || JKRArchive || both || JKernel archive&lt;br /&gt;
|-&lt;br /&gt;
| [[Yaz0|szs]] || Yaz0 || JKRDecomp || both || SZS-compressed data&lt;br /&gt;
|-&lt;br /&gt;
| szp || Yay0 || JKRDecomp || both || SZP-compressed data (&#039;&#039;&#039;Outdated&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|bcsv]] || n/a || JMapInfo || both || JMap flatbuffer data&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|tbl]] || n/a || JMapInfo || both || Sorted JMap data&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|bcam]] || n/a || JMapInfo || both || JMap camera data&lt;br /&gt;
|-&lt;br /&gt;
| canm || ANDOCKAN&amp;lt;br&amp;gt;ANDOCANM || CameraAnim || both || Camera key frames&lt;br /&gt;
|-&lt;br /&gt;
| gst || n/a || GhostPacket || both || Ghost movement&lt;br /&gt;
|-&lt;br /&gt;
| pad || n/a || PadRecorder || SMG2 || Wiimote controls&lt;br /&gt;
|-&lt;br /&gt;
| [[JPA|jpc]] || JPAC2-10 || JPAEmitterArchiveLoaderDataBase || both || JParticle container&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Texts&lt;br /&gt;
|-&lt;br /&gt;
| [[BMG|bmg]] || MESGbmg1 || ? || SMG1 || Binary message container&lt;br /&gt;
|-&lt;br /&gt;
| [[MSBT|msbt]] || MsgStdBn || LMS_Message || SMG2 || LMS text data&lt;br /&gt;
|-&lt;br /&gt;
| [[MSBF|msbf]] || MsgFlwBn || LMS_Flowchart || SMG2 || LMS flow data&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Models&lt;br /&gt;
|-&lt;br /&gt;
| kcl || n/a || KCollision || both || Collision mesh&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|pa]] || n/a || JMapInfo || both || Collision attributes (BCSV)&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BMD_and_BDL bdl] || J3D2bdl4 || J3DModelData || both || J3D display lists&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BMD_and_BDL bmd] || J3D2bmd3 || J3DModelData || both || J3D model&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|banmt]] || n/a || JMapInfo || both || Animation table (BCSV)&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BCK bck] || J3D1bck1 || J3DAnmTransformKey || both || J3D skeletal transformation (key)&lt;br /&gt;
|-&lt;br /&gt;
| bca || J3D1bca1 || J3DAnmTransformFull || both || J3D skeletal transformation (full, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BTK btk] || J3D1btk1 || J3DAnmTextureSRTKey || both || J3D texture animation&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BRK brk] || J3D1brk1 || J3DAnmTevRegKey || both || J3D TEV color animation&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BTP btp] || J3D1btp1 || J3DAnmTexPattern || both || J3D texture pattern animation&lt;br /&gt;
|-&lt;br /&gt;
| bpk || J3D1bpk1 || J3DAnmColorKey || both || J3D color animation (key)&lt;br /&gt;
|-&lt;br /&gt;
| bpa || J3D1bpa1 || J3DAnmColorFull || both || J3D color animation (full, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| bva || J3D1bva1 || J3DAnmVisibilityFull || both || J3D visibility animation (full)&lt;br /&gt;
|-&lt;br /&gt;
| blk || J3D1blk1 || J3DAnmClusterKey || both || J3D cluster animation (key, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| bla || J3D1bla1 || J3DAnmClusterFull || both || J3D cluster animation (full, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| bxk || J3D1bxk1 || J3DAnmVtxColorKey || both || J3D vertex color animation (key, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| bxa || J3D1bxa1 || J3DAnmVtxColorFull || both || J3D vertex color animation (full, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| fur.txt || n/a || FurParam || both || Fur map parameters&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Image &amp;amp; video formats&lt;br /&gt;
|-&lt;br /&gt;
| [[BTI|bti]] || n/a || JUTTexture || both || JUtility image&lt;br /&gt;
|-&lt;br /&gt;
| [[THP|thp]] || THP0 || ? || SMG1 || Prerendered video&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Sound &amp;amp; audio formats&lt;br /&gt;
|-&lt;br /&gt;
| [[AST|ast]] || STRM || JAIStream || both || JAudio stream&lt;br /&gt;
|-&lt;br /&gt;
| bas || n/a || JAUSoundAnimation || both || Sound animation&lt;br /&gt;
|-&lt;br /&gt;
| bms || n/a || JAISeq || both || JAudio music sequence&lt;br /&gt;
|-&lt;br /&gt;
| aw || n/a || JASWaveArc || both || JAudio wave archive&lt;br /&gt;
|-&lt;br /&gt;
| baa || AA_&amp;lt; || JAUAudioArcLoader || both || JAudio audio archive&lt;br /&gt;
|-&lt;br /&gt;
| [[CIT|cit]] || n/a || ? || both || Chord information table&lt;br /&gt;
|-&lt;br /&gt;
| bct || n/a || ? || both || Wii Remote sound info&lt;br /&gt;
|-&lt;br /&gt;
| csw || n/a || ? || both || Wii Remote sound effect&lt;br /&gt;
|-&lt;br /&gt;
| bme || n/a || ? || both || ?&lt;br /&gt;
|-&lt;br /&gt;
| bmt || n/a || ? || both || ?&lt;br /&gt;
|-&lt;br /&gt;
| brs || n/a || ? || both || ?&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | &#039;&#039;Nintendo Ware for Revolution&#039;&#039; formats&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/TPL_(File_Format) tpl] || n/a || nw4r::lyt::res::Picture || both || NW4R texture&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/BRLYT_(File_Format) brlyt] || RLYT || nw4r::lyt::Layout || both || NW4R layout structure&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/BRLAN_(File_Format) brlan] || RLAN || nw4r::lyt::AnimResource || both || NW4R layout animation&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/BRFNT_(File_Format) brfnt] || RFNT || nw4r::ut::ResFont || both || NW4R font&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | &#039;&#039;Revolution&#039;&#039; formats&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.metroid2002.com/retromodding/wiki/RSO_(File_Format) rso] || n/a || RSO || both || Relocatable object file&lt;br /&gt;
|-&lt;br /&gt;
| sel || n/a || RSO || both || RSO symbol export table&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/U8_(File_Format) arc] || Uª8- || ? || both || U8 archive&lt;br /&gt;
|-&lt;br /&gt;
| bnr || n/a || ? || both || Wii menu banner&lt;br /&gt;
|-&lt;br /&gt;
| bwav || n/a || ? || both(?) || ?&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Category:File_formats&amp;diff=230</id>
		<title>Category:File formats</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Category:File_formats&amp;diff=230"/>
		<updated>2023-03-05T17:45:25Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this category belongs all file formats that are used and supported in the Super Mario Galaxy games. Detailed information about a file format can be found by clicking on its file extension.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Extension !! Magic !! Class name !! Games !! Description&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Common&lt;br /&gt;
|-&lt;br /&gt;
| [[RARC|arc]] || RARC || JKRArchive || both || JKernel archive&lt;br /&gt;
|-&lt;br /&gt;
| [[Yaz0||szs]] || Yaz0 || JKRDecomp || both || SZS-compressed data&lt;br /&gt;
|-&lt;br /&gt;
| szp || Yay0 || JKRDecomp || both || SZP-compressed data (&#039;&#039;&#039;Outdated&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|bcsv]] || n/a || JMapInfo || both || JMap flatbuffer data&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|tbl]] || n/a || JMapInfo || both || Sorted JMap data&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|bcam]] || n/a || JMapInfo || both || JMap camera data&lt;br /&gt;
|-&lt;br /&gt;
| canm || ANDOCKAN&amp;lt;br&amp;gt;ANDOCANM || CameraAnim || both || Camera key frames&lt;br /&gt;
|-&lt;br /&gt;
| gst || n/a || GhostPacket || both || Ghost movement&lt;br /&gt;
|-&lt;br /&gt;
| pad || n/a || PadRecorder || SMG2 || Wiimote controls&lt;br /&gt;
|-&lt;br /&gt;
| [[JPA|jpc]] || JPAC2-10 || JPAEmitterArchiveLoaderDataBase || both || JParticle container&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Texts&lt;br /&gt;
|-&lt;br /&gt;
| [[BMG|bmg]] || MESGbmg1 || ? || SMG1 || Binary message container&lt;br /&gt;
|-&lt;br /&gt;
| [[MSBT|msbt]] || MsgStdBn || LMS_Message || SMG2 || LMS text data&lt;br /&gt;
|-&lt;br /&gt;
| [[MSBF|msbf]] || MsgFlwBn || LMS_Flowchart || SMG2 || LMS flow data&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Models&lt;br /&gt;
|-&lt;br /&gt;
| kcl || n/a || KCollision || both || Collision mesh&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|pa]] || n/a || JMapInfo || both || Collision attributes (BCSV)&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BMD_and_BDL bdl] || J3D2bdl4 || J3DModelData || both || J3D display lists&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BMD_and_BDL bmd] || J3D2bmd3 || J3DModelData || both || J3D model&lt;br /&gt;
|-&lt;br /&gt;
| [[BCSV (File format)|banmt]] || n/a || JMapInfo || both || Animation table (BCSV)&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BCK bck] || J3D1bck1 || J3DAnmTransformKey || both || J3D skeletal transformation (key)&lt;br /&gt;
|-&lt;br /&gt;
| bca || J3D1bca1 || J3DAnmTransformFull || both || J3D skeletal transformation (full, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BTK btk] || J3D1btk1 || J3DAnmTextureSRTKey || both || J3D texture animation&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BRK brk] || J3D1brk1 || J3DAnmTevRegKey || both || J3D TEV color animation&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.cloudmodding.com/tww/BTP btp] || J3D1btp1 || J3DAnmTexPattern || both || J3D texture pattern animation&lt;br /&gt;
|-&lt;br /&gt;
| bpk || J3D1bpk1 || J3DAnmColorKey || both || J3D color animation (key)&lt;br /&gt;
|-&lt;br /&gt;
| bpa || J3D1bpa1 || J3DAnmColorFull || both || J3D color animation (full, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| bva || J3D1bva1 || J3DAnmVisibilityFull || both || J3D visibility animation (full)&lt;br /&gt;
|-&lt;br /&gt;
| blk || J3D1blk1 || J3DAnmClusterKey || both || J3D cluster animation (key, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| bla || J3D1bla1 || J3DAnmClusterFull || both || J3D cluster animation (full, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| bxk || J3D1bxk1 || J3DAnmVtxColorKey || both || J3D vertex color animation (key, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| bxa || J3D1bxa1 || J3DAnmVtxColorFull || both || J3D vertex color animation (full, &#039;&#039;&#039;not usable&#039;&#039;&#039;)&lt;br /&gt;
|-&lt;br /&gt;
| fur.txt || n/a || FurParam || both || Fur map parameters&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Image &amp;amp; video formats&lt;br /&gt;
|-&lt;br /&gt;
| [[BTI|bti]] || n/a || JUTTexture || both || JUtility image&lt;br /&gt;
|-&lt;br /&gt;
| [[THP|thp]] || THP0 || ? || SMG1 || Prerendered video&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Sound &amp;amp; audio formats&lt;br /&gt;
|-&lt;br /&gt;
| [[AST|ast]] || STRM || JAIStream || both || JAudio stream&lt;br /&gt;
|-&lt;br /&gt;
| bas || n/a || JAUSoundAnimation || both || Sound animation&lt;br /&gt;
|-&lt;br /&gt;
| bms || n/a || JAISeq || both || JAudio music sequence&lt;br /&gt;
|-&lt;br /&gt;
| aw || n/a || JASWaveArc || both || JAudio wave archive&lt;br /&gt;
|-&lt;br /&gt;
| baa || AA_&amp;lt; || JAUAudioArcLoader || both || JAudio audio archive&lt;br /&gt;
|-&lt;br /&gt;
| [[CIT|cit]] || n/a || ? || both || Chord information table&lt;br /&gt;
|-&lt;br /&gt;
| bct || n/a || ? || both || Wii Remote sound info&lt;br /&gt;
|-&lt;br /&gt;
| csw || n/a || ? || both || Wii Remote sound effect&lt;br /&gt;
|-&lt;br /&gt;
| bme || n/a || ? || both || ?&lt;br /&gt;
|-&lt;br /&gt;
| bmt || n/a || ? || both || ?&lt;br /&gt;
|-&lt;br /&gt;
| brs || n/a || ? || both || ?&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | &#039;&#039;Nintendo Ware for Revolution&#039;&#039; formats&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/TPL_(File_Format) tpl] || n/a || nw4r::lyt::res::Picture || both || NW4R texture&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/BRLYT_(File_Format) brlyt] || RLYT || nw4r::lyt::Layout || both || NW4R layout structure&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/BRLAN_(File_Format) brlan] || RLAN || nw4r::lyt::AnimResource || both || NW4R layout animation&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/BRFNT_(File_Format) brfnt] || RFNT || nw4r::ut::ResFont || both || NW4R font&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | &#039;&#039;Revolution&#039;&#039; formats&lt;br /&gt;
|-&lt;br /&gt;
| [https://www.metroid2002.com/retromodding/wiki/RSO_(File_Format) rso] || n/a || RSO || both || Relocatable object file&lt;br /&gt;
|-&lt;br /&gt;
| sel || n/a || RSO || both || RSO symbol export table&lt;br /&gt;
|-&lt;br /&gt;
| [https://wiki.tockdom.com/wiki/U8_(File_Format) arc] || Uª8- || ? || both || U8 archive&lt;br /&gt;
|-&lt;br /&gt;
| bnr || n/a || ? || both || Wii menu banner&lt;br /&gt;
|-&lt;br /&gt;
| bwav || n/a || ? || both(?) || ?&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Template:Navbox&amp;diff=222</id>
		<title>Template:Navbox</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Template:Navbox&amp;diff=222"/>
		<updated>2023-03-05T04:30:40Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;&amp;lt;includeonly&amp;gt;{{#invoke:Navbox|navbox}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt; &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Navbox|navbox}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:Navbox&amp;diff=221</id>
		<title>Module:Navbox</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:Navbox&amp;diff=221"/>
		<updated>2023-03-05T04:27:34Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;local p = {} local navbar = require(&amp;#039;Module:Navbar&amp;#039;)._navbar local cfg = mw.loadData(&amp;#039;Module:Navbox/configuration&amp;#039;) local getArgs -- lazily initialized local args local format = string.format  local function striped(wikitext, border) 	-- Return wikitext with markers replaced for odd/even striping. 	-- Child (subgroup) navboxes are flagged with a category that is removed 	-- by parent navboxes. The result is that the category shows all pages 	-- where a child navbox is no...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
local navbar = require(&#039;Module:Navbar&#039;)._navbar&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbox/configuration&#039;)&lt;br /&gt;
local getArgs -- lazily initialized&lt;br /&gt;
local args&lt;br /&gt;
local format = string.format&lt;br /&gt;
&lt;br /&gt;
local function striped(wikitext, border)&lt;br /&gt;
	-- Return wikitext with markers replaced for odd/even striping.&lt;br /&gt;
	-- Child (subgroup) navboxes are flagged with a category that is removed&lt;br /&gt;
	-- by parent navboxes. The result is that the category shows all pages&lt;br /&gt;
	-- where a child navbox is not contained in a parent navbox.&lt;br /&gt;
	local orphanCat = cfg.category.orphan&lt;br /&gt;
	if border == cfg.keyword.border_subgroup and args[cfg.arg.orphan] ~= cfg.keyword.orphan_yes then&lt;br /&gt;
		-- No change; striping occurs in outermost navbox.&lt;br /&gt;
		return wikitext .. orphanCat&lt;br /&gt;
	end&lt;br /&gt;
	local first, second = cfg.class.navbox_odd_part, cfg.class.navbox_even_part&lt;br /&gt;
	if args[cfg.arg.evenodd] then&lt;br /&gt;
		if args[cfg.arg.evenodd] == cfg.keyword.evenodd_swap then&lt;br /&gt;
			first, second = second, first&lt;br /&gt;
		else&lt;br /&gt;
			first = args[cfg.arg.evenodd]&lt;br /&gt;
			second = first&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local changer&lt;br /&gt;
	if first == second then&lt;br /&gt;
		changer = first&lt;br /&gt;
	else&lt;br /&gt;
		local index = 0&lt;br /&gt;
		changer = function (code)&lt;br /&gt;
			if code == &#039;0&#039; then&lt;br /&gt;
				-- Current occurrence is for a group before a nested table.&lt;br /&gt;
				-- Set it to first as a valid although pointless class.&lt;br /&gt;
				-- The next occurrence will be the first row after a title&lt;br /&gt;
				-- in a subgroup and will also be first.&lt;br /&gt;
				index = 0&lt;br /&gt;
				return first&lt;br /&gt;
			end&lt;br /&gt;
			index = index + 1&lt;br /&gt;
			return index % 2 == 1 and first or second&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local regex = orphanCat:gsub(&#039;([%[%]])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
	return (wikitext:gsub(regex, &#039;&#039;):gsub(cfg.marker.regex, changer)) -- () omits gsub count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function processItem(item, nowrapitems)&lt;br /&gt;
	if item:sub(1, 2) == &#039;{|&#039; then&lt;br /&gt;
		-- Applying nowrap to lines in a table does not make sense.&lt;br /&gt;
		-- Add newlines to compensate for trim of x in |parm=x in a template.&lt;br /&gt;
		return &#039;\n&#039; .. item ..&#039;\n&#039;&lt;br /&gt;
	end&lt;br /&gt;
	if nowrapitems == cfg.keyword.nowrapitems_yes then&lt;br /&gt;
		local lines = {}&lt;br /&gt;
		for line in (item .. &#039;\n&#039;):gmatch(&#039;([^\n]*)\n&#039;) do&lt;br /&gt;
			local prefix, content = line:match(&#039;^([*:;#]+)%s*(.*)&#039;)&lt;br /&gt;
			if prefix and not content:match(cfg.pattern.nowrap) then&lt;br /&gt;
				line = format(cfg.nowrap_item, prefix, content)&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(lines, line)&lt;br /&gt;
		end&lt;br /&gt;
		item = table.concat(lines, &#039;\n&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if item:match(&#039;^[*:;#]&#039;) then&lt;br /&gt;
		return &#039;\n&#039; .. item ..&#039;\n&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return item&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function has_navbar()&lt;br /&gt;
	return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off&lt;br /&gt;
		and args[cfg.arg.navbar] ~= cfg.keyword.navbar_plain&lt;br /&gt;
		and (&lt;br /&gt;
			args[cfg.arg.name]&lt;br /&gt;
			or mw.getCurrentFrame():getParent():getTitle():gsub(cfg.pattern.sandbox, &#039;&#039;)&lt;br /&gt;
				~= cfg.pattern.navbox&lt;br /&gt;
		)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderNavBar(titleCell)&lt;br /&gt;
	if has_navbar() then&lt;br /&gt;
		titleCell:wikitext(navbar{&lt;br /&gt;
			[cfg.navbar.name] = args[cfg.arg.name],&lt;br /&gt;
			[cfg.navbar.mini] = 1,&lt;br /&gt;
			[cfg.navbar.fontstyle] = (args[cfg.arg.basestyle] or &#039;&#039;) .. &#039;;&#039; ..&lt;br /&gt;
				(args[cfg.arg.titlestyle] or &#039;&#039;) ..&lt;br /&gt;
				&#039;;background:none transparent;border:none;box-shadow:none;padding:0;&#039;&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTitleRow(tbl)&lt;br /&gt;
	if not args[cfg.arg.title] then return end&lt;br /&gt;
&lt;br /&gt;
	local titleRow = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
	local titleCell = titleRow:tag(&#039;th&#039;):attr(&#039;scope&#039;, &#039;col&#039;)&lt;br /&gt;
&lt;br /&gt;
	local titleColspan = 2&lt;br /&gt;
	if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end&lt;br /&gt;
	if args[cfg.arg.image] then titleColspan = titleColspan + 1 end&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
		:cssText(args[cfg.arg.titlestyle])&lt;br /&gt;
		:addClass(cfg.class.navbox_title)&lt;br /&gt;
		:attr(&#039;colspan&#039;, titleColspan)&lt;br /&gt;
&lt;br /&gt;
	renderNavBar(titleCell)&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			-- id for aria-labelledby attribute&lt;br /&gt;
			:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.title]))&lt;br /&gt;
			:addClass(args[cfg.arg.titleclass])&lt;br /&gt;
			:css(&#039;font-size&#039;, &#039;114%&#039;)&lt;br /&gt;
			:css(&#039;margin&#039;, &#039;0 4em&#039;)&lt;br /&gt;
			:wikitext(processItem(args[cfg.arg.title]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getAboveBelowColspan()&lt;br /&gt;
	local ret = 2&lt;br /&gt;
	if args[cfg.arg.imageleft] then ret = ret + 1 end&lt;br /&gt;
	if args[cfg.arg.image] then ret = ret + 1 end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderAboveRow(tbl)&lt;br /&gt;
	if not args[cfg.arg.above] then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag(&#039;tr&#039;)&lt;br /&gt;
		:tag(&#039;td&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
			:addClass(args[cfg.arg.aboveclass])&lt;br /&gt;
			:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
			:cssText(args[cfg.arg.abovestyle])&lt;br /&gt;
			:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				-- id for aria-labelledby attribute, if no title&lt;br /&gt;
				:attr(&#039;id&#039;, args[cfg.arg.title] and nil or mw.uri.anchorEncode(args[cfg.arg.above]))&lt;br /&gt;
				:wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBelowRow(tbl)&lt;br /&gt;
	if not args[cfg.arg.below] then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag(&#039;tr&#039;)&lt;br /&gt;
		:tag(&#039;td&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
			:addClass(args[cfg.arg.belowclass])&lt;br /&gt;
			:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
			:cssText(args[cfg.arg.belowstyle])&lt;br /&gt;
			:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				:wikitext(processItem(args[cfg.arg.below], args[cfg.arg.nowrapitems]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderListRow(tbl, index, listnum, listnums_size)&lt;br /&gt;
	local row = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args[cfg.arg.imageleft] then&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.noviewer)&lt;br /&gt;
				:addClass(cfg.class.navbox_image)&lt;br /&gt;
				:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
				:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
				:css(&#039;padding&#039;, &#039;0 2px 0 0&#039;)&lt;br /&gt;
				:cssText(args[cfg.arg.imageleftstyle])&lt;br /&gt;
				:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.imageleft]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local group_and_num = format(cfg.arg.group_and_num, listnum)&lt;br /&gt;
	local groupstyle_and_num = format(cfg.arg.groupstyle_and_num, listnum)&lt;br /&gt;
	if args[group_and_num] then&lt;br /&gt;
		local groupCell = row:tag(&#039;th&#039;)&lt;br /&gt;
&lt;br /&gt;
		-- id for aria-labelledby attribute, if lone group with no title or above&lt;br /&gt;
		if listnum == 1 and not (args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group2]) then&lt;br /&gt;
			groupCell&lt;br /&gt;
				:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.group1]))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox_group)&lt;br /&gt;
			:addClass(args[cfg.arg.groupclass])&lt;br /&gt;
			:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
			-- If groupwidth not specified, minimize width&lt;br /&gt;
			:css(&#039;width&#039;, args[cfg.arg.groupwidth] or &#039;1%&#039;)&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:cssText(args[cfg.arg.groupstyle])&lt;br /&gt;
			:cssText(args[groupstyle_and_num])&lt;br /&gt;
			:wikitext(args[group_and_num])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listCell = row:tag(&#039;td&#039;)&lt;br /&gt;
&lt;br /&gt;
	if args[group_and_num] then&lt;br /&gt;
		listCell&lt;br /&gt;
			:addClass(cfg.class.navbox_list_with_group)&lt;br /&gt;
	else&lt;br /&gt;
		listCell:attr(&#039;colspan&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not args[cfg.arg.groupwidth] then&lt;br /&gt;
		listCell:css(&#039;width&#039;, &#039;100%&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing&lt;br /&gt;
	if index % 2 == 1 then&lt;br /&gt;
		rowstyle = args[cfg.arg.oddstyle]&lt;br /&gt;
	else&lt;br /&gt;
		rowstyle = args[cfg.arg.evenstyle]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local list_and_num = format(cfg.arg.list_and_num, listnum)&lt;br /&gt;
	local listText = args[list_and_num]&lt;br /&gt;
	local oddEven = cfg.marker.oddeven&lt;br /&gt;
	if listText:sub(1, 12) == &#039;&amp;lt;/div&amp;gt;&amp;lt;table&#039; then&lt;br /&gt;
		-- Assume list text is for a subgroup navbox so no automatic striping for this row.&lt;br /&gt;
		oddEven = listText:find(cfg.pattern.navbox_title) and cfg.marker.restart or cfg.class.navbox_odd_part&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local liststyle_and_num = format(cfg.arg.liststyle_and_num, listnum)&lt;br /&gt;
	local listclass_and_num = format(cfg.arg.listclass_and_num, listnum)&lt;br /&gt;
	listCell&lt;br /&gt;
		:css(&#039;padding&#039;, &#039;0&#039;)&lt;br /&gt;
		:cssText(args[cfg.arg.liststyle])&lt;br /&gt;
		:cssText(rowstyle)&lt;br /&gt;
		:cssText(args[liststyle_and_num])&lt;br /&gt;
		:addClass(cfg.class.navbox_list)&lt;br /&gt;
		:addClass(cfg.class.navbox_part .. oddEven)&lt;br /&gt;
		:addClass(args[cfg.arg.listclass])&lt;br /&gt;
		:addClass(args[listclass_and_num])&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			:css(&#039;padding&#039;,&lt;br /&gt;
				(index == 1 and args[cfg.arg.list1padding]) or args[cfg.arg.listpadding] or &#039;0 0.25em&#039;&lt;br /&gt;
			)&lt;br /&gt;
			:wikitext(processItem(listText, args[cfg.arg.nowrapitems]))&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args[cfg.arg.image] then&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.noviewer)&lt;br /&gt;
				:addClass(cfg.class.navbox_image)&lt;br /&gt;
				:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
				:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
				:css(&#039;padding&#039;, &#039;0 0 0 2px&#039;)&lt;br /&gt;
				:cssText(args[cfg.arg.imagestyle])&lt;br /&gt;
				:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.image]))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function has_list_class(htmlclass)&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		&#039;^&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
		&#039;%s&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
		&#039;^&#039; .. htmlclass .. &#039;%s&#039;,&lt;br /&gt;
		&#039;%s&#039; .. htmlclass .. &#039;%s&#039;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for arg, _ in pairs(args) do&lt;br /&gt;
		if type(arg) == &#039;string&#039; and mw.ustring.find(arg, cfg.pattern.class) then&lt;br /&gt;
			for _, pattern in ipairs(patterns) do&lt;br /&gt;
				if mw.ustring.find(args[arg] or &#039;&#039;, pattern) then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- there are a lot of list classes in the wild, so we add their TemplateStyles&lt;br /&gt;
local function add_list_styles()&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local function add_list_templatestyles(htmlclass, templatestyles)&lt;br /&gt;
		if has_list_class(htmlclass) then&lt;br /&gt;
			return frame:extensionTag{&lt;br /&gt;
				name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
			}&lt;br /&gt;
		else&lt;br /&gt;
			return &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local hlist_styles = add_list_templatestyles(&#039;hlist&#039;, cfg.hlist_templatestyles)&lt;br /&gt;
	local plainlist_styles = add_list_templatestyles(&#039;plainlist&#039;, cfg.plainlist_templatestyles)&lt;br /&gt;
	&lt;br /&gt;
	-- a second workaround for [[phab:T303378]]&lt;br /&gt;
	-- when that issue is fixed, we can actually use has_navbar not to emit the&lt;br /&gt;
	-- tag here if we want&lt;br /&gt;
	if has_navbar() and hlist_styles == &#039;&#039; then&lt;br /&gt;
		hlist_styles = frame:extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- hlist -&amp;gt; plainlist is best-effort to preserve old Common.css ordering.&lt;br /&gt;
	-- this ordering is not a guarantee because most navboxes will emit only&lt;br /&gt;
	-- one of these classes [hlist_note]&lt;br /&gt;
	return hlist_styles .. plainlist_styles&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function needsHorizontalLists(border)&lt;br /&gt;
	if border == cfg.keyword.border_subgroup or args[cfg.arg.tracking] == cfg.keyword.tracking_no then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return not has_list_class(cfg.pattern.hlist) and not has_list_class(cfg.pattern.plainlist)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasBackgroundColors()&lt;br /&gt;
	for _, key in ipairs({cfg.arg.titlestyle, cfg.arg.groupstyle,&lt;br /&gt;
		cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
		if tostring(args[key]):find(&#039;background&#039;, 1, true) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasBorders()&lt;br /&gt;
	for _, key in ipairs({cfg.arg.groupstyle, cfg.arg.basestyle,&lt;br /&gt;
		cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
		if tostring(args[key]):find(&#039;border&#039;, 1, true) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isIllegible()&lt;br /&gt;
	local styleratio = require(&#039;Module:Color contrast&#039;)._styleratio&lt;br /&gt;
	for key, style in pairs(args) do&lt;br /&gt;
		if tostring(key):match(cfg.pattern.style) then&lt;br /&gt;
			if styleratio{mw.text.unstripNoWiki(style)} &amp;lt; 4.5 then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getTrackingCategories(border)&lt;br /&gt;
	local cats = {}&lt;br /&gt;
	if needsHorizontalLists(border) then table.insert(cats, cfg.category.horizontal_lists) end&lt;br /&gt;
	if hasBackgroundColors() then table.insert(cats, cfg.category.background_colors) end&lt;br /&gt;
	if isIllegible() then table.insert(cats, cfg.category.illegible) end&lt;br /&gt;
	if hasBorders() then table.insert(cats, cfg.category.borders) end&lt;br /&gt;
	return cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTrackingCategories(builder, border)&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if title.namespace ~= 10 then return end -- not in template space&lt;br /&gt;
	local subpage = title.subpageText&lt;br /&gt;
	if subpage == cfg.keyword.subpage_doc or subpage == cfg.keyword.subpage_sandbox&lt;br /&gt;
		or subpage == cfg.keyword.subpage_testcases then return end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(getTrackingCategories(border)) do&lt;br /&gt;
		builder:wikitext(&#039;[[Category:&#039; .. cat .. &#039;]]&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMainTable(border, listnums)&lt;br /&gt;
	local tbl = mw.html.create(&#039;table&#039;)&lt;br /&gt;
		:addClass(cfg.class.nowraplinks)&lt;br /&gt;
		:addClass(args[cfg.arg.bodyclass])&lt;br /&gt;
&lt;br /&gt;
	local state = args[cfg.arg.state]&lt;br /&gt;
	if args[cfg.arg.title] and state ~= cfg.keyword.state_plain and state ~= cfg.keyword.state_off then&lt;br /&gt;
		if state == cfg.keyword.state_collapsed then&lt;br /&gt;
			state = cfg.class.collapsed&lt;br /&gt;
		end&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(cfg.class.collapsible)&lt;br /&gt;
			:addClass(state or cfg.class.autocollapse)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl:css(&#039;border-spacing&#039;, 0)&lt;br /&gt;
	if border == cfg.keyword.border_subgroup or border == cfg.keyword.border_none then&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(cfg.class.navbox_subgroup)&lt;br /&gt;
			:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
			:cssText(args[cfg.arg.style])&lt;br /&gt;
	else  -- regular navbox - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(cfg.class.navbox_inner)&lt;br /&gt;
			:css(&#039;background&#039;, &#039;transparent&#039;)&lt;br /&gt;
			:css(&#039;color&#039;, &#039;inherit&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	tbl:cssText(args[cfg.arg.innerstyle])&lt;br /&gt;
&lt;br /&gt;
	renderTitleRow(tbl)&lt;br /&gt;
	renderAboveRow(tbl)&lt;br /&gt;
	local listnums_size = #listnums&lt;br /&gt;
	for i, listnum in ipairs(listnums) do&lt;br /&gt;
		renderListRow(tbl, i, listnum, listnums_size)&lt;br /&gt;
	end&lt;br /&gt;
	renderBelowRow(tbl)&lt;br /&gt;
&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_navbox_styles(hiding_templatestyles)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- This is a lambda so that it doesn&#039;t need the frame as a parameter&lt;br /&gt;
	local function add_user_styles(templatestyles)&lt;br /&gt;
		if templatestyles and templatestyles ~= &#039;&#039; then&lt;br /&gt;
			return frame:extensionTag{&lt;br /&gt;
				name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- get templatestyles. load base from config so that Lua only needs to do&lt;br /&gt;
	-- the work once of parser tag expansion&lt;br /&gt;
	local base_templatestyles = cfg.templatestyles&lt;br /&gt;
	local templatestyles = add_user_styles(args[cfg.arg.templatestyles])&lt;br /&gt;
	local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles])&lt;br /&gt;
&lt;br /&gt;
	-- The &#039;navbox-styles&#039; div exists to wrap the styles to work around T200206&lt;br /&gt;
	-- more elegantly. Instead of combinatorial rules, this ends up being linear&lt;br /&gt;
	-- number of CSS rules.&lt;br /&gt;
	return mw.html.create(&#039;div&#039;)&lt;br /&gt;
		:addClass(cfg.class.navbox_styles)&lt;br /&gt;
		:wikitext(&lt;br /&gt;
			add_list_styles() .. -- see [hlist_note] applied to &#039;before base_templatestyles&#039;&lt;br /&gt;
			base_templatestyles ..&lt;br /&gt;
			templatestyles ..&lt;br /&gt;
			child_templatestyles ..&lt;br /&gt;
			table.concat(hiding_templatestyles)&lt;br /&gt;
		)&lt;br /&gt;
		:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- work around [[phab:T303378]]&lt;br /&gt;
-- for each arg: find all the templatestyles strip markers, insert them into a&lt;br /&gt;
-- table. then remove all templatestyles markers from the arg&lt;br /&gt;
local function move_hiding_templatestyles(args)&lt;br /&gt;
	local gfind = string.gfind&lt;br /&gt;
	local gsub = string.gsub&lt;br /&gt;
	local templatestyles_markers = {}&lt;br /&gt;
	local strip_marker_pattern = &#039;(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)&#039;&lt;br /&gt;
	for k, arg in pairs(args) do&lt;br /&gt;
		for marker in gfind(arg, strip_marker_pattern) do&lt;br /&gt;
			table.insert(templatestyles_markers, marker)&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = gsub(arg, strip_marker_pattern, &#039;&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return templatestyles_markers&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbox(navboxArgs)&lt;br /&gt;
	args = navboxArgs&lt;br /&gt;
	local hiding_templatestyles = move_hiding_templatestyles(args)&lt;br /&gt;
	local listnums = {}&lt;br /&gt;
&lt;br /&gt;
	for k, _ in pairs(args) do&lt;br /&gt;
		if type(k) == &#039;string&#039; then&lt;br /&gt;
			local listnum = k:match(cfg.pattern.listnum)&lt;br /&gt;
			if listnum then table.insert(listnums, tonumber(listnum)) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(listnums)&lt;br /&gt;
&lt;br /&gt;
	local border = mw.text.trim(args[cfg.arg.border] or args[1] or &#039;&#039;)&lt;br /&gt;
	if border == cfg.keyword.border_child then&lt;br /&gt;
		border = cfg.keyword.border_subgroup&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- render the main body of the navbox&lt;br /&gt;
	local tbl = renderMainTable(border, listnums)&lt;br /&gt;
&lt;br /&gt;
	local res = mw.html.create()&lt;br /&gt;
	-- render the appropriate wrapper for the navbox, based on the border param&lt;br /&gt;
&lt;br /&gt;
	if border == cfg.keyword.border_none then&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1]&lt;br /&gt;
			and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(&lt;br /&gt;
					args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label)&lt;br /&gt;
		end&lt;br /&gt;
	elseif border == cfg.keyword.border_subgroup then&lt;br /&gt;
		-- We assume that this navbox is being rendered in a list cell of a&lt;br /&gt;
		-- parent navbox, and is therefore inside a div with padding:0em 0.25em.&lt;br /&gt;
		-- We start with a &amp;lt;/div&amp;gt; to avoid the padding being applied, and at the&lt;br /&gt;
		-- end add a &amp;lt;div&amp;gt; to balance out the parent&#039;s &amp;lt;/div&amp;gt;&lt;br /&gt;
		res&lt;br /&gt;
			:wikitext(&#039;&amp;lt;/div&amp;gt;&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
			:wikitext(&#039;&amp;lt;div&amp;gt;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox)&lt;br /&gt;
			:addClass(args[cfg.arg.navboxclass])&lt;br /&gt;
			:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
			:cssText(args[cfg.arg.style])&lt;br /&gt;
			:css(&#039;padding&#039;, &#039;3px&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above]&lt;br /&gt;
			or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1])&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (args[cfg.arg.nocat] or cfg.keyword.nocat_false):lower() == cfg.keyword.nocat_false then&lt;br /&gt;
		renderTrackingCategories(res, border)&lt;br /&gt;
	end&lt;br /&gt;
	return striped(tostring(res), border)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbox(frame)&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	args = getArgs(frame, {wrappers = {cfg.pattern.navbox}})&lt;br /&gt;
&lt;br /&gt;
	-- Read the arguments in the order they&#039;ll be output in, to make references&lt;br /&gt;
	-- number in the right order.&lt;br /&gt;
	local _&lt;br /&gt;
	_ = args[cfg.arg.title]&lt;br /&gt;
	_ = args[cfg.arg.above]&lt;br /&gt;
	-- Limit this to 20 as covering &#039;most&#039; cases (that&#039;s a SWAG) and because&lt;br /&gt;
	-- iterator approach won&#039;t work here&lt;br /&gt;
	for i = 1, 20 do&lt;br /&gt;
		_ = args[format(cfg.arg.group_and_num, i)]&lt;br /&gt;
		_ = args[format(cfg.arg.list_and_num, i)]&lt;br /&gt;
	end&lt;br /&gt;
	_ = args[cfg.arg.below]&lt;br /&gt;
&lt;br /&gt;
	return p._navbox(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Template:Hlist/styles.css&amp;diff=220</id>
		<title>Template:Hlist/styles.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Template:Hlist/styles.css&amp;diff=220"/>
		<updated>2023-03-05T04:24:20Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.hlist dl,&lt;br /&gt;
.hlist ol,&lt;br /&gt;
.hlist ul {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
	margin: 0; &lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
.hlist.inline,&lt;br /&gt;
.hlist.inline dl,&lt;br /&gt;
.hlist.inline ol,&lt;br /&gt;
.hlist.inline ul,&lt;br /&gt;
.hlist dl dl,&lt;br /&gt;
.hlist dl ol,&lt;br /&gt;
.hlist dl ul,&lt;br /&gt;
.hlist ol dl,&lt;br /&gt;
.hlist ol ol,&lt;br /&gt;
.hlist ol ul,&lt;br /&gt;
.hlist ul dl,&lt;br /&gt;
.hlist ul ol,&lt;br /&gt;
.hlist ul ul {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist .mw-empty-li {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dt::after {&lt;br /&gt;
	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd::after,&lt;br /&gt;
.hlist li::after {&lt;br /&gt;
	content: &amp;quot; · &amp;quot;;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd:last-child::after,&lt;br /&gt;
.hlist dt:last-child::after,&lt;br /&gt;
.hlist li:last-child::after {&lt;br /&gt;
	content: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd dd:first-child::before,&lt;br /&gt;
.hlist dd dt:first-child::before,&lt;br /&gt;
.hlist dd li:first-child::before,&lt;br /&gt;
.hlist dt dd:first-child::before,&lt;br /&gt;
.hlist dt dt:first-child::before,&lt;br /&gt;
.hlist dt li:first-child::before,&lt;br /&gt;
.hlist li dd:first-child::before,&lt;br /&gt;
.hlist li dt:first-child::before,&lt;br /&gt;
.hlist li li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd dd:last-child::after,&lt;br /&gt;
.hlist dd dt:last-child::after,&lt;br /&gt;
.hlist dd li:last-child::after,&lt;br /&gt;
.hlist dt dd:last-child::after,&lt;br /&gt;
.hlist dt dt:last-child::after,&lt;br /&gt;
.hlist dt li:last-child::after,&lt;br /&gt;
.hlist li dd:last-child::after,&lt;br /&gt;
.hlist li dt:last-child::after,&lt;br /&gt;
.hlist li li:last-child::after {&lt;br /&gt;
	content: &amp;quot;)&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol {&lt;br /&gt;
	counter-reset: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li {&lt;br /&gt;
	counter-increment: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li::before {&lt;br /&gt;
	content: &amp;quot; &amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist dt ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist li ol &amp;gt; li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Template:Hlist/styles.css&amp;diff=219</id>
		<title>Template:Hlist/styles.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Template:Hlist/styles.css&amp;diff=219"/>
		<updated>2023-03-05T04:23:41Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.hlist dl,&lt;br /&gt;
.hlist ol,&lt;br /&gt;
.hlist ul {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Display list items inline */&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
	/*&lt;br /&gt;
	 * don&#039;t trust the note that says margin doesn&#039;t work with inline&lt;br /&gt;
	 * removing margin: 0 makes dds have margins again&lt;br /&gt;
	 * We also want to reset margin-right in Minerva&lt;br /&gt;
	 */&lt;br /&gt;
	margin: 0; &lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Display requested top-level lists inline */&lt;br /&gt;
.hlist.inline,&lt;br /&gt;
.hlist.inline dl,&lt;br /&gt;
.hlist.inline ol,&lt;br /&gt;
.hlist.inline ul,&lt;br /&gt;
/* Display nested lists inline */&lt;br /&gt;
.hlist dl dl,&lt;br /&gt;
.hlist dl ol,&lt;br /&gt;
.hlist dl ul,&lt;br /&gt;
.hlist ol dl,&lt;br /&gt;
.hlist ol ol,&lt;br /&gt;
.hlist ol ul,&lt;br /&gt;
.hlist ul dl,&lt;br /&gt;
.hlist ul ol,&lt;br /&gt;
.hlist ul ul {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide empty list items */&lt;br /&gt;
.hlist .mw-empty-li {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TODO: :not() can maybe be used here to remove the later rule. naive test&lt;br /&gt;
 * seems to work. more testing needed. like so:&lt;br /&gt;
 *.hlist dt:not(:last-child)::after {&lt;br /&gt;
 *	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
 *}&lt;br /&gt;
 *.hlist dd:not(:last-child)::after,&lt;br /&gt;
 *.hlist li:not(:last-child)::after {&lt;br /&gt;
 *	content: &amp;quot; · &amp;quot;;&lt;br /&gt;
 *	font-weight: bold;&lt;br /&gt;
 *}&lt;br /&gt;
 */&lt;br /&gt;
/* Generate interpuncts */&lt;br /&gt;
.hlist dt::after {&lt;br /&gt;
	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd::after,&lt;br /&gt;
.hlist li::after {&lt;br /&gt;
	content: &amp;quot; · &amp;quot;;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd:last-child::after,&lt;br /&gt;
.hlist dt:last-child::after,&lt;br /&gt;
.hlist li:last-child::after {&lt;br /&gt;
	content: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add parentheses around nested lists */&lt;br /&gt;
.hlist dd dd:first-child::before,&lt;br /&gt;
.hlist dd dt:first-child::before,&lt;br /&gt;
.hlist dd li:first-child::before,&lt;br /&gt;
.hlist dt dd:first-child::before,&lt;br /&gt;
.hlist dt dt:first-child::before,&lt;br /&gt;
.hlist dt li:first-child::before,&lt;br /&gt;
.hlist li dd:first-child::before,&lt;br /&gt;
.hlist li dt:first-child::before,&lt;br /&gt;
.hlist li li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd dd:last-child::after,&lt;br /&gt;
.hlist dd dt:last-child::after,&lt;br /&gt;
.hlist dd li:last-child::after,&lt;br /&gt;
.hlist dt dd:last-child::after,&lt;br /&gt;
.hlist dt dt:last-child::after,&lt;br /&gt;
.hlist dt li:last-child::after,&lt;br /&gt;
.hlist li dd:last-child::after,&lt;br /&gt;
.hlist li dt:last-child::after,&lt;br /&gt;
.hlist li li:last-child::after {&lt;br /&gt;
	content: &amp;quot;)&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Put ordinals in front of ordered list items */&lt;br /&gt;
.hlist ol {&lt;br /&gt;
	counter-reset: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li {&lt;br /&gt;
	counter-increment: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li::before {&lt;br /&gt;
	content: &amp;quot; &amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist dt ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist li ol &amp;gt; li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Template:Hlist/styles.css&amp;diff=218</id>
		<title>Template:Hlist/styles.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Template:Hlist/styles.css&amp;diff=218"/>
		<updated>2023-03-05T04:23:28Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;/*   * hlist styles are defined in core and Minerva and differ in Minerva. The  * current definitions here (2023-01-01) are sufficient to override Minerva  * without use of the hlist-separated class. The most problematic styles were  * related to margin, padding, and the bullet. Check files listed at  * MediaWiki talk:Common.css/to do#hlist-separated  */ /*  * TODO: When the majority of readership supports it (or some beautiful world  * in which grade C support is ab...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* &lt;br /&gt;
 * hlist styles are defined in core and Minerva and differ in Minerva. The&lt;br /&gt;
 * current definitions here (2023-01-01) are sufficient to override Minerva&lt;br /&gt;
 * without use of the hlist-separated class. The most problematic styles were&lt;br /&gt;
 * related to margin, padding, and the bullet. Check files listed at&lt;br /&gt;
 * [[MediaWiki talk:Common.css/to do#hlist-separated]]&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * TODO: When the majority of readership supports it (or some beautiful world&lt;br /&gt;
 * in which grade C support is above the minimum threshold), use :is()&lt;br /&gt;
 */&lt;br /&gt;
.hlist dl,&lt;br /&gt;
.hlist ol,&lt;br /&gt;
.hlist ul {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Display list items inline */&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
	/*&lt;br /&gt;
	 * don&#039;t trust the note that says margin doesn&#039;t work with inline&lt;br /&gt;
	 * removing margin: 0 makes dds have margins again&lt;br /&gt;
	 * We also want to reset margin-right in Minerva&lt;br /&gt;
	 */&lt;br /&gt;
	margin: 0; &lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Display requested top-level lists inline */&lt;br /&gt;
.hlist.inline,&lt;br /&gt;
.hlist.inline dl,&lt;br /&gt;
.hlist.inline ol,&lt;br /&gt;
.hlist.inline ul,&lt;br /&gt;
/* Display nested lists inline */&lt;br /&gt;
.hlist dl dl,&lt;br /&gt;
.hlist dl ol,&lt;br /&gt;
.hlist dl ul,&lt;br /&gt;
.hlist ol dl,&lt;br /&gt;
.hlist ol ol,&lt;br /&gt;
.hlist ol ul,&lt;br /&gt;
.hlist ul dl,&lt;br /&gt;
.hlist ul ol,&lt;br /&gt;
.hlist ul ul {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide empty list items */&lt;br /&gt;
.hlist .mw-empty-li {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TODO: :not() can maybe be used here to remove the later rule. naive test&lt;br /&gt;
 * seems to work. more testing needed. like so:&lt;br /&gt;
 *.hlist dt:not(:last-child)::after {&lt;br /&gt;
 *	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
 *}&lt;br /&gt;
 *.hlist dd:not(:last-child)::after,&lt;br /&gt;
 *.hlist li:not(:last-child)::after {&lt;br /&gt;
 *	content: &amp;quot; · &amp;quot;;&lt;br /&gt;
 *	font-weight: bold;&lt;br /&gt;
 *}&lt;br /&gt;
 */&lt;br /&gt;
/* Generate interpuncts */&lt;br /&gt;
.hlist dt::after {&lt;br /&gt;
	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd::after,&lt;br /&gt;
.hlist li::after {&lt;br /&gt;
	content: &amp;quot; · &amp;quot;;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd:last-child::after,&lt;br /&gt;
.hlist dt:last-child::after,&lt;br /&gt;
.hlist li:last-child::after {&lt;br /&gt;
	content: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add parentheses around nested lists */&lt;br /&gt;
.hlist dd dd:first-child::before,&lt;br /&gt;
.hlist dd dt:first-child::before,&lt;br /&gt;
.hlist dd li:first-child::before,&lt;br /&gt;
.hlist dt dd:first-child::before,&lt;br /&gt;
.hlist dt dt:first-child::before,&lt;br /&gt;
.hlist dt li:first-child::before,&lt;br /&gt;
.hlist li dd:first-child::before,&lt;br /&gt;
.hlist li dt:first-child::before,&lt;br /&gt;
.hlist li li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd dd:last-child::after,&lt;br /&gt;
.hlist dd dt:last-child::after,&lt;br /&gt;
.hlist dd li:last-child::after,&lt;br /&gt;
.hlist dt dd:last-child::after,&lt;br /&gt;
.hlist dt dt:last-child::after,&lt;br /&gt;
.hlist dt li:last-child::after,&lt;br /&gt;
.hlist li dd:last-child::after,&lt;br /&gt;
.hlist li dt:last-child::after,&lt;br /&gt;
.hlist li li:last-child::after {&lt;br /&gt;
	content: &amp;quot;)&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Put ordinals in front of ordered list items */&lt;br /&gt;
.hlist ol {&lt;br /&gt;
	counter-reset: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li {&lt;br /&gt;
	counter-increment: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li::before {&lt;br /&gt;
	content: &amp;quot; &amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist dt ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist li ol &amp;gt; li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Template:Plainlist/styles.css&amp;diff=217</id>
		<title>Template:Plainlist/styles.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Template:Plainlist/styles.css&amp;diff=217"/>
		<updated>2023-03-05T04:22:43Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;.plainlist ol, .plainlist ul { 	line-height: inherit; 	list-style: none; 	margin: 0; 	padding: 0; /* Reset Minerva default */ }  .plainlist ol li, .plainlist ul li { 	margin-bottom: 0; }&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.plainlist ol,&lt;br /&gt;
.plainlist ul {&lt;br /&gt;
	line-height: inherit;&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	padding: 0; /* Reset Minerva default */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.plainlist ol li,&lt;br /&gt;
.plainlist ul li {&lt;br /&gt;
	margin-bottom: 0;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:Navbox/configuration&amp;diff=216</id>
		<title>Module:Navbox/configuration</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:Navbox/configuration&amp;diff=216"/>
		<updated>2023-03-05T04:11:15Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;return { 	aria_label = &amp;#039;Navbox&amp;#039;, 	nowrap_item = &amp;#039;%s&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;#039;, 	templatestyles = mw.getCurrentFrame():extensionTag{ 		name = &amp;#039;templatestyles&amp;#039;, args = { src = &amp;#039;Module:Navbox/styles.css&amp;#039; } 	}, 	hlist_templatestyles = &amp;#039;Hlist/styles.css&amp;#039;, 	plainlist_templatestyles = &amp;#039;Plainlist/styles.css&amp;#039;, 	-- do not localize marker table 	marker = { 		oddeven = &amp;#039;\127_ODDEVEN_\127&amp;#039;, 		restart = &amp;#039;\127_ODDEVEN0_\127&amp;#039;, 		regex = &amp;#039;\127_ODDEVEN(%d?)_\127&amp;#039; 	}, 	category = {...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	aria_label = &#039;Navbox&#039;,&lt;br /&gt;
	nowrap_item = &#039;%s&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
	templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = &#039;Module:Navbox/styles.css&#039; }&lt;br /&gt;
	},&lt;br /&gt;
	hlist_templatestyles = &#039;Hlist/styles.css&#039;,&lt;br /&gt;
	plainlist_templatestyles = &#039;Plainlist/styles.css&#039;,&lt;br /&gt;
	-- do not localize marker table&lt;br /&gt;
	marker = {&lt;br /&gt;
		oddeven = &#039;\127_ODDEVEN_\127&#039;,&lt;br /&gt;
		restart = &#039;\127_ODDEVEN0_\127&#039;,&lt;br /&gt;
		regex = &#039;\127_ODDEVEN(%d?)_\127&#039;&lt;br /&gt;
	},&lt;br /&gt;
	category = {&lt;br /&gt;
		orphan = &#039;[[Category:Navbox orphans]]&#039;,&lt;br /&gt;
		horizontal_lists = &#039;Navigational boxes without horizontal lists&#039;,&lt;br /&gt;
		background_colors = &#039;Navboxes using background colours&#039;,&lt;br /&gt;
		illegible = &#039;Potentially illegible navboxes&#039;,&lt;br /&gt;
		borders = &#039;Navboxes using borders&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	keyword = {&lt;br /&gt;
		border_subgroup = &#039;subgroup&#039;,&lt;br /&gt;
		border_child = &#039;child&#039;,&lt;br /&gt;
		border_none = &#039;none&#039;,&lt;br /&gt;
		evenodd_swap = &#039;swap&#039;,&lt;br /&gt;
		navbar_off = &#039;off&#039;,&lt;br /&gt;
		navbar_plain = &#039;plain&#039;,&lt;br /&gt;
		nocat_false = &#039;false&#039;,&lt;br /&gt;
		nowrapitems_yes = &#039;yes&#039;,&lt;br /&gt;
		orphan_yes = &#039;yes&#039;,&lt;br /&gt;
		state_collapsed = &#039;collapsed&#039;,&lt;br /&gt;
		state_off = &#039;off&#039;,&lt;br /&gt;
		state_plain = &#039;plain&#039;,&lt;br /&gt;
		subpage_doc = &#039;doc&#039;,&lt;br /&gt;
		subpage_sandbox = &#039;sandbox&#039;,&lt;br /&gt;
		subpage_testcases = &#039;testcases&#039;,&lt;br /&gt;
		tracking_no = &#039;no&#039;&lt;br /&gt;
	},&lt;br /&gt;
	class = {&lt;br /&gt;
		autocollapse = &#039;autocollapse&#039;,&lt;br /&gt;
		collapsible = &#039;mw-collapsible&#039;,&lt;br /&gt;
		collapsed = &#039;mw-collapsed&#039;,&lt;br /&gt;
		-- Warning&lt;br /&gt;
		navbox = &#039;navbox&#039;, -- WMF currently hides &#039;navbox&#039; from mobile,&lt;br /&gt;
		-- so you probably shouldn&#039;t change the navbox class.&lt;br /&gt;
		navbox_abovebelow = &#039;navbox-abovebelow&#039;,&lt;br /&gt;
		navbox_group = &#039;navbox-group&#039;,&lt;br /&gt;
		navbox_image = &#039;navbox-image&#039;,&lt;br /&gt;
		navbox_inner = &#039;navbox-inner&#039;,&lt;br /&gt;
		navbox_list = &#039;navbox-list&#039;,&lt;br /&gt;
		navbox_list_with_group = &#039;navbox-list-with-group&#039;,&lt;br /&gt;
		navbox_part = &#039;navbox-&#039;, -- do not l10n&lt;br /&gt;
		navbox_styles = &#039;navbox-styles&#039;,&lt;br /&gt;
		navbox_subgroup = &#039;navbox-subgroup&#039;,&lt;br /&gt;
		navbox_title = &#039;navbox-title&#039;, -- l10n only if you change pattern.navbox_title below&lt;br /&gt;
		navbox_odd_part = &#039;odd&#039;, -- do not l10n&lt;br /&gt;
		navbox_even_part = &#039;even&#039;, -- do not l10n&lt;br /&gt;
		nomobile = &#039;nomobile&#039;,&lt;br /&gt;
		nowraplinks = &#039;nowraplinks&#039;,&lt;br /&gt;
		noviewer = &#039;noviewer&#039; -- used to remove images from MediaViewer&lt;br /&gt;
	},&lt;br /&gt;
	pattern = {&lt;br /&gt;
		listnum = &#039;^list(%d+)$&#039;,&lt;br /&gt;
		class = &#039;class&#039;,&lt;br /&gt;
		sandbox = &#039;/sandbox$&#039;,&lt;br /&gt;
		navbox = &#039;Template:Navbox&#039;,&lt;br /&gt;
		nowrap = &#039;^&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039;,&lt;br /&gt;
		style = &#039;style$&#039;,&lt;br /&gt;
		navbox_title = &#039;&amp;lt;th[^&amp;gt;]*&amp;quot;navbox%-title&amp;quot;&#039;,&lt;br /&gt;
		hlist = &#039;hlist&#039;,&lt;br /&gt;
		plainlist = &#039;plainlist&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	arg = {&lt;br /&gt;
		above = &#039;above&#039;,&lt;br /&gt;
		aboveclass = &#039;aboveclass&#039;,&lt;br /&gt;
		abovestyle = &#039;abovestyle&#039;,&lt;br /&gt;
		basestyle = &#039;basestyle&#039;,&lt;br /&gt;
		bodyclass = &#039;bodyclass&#039;,&lt;br /&gt;
		bodystyle = &#039;bodystyle&#039;,&lt;br /&gt;
		border = &#039;border&#039;,&lt;br /&gt;
		below = &#039;below&#039;,&lt;br /&gt;
		belowclass = &#039;belowclass&#039;,&lt;br /&gt;
		belowstyle = &#039;belowstyle&#039;,&lt;br /&gt;
		evenodd = &#039;evenodd&#039;,&lt;br /&gt;
		evenstyle = &#039;evenstyle&#039;,&lt;br /&gt;
		group1 = &#039;group1&#039;,&lt;br /&gt;
		group2 = &#039;group2&#039;,&lt;br /&gt;
		group_and_num = &#039;group%d&#039;,&lt;br /&gt;
		groupstyle_and_num = &#039;group%dstyle&#039;,&lt;br /&gt;
		groupclass = &#039;groupclass&#039;,&lt;br /&gt;
		groupstyle = &#039;groupstyle&#039;,&lt;br /&gt;
		groupwidth = &#039;groupwidth&#039;,&lt;br /&gt;
		innerstyle = &#039;innerstyle&#039;,&lt;br /&gt;
		image = &#039;image&#039;,&lt;br /&gt;
		imageclass = &#039;imageclass&#039;,&lt;br /&gt;
		imageleft = &#039;imageleft&#039;,&lt;br /&gt;
		imageleftstyle = &#039;imageleftstyle&#039;,&lt;br /&gt;
		imagesetyle = &#039;imagestyle&#039;,&lt;br /&gt;
		list_and_num = &#039;list%d&#039;,&lt;br /&gt;
		listclass_and_num = &#039;list%dclass&#039;,&lt;br /&gt;
		liststyle_and_num = &#039;list%dstyle&#039;,&lt;br /&gt;
		list1padding = &#039;list1padding&#039;,&lt;br /&gt;
		listclass = &#039;listclass&#039;,&lt;br /&gt;
		listpadding = &#039;listpadding&#039;,&lt;br /&gt;
		liststyle = &#039;liststyle&#039;,&lt;br /&gt;
		name = &#039;name&#039;,&lt;br /&gt;
		navbar = &#039;navbar&#039;,&lt;br /&gt;
		navboxclass = &#039;navboxclass&#039;,&lt;br /&gt;
		nocat = &#039;nocat&#039;,&lt;br /&gt;
		nowrapitems = &#039;nowrapitems&#039;,&lt;br /&gt;
		oddstyle = &#039;oddstyle&#039;,&lt;br /&gt;
		orphan = &#039;orphan&#039;,&lt;br /&gt;
		state = &#039;state&#039;,&lt;br /&gt;
		style = &#039;style&#039;,&lt;br /&gt;
		templatestyles = &#039;templatestyles&#039;,&lt;br /&gt;
		child_templatestyles = &#039;child templatestyles&#039;,&lt;br /&gt;
		title = &#039;title&#039;,&lt;br /&gt;
		titleclass = &#039;titleclass&#039;,&lt;br /&gt;
		titlestyle = &#039;titlestyle&#039;,&lt;br /&gt;
		tracking = &#039;tracking&#039;&lt;br /&gt;
	},&lt;br /&gt;
	-- names of navbar arguments&lt;br /&gt;
	navbar = {&lt;br /&gt;
		name = 1,&lt;br /&gt;
		fontstyle = &#039;fontstyle&#039;,&lt;br /&gt;
		mini = &#039;mini&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:Navbar&amp;diff=215</id>
		<title>Module:Navbar</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:Navbar&amp;diff=215"/>
		<updated>2023-03-05T04:10:46Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;local p = {} local cfg = mw.loadData(&amp;#039;Module:Navbar/configuration&amp;#039;)  local function get_title_arg(is_collapsible, template) 	local title_arg = 1 	if is_collapsible then title_arg = 2 end 	if template then title_arg = &amp;#039;template&amp;#039; end 	return title_arg end  local function choose_links(template, args) 	-- The show table indicates the default displayed items. 	-- view, talk, edit, hist, move, watch 	-- TODO: Move to configuration. 	local show = {true, true, true, false, false...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbar/configuration&#039;)&lt;br /&gt;
&lt;br /&gt;
local function get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_arg = 1&lt;br /&gt;
	if is_collapsible then title_arg = 2 end&lt;br /&gt;
	if template then title_arg = &#039;template&#039; end&lt;br /&gt;
	return title_arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function choose_links(template, args)&lt;br /&gt;
	-- The show table indicates the default displayed items.&lt;br /&gt;
	-- view, talk, edit, hist, move, watch&lt;br /&gt;
	-- TODO: Move to configuration.&lt;br /&gt;
	local show = {true, true, true, false, false, false}&lt;br /&gt;
	if template then&lt;br /&gt;
		show[2] = false&lt;br /&gt;
		show[3] = false&lt;br /&gt;
		local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,&lt;br /&gt;
			talk = 2, edit = 3, hist = 4, move = 5, watch = 6}&lt;br /&gt;
		-- TODO: Consider removing TableTools dependency.&lt;br /&gt;
		for _, v in ipairs(require (&#039;Module:TableTools&#039;).compressSparseArray(args)) do&lt;br /&gt;
			local num = index[v]&lt;br /&gt;
			if num then show[num] = true end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local remove_edit_link = args.noedit&lt;br /&gt;
	if remove_edit_link then show[3] = false end&lt;br /&gt;
	&lt;br /&gt;
	return show&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_link(link_description, ul, is_mini, font_style)&lt;br /&gt;
	local l&lt;br /&gt;
	if link_description.url then&lt;br /&gt;
		l = {&#039;[&#039;, &#039;&#039;, &#039;]&#039;}&lt;br /&gt;
	else&lt;br /&gt;
		l = {&#039;[[&#039;, &#039;|&#039;, &#039;]]&#039;}&lt;br /&gt;
	end&lt;br /&gt;
	ul:tag(&#039;li&#039;)&lt;br /&gt;
		:addClass(&#039;nv-&#039; .. link_description.full)&lt;br /&gt;
		:wikitext(l[1] .. link_description.link .. l[2])&lt;br /&gt;
		:tag(is_mini and &#039;abbr&#039; or &#039;span&#039;)&lt;br /&gt;
			:attr(&#039;title&#039;, link_description.html_title)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(is_mini and link_description.mini or link_description.full)&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(l[3])&lt;br /&gt;
		:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)&lt;br /&gt;
	if not title then&lt;br /&gt;
		error(cfg.invalid_title .. title_text)&lt;br /&gt;
	end&lt;br /&gt;
	local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: Get link_descriptions and show into the configuration module.&lt;br /&gt;
	-- link_descriptions should be easier...&lt;br /&gt;
	local link_descriptions = {&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;v&#039;, [&#039;full&#039;] = &#039;view&#039;, [&#039;html_title&#039;] = &#039;View this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;t&#039;, [&#039;full&#039;] = &#039;talk&#039;, [&#039;html_title&#039;] = &#039;Discuss this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = talkpage, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;e&#039;, [&#039;full&#039;] = &#039;edit&#039;, [&#039;html_title&#039;] = &#039;Edit this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = title:fullUrl(&#039;action=edit&#039;), [&#039;url&#039;] = true },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;h&#039;, [&#039;full&#039;] = &#039;hist&#039;, [&#039;html_title&#039;] = &#039;History of this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = title:fullUrl(&#039;action=history&#039;), [&#039;url&#039;] = true },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;m&#039;, [&#039;full&#039;] = &#039;move&#039;, [&#039;html_title&#039;] = &#039;Move this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = mw.title.new(&#039;Special:Movepage&#039;):fullUrl(&#039;target=&#039;..title.fullText), [&#039;url&#039;] = true },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;w&#039;, [&#039;full&#039;] = &#039;watch&#039;, [&#039;html_title&#039;] = &#039;Watch this template&#039;, &lt;br /&gt;
			[&#039;link&#039;] = title:fullUrl(&#039;action=watch&#039;), [&#039;url&#039;] = true }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local ul = mw.html.create(&#039;ul&#039;)&lt;br /&gt;
	if has_brackets then&lt;br /&gt;
		ul:addClass(cfg.classes.brackets)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i, _ in ipairs(displayed_links) do&lt;br /&gt;
		if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end&lt;br /&gt;
	end&lt;br /&gt;
	return ul:done()&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbar(args)&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: We probably don&#039;t need both fontstyle and fontcolor...&lt;br /&gt;
	local font_style = args.fontstyle&lt;br /&gt;
	local font_color = args.fontcolor&lt;br /&gt;
	local is_collapsible = args.collapsible&lt;br /&gt;
	local is_mini = args.mini&lt;br /&gt;
	local is_plain = args.plain&lt;br /&gt;
	&lt;br /&gt;
	local collapsible_class = nil&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		collapsible_class = cfg.classes.collapsible&lt;br /&gt;
		if not is_plain then is_mini = 1 end&lt;br /&gt;
		if font_color then&lt;br /&gt;
			font_style = (font_style or &#039;&#039;) .. &#039;; color: &#039; .. font_color .. &#039;;&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local navbar_style = args.style&lt;br /&gt;
	local div = mw.html.create():tag(&#039;div&#039;)&lt;br /&gt;
	div&lt;br /&gt;
		:addClass(cfg.classes.navbar)&lt;br /&gt;
		:addClass(cfg.classes.plainlinks)&lt;br /&gt;
		:addClass(cfg.classes.horizontal_list)&lt;br /&gt;
		:addClass(collapsible_class) -- we made the determination earlier&lt;br /&gt;
		:cssText(navbar_style)&lt;br /&gt;
&lt;br /&gt;
	if is_mini then div:addClass(cfg.classes.mini) end&lt;br /&gt;
&lt;br /&gt;
	local box_text = (args.text or cfg.box_text) .. &#039; &#039;&lt;br /&gt;
	 -- the concatenated space guarantees the box text is separated&lt;br /&gt;
	if not (is_mini or is_plain) then&lt;br /&gt;
		div&lt;br /&gt;
			:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(cfg.classes.box_text)&lt;br /&gt;
				:cssText(font_style)&lt;br /&gt;
				:wikitext(box_text)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local template = args.template&lt;br /&gt;
	local displayed_links = choose_links(template, args)&lt;br /&gt;
	local has_brackets = args.brackets&lt;br /&gt;
	local title_arg = get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_text = args[title_arg] or (&#039;:&#039; .. mw.getCurrentFrame():getParent():getTitle())&lt;br /&gt;
	local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	div:node(list)&lt;br /&gt;
&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		local title_text_class&lt;br /&gt;
		if is_mini then&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_mini&lt;br /&gt;
		else&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_full&lt;br /&gt;
		end&lt;br /&gt;
		div:done()&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(title_text_class)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(args[1])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- hlist -&amp;gt; navbar is best-effort to preserve old Common.css ordering.&lt;br /&gt;
	return frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
	} .. frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.templatestyles }&lt;br /&gt;
	} .. tostring(div:done())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbar(frame)&lt;br /&gt;
	return p._navbar(require(&#039;Module:Arguments&#039;).getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:Navbar/configuration&amp;diff=214</id>
		<title>Module:Navbar/configuration</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:Navbar/configuration&amp;diff=214"/>
		<updated>2023-03-05T04:09:50Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;return { 	[&amp;#039;templatestyles&amp;#039;] = &amp;#039;Module:Navbar/styles.css&amp;#039;, 	[&amp;#039;hlist_templatestyles&amp;#039;] = &amp;#039;Hlist/styles.css&amp;#039;, 	[&amp;#039;box_text&amp;#039;] = &amp;#039;This box: &amp;#039;,			-- default text box when not plain or mini 	[&amp;#039;title_namespace&amp;#039;] = &amp;#039;Template&amp;#039;,		-- namespace to default to for title 	[&amp;#039;invalid_title&amp;#039;] = &amp;#039;Invalid title &amp;#039;, 	[&amp;#039;classes&amp;#039;] = { -- set a line to nil if you don&amp;#039;t want it 		[&amp;#039;navbar&amp;#039;] = &amp;#039;navbar&amp;#039;, 		[&amp;#039;plainlinks&amp;#039;] = &amp;#039;plainlinks&amp;#039;, -- plainlinks 		[&amp;#039;horizontal_list&amp;#039;] = &amp;#039;hlist&amp;#039;, -- horizontal lis...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	[&#039;templatestyles&#039;] = &#039;Module:Navbar/styles.css&#039;,&lt;br /&gt;
	[&#039;hlist_templatestyles&#039;] = &#039;Hlist/styles.css&#039;,&lt;br /&gt;
	[&#039;box_text&#039;] = &#039;This box: &#039;,			-- default text box when not plain or mini&lt;br /&gt;
	[&#039;title_namespace&#039;] = &#039;Template&#039;,		-- namespace to default to for title&lt;br /&gt;
	[&#039;invalid_title&#039;] = &#039;Invalid title &#039;,&lt;br /&gt;
	[&#039;classes&#039;] = { -- set a line to nil if you don&#039;t want it&lt;br /&gt;
		[&#039;navbar&#039;] = &#039;navbar&#039;,&lt;br /&gt;
		[&#039;plainlinks&#039;] = &#039;plainlinks&#039;, -- plainlinks&lt;br /&gt;
		[&#039;horizontal_list&#039;] = &#039;hlist&#039;, -- horizontal list class&lt;br /&gt;
		[&#039;mini&#039;] = &#039;navbar-mini&#039;, -- class indicating small links in the navbar&lt;br /&gt;
		[&#039;this_box&#039;] = &#039;navbar-boxtext&#039;,&lt;br /&gt;
		[&#039;brackets&#039;] = &#039;navbar-brackets&#039;,&lt;br /&gt;
		-- &#039;collapsible&#039; is the key for a class to indicate the navbar is&lt;br /&gt;
		-- setting up the collapsible element in addition to the normal&lt;br /&gt;
		-- navbar.&lt;br /&gt;
		[&#039;collapsible&#039;] = &#039;navbar-collapse&#039;,&lt;br /&gt;
		[&#039;collapsible_title_mini&#039;] = &#039;navbar-ct-mini&#039;,&lt;br /&gt;
		[&#039;collapsible_title_full&#039;] = &#039;navbar-ct-full&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:TableTools&amp;diff=213</id>
		<title>Module:TableTools</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:TableTools&amp;diff=213"/>
		<updated>2023-03-05T04:08:59Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;------------------------------------------------------------------------------------ --                                   TableTools                                   -- --                                                                                -- -- This module includes a number of functions for dealing with Lua tables.        -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;------------------------------------------------------------------------------------&lt;br /&gt;
--                                   TableTools                                   --&lt;br /&gt;
--                                                                                --&lt;br /&gt;
-- This module includes a number of functions for dealing with Lua tables.        --&lt;br /&gt;
-- It is a meta-module, meant to be called from other Lua modules, and should not --&lt;br /&gt;
-- be called directly from #invoke.                                               --&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Define often-used variables and functions.&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
local infinity = math.huge&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local checkTypeMulti = libraryUtil.checkTypeMulti&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isPositiveInteger&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given value is a positive integer, and false&lt;br /&gt;
-- if not. Although it doesn&#039;t operate on tables, it is included here as it is&lt;br /&gt;
-- useful for determining whether a given table key is in the array part or the&lt;br /&gt;
-- hash part of a table.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isPositiveInteger(v)&lt;br /&gt;
	return type(v) == &#039;number&#039; and v &amp;gt;= 1 and floor(v) == v and v &amp;lt; infinity&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isNan&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given number is a NaN value, and false if&lt;br /&gt;
-- not. Although it doesn&#039;t operate on tables, it is included here as it is useful&lt;br /&gt;
-- for determining whether a value can be a valid table key. Lua will generate an&lt;br /&gt;
-- error if a NaN is used as a table key.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isNan(v)&lt;br /&gt;
	return type(v) == &#039;number&#039; and v ~= v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- shallowClone&lt;br /&gt;
--&lt;br /&gt;
-- This returns a clone of a table. The value returned is a new table, but all&lt;br /&gt;
-- subtables and functions are shared. Metamethods are respected, but the returned&lt;br /&gt;
-- table will have no metatable of its own.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.shallowClone(t)&lt;br /&gt;
	checkType(&#039;shallowClone&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		ret[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- removeDuplicates&lt;br /&gt;
--&lt;br /&gt;
-- This removes duplicate values from an array. Non-positive-integer keys are&lt;br /&gt;
-- ignored. The earliest value is kept, and all subsequent duplicate values are&lt;br /&gt;
-- removed, but otherwise the array order is unchanged.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.removeDuplicates(arr)&lt;br /&gt;
	checkType(&#039;removeDuplicates&#039;, 1, arr, &#039;table&#039;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local ret, exists = {}, {}&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if isNan(v) then&lt;br /&gt;
			-- NaNs can&#039;t be table keys, and they are also unique, so we don&#039;t need to check existence.&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
		else&lt;br /&gt;
			if not exists[v] then&lt;br /&gt;
				ret[#ret + 1] = v&lt;br /&gt;
				exists[v] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numKeys&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of any numerical&lt;br /&gt;
-- keys that have non-nil values, sorted in numerical order.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.numKeys(t)&lt;br /&gt;
	checkType(&#039;numKeys&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local isPositiveInteger = p.isPositiveInteger&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		if isPositiveInteger(k) then&lt;br /&gt;
			nums[#nums + 1] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- affixNums&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of keys with the&lt;br /&gt;
-- specified prefix and suffix. For example, for the table&lt;br /&gt;
-- {a1 = &#039;foo&#039;, a3 = &#039;bar&#039;, a6 = &#039;baz&#039;} and the prefix &amp;quot;a&amp;quot;, affixNums will return&lt;br /&gt;
-- {1, 3, 6}.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.affixNums(t, prefix, suffix)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 2, prefix, &#039;string&#039;, true)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 3, suffix, &#039;string&#039;, true)&lt;br /&gt;
&lt;br /&gt;
	local function cleanPattern(s)&lt;br /&gt;
		-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.&lt;br /&gt;
		return s:gsub(&#039;([%(%)%%%.%[%]%*%+%-%?%^%$])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	prefix = prefix or &#039;&#039;&lt;br /&gt;
	suffix = suffix or &#039;&#039;&lt;br /&gt;
	prefix = cleanPattern(prefix)&lt;br /&gt;
	suffix = cleanPattern(suffix)&lt;br /&gt;
	local pattern = &#039;^&#039; .. prefix .. &#039;([1-9]%d*)&#039; .. suffix .. &#039;$&#039;&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		if type(k) == &#039;string&#039; then&lt;br /&gt;
			local num = mw.ustring.match(k, pattern)&lt;br /&gt;
			if num then&lt;br /&gt;
				nums[#nums + 1] = tonumber(num)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numData&lt;br /&gt;
--&lt;br /&gt;
-- Given a table with keys like {&amp;quot;foo1&amp;quot;, &amp;quot;bar1&amp;quot;, &amp;quot;foo2&amp;quot;, &amp;quot;baz2&amp;quot;}, returns a table&lt;br /&gt;
-- of subtables in the format&lt;br /&gt;
-- {[1] = {foo = &#039;text&#039;, bar = &#039;text&#039;}, [2] = {foo = &#039;text&#039;, baz = &#039;text&#039;}}.&lt;br /&gt;
-- Keys that don&#039;t end with an integer are stored in a subtable named &amp;quot;other&amp;quot;. The&lt;br /&gt;
-- compress option compresses the table so that it can be iterated over with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.numData(t, compress)&lt;br /&gt;
	checkType(&#039;numData&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;numData&#039;, 2, compress, &#039;boolean&#039;, true)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		local prefix, num = mw.ustring.match(tostring(k), &#039;^([^0-9]*)([1-9][0-9]*)$&#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			num = tonumber(num)&lt;br /&gt;
			local subtable = ret[num] or {}&lt;br /&gt;
			if prefix == &#039;&#039; then&lt;br /&gt;
				-- Positional parameters match the blank string; put them at the start of the subtable instead.&lt;br /&gt;
				prefix = 1&lt;br /&gt;
			end&lt;br /&gt;
			subtable[prefix] = v&lt;br /&gt;
			ret[num] = subtable&lt;br /&gt;
		else&lt;br /&gt;
			local subtable = ret.other or {}&lt;br /&gt;
			subtable[k] = v&lt;br /&gt;
			ret.other = subtable&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if compress then&lt;br /&gt;
		local other = ret.other&lt;br /&gt;
		ret = p.compressSparseArray(ret)&lt;br /&gt;
		ret.other = other&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- compressSparseArray&lt;br /&gt;
--&lt;br /&gt;
-- This takes an array with one or more nil values, and removes the nil values&lt;br /&gt;
-- while preserving the order, so that the array can be safely traversed with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.compressSparseArray(t)&lt;br /&gt;
	checkType(&#039;compressSparseArray&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		ret[#ret + 1] = t[num]&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sparseIpairs&lt;br /&gt;
--&lt;br /&gt;
-- This is an iterator for sparse arrays. It can be used like ipairs, but can&lt;br /&gt;
-- handle nil values.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.sparseIpairs(t)&lt;br /&gt;
	checkType(&#039;sparseIpairs&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	local lim = #nums&lt;br /&gt;
	return function ()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if i &amp;lt;= lim then&lt;br /&gt;
			local key = nums[i]&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- size&lt;br /&gt;
--&lt;br /&gt;
-- This returns the size of a key/value pair table. It will also work on arrays,&lt;br /&gt;
-- but for arrays it is more efficient to use the # operator.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.size(t)&lt;br /&gt;
	checkType(&#039;size&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(t) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function defaultKeySort(item1, item2)&lt;br /&gt;
	-- &amp;quot;number&amp;quot; &amp;lt; &amp;quot;string&amp;quot;, so numbers will be sorted before strings.&lt;br /&gt;
	local type1, type2 = type(item1), type(item2)&lt;br /&gt;
	if type1 ~= type2 then&lt;br /&gt;
		return type1 &amp;lt; type2&lt;br /&gt;
	elseif type1 == &#039;table&#039; or type1 == &#039;boolean&#039; or type1 == &#039;function&#039; then&lt;br /&gt;
		return tostring(item1) &amp;lt; tostring(item2)&lt;br /&gt;
	else&lt;br /&gt;
		return item1 &amp;lt; item2&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- keysToList&lt;br /&gt;
--&lt;br /&gt;
-- Returns an array of the keys in a table, sorted using either a default&lt;br /&gt;
-- comparison function or a custom keySort function.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.keysToList(t, keySort, checked)&lt;br /&gt;
	if not checked then&lt;br /&gt;
		checkType(&#039;keysToList&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
		checkTypeMulti(&#039;keysToList&#039;, 2, keySort, {&#039;function&#039;, &#039;boolean&#039;, &#039;nil&#039;})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local arr = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		arr[index] = k&lt;br /&gt;
		index = index + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if keySort ~= false then&lt;br /&gt;
		keySort = type(keySort) == &#039;function&#039; and keySort or defaultKeySort&lt;br /&gt;
		table.sort(arr, keySort)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return arr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sortedPairs&lt;br /&gt;
--&lt;br /&gt;
-- Iterates through a table, with the keys sorted using the keysToList function.&lt;br /&gt;
-- If there are only numerical keys, sparseIpairs is probably more efficient.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.sortedPairs(t, keySort)&lt;br /&gt;
	checkType(&#039;sortedPairs&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;sortedPairs&#039;, 2, keySort, &#039;function&#039;, true)&lt;br /&gt;
&lt;br /&gt;
	local arr = p.keysToList(t, keySort, true)&lt;br /&gt;
&lt;br /&gt;
	local i = 0&lt;br /&gt;
	return function ()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		local key = arr[i]&lt;br /&gt;
		if key ~= nil then&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isArray&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if the given value is a table and all keys are consecutive&lt;br /&gt;
-- integers starting at 1.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isArray(v)&lt;br /&gt;
	if type(v) ~= &#039;table&#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(v) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if v[i] == nil then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isArrayLike&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if the given value is iterable and all keys are consecutive&lt;br /&gt;
-- integers starting at 1.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isArrayLike(v)&lt;br /&gt;
	if not pcall(pairs, v) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(v) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if v[i] == nil then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- invert&lt;br /&gt;
--&lt;br /&gt;
-- Transposes the keys and values in an array. For example, {&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;} -&amp;gt;&lt;br /&gt;
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to&lt;br /&gt;
-- the index of the last duplicate) and NaN values are ignored.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.invert(arr)&lt;br /&gt;
	checkType(&amp;quot;invert&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local map = {}&lt;br /&gt;
	for i, v in ipairs(arr) do&lt;br /&gt;
		if not isNan(v) then&lt;br /&gt;
			map[v] = i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return map&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- listToSet&lt;br /&gt;
--&lt;br /&gt;
-- Creates a set from the array part of the table. Indexing the set by any of the&lt;br /&gt;
-- values of the array returns true. For example, {&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;} -&amp;gt;&lt;br /&gt;
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them&lt;br /&gt;
-- never equal to any value (including other NaNs or even themselves).&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.listToSet(arr)&lt;br /&gt;
	checkType(&amp;quot;listToSet&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local set = {}&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if not isNan(v) then&lt;br /&gt;
			set[v] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- deepCopy&lt;br /&gt;
--&lt;br /&gt;
-- Recursive deep copy function. Preserves identities of subtables.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
local function _deepCopy(orig, includeMetatable, already_seen)&lt;br /&gt;
	-- Stores copies of tables indexed by the original table.&lt;br /&gt;
	already_seen = already_seen or {}&lt;br /&gt;
&lt;br /&gt;
	local copy = already_seen[orig]&lt;br /&gt;
	if copy ~= nil then&lt;br /&gt;
		return copy&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if type(orig) == &#039;table&#039; then&lt;br /&gt;
		copy = {}&lt;br /&gt;
		for orig_key, orig_value in pairs(orig) do&lt;br /&gt;
			copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)&lt;br /&gt;
		end&lt;br /&gt;
		already_seen[orig] = copy&lt;br /&gt;
&lt;br /&gt;
		if includeMetatable then&lt;br /&gt;
			local mt = getmetatable(orig)&lt;br /&gt;
			if mt ~= nil then&lt;br /&gt;
				local mt_copy = _deepCopy(mt, includeMetatable, already_seen)&lt;br /&gt;
				setmetatable(copy, mt_copy)&lt;br /&gt;
				already_seen[mt] = mt_copy&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else -- number, string, boolean, etc&lt;br /&gt;
		copy = orig&lt;br /&gt;
	end&lt;br /&gt;
	return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.deepCopy(orig, noMetatable, already_seen)&lt;br /&gt;
	checkType(&amp;quot;deepCopy&amp;quot;, 3, already_seen, &amp;quot;table&amp;quot;, true)&lt;br /&gt;
	return _deepCopy(orig, not noMetatable, already_seen)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sparseConcat&lt;br /&gt;
--&lt;br /&gt;
-- Concatenates all values in the table that are indexed by a number, in order.&lt;br /&gt;
-- sparseConcat{a, nil, c, d}  =&amp;gt;  &amp;quot;acd&amp;quot;&lt;br /&gt;
-- sparseConcat{nil, b, c, d}  =&amp;gt;  &amp;quot;bcd&amp;quot;&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.sparseConcat(t, sep, i, j)&lt;br /&gt;
	local arr = {}&lt;br /&gt;
&lt;br /&gt;
	local arr_i = 0&lt;br /&gt;
	for _, v in p.sparseIpairs(t) do&lt;br /&gt;
		arr_i = arr_i + 1&lt;br /&gt;
		arr[arr_i] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(arr, sep, i, j)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- length&lt;br /&gt;
--&lt;br /&gt;
-- Finds the length of an array, or of a quasi-array with keys such as &amp;quot;data1&amp;quot;,&lt;br /&gt;
-- &amp;quot;data2&amp;quot;, etc., using an exponential search algorithm. It is similar to the&lt;br /&gt;
-- operator #, but may return a different value when there are gaps in the array&lt;br /&gt;
-- portion of the table. Intended to be used on data loaded with mw.loadData. For&lt;br /&gt;
-- other tables, use #.&lt;br /&gt;
-- Note: #frame.args in frame object always be set to 0, regardless of  the number&lt;br /&gt;
-- of unnamed template parameters, so use this function for frame.args.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.length(t, prefix)&lt;br /&gt;
	-- requiring module inline so that [[Module:Exponential search]] which is&lt;br /&gt;
	-- only needed by this one function doesn&#039;t get millions of transclusions&lt;br /&gt;
	local expSearch = require(&amp;quot;Module:Exponential search&amp;quot;)&lt;br /&gt;
	checkType(&#039;length&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;length&#039;, 2, prefix, &#039;string&#039;, true)&lt;br /&gt;
	return expSearch(function (i)&lt;br /&gt;
		local key&lt;br /&gt;
		if prefix then&lt;br /&gt;
			key = prefix .. tostring(i)&lt;br /&gt;
		else&lt;br /&gt;
			key = i&lt;br /&gt;
		end&lt;br /&gt;
		return t[key] ~= nil&lt;br /&gt;
	end) or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- inArray&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if valueToFind is a member of the array, and false otherwise.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.inArray(arr, valueToFind)&lt;br /&gt;
	checkType(&amp;quot;inArray&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	-- if valueToFind is nil, error?&lt;br /&gt;
&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if v == valueToFind then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:Exponential_search&amp;diff=212</id>
		<title>Module:Exponential search</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:Exponential_search&amp;diff=212"/>
		<updated>2023-03-05T04:08:08Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;-- This module provides a generic exponential search algorithm. requirestrict  local checkType = require(&amp;#039;libraryUtil&amp;#039;).checkType local floor = math.floor  local function midPoint(lower, upper) 	return floor(lower + (upper - lower) / 2) end  local function search(testFunc, i, lower, upper) 	if testFunc(i) then 		if i + 1 == upper then 			return i 		end 		lower = i 		if upper then 			i = midPoint(lower, upper) 		else 			i = i * 2 		end 		return search(testFunc, i, low...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides a generic exponential search algorithm.&lt;br /&gt;
require[[strict]]&lt;br /&gt;
&lt;br /&gt;
local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
&lt;br /&gt;
local function midPoint(lower, upper)&lt;br /&gt;
	return floor(lower + (upper - lower) / 2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function search(testFunc, i, lower, upper)&lt;br /&gt;
	if testFunc(i) then&lt;br /&gt;
		if i + 1 == upper then&lt;br /&gt;
			return i&lt;br /&gt;
		end&lt;br /&gt;
		lower = i&lt;br /&gt;
		if upper then&lt;br /&gt;
			i = midPoint(lower, upper)&lt;br /&gt;
		else&lt;br /&gt;
			i = i * 2&lt;br /&gt;
		end&lt;br /&gt;
		return search(testFunc, i, lower, upper)&lt;br /&gt;
	else&lt;br /&gt;
		upper = i&lt;br /&gt;
		i = midPoint(lower, upper)&lt;br /&gt;
		return search(testFunc, i, lower, upper)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return function (testFunc, init)&lt;br /&gt;
	checkType(&#039;Exponential search&#039;, 1, testFunc, &#039;function&#039;)&lt;br /&gt;
	checkType(&#039;Exponential search&#039;, 2, init, &#039;number&#039;, true)&lt;br /&gt;
	if init and (init &amp;lt; 1 or init ~= floor(init) or init == math.huge) then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;invalid init value &#039;%s&#039; detected in argument #2 to &amp;quot; ..&lt;br /&gt;
			&amp;quot;&#039;Exponential search&#039; (init value must be a positive integer)&amp;quot;,&lt;br /&gt;
			tostring(init)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
	init = init or 2&lt;br /&gt;
	if not testFunc(1) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return search(testFunc, init, 1, nil)&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:Color_contrast&amp;diff=211</id>
		<title>Module:Color contrast</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:Color_contrast&amp;diff=211"/>
		<updated>2023-03-05T04:06:55Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;-- -- This module implements --  {{Color contrast ratio}} --  {{Greater color contrast ratio}} --  {{ColorToLum}} --  {{RGBColorToLum}} -- local p = {} local HTMLcolor = mw.loadData( &amp;#039;Module:Color contrast/colors&amp;#039; )  local function sRGB (v) 	if (v &amp;lt;= 0.03928) then 		v = v / 12.92 	else 		v = math.pow((v+0.055)/1.055, 2.4) 	end 	return v end  local function rgbdec2lum(R, G, B) 	if ( 0 &amp;lt;= R and R &amp;lt; 256 and 0 &amp;lt;= G and G &amp;lt; 256 and 0 &amp;lt;= B and B &amp;lt; 256 ) then 		return 0.2126 *...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements&lt;br /&gt;
--  {{Color contrast ratio}}&lt;br /&gt;
--  {{Greater color contrast ratio}}&lt;br /&gt;
--  {{ColorToLum}}&lt;br /&gt;
--  {{RGBColorToLum}}&lt;br /&gt;
--&lt;br /&gt;
local p = {}&lt;br /&gt;
local HTMLcolor = mw.loadData( &#039;Module:Color contrast/colors&#039; )&lt;br /&gt;
&lt;br /&gt;
local function sRGB (v)&lt;br /&gt;
	if (v &amp;lt;= 0.03928) then&lt;br /&gt;
		v = v / 12.92&lt;br /&gt;
	else&lt;br /&gt;
		v = math.pow((v+0.055)/1.055, 2.4)&lt;br /&gt;
	end&lt;br /&gt;
	return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rgbdec2lum(R, G, B)&lt;br /&gt;
	if ( 0 &amp;lt;= R and R &amp;lt; 256 and 0 &amp;lt;= G and G &amp;lt; 256 and 0 &amp;lt;= B and B &amp;lt; 256 ) then&lt;br /&gt;
		return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255)&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hsl2lum(h, s, l)&lt;br /&gt;
	if ( 0 &amp;lt;= h and h &amp;lt; 360 and 0 &amp;lt;= s and s &amp;lt;= 1 and 0 &amp;lt;= l and l &amp;lt;= 1 ) then&lt;br /&gt;
		local c = (1 - math.abs(2*l - 1))*s&lt;br /&gt;
		local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) )&lt;br /&gt;
		local m = l - c/2&lt;br /&gt;
&lt;br /&gt;
		local r, g, b = m, m, m&lt;br /&gt;
		if( 0 &amp;lt;= h and h &amp;lt; 60 ) then&lt;br /&gt;
			r = r + c&lt;br /&gt;
			g = g + x&lt;br /&gt;
		elseif( 60 &amp;lt;= h and h &amp;lt; 120 ) then&lt;br /&gt;
			r = r + x&lt;br /&gt;
			g = g + c&lt;br /&gt;
		elseif( 120 &amp;lt;= h and h &amp;lt; 180 ) then&lt;br /&gt;
			g = g + c&lt;br /&gt;
			b = b + x&lt;br /&gt;
		elseif( 180 &amp;lt;= h and h &amp;lt; 240 ) then&lt;br /&gt;
			g = g + x&lt;br /&gt;
			b = b + c&lt;br /&gt;
		elseif( 240 &amp;lt;= h and h &amp;lt; 300 ) then&lt;br /&gt;
			r = r + x&lt;br /&gt;
			b = b + c&lt;br /&gt;
		elseif( 300 &amp;lt;= h and h &amp;lt; 360 ) then&lt;br /&gt;
			r = r + c&lt;br /&gt;
			b = b + x&lt;br /&gt;
		end&lt;br /&gt;
		return rgbdec2lum(255*r, 255*g, 255*b)&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function color2lum(c)&lt;br /&gt;
&lt;br /&gt;
	if (c == nil) then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- html &#039;#&#039; entity&lt;br /&gt;
	c = c:gsub(&amp;quot;&amp;amp;#35;&amp;quot;, &amp;quot;#&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- whitespace&lt;br /&gt;
	c = c:match( &#039;^%s*(.-)[%s;]*$&#039; )&lt;br /&gt;
&lt;br /&gt;
	-- unstrip nowiki strip markers&lt;br /&gt;
	c = mw.text.unstripNoWiki(c)&lt;br /&gt;
&lt;br /&gt;
	-- lowercase&lt;br /&gt;
	c = c:lower()&lt;br /&gt;
&lt;br /&gt;
	-- first try to look it up&lt;br /&gt;
	local L = HTMLcolor[c]&lt;br /&gt;
	if (L ~= nil) then&lt;br /&gt;
		return L&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- convert from hsl&lt;br /&gt;
	if mw.ustring.match(c,&#039;^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&#039;) then&lt;br /&gt;
		local h, s, l = mw.ustring.match(c,&#039;^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&#039;)&lt;br /&gt;
		return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- convert from rgb&lt;br /&gt;
	if mw.ustring.match(c,&#039;^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$&#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&#039;^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$&#039;)&lt;br /&gt;
		return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- convert from rgb percent&lt;br /&gt;
	if mw.ustring.match(c,&#039;^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&#039;^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&#039;)&lt;br /&gt;
		return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- remove leading # (if there is one) and whitespace&lt;br /&gt;
	c = mw.ustring.match(c, &#039;^[%s#]*([a-f0-9]*)[%s]*$&#039;)&lt;br /&gt;
&lt;br /&gt;
	-- split into rgb&lt;br /&gt;
	local cs = mw.text.split(c or &#039;&#039;, &#039;&#039;)&lt;br /&gt;
	if( #cs == 6 ) then&lt;br /&gt;
		local R = 16*tonumber(&#039;0x&#039; .. cs[1]) + tonumber(&#039;0x&#039; .. cs[2])&lt;br /&gt;
		local G = 16*tonumber(&#039;0x&#039; .. cs[3]) + tonumber(&#039;0x&#039; .. cs[4])&lt;br /&gt;
		local B = 16*tonumber(&#039;0x&#039; .. cs[5]) + tonumber(&#039;0x&#039; .. cs[6])&lt;br /&gt;
&lt;br /&gt;
		return rgbdec2lum(R, G, B)&lt;br /&gt;
	elseif ( #cs == 3 ) then&lt;br /&gt;
		local R = 16*tonumber(&#039;0x&#039; .. cs[1]) + tonumber(&#039;0x&#039; .. cs[1])&lt;br /&gt;
		local G = 16*tonumber(&#039;0x&#039; .. cs[2]) + tonumber(&#039;0x&#039; .. cs[2])&lt;br /&gt;
		local B = 16*tonumber(&#039;0x&#039; .. cs[3]) + tonumber(&#039;0x&#039; .. cs[3])&lt;br /&gt;
&lt;br /&gt;
		return rgbdec2lum(R, G, B)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- failure, return blank&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This exports the function for use in other modules.&lt;br /&gt;
-- The colour is passed as a string.&lt;br /&gt;
function p._lum(color)&lt;br /&gt;
	return color2lum(color)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._greatercontrast(args)&lt;br /&gt;
	local bias = tonumber(args[&#039;bias&#039;] or &#039;0&#039;) or 0&lt;br /&gt;
	local css = (args[&#039;css&#039;] and args[&#039;css&#039;] ~= &#039;&#039;) and true or false&lt;br /&gt;
	local v1 = color2lum(args[1] or &#039;&#039;)&lt;br /&gt;
	local c2 = args[2] or &#039;#FFFFFF&#039;&lt;br /&gt;
	local v2 = color2lum(c2)&lt;br /&gt;
	local c3 = args[3] or &#039;#000000&#039;&lt;br /&gt;
	local v3 = color2lum(c3)&lt;br /&gt;
	local ratio1 = -1;&lt;br /&gt;
	local ratio2 = -1;&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v2) == &#039;number&#039;) then&lt;br /&gt;
		ratio1 = (v2 + 0.05)/(v1 + 0.05)&lt;br /&gt;
		ratio1 = (ratio1 &amp;lt; 1) and 1/ratio1 or ratio1&lt;br /&gt;
	end&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v3) == &#039;number&#039;) then&lt;br /&gt;
		ratio2 = (v3 + 0.05)/(v1 + 0.05)&lt;br /&gt;
		ratio2 = (ratio2 &amp;lt; 1) and 1/ratio2 or ratio2&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if css then&lt;br /&gt;
		local c1 = args[1] or &#039;&#039;&lt;br /&gt;
		if mw.ustring.match(c1, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(c1, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c1 = &#039;#&#039; .. c1&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.match(c2, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(c2, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c2 = &#039;#&#039; .. c2&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.match(v3, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(v3, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c3 = &#039;#&#039; .. c3&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;background-color:&#039; .. c1 .. &#039;; color:&#039; .. ((ratio1 &amp;gt; 0) and (ratio2 &amp;gt; 0) and ((ratio1 + bias &amp;gt; ratio2) and c2 or c3) or &#039;&#039;) .. &#039;;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return (ratio1 &amp;gt; 0) and (ratio2 &amp;gt; 0) and ((ratio1 + bias &amp;gt; ratio2) and c2 or c3) or &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._ratio(args)&lt;br /&gt;
	local v1 = color2lum(args[1])&lt;br /&gt;
	local v2 = color2lum(args[2])&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v2) == &#039;number&#039;) then&lt;br /&gt;
		-- v1 should be the brighter of the two.&lt;br /&gt;
		if v2 &amp;gt; v1 then&lt;br /&gt;
			v1, v2 = v2, v1&lt;br /&gt;
		end&lt;br /&gt;
		return (v1 + 0.05)/(v2 + 0.05)&lt;br /&gt;
	else&lt;br /&gt;
		return args[&#039;error&#039;] or &#039;?&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._styleratio(args)&lt;br /&gt;
	local style = (args[1] or &#039;&#039;):lower()&lt;br /&gt;
	local bg, fg = &#039;white&#039;, &#039;black&#039;&lt;br /&gt;
	local lum_bg, lum_fg = 1, 0&lt;br /&gt;
&lt;br /&gt;
	if args[2] then&lt;br /&gt;
		local lum = color2lum(args[2])&lt;br /&gt;
		if lum ~= &#039;&#039; then bg, lum_bg = args[2], lum end&lt;br /&gt;
	end&lt;br /&gt;
	if args[3] then&lt;br /&gt;
		local lum = color2lum(args[3])&lt;br /&gt;
		if lum ~= &#039;&#039; then fg, lum_fg = args[3], lum end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or &#039;&#039;, &#039;&amp;amp;#[Xx]23;&#039;, &#039;#&#039;), &#039;&amp;amp;#35;&#039;, &#039;#&#039;), &#039;;&#039;)&lt;br /&gt;
	for k = 1,#slist do&lt;br /&gt;
		local s = slist[k]&lt;br /&gt;
		local k,v = s:match( &#039;^[%s]*([^:]-):([^:]-)[%s;]*$&#039; )&lt;br /&gt;
		k = k or &#039;&#039;&lt;br /&gt;
		v = v or &#039;&#039;&lt;br /&gt;
		if (k:match(&#039;^[%s]*(background)[%s]*$&#039;) or k:match(&#039;^[%s]*(background%-color)[%s]*$&#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &#039;&#039; ) then bg, lum_bg = v, lum end&lt;br /&gt;
		elseif (k:match(&#039;^[%s]*(color)[%s]*$&#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &#039;&#039; ) then bg, lum_fg = v, lum end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if lum_bg &amp;gt; lum_fg then&lt;br /&gt;
		return (lum_bg + 0.05)/(lum_fg + 0.05)&lt;br /&gt;
	else&lt;br /&gt;
		return (lum_fg + 0.05)/(lum_bg + 0.05)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Use {{#invoke:Color contrast|somecolor}} directly or&lt;br /&gt;
{{#invoke:Color contrast}} from a wrapper template.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
	-- |1=	— required; A color to check.&lt;br /&gt;
--]]&lt;br /&gt;
function p.lum(frame)&lt;br /&gt;
	local color = frame.args[1] or frame:getParent().args[1]&lt;br /&gt;
	return p._lum(color)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ratio(frame)&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	return p._ratio(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.styleratio(frame)&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	return p._styleratio(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.greatercontrast(frame)&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	return p._greatercontrast(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:Color_contrast/colors&amp;diff=210</id>
		<title>Module:Color contrast/colors</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:Color_contrast/colors&amp;diff=210"/>
		<updated>2023-03-05T04:05:50Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;return { 	aliceblue            = 0.92880068253475, 	antiquewhite         = 0.84646951707754, 	aqua                 = 0.7874, 	aquamarine           = 0.8078549208338, 	azure                = 0.97265264954166, 	beige                = 0.8988459998705, 	bisque               = 0.80732327372979, 	black                = 0, 	blanchedalmond       = 0.85084439608156, 	blue                 = 0.0722, 	blueviolet           = 0.12622014321946, 	brown                = 0.098224287876511...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	aliceblue            = 0.92880068253475,&lt;br /&gt;
	antiquewhite         = 0.84646951707754,&lt;br /&gt;
	aqua                 = 0.7874,&lt;br /&gt;
	aquamarine           = 0.8078549208338,&lt;br /&gt;
	azure                = 0.97265264954166,&lt;br /&gt;
	beige                = 0.8988459998705,&lt;br /&gt;
	bisque               = 0.80732327372979,&lt;br /&gt;
	black                = 0,&lt;br /&gt;
	blanchedalmond       = 0.85084439608156,&lt;br /&gt;
	blue                 = 0.0722,&lt;br /&gt;
	blueviolet           = 0.12622014321946,&lt;br /&gt;
	brown                = 0.098224287876511,&lt;br /&gt;
	burlywood            = 0.51559844533893,&lt;br /&gt;
	cadetblue            = 0.29424681085422,&lt;br /&gt;
	chartreuse           = 0.76032025902623,&lt;br /&gt;
	chocolate            = 0.23898526114557,&lt;br /&gt;
	coral                = 0.37017930872924,&lt;br /&gt;
	cornflowerblue       = 0.30318641994179,&lt;br /&gt;
	cornsilk             = 0.93562110372965,&lt;br /&gt;
	crimson              = 0.16042199953026,&lt;br /&gt;
	cyan                 = 0.7874,&lt;br /&gt;
	darkblue             = 0.018640801980939,&lt;br /&gt;
	darkcyan             = 0.20329317839046,&lt;br /&gt;
	darkgoldenrod        = 0.27264703559993,&lt;br /&gt;
	darkgray             = 0.39675523072563,&lt;br /&gt;
	darkgreen            = 0.091143429047575,&lt;br /&gt;
	darkgrey             = 0.39675523072563,&lt;br /&gt;
	darkkhaki            = 0.45747326349994,&lt;br /&gt;
	darkmagenta          = 0.07353047651207,&lt;br /&gt;
	darkolivegreen       = 0.12651920884889,&lt;br /&gt;
	darkorange           = 0.40016167026524,&lt;br /&gt;
	darkorchid           = 0.13413142174857,&lt;br /&gt;
	darkred              = 0.054889674531132,&lt;br /&gt;
	darksalmon           = 0.40541471563381,&lt;br /&gt;
	darkseagreen         = 0.43789249325969,&lt;br /&gt;
	darkslateblue        = 0.065792846227988,&lt;br /&gt;
	darkslategray        = 0.067608151928044,&lt;br /&gt;
	darkslategrey        = 0.067608151928044,&lt;br /&gt;
	darkturquoise        = 0.4874606277449,&lt;br /&gt;
	darkviolet           = 0.10999048339343,&lt;br /&gt;
	deeppink             = 0.23866895828276,&lt;br /&gt;
	deepskyblue          = 0.44481603395575,&lt;br /&gt;
	dimgray              = 0.14126329114027,&lt;br /&gt;
	dimgrey              = 0.14126329114027,&lt;br /&gt;
	dodgerblue           = 0.27442536991456,&lt;br /&gt;
	firebrick            = 0.10724525535015,&lt;br /&gt;
	floralwhite          = 0.95922484825004,&lt;br /&gt;
	forestgreen          = 0.18920812076002,&lt;br /&gt;
	fuchsia              = 0.2848,&lt;br /&gt;
	gainsboro            = 0.71569350050648,&lt;br /&gt;
	ghostwhite           = 0.94311261886323,&lt;br /&gt;
	gold                 = 0.69860877428159,&lt;br /&gt;
	goldenrod            = 0.41919977809569,&lt;br /&gt;
	gray                 = 0.2158605001139,&lt;br /&gt;
	green                = 0.15438342968146,&lt;br /&gt;
	greenyellow          = 0.80609472611453,&lt;br /&gt;
	grey                 = 0.2158605001139,&lt;br /&gt;
	honeydew             = 0.96336535554782,&lt;br /&gt;
	hotpink              = 0.34658438169715,&lt;br /&gt;
	indianred            = 0.21406134963884,&lt;br /&gt;
	indigo               = 0.03107561486337,&lt;br /&gt;
	ivory                = 0.99071270600615,&lt;br /&gt;
	khaki                = 0.77012343394121,&lt;br /&gt;
	lavender             = 0.80318750514521,&lt;br /&gt;
	lavenderblush        = 0.90172748631046,&lt;br /&gt;
	lawngreen            = 0.73905893124963,&lt;br /&gt;
	lemonchiffon         = 0.94038992245622,&lt;br /&gt;
	lightblue            = 0.63709141280807,&lt;br /&gt;
	lightcoral           = 0.35522120733135,&lt;br /&gt;
	lightcyan            = 0.94587293494829,&lt;br /&gt;
	lightgoldenrodyellow = 0.93348351018297,&lt;br /&gt;
	lightgray            = 0.65140563741982,&lt;br /&gt;
	lightgreen           = 0.69091979956865,&lt;br /&gt;
	lightgrey            = 0.65140563741982,&lt;br /&gt;
	lightpink            = 0.58566152734898,&lt;br /&gt;
	lightsalmon          = 0.4780675225206,&lt;br /&gt;
	lightseagreen        = 0.35050145117042,&lt;br /&gt;
	lightskyblue         = 0.56195637618331,&lt;br /&gt;
	lightslategray       = 0.23830165007287,&lt;br /&gt;
	lightslategrey       = 0.23830165007287,&lt;br /&gt;
	lightsteelblue       = 0.53983888284666,&lt;br /&gt;
	lightyellow          = 0.98161818392882,&lt;br /&gt;
	lime                 = 0.7152,&lt;br /&gt;
	limegreen            = 0.44571042246098,&lt;br /&gt;
	linen                = 0.88357340984379,&lt;br /&gt;
	magenta              = 0.2848,&lt;br /&gt;
	maroon               = 0.045891942324215,&lt;br /&gt;
	mediumaquamarine     = 0.49389703310801,&lt;br /&gt;
	mediumblue           = 0.044077780212328,&lt;br /&gt;
	mediumorchid         = 0.21639251153773,&lt;br /&gt;
	mediumpurple         = 0.22905858091648,&lt;br /&gt;
	mediumseagreen       = 0.34393112338131,&lt;br /&gt;
	mediumslateblue      = 0.20284629471622,&lt;br /&gt;
	mediumspringgreen    = 0.70704308194184,&lt;br /&gt;
	mediumturquoise      = 0.5133827926448,&lt;br /&gt;
	mediumvioletred      = 0.14371899849357,&lt;br /&gt;
	midnightblue         = 0.02071786635086,&lt;br /&gt;
	mintcream            = 0.97834604947588,&lt;br /&gt;
	mistyrose            = 0.82183047859185,&lt;br /&gt;
	moccasin             = 0.80083000991567,&lt;br /&gt;
	navajowhite          = 0.76519682342785,&lt;br /&gt;
	navy                 = 0.015585128108224,&lt;br /&gt;
	oldlace              = 0.91900633405549,&lt;br /&gt;
	olive                = 0.20027537200568,&lt;br /&gt;
	olivedrab            = 0.22593150951929,&lt;br /&gt;
	orange               = 0.4817026703631,&lt;br /&gt;
	orangered            = 0.25516243753416,&lt;br /&gt;
	orchid               = 0.31348806761439,&lt;br /&gt;
	palegoldenrod        = 0.78792647887614,&lt;br /&gt;
	palegreen            = 0.77936759006353,&lt;br /&gt;
	paleturquoise        = 0.76436077921714,&lt;br /&gt;
	palevioletred        = 0.28754994117889,&lt;br /&gt;
	papayawhip           = 0.87797100199835,&lt;br /&gt;
	peachpuff            = 0.74905589878251,&lt;br /&gt;
	peru                 = 0.30113074877936,&lt;br /&gt;
	pink                 = 0.63271070702466,&lt;br /&gt;
	plum                 = 0.45734221587969,&lt;br /&gt;
	powderblue           = 0.68254586500605,&lt;br /&gt;
	purple               = 0.061477070432439,&lt;br /&gt;
	rebeccapurple        = 0.07492341159447,&lt;br /&gt;
	red                  = 0.2126,&lt;br /&gt;
	rosybrown            = 0.32319457649407,&lt;br /&gt;
	royalblue            = 0.16663210743188,&lt;br /&gt;
	saddlebrown          = 0.097922285020521,&lt;br /&gt;
	salmon               = 0.36977241527596,&lt;br /&gt;
	sandybrown           = 0.46628543696283,&lt;br /&gt;
	seagreen             = 0.19734199706275,&lt;br /&gt;
	seashell             = 0.92737862206922,&lt;br /&gt;
	sienna               = 0.13697631337098,&lt;br /&gt;
	silver               = 0.52711512570581,&lt;br /&gt;
	skyblue              = 0.55291668518184,&lt;br /&gt;
	slateblue            = 0.14784278062136,&lt;br /&gt;
	slategray            = 0.20896704076536,&lt;br /&gt;
	slategrey            = 0.20896704076536,&lt;br /&gt;
	snow                 = 0.96533341834849,&lt;br /&gt;
	springgreen          = 0.73052306068529,&lt;br /&gt;
	steelblue            = 0.20562642207625,&lt;br /&gt;
	tan                  = 0.48237604163921,&lt;br /&gt;
	teal                 = 0.16996855778968,&lt;br /&gt;
	thistle              = 0.56818401093733,&lt;br /&gt;
	tomato               = 0.30638612719415,&lt;br /&gt;
	turquoise            = 0.5895536427578,&lt;br /&gt;
	violet               = 0.40315452986676,&lt;br /&gt;
	wheat                = 0.74909702820482,&lt;br /&gt;
	white                = 1,&lt;br /&gt;
	whitesmoke           = 0.91309865179342,&lt;br /&gt;
	yellow               = 0.9278,&lt;br /&gt;
	yellowgreen          = 0.50762957208707,&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Module:Arguments&amp;diff=209</id>
		<title>Module:Arguments</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Module:Arguments&amp;diff=209"/>
		<updated>2023-03-05T04:02:26Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;-- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly.  local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;) local checkType = libraryUtil.checkType  local arguments = {}  -- Generate four different tidyVal functions, so that we don&amp;#039;t have to check the -- options every time we call it.  local function tidyValDefault(key, val) 	if type(val) == &amp;#039;string&amp;#039;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from&lt;br /&gt;
-- #invoke. It is intended for use by other Lua modules, and should not be&lt;br /&gt;
-- called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&#039;t have to check the&lt;br /&gt;
-- options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		val = val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
		if val == &#039;&#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		return val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		if val:find(&#039;%S&#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == &#039;string&#039; or tp == &#039;number&#039;) and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 1, frame, &#039;table&#039;, true)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up argument translation.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Get the argument tables. If we were passed a valid frame object, get the&lt;br /&gt;
	-- frame arguments (fargs) and the parent frame arguments (pargs), depending&lt;br /&gt;
	-- on the options set and on the parent frame&#039;s availability. If we weren&#039;t&lt;br /&gt;
	-- passed a valid frame object, we are being called from another Lua module&lt;br /&gt;
	-- or from the debug console, so assume that we were passed a table of args&lt;br /&gt;
	-- directly, and assign it to a new variable (luaArgs).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &#039;table&#039; and type(frame.getParent) == &#039;function&#039; then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- The wrappers option makes Module:Arguments look up arguments in&lt;br /&gt;
			-- either the frame argument table or the parent argument table, but&lt;br /&gt;
			-- not both. This means that users can use either the #invoke syntax&lt;br /&gt;
			-- or a wrapper template without the loss of performance associated&lt;br /&gt;
			-- with looking arguments up in both the frame and the parent frame.&lt;br /&gt;
			-- Module:Arguments will look up arguments in the parent frame&lt;br /&gt;
			-- if it finds the parent frame&#039;s title in options.wrapper;&lt;br /&gt;
			-- otherwise it will look up arguments in the frame object passed&lt;br /&gt;
			-- to getArgs.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;)&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == &#039;table&#039; then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- We test for false specifically here so that nil (the default) acts like true.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- options.wrapper isn&#039;t set, so check the other options.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are&lt;br /&gt;
	-- nil, nothing will be added to the table, which is how we avoid clashes&lt;br /&gt;
	-- between the frame/parent args and the Lua args.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we&lt;br /&gt;
	-- use that; if not, we choose one of four functions depending on the&lt;br /&gt;
	-- options chosen. This is so that we don&#039;t have to call the options table&lt;br /&gt;
	-- every time the function is called.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &#039;function&#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option &#039;valueFunc&#039;&amp;quot;&lt;br /&gt;
					.. &#039;(function expected, got &#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &#039;)&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up the args, metaArgs and nilArgs tables. args will be the one&lt;br /&gt;
	-- accessed from functions, and metaArgs will hold the actual arguments. Nil&lt;br /&gt;
	-- arguments are memoized in nilArgs, and the metatable connects all of them&lt;br /&gt;
	-- together.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values&lt;br /&gt;
		-- into one table. If a value is already present it is not overwritten;&lt;br /&gt;
		-- tables listed earlier have precedence. We are also memoizing nil&lt;br /&gt;
		-- values, which can be overwritten if they are &#039;s&#039; (soft).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= &#039;h&#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &#039;s&#039;&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,&lt;br /&gt;
	-- and are only fetched from the argument tables once. Fetching arguments&lt;br /&gt;
	-- from the argument tables is the most resource-intensive step in this&lt;br /&gt;
	-- module, so we try and avoid it where possible. For this reason, nil&lt;br /&gt;
	-- arguments are also memoized, in the nilArgs table. Also, we keep a record&lt;br /&gt;
	-- in the metatable of when pairs and ipairs have been called, so we do not&lt;br /&gt;
	-- run pairs and ipairs on the argument tables more than once. We also do&lt;br /&gt;
	-- not run ipairs on fargs and pargs if pairs has already been run, as all&lt;br /&gt;
	-- the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Fetches an argument when the args table is indexed. First we check&lt;br /&gt;
		-- to see if the value is memoized, and if not we try and fetch it from&lt;br /&gt;
		-- the argument tables. When we check memoization, we need to check&lt;br /&gt;
		-- metaArgs before nilArgs, as both can be non-nil at the same time.&lt;br /&gt;
		-- If the argument is not present in metaArgs, we also check whether&lt;br /&gt;
		-- pairs has been run yet. If pairs has already been run, we return nil.&lt;br /&gt;
		-- This is because all the arguments will have already been copied into&lt;br /&gt;
		-- metaArgs by the mergeArgs function, meaning that any other arguments&lt;br /&gt;
		-- must be nil.&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- This function is called when a module tries to add a new value to the&lt;br /&gt;
		-- args table, or tries to change an existing value.&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; the table is read-only&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; overwriting existing arguments is not permitted&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- If the argument is to be overwritten with nil, we need to erase&lt;br /&gt;
			-- the value in metaArgs, so that __index, __pairs and __ipairs do&lt;br /&gt;
			-- not use a previous existing value, if present; and we also need&lt;br /&gt;
			-- to memoize the nil in nilArgs, so that the value isn&#039;t looked&lt;br /&gt;
			-- up in the argument tables if it is accessed again.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= &#039;string&#039; or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Skip this one. This is a tail call, so this won&#039;t cause stack overflow&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Called when pairs is run on the args table.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- This uses our __index metamethod&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Called when ipairs is run on the args table.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Category:List_of_Super_Mario_Galaxy_2_Galaxies&amp;diff=208</id>
		<title>Category:List of Super Mario Galaxy 2 Galaxies</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Category:List_of_Super_Mario_Galaxy_2_Galaxies&amp;diff=208"/>
		<updated>2023-03-05T03:35:35Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;This category contains all the galaxies in Super Mario Galaxy 2  LEGEND:&amp;lt;br&amp;gt; &amp;lt;nowiki&amp;gt;# Has a Grand Star&amp;lt;/nowiki&amp;gt;  == World 1 == {| class = &amp;quot;wikitable&amp;quot; ! Name !! No. of Stars !! Access requirement |- | Sky Station Galaxy || 6 || None |- | Yoshi Star Galaxy || 6 || 1 star |- | Spin-Dig Galaxy || 6 || 3 stars including Yoshi Star 1 |- | Fluffy Bluff Galaxy || 6 || Spin Dig 1 |- | Flip-Swap Galaxy || 4 || 3 stars including Yoshi Star 1 |- | Rightside Do...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category contains all the galaxies in Super Mario Galaxy 2&lt;br /&gt;
&lt;br /&gt;
LEGEND:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# Has a Grand Star&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== World 1 ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Sky Station Galaxy]] || 6 || None&lt;br /&gt;
|-&lt;br /&gt;
| [[Yoshi Star Galaxy]] || 6 || 1 star&lt;br /&gt;
|-&lt;br /&gt;
| [[Spin-Dig Galaxy]] || 6 || 3 stars including Yoshi Star 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Fluffy Bluff Galaxy]] || 6 || Spin Dig 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Flip-Swap Galaxy]] || 4 || 3 stars including Yoshi Star 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Rightside Down Galaxy]] || 4 || Spin Dig 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser Jr.&#039;s Fiery Flotilla]] || 4# || 7 stars including Spin Dig 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== World 2 ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Puzzle Plank Galaxy]] || 6 || The Grand Star in World 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Hightail Falls Galaxy]] || 6 || 1 star from Puzzle Plank&lt;br /&gt;
|-&lt;br /&gt;
| [[Boulder Bowl Galaxy]] || 6 || 1 star from Puzzle Plank&lt;br /&gt;
|-&lt;br /&gt;
| [[Cosmic Cove Galaxy]] || 6 || 1 star from Hightail Falls or Boulder Bowl&lt;br /&gt;
|-&lt;br /&gt;
| [[Wild Glide Galaxy]] || 4 || 1 star from Hightail Falls or Boulder Bowl&lt;br /&gt;
|-&lt;br /&gt;
| [[Honeybloom Galaxy]] || 4 || 1 star from Hightail Falls or Boulder Bowl&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser&#039;s Lava Lair]] || 4# || 16 stars including one from Wild Glide, Honeybloom or Cosmic Cove&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== World 3 ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Tall Trunk Galaxy]] || 6 || The Grand Star in World 2&lt;br /&gt;
|-&lt;br /&gt;
| [[Cloudy Court Galaxy]] || 6 || The Grand Star in World 2&lt;br /&gt;
|-&lt;br /&gt;
| [[Haunty Halls Galaxy]] || 6 || 1 star from Tall Trunk or Freezy Flake&lt;br /&gt;
|-&lt;br /&gt;
| [[Freezy Flake Galaxy]] || 6 || 1 star from Cloudy Court or Haunty Halls&lt;br /&gt;
|-&lt;br /&gt;
| [[Rolling Masterpiece Galaxy]] || 4 || 1 star from Freezy Flake&lt;br /&gt;
|-&lt;br /&gt;
| [[Beat Block Galaxy]] || 4 || Haunty Halls 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser Jr&#039;s. Fearsome Fleet]] || 4# || 28 stars&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== World 4 ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Supermassive Galaxy]] || 6 || The Grand Star in World 3&lt;br /&gt;
|-&lt;br /&gt;
| [[Flipsvile Galaxy]] || 6 || Supermassive 1 or Sweet Mystery 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Starshine Beach Galaxy]] || 6 || Flipsvile 1 or Honeyhop 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Chompworks Galaxy]] || 6 || Flipsvile 1 or Honeyhop 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Sweet Mystery Galaxy]] || 4 || The Grand Star in World 3&lt;br /&gt;
|-&lt;br /&gt;
| [[Honeyhop Galaxy]] || 4 || 1 star from Supermassive&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser&#039;s Gravity Gauntlet]] || 4# || 40 stars including either Starshine Beach 1 or Chompworks 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== World 5 ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Space Storm Galaxy]] || 6 || The Grand Star from World 4&lt;br /&gt;
|-&lt;br /&gt;
| [[Slipsand Galaxy]] || 6 || Space Storm 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Shiverburn Galaxy]] || 6 || Space Storm 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Boo Moon Galaxy]] || 6 || Space Storm 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Upside Dizzy Galaxy]] || 4 || Space Storm 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Fleet Glide Galaxy]] || 4 || Space Storm 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser Jr.&#039;s Boom Bunker]] || 4# || 55 stars including Space Storm 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== World 6 ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Melty Monster Galaxy]] || 6 || The Grand Star from World 5&lt;br /&gt;
|-&lt;br /&gt;
| [[Clockwork Ruins Galaxy]] || 6 || 1 star from Melty Monster&lt;br /&gt;
|-&lt;br /&gt;
| [[Throwback Galaxy]] || 6 || 60 stars including 1 from Clockwork Ruins&lt;br /&gt;
|-&lt;br /&gt;
| [[Battle Belt Galaxy]] || 6 || 65 including Throwback 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Flash Black Galaxy]] || 4 || 1 star from Melty Monster&lt;br /&gt;
|-&lt;br /&gt;
| [[Slimy Spring Galaxy]] || 4 || Flash Black 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser&#039;s Galaxy Generator]] || 4# || 70 stars including one from either Battle Belt or Slimy Spring&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== World S ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Mario Squared Galaxy]] || 4 || The Grand Star from World 6&lt;br /&gt;
|-&lt;br /&gt;
| [[Rolling Coaster Galaxy]] || 4 || 75 stars including Mario Squared 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Twisty Trials Galaxy]] || 4 || 80 stars including Rolling Coaster 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Silver Cyclone Galaxy]] || 4 || 90 stars including Twisty Trials 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Boss Blitz Galaxy]] || 4 || 100 stars including Silver Cyclone 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Flip-Out Galaxy]] || 4 || 110 stars including Boss Blitz 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Grandmaster Galaxy]] || 2 || 240 stars with no Bronze Stars&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Category:List_of_Super_Mario_Galaxy_1_Galaxies&amp;diff=205</id>
		<title>Category:List of Super Mario Galaxy 1 Galaxies</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Category:List_of_Super_Mario_Galaxy_1_Galaxies&amp;diff=205"/>
		<updated>2023-03-05T03:00:17Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category contains all the galaxies in Super Mario Galaxy 1.&lt;br /&gt;
&lt;br /&gt;
LEGEND:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* Has one of the Green Stars&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;^ Has a Luigi secret star&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# Has a Grand Star&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Terrace ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Good Egg Galaxy]] || 6^ || 1 star&lt;br /&gt;
|-&lt;br /&gt;
| [[Honeyhive Galaxy]] || 6^ || 3 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Loopdeeloop Galaxy]] || 1 || 5 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Flipswitch Galaxy]] || 1 || 7 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser Jr.&#039;s Robot Reactor]] || 1# || 8 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Sweet Sweet Galaxy]] || 1 || 7 stars&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fountain ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Space Junk Galaxy]] || 6 || 9 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Rolling Green Galaxy]] || 1 || 11 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Battlerock Galaxy]] || 7*^ || 12 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Hurry-Scurry Galaxy]] || 1 || 18 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser&#039;s Star Reactor]] || 1# || 15 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Sling Pod Galaxy]] || 1 || Space Junk Galaxy 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Kitchen ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Beach Bowl Galaxy]] || 6 || 16 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Bubble Breeze Galaxy]] || 1 || 19 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Ghostly Galaxy]] || 6 || 20 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Buoy Base Galaxy]] || 2* || 30 stars including Beach Bowl Galaxy 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser Jr.&#039;s Airship Armada]] || 1# || 23 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Drip Drop Galaxy]] || 1 || Beach Bowl Galaxy 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Bedroom ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Gusty Garden Galaxy]] || 6 || 24 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Freezeflame Galaxy]] || 6 || 26 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Dusty Dune Galaxy]] || 7* || 29 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Honeyclimb Galaxy]] || 1 || 42 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser&#039;s Dark Matter Plant]] || 1# || 33 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Bigmouth Galaxy]] || 1 || Dusty Dune Galaxy 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Engine Room ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Gold Leaf Galaxy]] || 6 || 34 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Sea Slide Galaxy]] || 6 || 36 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Toy Time Galaxy]] || 6 || 40 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Bonefin Galaxy]] || 1 || 55 stars including Drip Drop Galaxy 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser Jr.&#039;s Lava Reactor]] || 1# || 45 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Sand Spiral Galaxy]] || 1 || Sea Slide Galaxy 2 and Ghostly Galaxy 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Gate ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Gateway Galaxy]] || 2# || Bowser Jr.&#039;s Lava Reactor 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Boo&#039;s Boneyard Galaxy]] || 1 || Gateway Galaxy 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Garden ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Deep Dark Galaxy]] || 6 || 46 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Dreadnought Galaxy]] || 6 || 48 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Matter Splatter Galaxy]] || 1 || 50 stars including Toy Time Galaxy 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Melty Molten Galaxy]] || 6 || 52 stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Snow Cap Galaxy]] || 1 || Melty Molten Galaxy 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Trial Galaxies ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars || Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Rolling Gizmo Galaxy]] || 1 || All three Green Stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Bubble Blast Galaxy]] || 1 || All three Green Stars&lt;br /&gt;
|-&lt;br /&gt;
| [[Loopdeeswoop Galaxy]] || 1 || All three Green Stars&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars || Access requirement&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser&#039;s Galaxy Reactor]] || 1# || 60 stars including Bowser&#039;s Dark Matter Plant 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Grand Finale Galaxy]] || 1 || All 120 other stars collected as both Mario and Luigi&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=Category:List_of_Super_Mario_Galaxy_1_Galaxies&amp;diff=188</id>
		<title>Category:List of Super Mario Galaxy 1 Galaxies</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=Category:List_of_Super_Mario_Galaxy_1_Galaxies&amp;diff=188"/>
		<updated>2023-03-04T22:10:42Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: not done yet btw&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category contains all the galaxies in Super Mario Galaxy 1.&lt;br /&gt;
&lt;br /&gt;
LEGEND:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;* Has one of the Green Stars&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;^ Has a Luigi secret star&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;# Is a Grand Star&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Terrance ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! No. Stars required&lt;br /&gt;
|-&lt;br /&gt;
| [[Good Egg Galaxy]] || 6^ || 1&lt;br /&gt;
|-&lt;br /&gt;
| [[Honeyhive Galaxy]] || 6^ || 3&lt;br /&gt;
|-&lt;br /&gt;
| [[Loopdeeloop Galaxy]] || 1 || 5&lt;br /&gt;
|-&lt;br /&gt;
| [[Flipswitch Galaxy]] || 1 || 7&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser Jr.&#039;s Robot Reactor]] || 1# || 8&lt;br /&gt;
|-&lt;br /&gt;
| [[Sweet Sweet Galaxy]] || 1 || 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fountain ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! No. Stars required&lt;br /&gt;
|-&lt;br /&gt;
| [[Space Junk Galaxy]] || 6 || 9&lt;br /&gt;
|-&lt;br /&gt;
| [[Rolling Green Galaxy]] || 1 || 11&lt;br /&gt;
|-&lt;br /&gt;
| [[Battlerock Galaxy]] || 7*^ || 12&lt;br /&gt;
|-&lt;br /&gt;
| [[Hurry-Scurry Galaxy]] || 1 || 18&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser&#039;s Star Reactor]] || 1# || 15&lt;br /&gt;
|-&lt;br /&gt;
| [[Sling Pod Galaxy]] || 1 || Complete Space Junk 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Kitchen ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! No. Stars required&lt;br /&gt;
|-&lt;br /&gt;
| [[Beach Bowl Galaxy]] || 6 || 16&lt;br /&gt;
|-&lt;br /&gt;
| [[Bubble Breeze Galaxy]] || 1 || 19&lt;br /&gt;
|-&lt;br /&gt;
| [[Ghostly Galaxy]] || 6 || 20&lt;br /&gt;
|-&lt;br /&gt;
| [[Buoy Base Galaxy]] || 2* || 30 (Beach Bowl 1 must also be completed)&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser Jr.&#039;s Airship Armada || 1# || 23&lt;br /&gt;
|-&lt;br /&gt;
| [[Drip Drop Galaxy]] || 1 || Complete Beach Bowl 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Bedroom ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! No. Stars required&lt;br /&gt;
| [[Gusty Garden Galaxy]] || 6 || 24&lt;br /&gt;
|-&lt;br /&gt;
| [[Freezeflame Galaxy]] || 6 || 26&lt;br /&gt;
|-&lt;br /&gt;
| [[Dusty Dune Galaxy]] || 7* || 29&lt;br /&gt;
|-&lt;br /&gt;
| [[Honeyclimb Galaxy]] || 1 || 42&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser&#039;s Dark Matter Planet]] || 1# || 33&lt;br /&gt;
|-&lt;br /&gt;
| [[Bigmouth Galaxy]] || 1 || Collect Dusty Dune 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Engine Room ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! No. Stars required&lt;br /&gt;
| [[Gold Leaf Galaxy]] || 6 || 34&lt;br /&gt;
|-&lt;br /&gt;
| [[Sea Slide Galaxy]] || 6 || 36&lt;br /&gt;
|-&lt;br /&gt;
| [[Toy Time Galaxy]] || 6 || 40&lt;br /&gt;
|-&lt;br /&gt;
| [[Bonefin Galaxy]] || 1 || 55 (Drip Drop must also be collected)&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser Jr.&#039;s Lava Reactor]] || 1# || 45&lt;br /&gt;
|-&lt;br /&gt;
| [[Sand Spiral Galaxy]] || 1 || Collect Sea Slide 2 and Ghostly Galaxy 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Gate ==&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars !! No. Stars required&lt;br /&gt;
| [[Deep Dark Galaxy]] || 6 || 46&lt;br /&gt;
|-&lt;br /&gt;
| [[Dreadnought Galaxy]] || 6 || 48&lt;br /&gt;
|-&lt;br /&gt;
| [[Matter Splatter Galaxy]] || 1 || 50 (Toy Time 1 must also be collected)&lt;br /&gt;
|-&lt;br /&gt;
| [[Melty Molten Galaxy]] || 6 || 52&lt;br /&gt;
|-&lt;br /&gt;
| [[Snow Cap Galaxy]] || 1 || Collect Melty Molten 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
These Galaxies do not really have a dome (Gateway kind of, but not really) so they are here instead.&lt;br /&gt;
{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! No. of Stars || No. Stars Required&lt;br /&gt;
| [[Gateway Galaxy]] || 2 || Collect the Engine Room&#039;s Grand Star&lt;br /&gt;
|-&lt;br /&gt;
| [[Boo&#039;s Boneyard Galaxy]] || 1 || Complete Gateway 2&lt;br /&gt;
|-&lt;br /&gt;
| [[Bowser&#039;s Galaxy Reactor]] || 1# || 60 (The bedroom Grand Star must be collected)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=155</id>
		<title>File system</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=155"/>
		<updated>2022-08-19T04:11:35Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Reverted edits by GalaxyMaster (talk) to last revision by Lord-Giganticus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== SMG1 ==&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Filesystem&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Name !! Number of Subdirs !! Number of Files&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetAddressMap || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetModuleData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AudioRes || 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| Debug || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| HomeButton2 || 0 || 3&lt;br /&gt;
|-&lt;br /&gt;
| LayoutData || 0 || 92&lt;br /&gt;
|-&lt;br /&gt;
| MapPartsData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| ModuleData || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| MovieData || 0 || 9&lt;br /&gt;
|-&lt;br /&gt;
| ObjectData || 0 || 1,844&lt;br /&gt;
|-&lt;br /&gt;
| ParticleData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| StageData || 48 || 279&lt;br /&gt;
|-&lt;br /&gt;
| SystemData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | opening.bnr&lt;br /&gt;
|}&lt;br /&gt;
=== Regional folders ===&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Language Folders&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Region || Name || Present in game files&lt;br /&gt;
|-&lt;br /&gt;
| China || CnSimpChinese || Yes (Nvida Release)&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuDutch || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuGerman || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuItalian || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuSpanish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Japan || JpJapanese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| South Korea || KrKorean || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsSpanish || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SMG2 ==&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG2 Filesystem&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Name !! Number of Subdirs !! Number of Files&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetAddressMap || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetModuleData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AudioRes || 5 || 714&lt;br /&gt;
|-&lt;br /&gt;
| Debug || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| HomeButton2 || 0 || 3&lt;br /&gt;
|-&lt;br /&gt;
| LayoutData || 0 || 89&lt;br /&gt;
|-&lt;br /&gt;
| LightData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| LocalizeData || &#039;&#039;&#039;VARIES&#039;&#039;&#039; || &#039;&#039;&#039;VARIES&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MapPartsData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| ModuleData || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| ObjectData || 0 || 1,576&lt;br /&gt;
|-&lt;br /&gt;
| ParticleData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| StageData || 529 || 949&lt;br /&gt;
|-&lt;br /&gt;
| SystemData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | opening.bnr&lt;br /&gt;
|}&lt;br /&gt;
=== Regional Folders ===&lt;br /&gt;
Unlike SMG1, SMG2&#039;s region specific folders are placed in LocalizeData with 2 subdirs just like SMG1.&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG2 Language Folders&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Region || Name || Present in game files&lt;br /&gt;
|-&lt;br /&gt;
| Taiwan || AsTradChinese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnSimpChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnTradChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuDutch || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuGerman || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuItalian || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuSpanish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Japan || JpJapanese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| South Korea || KrKorean || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsSpanish || Yes&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Monobook.css&amp;diff=148</id>
		<title>MediaWiki:Monobook.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Monobook.css&amp;diff=148"/>
		<updated>2022-08-19T02:24:54Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;/* All CSS here will be loaded for users of the MonoBook skin */ /* Dark Mode fixes */ .client-js.client-darkmode .mw-wiki-logo { 	filter: invert( 1 ) hue-rotate( 180deg ) }&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the MonoBook skin */&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Vector-2022.css&amp;diff=147</id>
		<title>MediaWiki:Vector-2022.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Vector-2022.css&amp;diff=147"/>
		<updated>2022-08-19T02:24:31Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;/* Dark Mode fixes */ .client-js.client-darkmode .mw-wiki-logo { 	filter: invert( 1 ) hue-rotate( 180deg ) }&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=User:Lord-Giganticus/vector-2022.css&amp;diff=146</id>
		<title>User:Lord-Giganticus/vector-2022.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=User:Lord-Giganticus/vector-2022.css&amp;diff=146"/>
		<updated>2022-08-19T02:24:06Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=User:Lord-Giganticus/vector-2022.css&amp;diff=145</id>
		<title>User:Lord-Giganticus/vector-2022.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=User:Lord-Giganticus/vector-2022.css&amp;diff=145"/>
		<updated>2022-08-19T02:23:08Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;/* Dark Mode fixes */ .client-js.client-darkmode .mw-wiki-logo { 	filter: invert( 1 ) hue-rotate( 180deg ) }&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Vector.css&amp;diff=144</id>
		<title>MediaWiki:Vector.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Vector.css&amp;diff=144"/>
		<updated>2022-08-19T02:21:52Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the Vector skin */&lt;br /&gt;
&lt;br /&gt;
.client-js.client-darkmode {&lt;br /&gt;
	background: #f6f6f6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=143</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=143"/>
		<updated>2022-08-19T02:21:34Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Timeless.css&amp;diff=142</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Timeless.css&amp;diff=142"/>
		<updated>2022-08-19T02:21:15Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the Timeless skin */&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Timeless.css&amp;diff=141</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Timeless.css&amp;diff=141"/>
		<updated>2022-08-19T02:19:34Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the Timeless skin */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo.timeless-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Timeless.css&amp;diff=140</id>
		<title>MediaWiki:Timeless.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Timeless.css&amp;diff=140"/>
		<updated>2022-08-19T02:18:56Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;/* All CSS here will be loaded for users of the Timeless skin */  /* Dark Mode fixes */ .client-js.client-darkmode .mw-wiki-logo { 	filter: invert( 1 ) hue-rotate( 180deg ) }&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the Timeless skin */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=138</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=138"/>
		<updated>2022-08-19T02:13:04Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Vector.css&amp;diff=137</id>
		<title>MediaWiki:Vector.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Vector.css&amp;diff=137"/>
		<updated>2022-08-19T02:12:59Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;/* All CSS here will be loaded for users of the Vector skin */  .client-js.client-darkmode { 	background: #f6f6f6; }&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the Vector skin */&lt;br /&gt;
&lt;br /&gt;
.client-js.client-darkmode {&lt;br /&gt;
	background: #f6f6f6;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=132</id>
		<title>File system</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=132"/>
		<updated>2022-08-19T01:08:53Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: /* Regional folders */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== SMG1 ==&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Filesystem&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Name !! Number of Subdirs !! Number of Files&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetAddressMap || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetModuleData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AudioRes || 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| Debug || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| HomeButton2 || 0 || 3&lt;br /&gt;
|-&lt;br /&gt;
| LayoutData || 0 || 92&lt;br /&gt;
|-&lt;br /&gt;
| MapPartsData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| ModuleData || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| MovieData || 0 || 9&lt;br /&gt;
|-&lt;br /&gt;
| ObjectData || 0 || 1,844&lt;br /&gt;
|-&lt;br /&gt;
| ParticleData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| StageData || 48 || 279&lt;br /&gt;
|-&lt;br /&gt;
| SystemData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | opening.bnr&lt;br /&gt;
|}&lt;br /&gt;
=== Regional folders ===&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Language Folders&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Region || Name || Present in game files&lt;br /&gt;
|-&lt;br /&gt;
| China || CnSimpChinese || Yes (Nvida Release)&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuDutch || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuGerman || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuItalian || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuSpanish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Japan || JpJapanese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| South Korea || KrKorean || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsSpanish || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SMG2 ==&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG2 Filesystem&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Name !! Number of Subdirs !! Number of Files&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetAddressMap || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetModuleData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AudioRes || 5 || 714&lt;br /&gt;
|-&lt;br /&gt;
| Debug || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| HomeButton2 || 0 || 3&lt;br /&gt;
|-&lt;br /&gt;
| LayoutData || 0 || 89&lt;br /&gt;
|-&lt;br /&gt;
| LightData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| LocalizeData || &#039;&#039;&#039;VARIES&#039;&#039;&#039; || &#039;&#039;&#039;VARIES&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MapPartsData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| ModuleData || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| ObjectData || 0 || 1,576&lt;br /&gt;
|-&lt;br /&gt;
| ParticleData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| StageData || 529 || 949&lt;br /&gt;
|-&lt;br /&gt;
| SystemData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | opening.bnr&lt;br /&gt;
|}&lt;br /&gt;
=== Regional Folders ===&lt;br /&gt;
Unlike SMG1, SMG2&#039;s region specific folders are placed in LocalizeData with 2 subdirs just like SMG1.&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG2 Language Folders&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Region || Name || Present in game files&lt;br /&gt;
|-&lt;br /&gt;
| Taiwan || AsTradChinese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnSimpChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnTradChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuDutch || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuGerman || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuItalian || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuSpanish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Japan || JpJapanese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| South Korea || KrKorean || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsSpanish || Yes&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=131</id>
		<title>File system</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=131"/>
		<updated>2022-08-19T01:05:12Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: /* SMG2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== SMG1 ==&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Filesystem&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Name !! Number of Subdirs !! Number of Files&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetAddressMap || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetModuleData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AudioRes || 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| Debug || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| HomeButton2 || 0 || 3&lt;br /&gt;
|-&lt;br /&gt;
| LayoutData || 0 || 92&lt;br /&gt;
|-&lt;br /&gt;
| MapPartsData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| ModuleData || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| MovieData || 0 || 9&lt;br /&gt;
|-&lt;br /&gt;
| ObjectData || 0 || 1,844&lt;br /&gt;
|-&lt;br /&gt;
| ParticleData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| StageData || 48 || 279&lt;br /&gt;
|-&lt;br /&gt;
| SystemData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | opening.bnr&lt;br /&gt;
|}&lt;br /&gt;
=== Regional folders ===&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Language Folders&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Region || Name || Present in game files&lt;br /&gt;
|-&lt;br /&gt;
| Taiwan || AsTradChinese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnSimpChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnTradChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuDutch || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuGerman || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuItalian || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuSpanish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Japan || JpJapanese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| South Korea || KrKorean || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsSpanish || Yes&lt;br /&gt;
|}&lt;br /&gt;
== SMG2 ==&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG2 Filesystem&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Name !! Number of Subdirs !! Number of Files&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetAddressMap || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetModuleData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AudioRes || 5 || 714&lt;br /&gt;
|-&lt;br /&gt;
| Debug || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| HomeButton2 || 0 || 3&lt;br /&gt;
|-&lt;br /&gt;
| LayoutData || 0 || 89&lt;br /&gt;
|-&lt;br /&gt;
| LightData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| LocalizeData || &#039;&#039;&#039;VARIES&#039;&#039;&#039; || &#039;&#039;&#039;VARIES&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MapPartsData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| ModuleData || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| ObjectData || 0 || 1,576&lt;br /&gt;
|-&lt;br /&gt;
| ParticleData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| StageData || 529 || 949&lt;br /&gt;
|-&lt;br /&gt;
| SystemData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | opening.bnr&lt;br /&gt;
|}&lt;br /&gt;
=== Regional Folders ===&lt;br /&gt;
Unlike SMG1, SMG2&#039;s region specific folders are placed in LocalizeData with 2 subdirs just like SMG1.&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG2 Language Folders&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Region || Name || Present in game files&lt;br /&gt;
|-&lt;br /&gt;
| Taiwan || AsTradChinese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnSimpChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnTradChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuDutch || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuGerman || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuItalian || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuSpanish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Japan || JpJapanese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| South Korea || KrKorean || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsSpanish || Yes&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=130</id>
		<title>File system</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=130"/>
		<updated>2022-08-19T00:59:51Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== SMG1 ==&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Filesystem&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Name !! Number of Subdirs !! Number of Files&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetAddressMap || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetModuleData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AudioRes || 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| Debug || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| HomeButton2 || 0 || 3&lt;br /&gt;
|-&lt;br /&gt;
| LayoutData || 0 || 92&lt;br /&gt;
|-&lt;br /&gt;
| MapPartsData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| ModuleData || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| MovieData || 0 || 9&lt;br /&gt;
|-&lt;br /&gt;
| ObjectData || 0 || 1,844&lt;br /&gt;
|-&lt;br /&gt;
| ParticleData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| StageData || 48 || 279&lt;br /&gt;
|-&lt;br /&gt;
| SystemData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | opening.bnr&lt;br /&gt;
|}&lt;br /&gt;
=== Regional folders ===&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Language Folders&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Region || Name || Present in game files&lt;br /&gt;
|-&lt;br /&gt;
| Taiwan || AsTradChinese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnSimpChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnTradChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuDutch || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuGerman || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuItalian || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuSpanish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Japan || JpJapanese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| South Korea || KrKorean || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsSpanish || Yes&lt;br /&gt;
|}&lt;br /&gt;
== SMG2 ==&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG2 Filesystem&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Name !! Number of Subdirs !! Number of Files&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetAddressMap || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetModuleData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AudioRes || 5 || 714&lt;br /&gt;
|-&lt;br /&gt;
| Debug || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| HomeButton2 || 0 || 3&lt;br /&gt;
|-&lt;br /&gt;
| LayoutData || 0 || 89&lt;br /&gt;
|-&lt;br /&gt;
| LightData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| LocalizeData || &#039;&#039;&#039;VARIES&#039;&#039;&#039; || &#039;&#039;&#039;VARIES&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MapPartsData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| ModuleData || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| ObjectData || 0 || 1,576&lt;br /&gt;
|-&lt;br /&gt;
| ParticleData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| StageData || 529 || 949&lt;br /&gt;
|-&lt;br /&gt;
| SystemData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | opening.bnr&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=129</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=129"/>
		<updated>2022-08-19T00:45:42Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.client-js.client-darkmode {&lt;br /&gt;
	background: #f6f6f6;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=128</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=128"/>
		<updated>2022-08-19T00:44:24Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.client-js.client-darkmode {&lt;br /&gt;
	background: black&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=127</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=127"/>
		<updated>2022-08-19T00:43:31Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.client-js.client-darkmode {&lt;br /&gt;
	background: #090909;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=126</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=126"/>
		<updated>2022-08-19T00:42:12Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.client-js.client-darkmode {&lt;br /&gt;
	background: white;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=125</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=125"/>
		<updated>2022-08-19T00:41:43Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.client-js.client-darkmode {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=124</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=124"/>
		<updated>2022-08-19T00:37:33Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fixes */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.client-js.client-darkmode {&lt;br /&gt;
	background: white;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=123</id>
		<title>File system</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=123"/>
		<updated>2022-08-19T00:28:17Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== SMG1 ==&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Filesystem&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Name !! Number of Subdirs !! Number of Files&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetAddressMap || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AllTargetModuleData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| AudioRes || 5 || 1&lt;br /&gt;
|-&lt;br /&gt;
| Debug || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| HomeButton2 || 0 || 3&lt;br /&gt;
|-&lt;br /&gt;
| LayoutData || 0 || 92&lt;br /&gt;
|-&lt;br /&gt;
| MapPartsData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| ModuleData || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| MovieData || 0 || 9&lt;br /&gt;
|-&lt;br /&gt;
| ObjectData || 0 || 1,844&lt;br /&gt;
|-&lt;br /&gt;
| ParticleData || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
| StageData || 48 || 279&lt;br /&gt;
|-&lt;br /&gt;
| SystemData || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! colspan=3 | opening.bnr&lt;br /&gt;
|}&lt;br /&gt;
=== Regional folders ===&lt;br /&gt;
{| class=&amp;quot;textbox grid alt center&amp;quot; style=&amp;quot;border:1px solid #aaa; margin: auto; text-align: center&amp;quot; rules=all&lt;br /&gt;
|- style=background:#ccccff&lt;br /&gt;
! colspan=3 | SMG1 Language Folders&lt;br /&gt;
|- style=background:white&lt;br /&gt;
! Region || Name || Present in game files&lt;br /&gt;
|-&lt;br /&gt;
| Taiwan || AsTradChinese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnSimpChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Chinese || CnTradChinese || No&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuDutch || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuGerman || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuItalian || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Europe || EuSpanish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| Japan || JpJapanese || Yes&lt;br /&gt;
|-&lt;br /&gt;
| South Korea || KrKorean || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsEnglish || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsFrench || Yes&lt;br /&gt;
|-&lt;br /&gt;
| USA || UsSpanish || Yes&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=122</id>
		<title>File system</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=File_system&amp;diff=122"/>
		<updated>2022-08-18T23:26:35Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: Created page with &amp;quot;&amp;lt;table class=&amp;quot;navbox&amp;quot; border=&amp;quot;0&amp;quot; style=&amp;quot;align-content: left; text-align: center&amp;quot;&amp;gt; &amp;lt;tr&amp;gt;&amp;lt;th colspan=&amp;quot;16&amp;quot; style=&amp;quot;border-left:2px solid #fdfdfd;width:100%;&amp;quot;&amp;gt;SMG1 Filesystem&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td width=&amp;quot;1px&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt; &amp;lt;table style=&amp;quot;width: 150px; height: 250px; display:flex; flex-direction: column; overflow:auto&amp;quot;&amp;gt; &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 150px;&amp;quot;&amp;gt;dev&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table class=&amp;quot;navbox&amp;quot; border=&amp;quot;0&amp;quot; style=&amp;quot;align-content: left; text-align: center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th colspan=&amp;quot;16&amp;quot; style=&amp;quot;border-left:2px solid #fdfdfd;width:100%;&amp;quot;&amp;gt;SMG1 Filesystem&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td width=&amp;quot;1px&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 150px; height: 250px; display:flex; flex-direction: column; overflow:auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 150px;&amp;quot;&amp;gt;dev&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=121</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://mariogalaxy.org/w/index.php?title=MediaWiki:Common.css&amp;diff=121"/>
		<updated>2022-08-18T23:25:57Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* Dark Mode fix */&lt;br /&gt;
.client-js.client-darkmode .mw-wiki-logo {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Other */&lt;br /&gt;
&lt;br /&gt;
.navbox {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    margin: auto;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tbody {&lt;br /&gt;
    display: table-row-group;&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
    border-color: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tr {&lt;br /&gt;
    display: table-row;&lt;br /&gt;
    vertical-align: inherit;&lt;br /&gt;
    border-color: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.navbox th {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding-left: 1em;&lt;br /&gt;
    padding-right: 1em;&lt;br /&gt;
    background: #ccccff;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
</feed>