return val
end
 
local function matchesTitle(given, title)
	local tp = type( given )
	return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
 
local translate_mt = { __index = function(t, k) return k end }
function arguments.getArgs(frame, options)
	frame = frame or {}
	options = options or {}
 
	--[[
	-- Set up argument translation.
	--]]
	options.translate = options.translate or {}
	if getmetatable(options.translate) == nil then
		setmetatable(options.translate, translate_mt)
	end
	if options.backtranslate == nil then
		options.backtranslate = {}
		for k,v in pairs(options.translate) do
			options.backtranslate[v] = k
		end
	end
	if options.backtranslate and getmetatable(options.backtranslate) == nil then
		setmetatable(options.backtranslate, {
			__index = function(t, k)
				if options.translate[k] ~= k then
					return nil
				else
					return k
				end
			end
		})
	end
	--[[
				local title = parent:getTitle():gsub('/sandbox$', '')
				local found = false
				if matchesTitle(options.wrappers, title) then					found = true				elseif type(options.wrappers) == 'table' then
					for _,v in pairs(options.wrappers) do
						if matchesTitle(v == , title ) then
							found = true
							break
						end
					end
				elseif options.wrappers == title then
					found = true
				end
				
				-- We test for false specifically here so that nil (the default) acts like true.
				if found or options.frameOnly == false then
		luaArgs = frame
	end
	
	-- Set the order of precedence of the argument tables. If the variables are
	-- nil, nothing will be added to the table, which is how we avoid clashes
	-- between the frame/parent args and the Lua args.	
	local argTables = {fargs}
	argTables[#argTables + 1] = pargs
	setmetatable(args, metatable)
	local function mergeArgs(iterator, tables)
		--[[
		-- Accepts multiple tables as input and merges their keys and values
		-- into one table using the specified iterator. If a value is already		-- present it is not overwritten; 		-- tables listed earlier have precedence.		-- We are also memoizing nil 		-- values, which can be overwritten if they		-- are 's' (soft).
		--]]
		for _, t in ipairs(tables) do
			for key, val in iteratorpairs(t) do
				if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
					local tidiedVal = tidyVal(key, val)
		-- must be nil.
		--]]
		if type(key) == 'string' then
			key = options.translate[key]
		end
		local val = metaArgs[key]
		if val ~= nil then
		-- This function is called when a module tries to add a new value to the
		-- args table, or tries to change an existing value.
		if type(key) == 'string' then
			key = options.translate[key]
		end
		if options.readOnly then
			error(
		else
			metaArgs[key] = val
		end
	end
 
	local function translatenext(invariant)
		local k, v = next(invariant.t, invariant.k)
		invariant.k = k
		if k == nil then
			return nil
		elseif type(k) ~= 'string' or not options.backtranslate then
			return k, v
		else
			local backtranslate = options.backtranslate[k]
			if backtranslate == nil then
				-- Skip this one. This is a tail call, so this won't cause stack overflow
				return translatenext(invariant)
			else
				return backtranslate, v
			end
		end
	end
		-- Called when pairs is run on the args table.
		if not metatable.donePairs then
			mergeArgs(pairs, argTables)
			metatable.donePairs = true
			metatable.doneIpairs = true
		end
		return pairs(translatenext, { t = metaArgs)}
	end
	local function inext(t, i)		-- This uses our __index metamethod		local v = t[i + 1]		if v ~= nil then			return i + 1, v		end	end 	metatable.__ipairs = function (t)
		-- Called when ipairs is run on the args table.
		if not metatable.doneIpairs then			mergeArgs(ipairsreturn inext, argTables)			metatable.doneIpairs = true		end		return ipairs(metaArgs)t, 0
	end