localp={}-- Returns the permission required to perform a given action on a given title.-- If no title is specified, the title of the page being displayed is used.functionp._main(action,pagename)localtitleiftype(pagename)=='table'andpagename.prefixedTextthentitle=pagenameelseifpagenamethentitle=mw.title.new(pagename)elsetitle=mw.title.getCurrentTitle()endpagename=title.prefixedTextifaction=='autoreview'thenlocallevel=mw.getCurrentFrame():callParserFunction('PENDINGCHANGELEVEL',pagename)iflevel=='review'thenreturn'reviewer'elseiflevel~=''thenreturnlevelelsereturnnil-- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can reviewendelseifaction~='edit'andaction~='move'andaction~='create'andaction~='upload'thenerror('First parameter must be one of edit, move, create, upload, autoreview',2)endiftitle.namespace==8then-- MediaWiki namespacereturn'sysop'elseiftitle.namespace==2andtitle.isSubpageand(title.contentModel=='javascript'ortitle.contentModel=='css')then-- user JS or CSS pagereturn'sysop'endlocallevel=title.protectionLevels[action]andtitle.protectionLevels[action][1]iflevel=='sysop'orlevel=='editprotected'thenreturn'sysop'elseiftitle.cascadingProtection.restrictions[action]andtitle.cascadingProtection.restrictions[action][1]then-- used by a cascading-protected pagereturn'sysop'elseiflevel=='templateeditor'thenreturn'templateeditor'elseifaction=='move'thenlocalblacklistentry=mw.ext.TitleBlacklist.test('edit',pagename)-- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move.ifblacklistentryandnotblacklistentry.params.autoconfirmedthenreturn'templateeditor'elseiftitle.namespace==6thenreturn'filemover'elsereturn'autoconfirmed'endendlocalblacklistentry=mw.ext.TitleBlacklist.test(action,pagename)ifblacklistentrythenreturnblacklistentry.params.autoconfirmedand'autoconfirmed'or'templateeditor'elseiflevel=='editsemiprotected'then-- create-semiprotected pages return this for some reasonreturn'autoconfirmed'elseiflevelthenreturnlevelelseifaction=='upload'thenreturn'autoconfirmed'elseifaction=='create'andtitle.namespace%2==0andtitle.namespace~=118then-- You need to be registered, but not autoconfirmed, to create non-talk pages other than draftsreturn'user'elsereturn'*'endendsetmetatable(p,{__index=function(t,k)returnfunction(frame)returnt._main(k,frame.args[1])endend})returnp