% Copyright (c) 2006-2011 Philipp Lehman.
%               2012-2017 Philip Kime, Audrey Boruvka, Joseph Wright
%
% Permission is granted to copy, distribute and/or modify this
% software under the terms of the LaTeX Project Public License
% (LPPL), version 1.3c.
%
% This software is provided 'as is', without warranty of any kind,
% either expressed or implied, including, but not limited to, the
% implied warranties of merchantability and fitness for a
% particular purpose.

% Set up the version strings here
\def\abx@date{2017/11/05}
\def\abx@version{3.8a}
\def\abx@bbxid{\abx@date\space v\abx@version\space biblatex bibliography style (PK/JW/AB)}
\def\abx@cbxid{\abx@date\space v\abx@version\space biblatex citation style (PK/JW/AB)}
\def\abx@lbxid{\abx@date\space v\abx@version\space biblatex localization (PK/JW/AB)}
\def\abx@cptid{\abx@date\space v\abx@version\space biblatex compatibility (PK/JW/AB)}

% This is not updated by build script as the control file version
% does not necessarily change with the package version.
% This is used when writing the .bcf
\def\blx@bcfversion{3.4}

% This is not updated by build script as the bbl version
% does not necessarily change with the package version.
% This is used when checking the .bbl
\def\blx@bblversion{2.9}

\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{biblatex}
[\abx@date\space v\abx@version\space programmable bibliographies (PK/JW/AB)]

%% Dependencies
\RequirePackage{pdftexcmds}
\RequirePackage{etoolbox}
\RequirePackage{keyval}
\RequirePackage{kvoptions}
\RequirePackage{logreq}
\RequirePackage{ifthen}
\RequirePackage{url}
\RequirePackage{xstring}
%\RequirePackage{trace}

\@ifpackagelater{etoolbox}{2010/11/29}
  {}
  {\PackageError{biblatex}
     {Outdated 'etoolbox' package}
     {Upgrade to etoolbox v2.1 (2010/11/29) or later.\MessageBreak
      I found: '\csuse{ver@etoolbox.sty}'.\MessageBreak
      This is a fatal error. I'm aborting now.}%
   \endinput}

\@ifpackagelater{xstring}{2013/10/13}
  {}
  {\PackageError{biblatex}
     {Outdated 'xstring' package}
     {Upgrade to xstring v1.7c (2013/10/13) or later.\MessageBreak
      I found: '\csuse{xstringversion}'.\MessageBreak
      This is a fatal error. I'm aborting now.}%
   \endinput}

% polyglossia pretends to be babel, so we need to make sure
% we are definitely talking to babel here.
\AtEndPreamble{%
  \@ifpackageloaded{polyglossia}
    {}
    {\@ifpackageloaded{babel}
       {\@ifpackagelater{babel}{2016/04/23}
          {}
          {\PackageError{biblatex}
             {Outdated 'babel' package}
             {Upgrade to babel 3.9r (2016/04/23) or later.\MessageBreak
              I found: '\csuse{ver@babel.sty}'.\MessageBreak
              This is a fatal error. I'm aborting now.}%
            \endinput}}
       {}}}

%% Category codes

\def\blx@docatcodes{%
  \do\=\do\<\do\>\do\-\do\"\do\'\do\`\do\.%
  \do\,\do\;\do\:\do\!\do\?\do\/}
\def\do#1{\catcode\number`#1=\the\catcode`#1\relax}
\edef\blx@catcodes{\blx@docatcodes\do\^\do\~\do\&\do\|}
\let\do\noexpand

\def\blx@saneccodes{%
  \catcode`\~=\active
  \let\do\@makeother
  \blx@docatcodes
  \let\do\noexpand}

\blx@saneccodes
\catcode`\&=3
\catcode`\|=3
\catcode`\^=7
\def\blx@nl{^^J}

%% Compatibility

\begingroup
\catcode`\#=12
\gdef\blx@patchbidifootnotes{%
  \patchcmd\@footnotetext
    {#1}
    {\toggletrue{blx@footnote}#1}
    {\togglefalse{blx@tempa}}
    {}%
  \patchcmd\@LTRfootnotetext
    {#1}
    {\toggletrue{blx@footnote}#1}
    {\togglefalse{blx@tempa}}
    {}%
  \patchcmd\@RTLfootnotetext
    {#1}
    {\toggletrue{blx@footnote}#1}
    {\togglefalse{blx@tempa}}
    {}}
\endgroup

\AtEndPreamble{%
  \def\do#1{%
    \@ifpackageloaded{#1}
      {\blx@error
         {Incompatible package '#1'}
         {The '#1' package and biblatex are incompatible}}
      {}}%
  \docsvlist{%
    amsrefs,apacite,babelbib,backref,bibtopic,bibunits,chapterbib,
    cite,citeref,drftcite,footbib,inlinebib,jurabib,mcite,mciteplus,
    mlbib,multibbl,multibib,natbib,opcit,overcite,splitbib,ucs,etextools}%
  \def\blx@langstrings{}%
  % Set up sortlocale defaults and default language if babel/polyglossia is not loaded
  \ifdefstring\blx@sortlocale{auto}
    {\ifdef\bbl@main@language% babel or polyglossia is loaded
      {\edef\blx@sortlocale{\bbl@main@language}}
      {\def\blx@sortlocale{english}}}
    {}%
  \@ifpackageloaded{polyglossia}
    {% This is required for languages which are never explicitly selected
     % This check because \xpg@loaded is not defined in polyglossia <= v1.42.0
     \ifundef\xpg@loaded
       {\let\xpg@loaded\@empty
        \let\xpg@vloaded\@empty
        \PackageWarningNoLine{biblatex}{Upgrade package 'polyglossia' to > v1.42.0 recommended}}
       {}%
     \def\do#1{\blx@langsetup{#1}}%
     \expandafter\docsvlist\expandafter{\xpg@loaded}%
     \expandafter\docsvlist\expandafter{\xpg@vloaded}%
     \ifboolexpr{
      not test {\iftoggle{blx@autolangbib}}
      and
      not test {\iftoggle{blx@autolangcite}}}
       {\blx@mknoautolang}
       {\blx@mkautolangpoly}}
    {\@ifpackageloaded{babel}
      {% This is required for languages which are never explicitly selected
       \def\do#1{\blx@langsetup{#1}}%
       \expandafter\docsvlist\expandafter{\bbl@loaded}%
       \ifboolexpr{
        not test {\iftoggle{blx@autolangbib}}
        and
        not test {\iftoggle{blx@autolangcite}}}
         {\blx@mknoautolang}
         {\blx@mkautolangbabel}}
      {\blx@mknoautolang}}%
  % These already have defaults set to basically do nothing
  % so if the toggles are true, we need to define again since
  % mkautolang* redefines \blx@beglang
  % In turn, \blx@beglang defines \blx@endlang and so \blx@beglangcite and
  % \blx@endlangcite need redefining inside \blx@beglang after \blx@endlang
  % has been defined.
  \iftoggle{blx@autolangbib}
    {\let\blx@beglangbib\blx@beglang}
    {}%
  \iftoggle{blx@autolangcite}
    {\let\blx@beglangcite\blx@beglang}
    {}%
  \csuse{abx@extras@\blx@languagename}%
  \csuse{abx@strings@\blx@languagename}%
  \undef\blx@mkautolangbabel
  \undef\blx@mkautolangpoly
  \undef\blx@mknoautolang
  \ifnum\blx@hyperref=\thr@@
  \else
    \ifnum\blx@hyperref=\z@
      \blx@mknohyperref
    \else
      \@ifpackageloaded{hyperref}
        {\blx@mkhyperref}
        {\ifnum\blx@hyperref=\@ne
           \blx@warning@noline{%
             Missing 'hyperref' package.\MessageBreak
             Setting 'hyperref=false'}%
         \fi
         \blx@mknohyperref}%
    \fi
    \undef\blx@mkhyperref
    \undef\blx@mknohyperref
  \fi
  \providecommand*{\nolinkurl}{\url}%
  \ifundef\TE@hook
    {\let\TE@hook\@empty
     \toggletrue{blx@tempa}%
     \def\do#1{%
       \patchcmd#1%
         {\let\isundefined\TE@undef}
         {\let\isundefined\TE@undef\TE@hook}
         {\togglefalse{blx@tempa}\listbreak}
         {}}%
     \docsvlist{%
       \ifthenelse,%          ifthen
       \org@ifthenelse,%      babel
       \HyOrg@ifthenelse,%    hyperref
       \NROrg@ifthenelse}%    nameref
     \iftoggle{blx@tempa}
       {\blx@err@patch{'ifthen' package}}
       {}}
    {}%
  \appto\TE@hook{\blx@TE@hook}%
  \toggletrue{blx@tempa}%
  \def\do#1{%
    \patchcmd#1%
      {\color@begingroup}
      {\color@begingroup\toggletrue{blx@footnote}}
      {\togglefalse{blx@tempa}\listbreak}
      {}}%
  \docsvlist{%
    \@footnotetext,%          latex
    \H@@footnotetext,%        hyperref
    \V@@footnotetext,%        fancyvrb
    \scr@saved@footnotetext,% koma-script 3.x
    \l@dold@footnotetext,%    ledmac
    \l@doldold@footnotetext,% ledmac
    \predefinedfootnotetext,% linguex
    \@fntORI}%                frenchle
  \iftoggle{blx@tempa}%       ams classes
    {\patchcmd\@footnotetext
       {\@makefntext}
       {\toggletrue{blx@footnote}\@makefntext}
       {\togglefalse{blx@tempa}}
       {}}
    {}%
  \@ifpackageloaded{bidi}%    bidi
    {\blx@patchbidifootnotes}
    {}%
  \@ifclassloaded{memoir}
    {\def\do#1{%
       \patchcmd#1%
         {\color@begingroup}
         {\color@begingroup\toggletrue{blx@footnote}}
         {}
         {}}%
     \docsvlist{%
       \m@mold@footnotetext,%
       \@plainfootnotetext,%
       \@twocolfootnotetext,%
       \@threecolfootnotetext,%
       \@parafootnotetext}%
     \def\do#1{%
       \patchcmd#1%
         {\color@begingroup\@makefntext}
         {\color@begingroup\toggletrue{blx@footnote}\@makefntext}
         {}
         {}}%
     \docsvlist{%
       \@footnotetext,% patch twice
       \H@@footnotetext,% patch twice
       \@plainfootnotetext}}
    {}%
  \iftoggle{blx@tempa}
    {\blx@warning@noline{%
       Patching footnotes failed.\MessageBreak
       Footnote detection will not work}}
    {}%
  \@ifpackageloaded{endnotes}
    {\patchcmd\theendnotes
       {\enoteformat}
       {\toggletrue{blx@footnote}\enoteformat}
       {}
       {\blx@err@patch{'endnotes' package}}}
    {}%
  \@ifpackageloaded{bigfoot}
    {\apptocmd\@makefnstartbox
       {\toggletrue{blx@footnote}}
       {}
       {\blx@err@patch{'bigfoot' package}}}
    {}%
  \@ifpackageloaded{showkeys}
    {\ifdef\SK@
       {\AtEveryBibitem{\SK@\SK@@label{\thefield{entrykey}}}%
        \AtEveryLositem{\SK@\SK@@label{\thefield{entrykey}}}%
        \ifundef\SK@cite % = 'notcite' disabled
          {\AtEveryCitekey{\SK@\SK@@ref{\thefield{entrykey}}}}
          {}}
       {}}
    {}%
  \apptocmd\@floatboxreset
    {\boolfalse{citetracker}%
     \boolfalse{pagetracker}}
    {}
    {\blx@err@patch{floats}}%
  \ifdef\TX@endtabularx % tabularx/memoir
    {\pretocmd\TX@endtabularx
      {\addtocounter{tabx@nest}{1}}% track nested tabularx environments
      {}
      {\blx@err@patch{'tabularx'}}%
      % no need to conditionalise on top-level tabx as the search/replace
      % will only match once anyway
     \patchcmd\TX@endtabularx
      {\edef\TX@ckpt{\cl@@ckpt}}
      {\edef\TX@ckpt{\cl@@ckpt\abx@resttrackers}%
       \abx@savetrackers}
      {}
      {\blx@err@patch{'tabularx'}}%
     \apptocmd\TX@endtabularx
      {\ifnum\value{tabx@nest}=1% only clear trackers for top-level tabularx
         \abx@cleartrackers
       \fi
       \addtocounter{tabx@nest}{-1}}
      {}
      {\blx@err@patch{'tabularx'}}}
    {}%
  \@ifpackageloaded{csquotes}
    {\@ifpackagelater{csquotes}{2009/05/30}
       {}
       {\blx@error
          {Outdated 'csquotes' package}
          {Upgrade to csquotes v4.4 (2009/05/30) or later.\MessageBreak
           I found: '\csuse{ver@csquotes.sty}'}}%
     \BlockquoteDisable{\let\blx@thecheckpunct\@gobble}%
     \@ifpackagelater{csquotes}{2009/08/27}
       {\appto\@blockquote@prehook{\abx@savetrackers}%
        \appto\@blockquote@posthook{\abx@resttrackers\abx@cleartrackers}}
       {}%
     \@ifpackagelater{csquotes}{2010/06/09}
       {}
       {\newcommand*{\@quotereset}{}\newcount\@quotereset}}
    {\@ifpackageloaded{babel}
       {\blx@warning@noline{%
          'babel/polyglossia' detected but 'csquotes' missing.\MessageBreak
          Loading 'csquotes' recommended}}
       {}%
     \newcommand*{\@quotelevel}{}%
     \newcount\@quotelevel
     \newcommand*{\@quotereset}{}%
     \newcount\@quotereset
     \newcommand*{\@setquotesfcodes}{}%
     \let\@setquotesfcodes\relax
     \newrobustcmd*{\initoquote}{\@quotelevel\@ne}%
     \newrobustcmd*{\initiquote}{\@quotelevel\tw@}%
     \newrobustcmd*{\textooquote}{``}%
     \newrobustcmd*{\textcoquote}{''}%
     \newrobustcmd*{\textoiquote}{`\relax}% block ligs
     \newrobustcmd*{\textciquote}{'\relax}% block ligs
     \newrobustcmd*{\enquote}{\@ifstar\blx@enquote@ii\blx@enquote}%
     \def\blx@enquote{%
       \ifnum\@quotelevel>\z@
         \expandafter\blx@enquote@ii
       \else
         \expandafter\blx@enquote@i
       \fi}%
     \long\def\blx@enquote@i#1{%
       \begingroup\initoquote
       \textooquote#1\textcoquote
       \endgroup}%
     \long\def\blx@enquote@ii#1{%
       \begingroup\initiquote
       \textoiquote#1\textciquote
       \endgroup}%
     \appto\blx@setsfcodes{%
       \sfcode`\`=\z@
       \sfcode`\'=\z@}}%
  \let\do\noexpand}

\begingroup
\@makeother\#
% \relax: gobble newline -> titletoc.sty
\AtEndPreamble{%
  \addtocontents{toc}{%
     \boolfalse{citerequest}%
     \boolfalse{citetracker}%
     \boolfalse{pagetracker}%
     \boolfalse{backtracker}\relax}%
  \addtocontents{lof}{%
     \boolfalse{citerequest}%
     \boolfalse{citetracker}%
     \boolfalse{pagetracker}%
     \boolfalse{backtracker}\relax}%
  \addtocontents{lot}{%
     \boolfalse{citerequest}%
     \boolfalse{citetracker}%
     \boolfalse{pagetracker}%
     \boolfalse{backtracker}\relax}%
  \patchcmd\addtocontents
    {\string\@writefile}
    {\string\@writefile{#1}{\defcounter{refsection}{\the\c@refsection}\relax}%
     \string\@writefile}
    {}
    {\blx@err@patch{\string\addtocontents}}}
\endgroup

% trick hyperref into believing we're natbib
\let\NAT@parse\@empty
% trick showkeys into believing we're havard
\let\HAR@checkdef\@empty

%% Allocation

\providecommand{\@gobblefive}[5]{}

% Counter to track nested tabularx environemnts so we don't
% try to patch the commands more than once below as this undefs some
% macros and an error is thrown
\newcounter{tabx@nest}
\setcounter{tabx@nest}{0}

\newcounter{listtotal}
\def\thelisttotal{\the\c@listtotal}
\newcounter{listcount}
\def\thelistcount{\the\c@listcount}
\newcounter{liststart}
\def\theliststart{\the\c@liststart}
\newcounter{liststop}
\def\theliststop{\the\c@liststop}
\newcounter{citecount}
\def\thecitecount{\the\c@citecount}
\newcounter{citetotal}
\def\thecitetotal{\the\c@citetotal}
\newcounter{multicitecount}
\def\themulticitecount{\the\c@multicitecount}
\newcounter{multicitetotal}
\def\themulticitetotal{\the\c@multicitetotal}
\newcounter{instcount}
\def\theinstcount{\the\c@instcount}
\newcounter{maxnames}
\def\themaxnames{\the\c@maxnames}
\newcounter{minnames}
\def\theminnames{\the\c@minnames}
\newcounter{maxitems}
\def\themaxitems{\the\c@maxitems}
\newcounter{minitems}
\def\theminitems{\the\c@minitems}
\newcounter{citecounter}
\def\thecitecount{\the\c@citecounter}
\newcounter{savedcitecounter}
\def\thecitecount{\the\c@savedcitecounter}
\newcounter{uniquelist}
\def\theuniquelist{\the\c@uniquelist}
\newcounter{uniquename}
\def\theuniquename{\the\c@uniquename}
\newcounter{refsection}
\def\therefsection{\the\c@refsection}
\newcounter{refsegment}
\def\therefsegment{\the\c@refsegment}
\newcounter{maxextratitle}
\def\themaxextratitle{\the\c@maxextratitle}
\newcounter{maxextratitleyear}
\def\themaxextratitleyear{\the\c@maxextratitleyear}
\newcounter{maxextradate}
\def\themaxextradate{\the\c@maxextradate}
\newcounter{maxextraalpha}
\def\themaxextraalpha{\the\c@maxextraalpha}
\newcounter{abbrvpenalty}
\def\theabbrvpenalty{\the\c@abbrvpenalty}
\newcounter{highnamepenalty}
\def\thehighnamepenalty{\the\c@highnamepenalty}
\newcounter{lownamepenalty}
\def\thelownamepenalty{\the\c@lownamepenalty}
\newcounter{maxparens}
\def\themaxparens{\the\c@maxparens}
\newcounter{parenlevel}
\def\theparenlevel{\the\c@parenlevel}

\newcount\blx@tempcnta
\newcount\blx@tempcntb
\newcount\blx@tempcntc
\newcount\blx@maxsection
\expandafter\newcount\csname blx@maxsegment@0\endcsname
\newcount\blx@notetype
\newcount\blx@parenlevel@text
\newcount\blx@parenlevel@foot
\expandafter\newcount\csname blx@sectionciteorder@0\endcsname

\def\blx@uniquename{0}
\def\blx@uniquelist{0}
\def\blx@maxbibnames{0}
\def\blx@minbibnames{0}
\def\blx@maxcitenames{0}
\def\blx@mincitenames{0}
\def\blx@maxbibnames@type{\blx@maxbibnames}
\def\blx@minbibnames@type{\blx@minbibnames}
\def\blx@maxcitenames@type{\blx@maxcitenames}
\def\blx@mincitenames@type{\blx@mincitenames}
\def\blx@maxalphanames{0}
\def\blx@minalphanames{0}
\def\blx@maxitems{0}
\def\blx@minitems{0}
\def\blx@maxitems@type{\blx@maxitems}
\def\blx@minitems@type{\blx@minitems}

\newlength{\labelnumberwidth}
\newlength{\labelalphawidth}
\newlength{\biblabelsep}
\ifdef\bibitemsep % memoir
  {}
  {\newlength{\bibitemsep}}
\newlength{\bibnamesep}
\newlength{\bibinitsep}
\newlength{\bibparsep}
\newlength{\bibhang}

\newbool{refcontextdefaults}
\booltrue{refcontextdefaults}%
\newbool{sourcemap}
\newbool{citetracker}
\newbool{pagetracker}
\newbool{backtracker}
\newbool{citerequest}
\booltrue{citerequest}
\newbool{sortcites}

\newtoggle{blx@bbldone}
\newtoggle{blx@tempa}
\newtoggle{blx@tempb}
\newtoggle{blx@runltx}
\newtoggle{blx@runbiber}
\newtoggle{blx@block}
\newtoggle{blx@unit}
\newtoggle{blx@skipentry}
\newtoggle{blx@insert}
\newtoggle{blx@lastins}
\newtoggle{blx@keepunit}
\newtoggle{blx@bibtex}
\newtoggle{blx@debug}
\newtoggle{blx@sortcase}
\newtoggle{blx@sortupper}
\newtoggle{blx@autolangbib}
\newtoggle{blx@autolangcite}
\newtoggle{blx@clearlang}
\newtoggle{blx@defernumbers}
\newtoggle{blx@omitnumbers}
\newtoggle{blx@footnote}
\newtoggle{blx@labelalpha}
\newtoggle{blx@labelnumber}
\newtoggle{blx@labeltitle}
\newtoggle{blx@labeltitleyear}
\newtoggle{blx@labeldateparts}
\newtoggle{blx@natbib}
\newtoggle{blx@mcite}
\newtoggle{blx@loadfiles}
\newtoggle{blx@singletitle}
\newtoggle{blx@sortsets}
\newtoggle{blx@crossrefsource}
\newtoggle{blx@xrefsource}
\newtoggle{blx@uniqueprimaryauthor}
\newtoggle{blx@uniquetitle}
\newtoggle{blx@uniquebaretitle}
\newtoggle{blx@uniquework}
\newtoggle{blx@terseinits}
\newtoggle{blx@useprefix}
\newtoggle{blx@addset}
\newtoggle{blx@setonly}
\newtoggle{blx@dataonly}
\newtoggle{blx@skipbib}
\newtoggle{blx@skipbiblist}
\newtoggle{blx@skiplab}
\newtoggle{blx@citation}
\newtoggle{blx@bibliography}
\newtoggle{blx@citeindex}
\newtoggle{blx@bibindex}
\newtoggle{blx@localnumber}
\newtoggle{blx@refcontext}
\newtoggle{blx@nosuffrecurse}

% Nice command from etextools which causes too many problems if you load
% the whole package
% Don't use it on arbitrary user input as it dies on non-expandable arguments
\newcommand*{\blx@xifempty}[1]{\blx@xifstrcmp{#1}{}}
% {string1}{string2}{true}{false}
\newcommand*{\blx@xifstrcmp}[2]{\csname @%
  \ifnum\pdf@strcmp{#1}{#2}=0 first\else second\fi
  oftwo\endcsname}

% Special fields which need resolution using the information provided by biber
\listadd\abx@rfields{labeltitle}
\def\abx@dorfields{%
  \dolistloop\abx@rfields%
}
\listadd\abx@rnames{labelname}
\def\abx@dornames{%
  \dolistloop\abx@rnames%
}

% Used to track default refcontexts for citations
\cslet{blx@defaultrefcontexts@0}\@empty
\listadd\blx@allrefsections{0}

% Used to track sorting name key specifications
\global\let\blx@sortingnamekeytemplates\@empty

% Used to track uniquename templates
\global\let\blx@untemplatespecs\@empty

% Used to track labelalphaname templates
\global\let\blx@lantemplatespecs\@empty

% Used to track transliterations
\global\let\blx@translits\@empty

% Use to track every entry found in .bbl
% Used to issue defernumbers warning about missing keys because this causes
% defernumbers labelling to fail.
\global\let\blx@entries\@empty

% Initialise some lists which track changing citations/sortingtemplates
% etc. between runs
\global\let\blx@cites\@empty
\global\let\blx@refcontexts\@empty
\global\let\blx@lastrefcontexts\@empty
\global\let\blx@sortingtemplatenames\@empty
\global\let\blx@dlistnames\@empty
\global\let\blx@biblists\@empty
\global\let\blx@lastbiblists\@empty
\global\let\blx@lastcites\@empty
\global\let\blx@localnumaux\@empty

\newread\blx@bcfin
\newwrite\blx@bcfout

\def\blx@onlypreamble#1{%
  \gappto\blx@dopreamblecmds{\do#1}}

\def\blx@dopreamblecmds{%
  \do\blx@dopreamblecmds
  \do\blx@onlypreamble}

% Deprecations
\newrobustcmd*{\DeprecateField}[2]{%
  \csdef{abx@field@#1}{%
    \ifcsundef{abx@field@legacy@warning@#1}{\blx@warning@noline{Field '#1' is deprecated. #2}}{}%
    \global\csdef{abx@field@legacy@warning@#1}{}}}%
\newrobustcmd*{\DeprecateList}[2]{%
  \csdef{abx@list@#1}{%
    \ifcsundef{abx@list@legacy@warning@#1}{\blx@warning@noline{List '#1' is deprecated. #2}}{}%
    \global\csdef{abx@list@legacy@warning@#1}{}}}%
\newrobustcmd*{\DeprecateName}[2]{%
  \csdef{abx@name@#1}{%
    \ifcsundef{abx@name@legacy@warning@#1}{\blx@warning@noline{Name '#1' is deprecated. #2}}{}%
    \global\csdef{abx@name@legacy@warning@#1}{}}}%

\let\blx@aliasfields\@empty

\newrobustcmd*{\DeprecateFieldWithReplacement}[2]{%
  \appto\blx@aliasfields{%
    \ifcsundef{abx@field@#2}
      {}
      {\csdef{abx@field@#1}{%
        \csuse{abx@field@#2}%
        \ifcsundef{abx@field@legacy@warning@#1}
          {\blx@warning@noline{Field '#1' is deprecated.\MessageBreak
             Please use '#2' instead.\MessageBreak
             Using '#2' now}}
          {}%
        \global\csdef{abx@field@legacy@warning@#1}{}}}}}

\newrobustcmd*{\DeprecateListWithReplacement}[2]{%
  \appto\blx@aliasfields{%
    \ifcsundef{abx@list@#2}
      {}
      {\csdef{abx@list@#1}{%
        \csuse{abx@list@#2}%
        \ifcsundef{abx@list@legacy@warning@#1}
          {\blx@warning@noline{List '#1' is deprecated.\MessageBreak
             Please use '#2' instead.\MessageBreak
             Using '#2' now}}
          {}%
        \global\csdef{abx@list@legacy@warning@#1}{}}}}}

\newrobustcmd*{\DeprecateNameWithReplacement}[2]{%
  \appto\blx@aliasfields{%
    \ifcsundef{abx@name@#2}
      {}
      {\csdef{abx@name@#1}{%
        \csuse{abx@name@#2}%
        \ifcsundef{abx@name@legacy@warning@#1}
          {\blx@warning@noline{Name '#1' is deprecated.\MessageBreak
             Please use '#2' instead.\MessageBreak
             Using '#2' now}}
          {}%
        \global\csdef{abx@name@legacy@warning@#1}{}}}}}

%% Initialisation
\def\blx@blxinit{%
  \let\blx@blxinit\relax
  \blx@initunit}

\def\blx@secinit{%
  \csgdef{blx@sections@\the\c@refsection}{true}% just to say we have a section for tests later
  \ifcsundef{blx@bsee@\the\c@refsection}
    {\global\cslet{blx@bsee@\the\c@refsection}\@empty}
    {}%
  \ifcsundef{blx@fsee@\the\c@refsection}
    {\global\cslet{blx@fsee@\the\c@refsection}\@empty}
    {}%
  \blx@ibidreset@force
  \blx@idemreset@force
  \blx@opcitreset@force
  \blx@loccitreset@force
  % List to track all aliases in a section. We need to output all aliases
  % to the .bcf every time so that they are visible to biber
  % Reset only if undefined
  \ifcsundef{blx@keyaliases@\the\c@refsection}
    {\global\cslet{blx@keyaliases@\the\c@refsection}\@empty}
    {}%
  \ifcsundef{blx@segm@\the\c@refsection @\the\c@refsegment}
    {\global\cslet{blx@segm@\the\c@refsection @\the\c@refsegment}\@empty}
    {}}

%% Auxiliary commands
\protected\def\blx@safe@actives{%
  \let\blx@if@safe@actives\if@safe@actives
  \let\if@safe@actives\iftrue}

\protected\def\blx@rest@actives{%
  \let\if@safe@actives\blx@if@safe@actives}

\protected\def\blx@regimc#1{%
  \xappto\blx@blxinit{%
    \let\noexpand#1\expandafter\noexpand\csname
    blx@imc@\expandafter\@gobble\string#1\endcsname}}

\protected\def\blx@regimcs#1{\blx@regimcs@i#1&}
\def\blx@regimcs@i#1{%
  \ifx#1&\else
    \blx@regimc#1%
    \expandafter\blx@regimcs@i
  \fi}

% {<field>} => \do{<item1>}\do{<item2>}...
\def\blx@imc@docsvfield#1{%
  \blx@imc@iffieldundef{#1}
    {}
    {\expandafter\expandafter\expandafter\docsvlist
     \expandafter\expandafter\expandafter{%
       \csname abx@field@#1\endcsname}}}

% {<handler>}{<field>} => <handler>{<item1>}<handler>{<item2>}...
\def\blx@imc@forcsvfield#1#2{%
  \blx@imc@iffieldundef{#2}
    {}
    {\expandafter\expandafter\expandafter\blx@imc@forcsvfield@i
     \expandafter\expandafter\expandafter{%
       \csname abx@field@#2\endcsname}{#1}}}

\def\blx@imc@forcsvfield@i#1#2{\forcsvlist{#2}{#1}}

\blx@regimcs{\docsvfield \forcsvfield}

% {<list>|<listmacro>}
\protected\long\def\blx@listloop#1{%
  \expandafter\blx@listloop@i#1|&}
\long\def\blx@listloop@i#1|{%
  \ifblank{#1}
    {\blx@break}
    {\blx@do{#1}\blx@listloop@i}}

\long\def\blx@break#1&{%
  \blx@done
  \undef\blx@do
  \undef\blx@done}

% {<listmacro>}{<listcsname>} => matches in <listmacro>
\protected\def\blx@filter#1#2{%
  \def\do##1{%
    \ifinlistcs{##1}{#2}
      {\listadd#1{##1}}
      {}}%
  \blx@runfilter#1}

% {<listmacro>}{<listcsname>} => matches in <listmacro>
% Slightly odd use of filtering to do citation sorting.
% Same as blx@filter but it keeps \tempcnta in step with the
% resulting number of things in the filtered list. This is
% because \tempcnta is used to set citetotal - this use
% of filtering for cite sorting has the side-effect of stripping
% duplicates like \cite{foo,foo} but we need then to keep citetotal
% in sync.
\protected\def\blx@filtercitesort#1#2{%
 \blx@tempcnta\z@
 \def\do##1{%
   \ifinlistcs{##1}{#2}
     {\listadd#1{##1}%
      \advance\blx@tempcnta\@ne}
     {}}%
 \blx@runfilter#1}

% {<listmacro>}{<listcsname>} => neg. matches in <listmacro>
\protected\def\blx@notfilter#1#2{%
  \def\do##1{%
    \ifinlistcs{##1}{#2}
      {}
      {\listadd#1{##1}}}%
  \blx@runfilter#1}

\def\blx@runfilter#1{%
  \begingroup\edef#1{\endgroup
    \unexpanded{\let#1\@empty\dolistloop}{#1}}%
  #1\let\do\noexpand}

% {<code>}{<string>} => <code>{<string>}
\protected\def\blx@xsanitizeafter#1#2{%
  \begingroup
  \abx@hook@xsanitize
  \def\blx@tempa{\endgroup#1}%
  \edef\blx@tempb{#2}%
  \expandafter\blx@tempa
  \expandafter{\detokenize\expandafter{\blx@tempb}}}

\def\abx@hook@xsanitize{%
  \blx@safe@actives
  \let\protect\string}

% {<code>}{<string>} => <code>{<string>}
\begingroup
\catcode`\<=\active
\catcode`\>=\active
\catcode`\&=\active
\catcode`\"=\active
\catcode`\'=\active
\protected\gdef\blx@xmlsanitizeafter#1#2{%
  \begingroup
  \abx@hook@xsanitize
  \def\blx@tempa{\endgroup#1}%
  \edef\blx@tempb{#2}%
  \let\do\@makeother
  \dospecials
  \catcode`\<=\active
  \catcode`\>=\active
  \catcode`\&=\active
  \catcode`\"=\active
  \catcode`\'=\active
  \edef<{\string&lt\string;}%
  \edef>{\string&gt\string;}%
  \edef&{\string&amp\string;}%
  \edef"{\string&quot\string;}%
  \edef'{\string&apos\string;}%
  \endlinechar\m@ne
  \everyeof{\noexpand}%
  \edef\blx@tempb{\scantokens\expandafter{\blx@tempb}}%
  \expandafter\blx@tempa
  \expandafter{\detokenize\expandafter{\blx@tempb}}}
\endgroup

% {<file>}{<message>}{<preload>}{<postload>}{<success>}{<failure>}
\protected\long\def\blx@inputonce#1#2#3#4#5#6{%
  \ifcsundef{blx@file@#1}
    {\blx@info@noline{Trying to load #2..}%
     \IfFileExists{#1}
       {\blx@info@noline{... file '#1' found}%
        \listxadd\blx@list@req@stat{#1}%
        #3\@@input\@filef@und#4#5}
       {\blx@info@noline{... file '#1' not found}#6}%
     \global\csdef{blx@file@#1}{}%
     \@addtofilelist{#1}}
    {#5}}

% {<write>}{<precode>}{<string>}
\protected\def\blx@auxwrite#1#2#3{%
  \if@filesw
    \begingroup
    \blx@safe@actives
    \let\protect\string
    #2%
    \immediate\write#1{#3}%
    \endgroup
  \fi}

% {<file>}{<signature>}{<true>}{<false>}
\def\blx@ifsigned#1#2{%
  \begingroup
  \let\blx@tempa\@firstoftwo
  \edef\blx@tempb{\csuse{blx@sig@#2}}%
  \edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}%
  \openin\blx@bcfin #1.#2\relax
    \ifeof\blx@bcfin
    \else
      \endlinechar\m@ne
      \readline\blx@bcfin to \blx@tempc
      \ifeof\blx@bcfin
      \else
        \ifx\blx@tempb\blx@tempc
          \readline\blx@bcfin to \blx@tempc
          \edef\blx@tempb{\csuse{blx@ver@#2}}%
          \edef\blx@tempb{\detokenize\expandafter{\blx@tempb}}%
          \ifx\blx@tempb\blx@tempc
          \else
            \blx@warning@noline{%
              File '#1.#2' is wrong format version - expected \blx@bblversion}
          \fi
        \else
          \blx@error
            {File '#1.#2' not created by biblatex}
            {This file was apparently not created by biblatex.
             Rename it or\MessageBreak move it to a location were
             TeX will not find it. If this error\MessageBreak
             persists, consider redefining \string\blxauxsuffix.%
             See the biblatex\MessageBreak manual for details}%
          \let\blx@tempa\@secondoftwo
        \fi
      \fi
    \fi
  \closein\blx@bcfin
  \expandafter\endgroup\blx@tempa}

\edef\blx@sig@bbl{\@percentchar\space $ biblatex auxiliary file $}
\edef\blx@ver@bbl{\@percentchar\space $ biblatex bbl format version \blx@bblversion\space $}
\edef\blx@sig@bcf{\detokenize{<?xml version="1.0" encoding="UTF-8"?>}}
\edef\blx@ver@bcf{%
  \detokenize{<bcf:controlfile version="}\blx@bcfversion
  \detokenize{" bltxversion="}\abx@version
  \detokenize{" xmlns:bcf="https://sourceforge.net/projects/biblatex">}}

% {<true>}{<false>}
\newrobustcmd*{\lbx@ifutfinput}{\ifboolexpr{%
  test {\ifdefstring\inputencodingname{utf8}}
  or
  test {\ifdefstring\inputencodingname{utf8x}}
  or
  test {\ifdefstring\inputencodingname{lutf8}}
  or
  ( test {\ifundef\inputencodingname}
    and
    ( not test {\ifundef\XeTeXrevision}
      or
      not test {\ifundef\luatexversion}
    )
  )
}}

%% User feedback

\protected\def\blx@error#1#2{%
  \begingroup
  \blx@safe@actives
  \PackageError{biblatex}{#1}{#2.}%
  \endgroup}

\protected\def\blx@warning@noline#1{%
  \begingroup
  \blx@safe@actives
  \PackageWarningNoLine{biblatex}{#1}%
  \endgroup}
\let\blx@warning\blx@warning@noline
\AtEndOfPackage{
  \protected\def\blx@warning#1{%
    \begingroup
    \blx@safe@actives
    \PackageWarning{biblatex}{#1}%
    \endgroup}}

\protected\def\blx@warning@entry#1{%
  \ifdef\abx@field@entrykey
    {\blx@warning{#1\MessageBreak at entry '\abx@field@entrykey'}}
    {\blx@warning{#1}}}

\protected\def\blx@info@noline#1{%
  \begingroup
  \blx@safe@actives
  \PackageInfo{biblatex}{#1\@gobble}%
  \endgroup}
\let\blx@info\blx@info@noline
\AtEndOfPackage{
  \protected\def\blx@info#1{%
    \begingroup
    \blx@safe@actives
    \PackageInfo{biblatex}{#1}%
    \endgroup}}

\let\blx@noline\@gobble
\AtEndOfPackage{\let\blx@noline\@empty}
\def\blx@imc@BibliographyWarning{\blx@warning@entry}
\blx@regimc\BibliographyWarning

\protected\def\abx@missing#1{%
  \mbox{\reset@font\bfseries#1}}

\def\blx@err@patch#1{%
  \blx@error
    {Patching #1 failed}
    {This is an internal issue typically caused by a
     conflict\MessageBreak between biblatex and some
     other package. Modifying\MessageBreak the package
     loading order may fix the problem}}

\def\blx@err@nolang#1{%
  \blx@error
    {Language '#1' not found}
    {The localization module for '#1' could not be found}}

\def\blx@err@invarg#1#2{%
  \blx@error
    {Argument '#1' invalid}
    {\ifblank{#2}
       {The argument you have supplied is invalid.\MessageBreak
        See the biblatex manual for details}
       {#2}}}

\def\blx@err@invopt#1#2{%
  \blx@error
    {Option '#1' invalid}
    {\ifblank{#2}
       {The option you have supplied is invalid.\MessageBreak
        See the biblatex manual for valid option keys and
        possible values}
       {#2}}}

\def\blx@err@confopt#1#2{%
  \blx@error
    {Conflicting options\ifblank{#1}{}{ (#1)}}
    {\ifblank{#2}
       {The option you have supplied conflicts with another one.\MessageBreak
        See the biblatex manual for valid option keys and possible values}
       {#2}}}

\def\blx@err@optdef#1{%
  \blx@error
    {Conflicting options}
    {The option '#1' is already defined}}

\def\blx@err@nodocdiv#1{%
  \blx@error
    {\@backslashchar#1 not provided by class}
    {The document class does not seems to support #1s}}

\def\blx@err@nosec#1{%
  \blx@error
    {Section '#1' not found}
    {The reference section '#1' could not be found}}

\def\blx@err@nosort#1{%
  \blx@error
    {Sorting template '#1' not found}
    {The sorting template '#1' does not seem to have been defined anywhere}}

\def\blx@err@secfirst{%
  \blx@error
    {'section' not first filter}
    {When passing multiple filter options,
     the 'section' filter must be given first}}

\protected\def\blx@err@nestcite{%
  \blx@error
    {Nested citation command}
    {Citation commands may not be nested}}

\def\blx@err@nestenv#1{%
  \blx@error
    {Nested '#1' environment}
    {This environment may not be nested}}

\protected\def\blx@err@citecmd#1{%
  \begingroup
  \escapechar\m@ne
  \blx@error
    {Command '\@backslashchar\string#1' undefined}
    {The citation command '\@backslashchar\string#1'
     has not been defined\MessageBreak by the
     selected citation style}%
  \endgroup}

\def\blx@err@endnote#1{%
  \blx@error
    {Missing or incomplete endnote support}
    {There does not seem to be endnote support available\MessageBreak
     or the available support is incomplete.\MessageBreak
     If you continue, I will fall back to '\string#1'}%
  #1}

\def\blx@err@matchparen#1{%
  \blx@error
    {Unbalanced parentheses or brackets}
    {\iftoggle{blx@footnote}{#1 in foot or endnote}{#1}.\MessageBreak
     This error is triggered if \string\bibopenparen\space and
     \string\bibcloseparen\MessageBreak or
     \string\bibopenbracket\space and \string\bibclosebracket\space
     are unbalanced\MessageBreak or mismatched}}

\def\blx@err@nestparen#1{%
  \blx@error
    {Too deeply nested parentheses or brackets}
    {#1 nested too deeply%
     \iftoggle{blx@footnote}{\space in foot or endnote}{}.\MessageBreak
     This error may also be triggered if \string\mkbibparens\MessageBreak
     or \string\mkbibbrackets\space are nested too deeply}}

\def\blx@err@filter{%
  \blx@error
    {Invalid filter expression}
    {The filter expression you have supplied is invalid.\MessageBreak
     See the biblatex manual for details}}

\def\blx@warn@nohyph#1{%
  \blx@warning{No hyphenation patterns for '#1'}}

\protected\def\blx@warn@citecmd#1#2{%
  \blx@warning{%
    '\string#1' not defined by citation style.\MessageBreak
    Falling back to '\string#2'}%
  #2}

\protected\def\blx@warn@nostring#1{%
  \blx@warning@entry{Bibliography string '#1' undefined}%
  \abx@missing{#1}}

\def\blx@warn@conflopt#1{%
  \blx@warning{Conflicting options.\MessageBreak#1}}

\def\blx@warn@badoptdt#1{%
  \blx@warning{Invalid option datatype '#1'.\MessageBreak Defaulting to 'boolean'}}

\def\blx@warn@depropt#1{%
  \blx@warning{Deprecated option.\MessageBreak Ignoring '#1'}}

\def\blx@warn@bibempty{%
  \@latex@warning{Empty bibliography}}

\def\blx@warn@biblistempty#1{%
  \@latex@warning{Empty biblist '#1'}}

\def\blx@inf@refsec{%
  \blx@info{Reference section=\the\c@refsection}}%

\def\blx@inf@delimdeclare#1#2{%
  \blx@info{Delimiter '#1' in context '#2' already defined, overwriting}}

\def\blx@warn@delimuse#1#2{%
  \blx@warning{Delimiter '#1' in context '#2' undefined}}

\def\blx@inf@refseg{%
  \ifnum\c@refsection=\z@
    \blx@info{Reference segment=\the\c@refsegment}%
  \else
    \blx@info{%
      Reference section/segment=%
      \the\c@refsection/\the\c@refsegment}%
  \fi}

\def\blx@inf@creset{%
  \blx@info{Resetting trackers}}%

\def\blx@msg@cundef#1{%
  Citation '#1' undefined}
\def\blx@msg@cundefon#1{%
  Citation '#1' on page \the\c@page\space undefined}

% Dummy as backend is biber by default. Some style may still use this to
% check though.
\newrobustcmd*{\RequireBiber}[1][2]{}

% \blx@list@active                      active aux files (basename)
%                                       [internal list]
% \blx@list@inactive                    inactive aux files (basename)
%                                       [internal list]
% \blx@list@bibfiles@<auxfile>          aux file -> bib file mapping (refsections)
%                                       aux file (basename) -> bib files (full)
%                                       [internal list]

\let\blx@list@active\@empty
\let\blx@list@inactive\@empty
\listeadd\blx@list@inactive{\jobname}

\protected\def\blx@regbibfiles#1#2{%
  \forlistloop{\blx@regbibfile{#1}}{#2}}

\def\blx@regbibfile#1#2{%
  \ifcsundef{blx@res@loca@#2}
    {\blx@regbibfile@i{#1}{#2}}
    {\ifcsstring{blx@res@loca@#2}{local}
       {\blx@regbibfile@i{#1}{#2}}
       {}}}

\def\blx@regbibfile@i#1#2{%
  \ifinlistcs{#2}{blx@list@bibfiles@#1}
    {}
    {\listcsxadd{blx@list@bibfiles@#1}{#2}}}

\def\blx@check@logreq{%
  \begingroup
  \ltxrequest{biblatex}{{\iftoggle{blx@runltx}{1}{0}}}{%
    \provides[type=dynamic]{
      \file{\jobname.bcf}
    }
    \requires[type=dynamic]{
      \file{\jobname.bbl}
    }
    \ifdef\blx@list@req@edit
      {\requires[type=editable]{
         \forlistloop\file\blx@list@req@edit
       }}
      {}
    \ifdef\blx@list@req@stat
      {\requires[type=static]{
         \forlistloop\file\blx@list@req@stat
       }}
      {}
  }%
  \logrequest[package=biblatex,priority=5,active={{\iftoggle{blx@runbiber}{1}{0}}}]{%
    \generic{biber}
    \cmdline{
      \binary{biber}
      \infile{\jobname}
    }
    \input{
      \file{\jobname.bcf}
    }
    \output{
      \file{\jobname.bbl}
    }
    \provides[type=dynamic]{
      \file{\jobname.bbl}
    }
    \requires[type=dynamic]{
      \file{\jobname.bcf}
    }
    \ifcsdef{blx@list@bibfiles@\jobname}
      {\requires[type=editable]{
         \def\do{\file}
         \dolistcsloop{blx@list@bibfiles@\jobname}
       }}
      {}
  }%
  \endgroup}

\def\blx@logreq@active#1{%
  \ifblank{#1}
    {}
    {\@latex@warning{#1}}%
  \blx@rerun@latex
  \blx@rerun@biber}

\def\blx@rerun@latex{%
  \G@refundefinedtrue
  \global\toggletrue{blx@runltx}%
  \global\let\blx@rerun@latex\relax}

\def\blx@rerun@biber{%
  \global\toggletrue{blx@runbiber}%
  \global\let\blx@rerun@biber\relax}

\let\blx@checksum@old\@empty
\let\blx@checksum@new\@empty
\let\blx@pagesum@old\@empty
\let\blx@pagesum@new\@empty

\def\blx@checksum#1#2#3{%
  \begingroup
  \blx@tempcnta\the\numexpr0#2*0#3\relax
  \blx@tempcntb\blx@tempcnta
  \divide\blx@tempcntb10
  \multiply\blx@tempcntb10
  \advance\blx@tempcnta-\blx@tempcntb
  \xdef#1{#1\the\blx@tempcnta}%
  \endgroup}

\def\blx@addchecksum{\blx@checksum\blx@checksum@old}
\def\blx@addpagesum{\blx@checksum\blx@pagesum@old}
\AtEndDocument{%
  \def\blx@addchecksum{\blx@checksum\blx@checksum@new}%
  \def\blx@addpagesum{\blx@checksum\blx@pagesum@new}}

\protected\def\blx@check@rerun{%
  \begingroup
  \blx@tempcnta\z@
  \iftoggle{blx@runltx}
    {\blx@tempcnta\@ne}
    {\ifx\blx@checksum@old\blx@checksum@new
       \ifx\blx@pagesum@old\blx@pagesum@new
       \else
         \blx@tempcnta\@ne
       \fi
     \else
       \blx@tempcnta\@ne
     \fi}%
  \iftoggle{blx@runbiber}
    {\advance\blx@tempcnta\tw@}
    {}%
  \ifcase\blx@tempcnta
  \or
    \blx@rerun@latex
    \blx@warning@noline{%
      Please rerun LaTeX%
      \ifx\blx@pagesum@old\blx@pagesum@new\else
        .\MessageBreak Page breaks have changed%
      \fi}%
  \else
    \blx@rerun@latex
    \blx@warn@auxlist
  \fi
  \endgroup}

\def\blx@warn@auxlist{%
  \begingroup
  \edef\blx@tempa{%
    Please (re)run Biber on the file:\MessageBreak
    \jobname}%
  \blx@warning@noline{%
    \blx@tempa\MessageBreak
    and rerun LaTeX afterwards}%
  \endgroup}

\AfterEndDocument{%
  \blx@check@rerun
  \blx@check@logreq}

%% Punctuation and capitalization

% 1001       prefix sep for names (e.g. d'Argent ... \printnames only)
% 1002       abbreviation period (dot)
% 1003/1250  comma
% 1004/1500  semicolon
% 1005/2000  colon
% 1006/3000  period
% 1007/3001  exclamation mark
% 1008/3002  question mark
% 1009       suppress punctuation
% 1010       new paragaph

\mathchardef\blx@sf@prefixchar=1001% e.g. apostrophe or equivalent for prefix handling
\mathchardef\blx@sf@dot=1002
\mathchardef\blx@sf@comma=1003
\mathchardef\blx@sf@semicolon=1004
\mathchardef\blx@sf@colon=1005
\mathchardef\blx@sf@period=1006
\mathchardef\blx@sf@exclam=1007
\mathchardef\blx@sf@question=1008
\mathchardef\blx@sf@nopunct=1009
\mathchardef\blx@sf@par=1010
\mathchardef\blx@sf@threshold@low=1002
\mathchardef\blx@sf@threshold@high=1009

\csdef{blx@sf@1250}{\the\blx@sf@comma}
\csdef{blx@sf@1500}{\the\blx@sf@semicolon}
\csdef{blx@sf@2000}{\the\blx@sf@colon}
\csdef{blx@sf@3000}{\the\blx@sf@period}
\csdef{blx@sf@3001}{\the\blx@sf@exclam}
\csdef{blx@sf@3002}{\the\blx@sf@question}

\csdef{blx@pm@,}{comma}
\csdef{blx@pm@;}{semicolon}
\csdef{blx@pm@:}{colon}
\csdef{blx@pm@.}{period}
\csdef{blx@pm@!}{exclam}
\csdef{blx@pm@?}{question}

\def\blx@setsfcodes{%
  \let\blx@setsfcodes\relax
  \let\frenchspacing\blx@setfrcodes
  \let\nonfrenchspacing\blx@setencodes
  \ifnum\sfcode`\.>2000
    \blx@setencodes
  \else
    \blx@setfrcodes
  \fi
  \@setquotesfcodes
  \sfcode`\(=\z@
  \sfcode`\)=\z@
  \sfcode`\[=\z@
  \sfcode`\]=\z@
  \sfcode`\<=\z@
  \sfcode`\>=\z@}

\def\blx@setfrcodes{%
  \ifnum\sfcode`\A=\@m
  \else
    \blx@setazcodes
  \fi
  \sfcode`\,=\blx@sf@comma
  \sfcode`\;=\blx@sf@semicolon
  \sfcode`\:=\blx@sf@colon
  \sfcode`\.=\blx@sf@period
  \sfcode`\!=\blx@sf@exclam
  \sfcode`\?=\blx@sf@question
}

\def\blx@setencodes{%
  \sfcode`\,=1250
  \sfcode`\;=1500
  \sfcode`\:=2000
  \sfcode`\.=3000
  \sfcode`\!=3001
  \sfcode`\?=3002
}

% Defining characters that count as prefices in names like d'Argent
% Code from moewe
\let\blx@prefchars\@empty

\def\blx@defprefchars@loop#1{%
  \ifx#1\relax
  \else
    \listadd{\blx@prefchars}{#1}%
    \expandafter\blx@defprefchars@loop
  \fi}

\def\blx@defprefchars#1{%
  \expandafter\blx@defprefchars@loop\detokenize{#1}\relax}

\newrobustcmd*{\DeclarePrefChars}{%
  \@ifstar
    {\blx@defprefchars}
    {\let\blx@prefchars\@empty
     \blx@defprefchars}}
\DeclarePrefChars{'’-}

\protected\def\blx@imc@ifprefchar{%
  \ifhmode
    \begingroup
    \ifnum\spacefactor=\blx@sf@prefixchar
      \endgroup
      \expandafter\expandafter
      \expandafter\@firstoftwo
    \else
      \endgroup
      \expandafter\expandafter
      \expandafter\@secondoftwo
    \fi
  \else
    \expandafter\@secondoftwo
  \fi}

\blx@regimcs{\ifprefchar}

\def\blx@namecodes{%
  \ifnum\sfcode`\A=\@m
  \else
    \blx@setazcodes
  \fi
  \def\do##1{\sfcode`##1=\blx@sf@prefixchar}%
  \dolistloop\blx@prefchars
}

\begingroup
\let\blx@setazcodes\@empty
\def\blx@tempa{%
  \xdef\blx@setazcodes{%
    \blx@setazcodes
    \sfcode\the\blx@tempcnta=\@m}
  \ifnum\blx@tempcnta<\blx@tempcntb
    \advance\blx@tempcnta\@ne
    \expandafter\blx@tempa
  \fi}
\blx@tempcnta`\A
\blx@tempcntb`\Z
\blx@tempa
\ifnum\inputlineno=\m@ne\else
  \blx@tempcnta"80
  \blx@tempcntb"9C
  \blx@tempa
  \blx@tempcnta"C0
  \blx@tempcntb"DF
  \blx@tempa
\fi
\ifx\Umathcode\undefined
\else
  \openin\blx@bcfin=UnicodeData.txt %
  \ifeof\blx@bcfin
  \else
    \let\blx@setazcodes\@empty
    \def\Lu{Lu}
    \def\storedpar{\par}
    \def\blx@tempa#1;#2;#3;#4\relax{%
      \def\temp{#3}%
      \ifx\temp\Lu
        \xdef\blx@setazcodes{%
          \blx@setazcodes
          \sfcode"#1=\@m
        }
      \fi
    }
    \loop\unless\ifeof\blx@bcfin
      \read\blx@bcfin to \blx@tempb
      \unless\ifx\blx@tempb\storedpar
        \expandafter\blx@tempa\blx@tempb\relax
      \fi
    \repeat
  \fi
  \closein\blx@bcfin
\fi
\endgroup

\def\blx@spacefactor{%
  \ifhmode
    \ifcsundef{blx@sf@\the\spacefactor}
      {\the\spacefactor}
      {\csname blx@sf@\the\spacefactor\endcsname}%
  \else
    \the\blx@sf@par
  \fi}

\protected\def\blx@leavevmode{%
  \ifhmode
  \else
    \leavevmode\spacefactor\blx@sf@par
  \fi}

\protected\def\blx@leavevmode@cite{%
  \ifhmode
    \ifnum\spacefactor=\blx@sf@par
    \else
      \spacefactor\@m
    \fi
  \else
    \leavevmode
  \fi}

\protected\def\blx@imc@setpunctfont#1{%
  \blx@ifpuncthook
    {\gdef\abx@puncthook{%
       \ifdim\lastkern>\z@\unkern\fi
       \blx@imc@resetpunctfont#1}}
    {}}
\protected\def\blx@imc@resetpunctfont{%
  \blx@ifpuncthook
    {\global\let\abx@puncthook\@firstofone}
    {}}

\protected\def\blx@setpostpunct#1{%
  \blx@ifuspunct
    {\global\let\blx@postpunct\blx@dopostpunct
     \ifdef\blx@thepostpunct
       {\gappto\blx@thepostpunct{#1}}
       {\gdef\blx@thepostpunct{#1}}}
    {}}

\def\blx@dopostpunct{%
  \blx@thepostpunct
  \global\let\blx@postpunct\@empty
  \global\undef\blx@thepostpunct}

\protected\def\blx@postpunct@agroup{%
  \aftergroup\blx@postpunct
  \let\blx@postpunct@agroup\@empty}

% {<characters>}
\newrobustcmd*{\DeclareCapitalPunctuation}[1]{%
  \cslet{blx@cap@\the\blx@sf@par}\@empty
  \csundef{blx@cap@\the\blx@sf@comma}%
  \csundef{blx@cap@\the\blx@sf@semicolon}%
  \csundef{blx@cap@\the\blx@sf@colon}%
  \csundef{blx@cap@\the\blx@sf@period}%
  \csundef{blx@cap@\the\blx@sf@exclam}%
  \csundef{blx@cap@\the\blx@sf@question}%
  \ifblank{#1}
    {}
    {\expandafter\blx@defcapstring\detokenize{#1}\relax}}

\def\blx@defcapstring#1{%
  \ifx#1\relax
  \else
    \begingroup
    \blx@setfrcodes
    \ifcsdef{blx@pm@#1}
      {\expandafter\endgroup
       \expandafter\let
         \csname blx@cap@\the\sfcode`#1\endcsname\@empty}
      {\blx@warning{Ignoring invalid punctuation mark '#1'}%
       \endgroup}%
    \expandafter\blx@defcapstring
  \fi}

% {<characters>}
\newrobustcmd*{\DeclareQuotePunctuation}[1]{%
  \csdef{blx@qp@comma}{\blx@postpunct}%
  \csdef{blx@qp@semicolon}{\blx@postpunct}%
  \csdef{blx@qp@colon}{\blx@postpunct}%
  \csdef{blx@qp@period}{\blx@postpunct}%
  \csdef{blx@qp@exclam}{\blx@postpunct}%
  \csdef{blx@qp@question}{\blx@postpunct}%
  \cslet{blx@pq@comma}\@empty
  \cslet{blx@pq@semicolon}\@empty
  \cslet{blx@pq@colon}\@empty
  \cslet{blx@pq@period}\@empty
  \cslet{blx@pq@exclam}\@empty
  \cslet{blx@pq@question}\@empty
  \let\blx@quotepunct\@empty
  \ifblank{#1}
    {\let\blx@ifuspunct\@secondoftwo}
    {\let\blx@ifuspunct\@firstoftwo
     \expandafter\blx@defquotepunct\detokenize{#1}&}}

\def\blx@defquotepunct#1{%
  \ifx&#1\relax
  \else
    \ifcsdef{blx@pm@#1}
      {\appto\blx@quotepunct{#1}%
       \cslet{blx@qp@\csuse{blx@pm@#1}}\@empty
       \csdef{blx@pq@\csuse{blx@pm@#1}}{\blx@postpunct}}
      {\blx@warning{Ignoring invalid punctuation mark '#1'}}%
    \expandafter\blx@defquotepunct
  \fi}

% {<mark>}{<characters>}
\newrobustcmd*{\DeclarePunctuationPairs}[2]{%
  \ifcsdef{blx@sf@\detokenize{#1}}
    {\ifnum\csname blx@sf@\detokenize{#1}\endcsname>\blx@sf@prefixchar
       \ifnum\csname blx@sf@\detokenize{#1}\endcsname<\blx@sf@nopunct
         \expandafter\blx@defpunctpairs
         \expandafter{\the\csname blx@sf@\detokenize{#1}\endcsname}{#2}%
       \else
         \blx@err@invarg{\detokenize{#1}{}}%
       \fi
     \else
       \blx@err@invarg{\detokenize{#1}{}}%
     \fi}
    {\blx@err@invarg{\detokenize{#1}{}}}}

\def\blx@defpunctpairs#1#2{%
  \blx@undefpair{#1}{\the\blx@sf@dot}%
  \blx@undefpair{#1}{\the\blx@sf@comma}%
  \blx@undefpair{#1}{\the\blx@sf@semicolon}%
  \blx@undefpair{#1}{\the\blx@sf@colon}%
  \blx@undefpair{#1}{\the\blx@sf@period}%
  \blx@undefpair{#1}{\the\blx@sf@exclam}%
  \blx@undefpair{#1}{\the\blx@sf@question}%
  \ifblank{#2}
    {}
    {\begingroup
     \def\blx@tempa{#1}%
     \let\blx@tempb\@empty
     \blx@setfrcodes
     \sfcode`\*=\blx@sf@dot
     \expandafter\blx@defpair\detokenize{#2}&%
     \expandafter\endgroup\blx@tempb}}

\def\blx@defpair#1{%
  \ifx&#1%
  \else
    \ifnum\the\sfcode`#1>\blx@sf@prefixchar
      \ifnum\the\sfcode`#1<\blx@sf@nopunct
        \eappto\blx@tempb{%
          \cslet{blx@pp@\blx@tempa @\the\sfcode`#1}\noexpand\@empty}%
      \else
        \blx@err@invarg{#1}{}%
      \fi
    \else
      \blx@err@invarg{#1}{}%
    \fi
    \expandafter\blx@defpair
  \fi}

\def\blx@undefpair#1#2{%
  \ifcsdef{blx@pp@#1@#2}
    {\csundef{blx@pp@#1@#2}}
    {}}

\protected\def\blx@resetpunct{%
  \DeclareCapitalPunctuation{.!?}%
  \DeclarePunctuationPairs{dot}{}%
  \DeclarePunctuationPairs{comma}{*!?}%
  \DeclarePunctuationPairs{semicolon}{*!?}%
  \DeclarePunctuationPairs{colon}{*!?}%
  \DeclarePunctuationPairs{period}{}%
  \DeclarePunctuationPairs{exclam}{*}%
  \DeclarePunctuationPairs{question}{*}%
  \DeclareQuotePunctuation{}%
  \def\abx@dot{\ifdim\lastkern>\z@\unkern\fi.\spacefactor\blx@sf@dot}%
  \def\abx@comma{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{,}}%
  \def\abx@semicolon{\abx@puncthook{;}}%
  \def\abx@colon{\abx@puncthook{:}}%
  \def\abx@period{\ifdim\lastkern>\z@\unkern\fi\abx@puncthook{.}}%
  \def\abx@exclam{\abx@puncthook{!}}%
  \def\abx@question{\abx@puncthook{?}}%
  \global\let\abx@puncthook\@firstofone
  \global\let\blx@postpunct\@empty}

\blx@resetpunct

% {<character>}{<true>}{<false>}
\protected\def\blx@imc@ifpunctmark#1{%
  \ifhmode
    \begingroup
    \sfcode`\*=\blx@sf@dot
    \ifnum\sfcode`#1=\spacefactor
      \endgroup
      \expandafter\expandafter
      \expandafter\@firstoftwo
    \else
      \endgroup
      \expandafter\expandafter
      \expandafter\@secondoftwo
    \fi
  \else
    \expandafter\@secondoftwo
  \fi}

% {<true>}{<false>}
\protected\def\blx@imc@ifterm{%
  \ifhmode
    \expandafter\blx@imc@ifcapital
  \else
    \expandafter\@secondoftwo
  \fi}

% {<true>}{<false>}
\protected\def\blx@imc@ifcapital{%
  \ifcsdef{blx@cap@\blx@spacefactor}}

% {<true>}{<false>}
\protected\def\blx@imc@ifpunct{%
  \ifnum\blx@spacefactor>\blx@sf@threshold@low
    \ifnum\blx@spacefactor<\blx@sf@threshold@high
      \expandafter\expandafter
      \expandafter\@firstoftwo
    \else
      \expandafter\expandafter
      \expandafter\@secondoftwo
    \fi
  \else
    \expandafter\@secondoftwo
  \fi}

% {<character>}
\newrobustcmd*{\autocap}[1]{#1}

\protected\def\blx@imc@autocap{%
  \blx@imc@ifcapital\MakeUppercase\@firstofone}

\protected\def\blx@imc@nopunct{%
  \leavevmode\spacefactor\blx@sf@nopunct}

\protected\def\blx@imc@isdot{%
  \ifnum\blx@spacefactor=\blx@sf@period
    \spacefactor\blx@sf@dot
  \fi}

\protected\def\blx@imc@adddot{%
  \blx@addpunct{dot}%
  \ifnum\blx@spacefactor=\blx@sf@period
    \spacefactor\blx@sf@dot
  \fi}

\protected\def\blx@imc@addperiod{%
  \blx@addpunct{period}%
  \ifnum\blx@spacefactor=\blx@sf@dot
    \spacefactor\blx@sf@period
  \fi}

\protected\def\blx@imc@addcomma{\blx@addpunct{comma}}
\protected\def\blx@imc@addsemicolon{\blx@addpunct{semicolon}}
\protected\def\blx@imc@addcolon{\blx@addpunct{colon}}
\protected\def\blx@imc@addexclam{\blx@addpunct{exclam}}
\protected\def\blx@imc@addquestion{\blx@addpunct{question}}

\def\blx@addpunct#1{%
  \unspace
  \ifnum\blx@spacefactor<\blx@sf@threshold@low
    \csuse{blx@qp@#1}\csuse{abx@#1}%
  \else
    \ifnum\blx@spacefactor>\blx@sf@threshold@high
      \csuse{blx@qp@#1}\csuse{abx@#1}%
    \else
      \ifcsdef{blx@pp@\the\csname blx@sf@#1\endcsname @\blx@spacefactor}
        {\csuse{blx@qp@#1}\csuse{abx@#1}}
        {\csuse{blx@qp@#1}}%
    \fi
  \fi
  \csuse{blx@pq@#1}}

\providerobustcmd*{\unspace}{%
  \ifbool{hmode}
    {\ifdimgreater\lastskip\z@
       {\unskip\unspace}
       {\ifnumgreater\lastpenalty\z@
          {\unpenalty\unspace}
          {}}}
    {}}

\newrobustcmd*{\bibsentence}{%
  \leavevmode\spacefactor\blx@sf@par
  \ignorespaces}

\newrobustcmd*{\midsentence}{%
  \leavevmode
  \@ifstar
    {\ifnum\spacefactor=\blx@sf@dot
     \else
       \spacefactor\@m
     \fi}
    {\spacefactor\@m}}

\newrobustcmd*{\addslash}{%
  \unspace/\penalty\hyphenpenalty\hskip\z@skip}

\newrobustcmd*{\addspace}{%
  \unspace\blx@postpunct
  \space\blx@imc@resetpunctfont}

\newrobustcmd*{\addnbspace}{%
  \unspace\blx@postpunct
  \nobreak\space\blx@imc@resetpunctfont}

\newrobustcmd*{\addthinspace}{%
  \unspace\blx@postpunct
  \hskip0.16667em\relax
  \blx@imc@resetpunctfont}

\newrobustcmd*{\addnbthinspace}{%
  \unspace\blx@postpunct
  \nobreak\hskip0.16667em\relax
  \blx@imc@resetpunctfont}

\newrobustcmd*{\addlowpenspace}{%
  \unspace\blx@postpunct
  \penalty\value{lownamepenalty}\space
  \blx@imc@resetpunctfont}

\newrobustcmd*{\addhighpenspace}{%
  \unspace\blx@postpunct
  \penalty\value{highnamepenalty}\space
  \blx@imc@resetpunctfont}

\newrobustcmd*{\addlpthinspace}{%
  \unspace\blx@postpunct
  \penalty\value{lownamepenalty}%
  \hskip0.16667em\relax\blx@imc@resetpunctfont}

\newrobustcmd*{\addhpthinspace}{%
  \unspace\blx@postpunct
  \penalty\value{highnamepenalty}%
  \hskip0.16667em\relax\blx@imc@resetpunctfont}

\newrobustcmd*{\addabbrvspace}{%
  \unspace\blx@postpunct
  \penalty\value{abbrvpenalty}%
  \space\blx@imc@resetpunctfont}

\newrobustcmd*{\addabthinspace}{%
  \unspace\blx@postpunct
  \penalty\value{abbrvpenalty}%
  \hskip0.16667em\relax
  \blx@imc@resetpunctfont}

\newrobustcmd*{\adddotspace}{%
  \unspace\adddot\blx@postpunct
  \penalty\value{abbrvpenalty}%
  \space\blx@imc@resetpunctfont}

\providerobustcmd*{\noligature}{%
  \penalty\@M\discretionary{-}{}{\kern0.03em}%
  \nobreak\hskip\z@skip}

\providerobustcmd*{\hyphen}{%
  \nobreak-\nobreak\hskip\z@skip}

\providerobustcmd*{\nbhyphen}{%
  \nobreak\mbox{-}\nobreak\hskip\z@skip}

\providerobustcmd*{\hyphenate}{%
  \nobreak\-\nobreak\hskip\z@skip}

\providerobustcmd*{\allowhyphens}{%
  \nobreak\hskip\z@skip}

\providerobustcmd*{\nohyphenation}{%
  \lefthyphenmin\@m}

\providerobustcmd*{\textnohyphenation}[1]{%
  \bgroup\nohyphenation#1\egroup}

\blx@regimcs{%
  \setpunctfont \resetpunctfont \ifcapital \autocap \ifpunctmark
  \ifpunct \ifterm \nopunct \isdot \adddot \addperiod \addcomma
  \addsemicolon \addcolon \addexclam \addquestion}

\appto\blx@blxinit{%
  \appto\nocorrlist{\isdot\adddot\addperiod\addcomma}}

%% Style definition

% {<bibstyle>}
\newrobustcmd*{\RequireBibliographyStyle}[1]{%
  \blx@inputonce{#1.bbx}{bibliography style '#1'}{}{}{}
    {\blx@error
       {Style '#1' not found}
       {The bibliography style '#1' could not be found}}}
\@onlypreamble\RequireBibliographyStyle

% {<code>}
\newrobustcmd*{\InitializeBibliographyStyle}{\appto\blx@hook@bbxinit}
\@onlypreamble\InitializeBibliographyStyle

% {<entry type>}{<driverdef>}
\newrobustcmd*{\DeclareBibliographyDriver}[1]{%
  \long\csdef{blx@bbx@#1}}
\@onlypreamble\DeclareBibliographyDriver

% {<entry type>}
\def\blx@driver#1{%
  \ifcsdef{blx@bbx@#1}
    {\csuse{blx@bbx@#1}}
    {\ifcsdef{blx@bbx@*}
       {\blx@warning{%
          No driver for entry type '#1'.\MessageBreak
          Using fallback driver}%
        \csuse{blx@bbx@*}}
       {\blx@error
          {No driver found}
          {I can't find a driver for the entry type
           '\abx@field@entrytype'\MessageBreak
           and there is no fallback driver either}}}}

% {<type>}{<true>}{<false>}
\def\blx@imc@ifdriver#1{\ifcsdef{blx@bbx@#1}}

% {<alias>}{<type>}
\newrobustcmd*{\DeclareBibliographyAlias}[2]{%
  \csedef{blx@bbx@#1}{%
    \expandafter\noexpand\csname blx@bbx@#2\endcsname}}
\@onlypreamble\DeclareBibliographyAlias

%% Auxiliary commands
\newrobustcmd*{\citereset}{%
  \csuse{blx@hook@cbxinit}%
  \@ifstar
    {}
    {\global\cslet{blx@bsee@\the\c@refsection}\@empty
     \global\cslet{blx@fsee@\the\c@refsection}\@empty
     \blx@ibidreset@force
     \blx@idemreset@force
     \blx@opcitreset@force
     \blx@loccitreset@force}}

\def\blx@save#1{%
  \ifcsdef{blx@saved@#1}
    {}
    {\blx@safe@actives
     \csletcs{blx@saved@#1}{#1}%
     \blx@rest@actives}}

\def\blx@restore#1{%
  \ifcsdef{blx@saved@#1}
    {\blx@safe@actives
     \csletcs{#1}{blx@saved@#1}%
     \csundef{blx@saved@#1}%
     \blx@rest@actives}
    {}}

\newrobustcmd*{\savecommand}[1]{%
  \ifcsdef{blx@saved@cmd@\detokenize{#1}}
    {}
    {\cslet{blx@saved@cmd@\detokenize{#1}}{#1}}}

\newrobustcmd*{\restorecommand}[1]{%
  \ifcsdef{blx@saved@cmd@\detokenize{#1}}
    {\letcs{#1}{blx@saved@cmd@\detokenize{#1}}%
     \csundef{blx@saved@cmd@\detokenize{#1}}}
    {}}

% {<name>}
\newrobustcmd*{\savebibmacro}[1]{%
  \blx@save{abx@macro@\detokenize{#1}}}

\newrobustcmd*{\restorebibmacro}[1]{%
  \blx@restore{abx@macro@\detokenize{#1}}}

% {<name>}[<args>][<optarg>]{<definition>}
\newrobustcmd*{\newbibmacro}{%
  \@star@or@long\blx@newbibmacro}

\def\blx@newbibmacro#1{%
  \ifcsundef{abx@macro@\detokenize{#1}}
    {\blx@defbibmacro\new@command{#1}}
    {\blx@warning{%
       Macro '\detokenize{#1}' already defined.\MessageBreak
       Using \string\renewbibmacro}
     \blx@defbibmacro\renew@command{#1}}}

\newrobustcmd*{\renewbibmacro}{%
  \@star@or@long\blx@renewbibmacro}

\def\blx@renewbibmacro#1{%
  \ifcsundef{abx@macro@\detokenize{#1}}
    {\blx@warning{%
       Macro '\detokenize{#1}' undefined.\MessageBreak
       Using \string\newbibmacro}
     \blx@defbibmacro\new@command{#1}}
    {\blx@defbibmacro\renew@command{#1}}}

\newrobustcmd*{\providebibmacro}{%
  \@star@or@long{\blx@defbibmacro\provide@command}}

\def\blx@defbibmacro#1#2{%
  \expandafter#1\csname abx@macro@\detokenize{#2}\endcsname}

% {<alias>}{<name>}
\newrobustcmd*{\letbibmacro}{%
  \@ifstar
    {\blx@letbibmacro@i}
    {\blx@letbibmacro}}

\def\blx@letbibmacro#1#2{%
  \blx@letbibmacro@i{\detokenize{#1}}{\detokenize{#2}}}

\def\blx@letbibmacro@i#1#2{%
  \ifcsundef{abx@macro@#2}
    {\blx@error
       {Bibliography macro '#2' undefined}
       {Use '\string\newbibmacro' to define this macro}}
    {\csletcs{abx@macro@#1}{abx@macro@#2}}}

% {<name>}
\newrobustcmd*{\usebibmacro}{%
  \@ifstar
    {\blx@usebibmacro@i}
    {\blx@usebibmacro}}

\def\blx@usebibmacro#1{%
  \blx@usebibmacro@i{\detokenize{#1}}}

\def\blx@usebibmacro@i#1{%
  \ifcsundef{abx@macro@#1}
    {\blx@error
       {Bibliography macro '#1' undefined}
       {Use '\string\newbibmacro' to define this macro}}
    {\csuse{abx@macro@#1}}}

% {<name>}{<true>}{<false>}
\def\blx@imc@ifbibmacroundef#1{%
  \ifcsundef{abx@macro@#1}}

% {<field>}
\def\blx@imc@thefield#1{\csuse{abx@field@#1}}

\def\blx@imc@strfield#1{%
  \ifcsdef{abx@field@#1}
    {\detokenize\expandafter\expandafter\expandafter
       {\csname abx@field@#1\endcsname}}
    {}}

\def\blx@imc@csfield#1{\usefield{\unexpanded}{#1}}

% {<command>}{<field>}
\def\blx@imc@usefield#1#2{%
  \expandafter\expandafter\expandafter#1%
  \expandafter\expandafter\expandafter{\csname abx@field@#2\endcsname}}

% {<plainlist>}
\def\blx@imc@thelist#1{\csuse{abx@list@#1}}

\def\blx@imc@strlist#1{%
  \ifcsdef{abx@list@#1}
    {\detokenize\expandafter\expandafter\expandafter
       {\csname abx@list@#1\endcsname}}
    {}}

% {<namelist>}
\def\blx@imc@thename#1{\csuse{abx@name@#1}}

\def\blx@imc@strname#1{%
  \ifcsdef{abx@name@#1}
    {\detokenize\expandafter\expandafter\expandafter
       {\csname abx@name@#1\endcsname}}
    {}}


% We have to save cleared fields/lists/names in case a related entry
% needs them for tests
\let\abx@dorelfields\@empty
\let\abx@dorellists\@empty
\let\abx@dorelnames\@empty

% {<field>}
% If there is a related field in the entry, save a special copy in case
% the related entry needs it for tests. See the corresponding tests in
% \blx@save{field,list,name}
\protected\def\blx@imc@clearfield#1{%
  \ifdef\abx@field@related
    {\csletcs{abx@field@relsaved#1}{abx@field@#1}%
     \listadd\abx@dorelfields{#1}}
    {}%
  \csundef{abx@field@#1}}

% {<plainlist>}
% If there is a related field in the entry, save a special copy in case
% the related entry needs it for tests. See the corresponding tests in
% \blx@save{field,list,name}
\protected\def\blx@imc@clearlist#1{%
  \ifcsundef{abx@list@#1}
    {}
    {\ifdef\abx@field@related
       {\csletcs{abx@list@relsaved#1}{abx@list@#1}%
        \csletcs{etb@tgl@abx@bool@morerelsaved#1}{etb@tgl@abx@bool@more#1}%
        \csletcs{c@relsaved#1}{c@#1}%
        \listadd\abx@dorellists{#1}}
       {}%
     \togglefalse{abx@bool@more#1}%
     \csundef{abx@list@#1}%
     \csname c@#1\endcsname\z@}}

% {<namelist>}
% If there is a related field in the entry, save a special copy in case
% the related entry needs it for tests. See the corresponding tests in
% \blx@save{field,list,name}
\protected\def\blx@imc@clearname#1{%
  \ifcsundef{abx@name@#1}
    {}
    {\ifdef\abx@field@related
      {\csletcs{abx@name@relsaved#1}{abx@name@#1}%
       \csletcs{etb@tgl@abx@bool@morerelsaved#1}{etb@tgl@abx@bool@more#1}%
       \csletcs{c@relsaved#1}{c@#1}%
       \listadd\abx@dorelnames{#1}}
      {}%
     \togglefalse{abx@bool@more#1}%
     \csundef{abx@name@#1}%
     \csname c@#1\endcsname\z@}}

% {<field>}{<macro>}
\protected\def\blx@imc@restorefield#1{\cslet{abx@field@#1}}

% {<plainlist>}{<macro>}
\protected\def\blx@imc@restorelist#1{\cslet{abx@list@#1}}

% {<namelist>}{<macro>}
\protected\def\blx@imc@restorename#1{\cslet{abx@name@#1}}

% {<field>}{<macro>}
\protected\def\blx@imc@savefield{%
  \@ifstar{\blx@savedata{field}}{\global\blx@savedata{field}}}
\def\blx@savedata#1#2#3{\letcs#3{abx@#1@#2}}

% {<plainlist>}{<macro>}
\protected\def\blx@imc@savelist{%
  \@ifstar{\blx@savedata{list}}{\global\blx@savedata{list}}}

% {<namelist>}{<macro>}
\protected\def\blx@imc@savename{%
  \@ifstar{\blx@savedata{name}}{\global\blx@savedata{name}}}

% {<field>}{<csname>}
\protected\def\blx@imc@savefieldcs{%
  \@ifstar{\blx@savedatacs{field}}{\global\blx@savedatacs{field}}}
\def\blx@savedatacs#1#2#3{\csletcs{#3}{abx@#1@#2}}

% {<plainlist>}{<csname>}
\protected\def\blx@imc@savelistcs{%
  \@ifstar{\blx@savedatacs{list}}{\global\blx@savedatacs{list}}}

% {<namelist>}{<csname>}
\protected\def\blx@imc@savenamecs{%
  \@ifstar{\blx@savedatacs{name}}{\global\blx@savedatacs{name}}}

% {<field>}{<true>}{<false>}
\def\blx@imc@iffieldundef#1{%
  \ifcsundef{abx@field@#1}}

% {<plainlist>}{<true>}{<false>}
\def\blx@imc@iflistundef#1{%
  \ifcsundef{abx@list@#1}}

% {<namelist>}{<true>}{<false>}
\def\blx@imc@ifnameundef#1{%
  \ifcsundef{abx@name@#1}}

% {<field1>}{<field2>}{<true>}{<false>}
\def\blx@imc@iffieldsequal#1#2{%
  \ifcsequal{abx@field@#1}{abx@field@#2}}

% {<plainlist1>}{<plainlist2>}{<true>}{<false>}
\def\blx@imc@iflistsequal#1#2{%
  \ifcsequal{abx@list@#1}{abx@list@#2}}

% {<namelist1>}{<namelist2>}{<true>}{<false>}
\def\blx@imc@ifnamesequal#1#2{%
  \ifcsundef{abx@name@#1}
    {\@secondoftwo}
    {\ifcsundef{abx@name@#2}
       {\@secondoftwo}
       {\blx@ifnamesequal{#1}{#2}}}}

\def\blx@ifnamesequal#1#2{%
  \begingroup
  \let\blx@tempa\@empty
  \expandafter\expandafter
  \expandafter\blx@ifnamesequal@i\csname abx@name@#2\endcsname
  \let\blx@tempb\blx@tempa
  \let\blx@tempa\@empty
  \expandafter\expandafter
  \expandafter\blx@ifnamesequal@i\csname abx@name@#1\endcsname
  \expandafter\endgroup
  \ifx\blx@tempa\blx@tempb
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}

\def\blx@ifnamesequal@i#1#2{%
  \expandafter\blx@ifnamesequal@ii#2{}&}

\def\blx@ifnamesequal@ii#1{%
  \ifblank{#1}
    {\blx@namebreak}
    {\blx@ifnamesequal@iii#1%
     \blx@ifnamesequal@ii}}

% These explicit nameparts are alright as they are for bibtex only
% biber names will always have a hash generated from all nameparts in datamodel
\def\blx@ifnamesequal@iii#1#2{%
  \setkeys{blx@opt@name}{#1}%
  \setkeys{blx@opt@namepart}{#2}%
  \ifdef\abx@field@hash
    {\eappto\blx@tempa{{\abx@field@hash}}}
    {\eappto\blx@tempa{{{\namepartfamily}{\namepartgiven}{\namepartprefix}{\namepartsuffix}}}}}

% {<field>}{<macro>}{<true>}{<false>}
\def\blx@imc@iffieldequals#1#2{%
  \blx@imc@iffieldundef{#1}
    {\@secondoftwo}
    {\ifundef#2%
       {\@secondoftwo}
       {\expandafter\ifx\csname abx@field@#1\endcsname#2%
          \expandafter\@firstoftwo
        \else
          \expandafter\@secondoftwo
        \fi}}}

% {<plainlist>}{<macro>}{<true>}{<false>}
\def\blx@imc@iflistequals#1#2{%
  \blx@imc@iflistundef{#1}
    {\@secondoftwo}
    {\ifundef#2%
       {\@secondoftwo}
       {\expandafter\ifx\csname abx@list@#1\endcsname#2%
          \expandafter\@firstoftwo
        \else
          \expandafter\@secondoftwo
        \fi}}}

% {<namelist>}{<macro>}{<true>}{<false>}
\def\blx@imc@ifnameequals#1#2{% FIXME
  \blx@imc@ifnameundef{#1}
    {\@secondoftwo}
    {\ifundef#2%
       {\@secondoftwo}
       {\expandafter\ifx\csname abx@name@#1\endcsname#2%
          \expandafter\@firstoftwo
        \else
          \expandafter\@secondoftwo
        \fi}}}

% {<field>}{<csname>}{<true>}{<false>}
\def\blx@imc@iffieldequalcs#1{%
  \ifcsequal{abx@field@#1}}

% {<plainlist>}{<csname>}{<true>}{<false>}
\def\blx@imc@iflistequalcs#1{%
  \ifcsequal{abx@list@#1}}

% {<namelist>}{<csname>}{<true>}{<false>}
\def\blx@imc@ifnameequalcs#1{% FIXME
  \ifcsequal{abx@name@#1}}

% {<field>}{<string>}{<true>}{<false>}
\protected\long\def\blx@imc@iffieldequalstr#1#2{%
  \blx@imc@iffieldundef{#1}
    {\@secondoftwo}
    {\expandafter\expandafter\expandafter\ifstrequal
     \expandafter\expandafter\expandafter{%
       \csname abx@field@#1\endcsname}{#2}}}

% {<field>}{<true>}{<false>}
\protected\def\blx@imc@iffieldxref#1{%
  \blx@imc@iffieldundef{#1}
    {\@secondoftwo}
    {\blx@whichxref
       {\blx@iffieldxref{#1}}
       {\@secondoftwo}}}

\def\blx@iffieldxref#1#2{%
  \begingroup
  \letcs\blx@tempa{abx@field@#2}%
  \letcs\blx@tempb{abx@field@#1}%
  \blx@resetdata
  \blx@getdata{\blx@tempa}%
  \blx@imc@iffieldequals{#1}\blx@tempb
    {\aftergroup\@firstoftwo}
    {\aftergroup\@secondoftwo}%
  \endgroup}

\def\blx@whichxref#1#2{%
  \blx@imc@iffieldundef{crossref}
    {\blx@imc@iffieldundef{xref}
       {#2}
       {#1{xref}}}
    {#1{crossref}}}

% {<plainlist>}{<true>}{<false>}
\protected\def\blx@imc@iflistxref#1{%
  \blx@imc@iflistundef{#1}
    {\@secondoftwo}
    {\blx@whichxref
       {\blx@iflistxref{#1}}
       {\@secondoftwo}}}

\def\blx@iflistxref#1#2{%
  \begingroup
  \letcs\blx@tempa{abx@field@#2}%
  \letcs\blx@tempb{abx@list@#1}%
  \blx@resetdata
  \blx@getdata{\blx@tempa}%
  \blx@imc@iflistequals{#1}\blx@tempb
    {\aftergroup\@firstoftwo}
    {\aftergroup\@secondoftwo}%
  \endgroup}

% {<namelist>}{<true>}{<false>}
\protected\def\blx@imc@ifnamexref#1{%
  \blx@imc@ifnameundef{#1}
    {\@secondoftwo}
    {\blx@whichxref
       {\blx@ifnamexref{#1}}
       {\@secondoftwo}}}

\def\blx@ifnamexref#1#2{%
  \begingroup
  \letcs\blx@tempa{abx@field@#2}%
  \letcs\blx@tempb{abx@name@#1}%
  \blx@resetdata
  \blx@getdata{\blx@tempa}%
  \blx@imc@ifnameequals{#1}\blx@tempb
    {\aftergroup\@firstoftwo}
    {\aftergroup\@secondoftwo}%
  \endgroup}

% {<string>}{<true>}{<false>}
\protected\def\blx@imc@ifcurrentfield#1{%
  \begingroup
  \def\blx@tempa{#1}%
  \ifx\currentfield\blx@tempa
    \aftergroup\@firstoftwo
  \else
    \aftergroup\@secondoftwo
  \fi
  \endgroup}

% {<string>}{<true>}{<false>}
\protected\def\blx@imc@ifcurrentlist#1{%
  \begingroup
  \def\blx@tempa{#1}%
  \ifx\currentlist\blx@tempa
    \aftergroup\@firstoftwo
  \else
    \aftergroup\@secondoftwo
  \fi
  \endgroup}

% {<string>}{<true>}{<false>}
\protected\def\blx@imc@ifcurrentname#1{%
  \begingroup
  \def\blx@tempa{#1}%
  \ifx\currentname\blx@tempa
    \aftergroup\@firstoftwo
  \else
    \aftergroup\@secondoftwo
  \fi
  \endgroup}

% {<string>}{<true>}{<false>}
\protected\def\blx@imc@ifentrytype#1{%
  \begingroup
  \def\blx@tempa{#1}%
  \ifx\abx@field@entrytype\blx@tempa
    \aftergroup\@firstoftwo
  \else
    \aftergroup\@secondoftwo
  \fi
  \endgroup}

% {<true>}{<false>}
\def\blx@imc@ifmorenames{%
  \ifundef\currentname
    {\@secondoftwo}
    {\iftoggle{abx@bool@more\currentname}
       {\@firstoftwo}
       {\ifnum\c@listtotal>\c@liststop
          \expandafter\@firstoftwo
        \else
          \expandafter\@secondoftwo
        \fi}}}

% {<true>}{<false>}
\def\blx@imc@ifmoreitems{%
  \ifundef\currentlist
    {\@secondoftwo}
    {\iftoggle{abx@bool@more\currentlist}
       {\@firstoftwo}
       {\ifnum\c@listtotal>\c@liststop
          \expandafter\@firstoftwo
        \else
          \expandafter\@secondoftwo
        \fi}}}

% {<true>}{<false>}
\def\blx@imc@iffirstcitekey{%
  \ifboolexpr{ ( test {\ifnumequal\c@multicitetotal\z@}
                 and test {\ifnumequal\c@citecount\@ne} )
    or ( test {\ifnumgreater\c@multicitetotal\z@}
         and test {\ifnumequal\c@multicitecount\@ne}
         and test {\ifnumequal\c@citecount\@ne} ) }}

\def\blx@imc@iflastcitekey{%
  \ifboolexpr{ test {\ifnumequal\c@citecount\c@citetotal}
               and test {\ifnumequal\c@multicitecount\c@multicitetotal} }}

% {<category>}{<true>}{<false>}
\protected\def\blx@imc@ifcategory{%
  \ifdef\abx@field@entrykey
    {\blx@imc@ifentrycategory\abx@field@entrykey}
    {\expandafter\@secondoftwo\@gobble}}

% {<entrykey>}{<category>}{<true>}{<false>}
\protected\def\blx@imc@ifentrycategory{%
  \blx@xsanitizeafter\blx@imc@ifentrycategory@i}

\def\blx@imc@ifentrycategory@i#1#2{%
  \ifcsdef{blx@catg@\detokenize{#2}}
    {\ifinlistcs{#1}{blx@catg@\detokenize{#2}}}
    {\@secondoftwo}}

% {<keyword>}{<true>}{<false>}
\protected\def\blx@imc@ifkeyword{%
  \ifdef\abx@field@entrykey
    {\blx@imc@ifentrykeyword\abx@field@entrykey}
    {\expandafter\@secondoftwo\@gobble}}

% {<entrykey>}{<keyword>}{<true>}{<false>}
\protected\def\blx@imc@ifentrykeyword{%
  \blx@xsanitizeafter\blx@imc@ifentrykeyword@i}

\def\blx@imc@ifentrykeyword@i#1#2{%
  \ifcsdef{blx@keyw@\the\c@refsection @\detokenize{#2}}
    {\ifinlistcs{#1}{blx@keyw@\the\c@refsection @\detokenize{#2}}}
    {\@secondoftwo}}

% {<true>}{<false>}
\protected\def\blx@ifciteseen@global{%
  \ifbool{citetracker}
    {\ifdef\abx@field@entrykey
       {\expandafter\blx@ifseen@global
        \expandafter{\abx@field@entrykey}}
       {\@secondoftwo}}
    {\@secondoftwo}}

\protected\def\blx@ifciteseen@context{%
  \ifbool{citetracker}
    {\ifdef\abx@field@entrykey
       {\expandafter\blx@ifseen@context
        \expandafter{\abx@field@entrykey}}
       {\@secondoftwo}}
    {\@secondoftwo}}

\protected\def\blx@ifciteseen@context{%
  \ifbool{citetracker}
    {\ifdef\abx@field@entrykey
       {\expandafter\blx@ifseen@context
        \expandafter{\abx@field@entrykey}}
       {\@secondoftwo}}
    {\@secondoftwo}}

% {<entrykey>}{<true>}{<false>}
\protected\def\blx@ifentryseen@global{%
  \blx@xsanitizeafter\blx@ifseen@global}

\protected\def\blx@ifentryseen@context{%
  \blx@xsanitizeafter\blx@ifseen@context}

\def\blx@ifseen@global#1{%
  \ifbool{citetracker}
    {\ifinlistcs{#1}{blx@bsee@\the\c@refsection}}
    {\@secondoftwo}}

\def\blx@ifseen@context#1{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\ifinlistcs{#1}{blx@fsee@\the\c@refsection}}
       {\ifinlistcs{#1}{blx@bsee@\the\c@refsection}}}
    {\@secondoftwo}}

% {<true>}{<false>}
\def\blx@ifciteibid@global{%
  \ifbool{citetracker}
    {\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}
    {\@secondoftwo}}

\def\blx@ifciteibid@context{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot}
       {\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}}
    {\@secondoftwo}}

\def\blx@ifciteibid@strict{%
  \ifbool{citetracker}
    {\blx@ifcitesingle
       {\blx@ifciteibid@global}
       {\@secondoftwo}}
    {\@secondoftwo}}

\def\blx@ifciteibid@constrict{%
  \ifbool{citetracker}
    {\blx@ifcitesingle
       {\iftoggle{blx@footnote}
          {\blx@ifmpfncheck
             {\blx@imc@iffieldequals{entrykey}\blx@lastkey@foot}
             {\@secondoftwo}}
          {\blx@imc@iffieldequals{entrykey}\blx@lastkey@text}}
       {\@secondoftwo}}
    {\@secondoftwo}}

% {<true>}{<false>}
\def\blx@ifciteidem@global{%
  \ifbool{citetracker}
    {\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}
    {\@secondoftwo}}

\def\blx@ifciteidem@context{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot}
       {\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}}
    {\@secondoftwo}}

\let\blx@ifciteidem@strict\blx@ifciteidem@global

\def\blx@ifciteidem@constrict{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\blx@ifmpfncheck
          {\blx@imc@iffieldequals{fullhash}\blx@lasthash@foot}
          {\@secondoftwo}}
       {\blx@imc@iffieldequals{fullhash}\blx@lasthash@text}}
    {\@secondoftwo}}

% {<true>}{<false>}
\def\blx@ifopcit@global{%
  \ifbool{citetracker}
    {\blx@imc@iffieldundef{namehash}
       {\@secondoftwo}
       {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}}
    {\@secondoftwo}}

\def\blx@ifopcit@context{%
  \ifbool{citetracker}
    {\blx@imc@iffieldundef{namehash}
       {\@secondoftwo}
       {\iftoggle{blx@footnote}
          {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@namehash}}
          {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}}}
    {\@secondoftwo}}

\def\blx@ifopcit@strict{%
  \ifbool{citetracker}
    {\blx@ifcitesingle
       {\blx@ifopcit@global}
       {\@secondoftwo}}
    {\@secondoftwo}}

\def\blx@ifopcit@constrict{%
  \ifbool{citetracker}
    {\blx@ifcitesingle
       {\blx@imc@iffieldundef{namehash}
          {\@secondoftwo}
          {\iftoggle{blx@footnote}
             {\blx@ifmpfncheck
                {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@foot@\abx@field@namehash}}
                {\@secondoftwo}}
             {\blx@imc@iffieldequalcs{entrykey}{blx@lastkey@text@\abx@field@namehash}}}}
       {\@secondoftwo}}
    {\@secondoftwo}}

% {<true>}{<false>}
\def\blx@ifloccit@global{%
  \ifbool{citetracker}
    {\blx@loccit@check{text}}
    {\@secondoftwo}}

\def\blx@ifloccit@context{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\blx@loccit@check{foot}}
       {\blx@loccit@check{text}}}
    {\@secondoftwo}}

\def\blx@ifloccit@strict{%
  \ifbool{citetracker}
    {\blx@ifcitesingle
       {\blx@loccit@numcheck{text}}
       {\@secondoftwo}}
    {\@secondoftwo}}

\def\blx@ifloccit@constrict{%
  \ifbool{citetracker}
    {\blx@ifcitesingle
       {\iftoggle{blx@footnote}
          {\blx@ifmpfncheck
             {\blx@loccit@numcheck{foot}}
             {\@secondoftwo}}
          {\blx@loccit@numcheck{text}}}
       {\@secondoftwo}}
    {\@secondoftwo}}

\def\blx@loccit@check#1{%
  \blx@imc@iffieldundef{postnote}
    {\@secondoftwo}
    {\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}}}

\def\blx@loccit@numcheck#1{%
  \blx@imc@iffieldundef{postnote}
    {\@secondoftwo}
    {\expandafter\blx@imc@ifpages
     \expandafter{\abx@field@postnote}
       {\blx@imc@iffieldequalcs{postnote}{blx@lastnote@#1@\abx@field@entrykey}}
       {\@secondoftwo}}}

% {<true>}{<false>}
\def\blx@ifmpfncheck{%
  \ifnum\numexpr\value\@mpfn-\blx@lastmpfn<\tw@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}

\def\blx@mpfnsave{%
  \xdef\blx@lastmpfn{\the\value\@mpfn}}

\def\blx@mpfnreset{%
  \global\let\blx@lastmpfn\z@}

\blx@mpfnreset

% {<true>}{<false>}
\def\blx@imc@iffirstonpage{%
  \ifbool{pagetracker}
    {\iftoggle{blx@footnote}
       {\blx@iffirstonpage{fnpage}}
       {\blx@iffirstonpage{page}}}
    {\@secondoftwo}}

\def\blx@iffirstonpage#1{%
  \ifcsundef{blx@#1@\number\c@instcount}
    {\@secondoftwo}
    {\expandafter\blx@iffirstonpage@i
     \expandafter{\number\numexpr\c@instcount-1}{#1}}}

\def\blx@iffirstonpage@i#1#2{%
  \ifcsundef{blx@#2@#1}
    {\ifnum#1>\@ne
       \expandafter\@firstoftwo
     \else
       \expandafter\@secondoftwo
     \fi
     {\expandafter\blx@iffirstonpage@i
      \expandafter{\number\numexpr#1-1}{#2}}
     {\@firstoftwo}}
    {\ifnum\csuse{blx@#2@\number\c@instcount}=%
           \csuse{blx@#2@#1} %
       \expandafter\@secondoftwo
     \else
       \expandafter\@firstoftwo
     \fi}}

% {<count1>}{<count2>}{<true>}{<false>}
\def\blx@imc@ifsamepage#1#2{%
  \ifbool{pagetracker}
    {\ifcsundef{blx@page@\number\numexpr#1}
       {\ifcsundef{blx@fnpage@\number\numexpr#1}
          {\@secondoftwo}
          {\blx@ifsamepage{#1}{#2}{fnpage}}}
       {\blx@ifsamepage{#1}{#2}{page}}}
    {\@secondoftwo}}

\def\blx@ifsamepage#1#2#3{%
  \ifcsundef{blx@page@\number\numexpr#2}
    {\ifcsundef{blx@fnpage@\number\numexpr#2}
       {\@secondoftwo}
       {\blx@ifsamepage@i{#1}{#2}{#3}{fnpage}}}
    {\blx@ifsamepage@i{#1}{#2}{#3}{page}}}

\def\blx@ifsamepage@i#1#2#3#4{%
  \ifnum\csuse{blx@#3@\number\numexpr#1}=%
        \csuse{blx@#4@\number\numexpr#2} %
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}

% {<string>}{<true>}{<false>}
\protected\long\def\blx@imc@ifinteger#1{%
  \begingroup
  \def\do##1{\uccode`##1=`\%}%
  \do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9%
  \makeatletter
  \catcode`\%=9
  \endlinechar\m@ne
  \uppercase{\scantokens{\def\blx@tempa{#1}}}%
  \ifx\blx@tempa\@empty
    \aftergroup\@firstoftwo
  \else
    \aftergroup\@secondoftwo
  \fi
  \endgroup}

% {<field>}{<true>}{<false>}
\protected\def\blx@imc@iffieldint#1{%
  \blx@imc@iffieldundef{#1}
    {\@secondoftwo}
    {\expandafter\expandafter
     \expandafter\ifinteger
     \expandafter\expandafter
     \expandafter{\csname abx@field@#1\endcsname}}}

% {<string>}{<true>}{<false>}
\protected\def\blx@imc@ifnumeral{%
  \blx@ifnum\blx@hook@ifnum}

\protected\def\blx@imc@ifnumerals{%
  \blx@ifnum\blx@hook@ifnums}

\protected\def\blx@imc@ifpages{%
  \blx@ifnum\blx@hook@ifpages}

\long\def\blx@ifnum#1#2{%
  \begingroup
  \let\protect\@unexpandable@protect
  \uppercase{\edef\blx@tempa{#2}}%
  \ifx\blx@tempa\@empty
    \aftergroup\@secondoftwo
  \else
    \makeatletter
    \catcode`\%=9
    \endlinechar\m@ne
    \everyeof{\noexpand}#1%
    \uppercase{\edef\blx@tempa{\scantokens{#2}}}%
    \ifx\blx@tempa\@empty
      \aftergroup\@firstoftwo
    \else
      \aftergroup\@secondoftwo
    \fi
  \fi
  \endgroup}

\def\blx@hook@ifnum{%
  \def\do##1{\uccode`##1=`\%}%
  \do\ \do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9%
  \do\i\do\v\do\x\do\l\do\c\do\d\do\m
  \do\I\do\V\do\X\do\L\do\C\do\D\do\M
  \blx@donumchars
  \let\RN\@firstofone
  \let\Rn\@firstofone}

\def\blx@hook@ifnums{%
  \blx@hook@ifnum
  \def\do##1{\uccode`##1=`\%}%
  \blx@dorangechars
  \def\do##1{\let##1\@empty}%
  \blx@dorangecmds}

\def\blx@hook@ifpages{%
  \blx@hook@ifnum
  \blx@hook@ifnums
  \def\do##1{\let##1\@empty}%
  \blx@dopagecmds}

% {<field>}{<true>}{<false>}
\protected\def\blx@imc@iffieldnum#1{%
  \blx@imc@iffieldundef{#1}
    {\@secondoftwo}
    {\expandafter\expandafter
     \expandafter\blx@imc@ifnumeral
     \expandafter\expandafter
     \expandafter{\csname abx@field@#1\endcsname}}}

\protected\def\blx@imc@iffieldnums#1{%
  \blx@imc@iffieldundef{#1}
    {\@secondoftwo}
    {\expandafter\expandafter
     \expandafter\blx@imc@ifnumerals
     \expandafter\expandafter
     \expandafter{\csname abx@field@#1\endcsname}}}

\protected\def\blx@imc@iffieldpages#1{%
  \blx@imc@iffieldundef{#1}
    {\@secondoftwo}
    {\expandafter\expandafter
     \expandafter\blx@imc@ifpages
     \expandafter\expandafter
     \expandafter{\csname abx@field@#1\endcsname}}}

% {<chars>}
\newrobustcmd*{\DeclareNumChars}{%
  \@ifstar
    {\blx@defnumchars}
    {\global\let\blx@donumchars\@empty
     \blx@defnumchars}}

\def\blx@defnumchars#1{%
  \ifblank{#1}
    {}
    {\expandafter\blx@defdochars
     \expandafter\blx@donumchars
     \detokenize{#1}\relax}}

% {<chars>}
\newrobustcmd*{\DeclareRangeChars}{%
  \@ifstar
    {\blx@defrangechars}
    {\global\let\blx@dorangechars\@empty
     \blx@defrangechars}}

\def\blx@defrangechars#1{%
  \ifblank{#1}
    {}
    {\expandafter\blx@defdochars
     \expandafter\blx@dorangechars
     \detokenize{#1}\relax}}

\def\blx@defdochars#1#2{%
  \ifx#2\relax
  \else
    \xdef#1{%
      \expandonce#1\noexpand\do
      \expandafter\noexpand\csname#2\endcsname}%
    \expandafter\blx@defdochars
    \expandafter#1%
  \fi}

% {<cstokens>}
\newrobustcmd*{\DeclareRangeCommands}{%
  \@ifstar
    {\blx@defrangecmds}
    {\global\let\blx@dorangecmds\@empty
     \blx@defrangecmds}}

\def\blx@defrangecmds#1{%
  \ifblank{#1}
    {}
    {\blx@defrangecmds@i#1&}}

\def\blx@defrangecmds@i#1{%
  \ifx&#1%
  \else
    \gappto\blx@dorangecmds{\do#1}%
    \expandafter\blx@defrangecmds@i
  \fi}

% {<cstokens>}
\newrobustcmd*{\DeclarePageCommands}{%
  \@ifstar
    {\blx@defpagecmds}
    {\global\let\blx@dopagecmds\@empty
     \blx@defpagecmds}}

\def\blx@defpagecmds#1{%
  \ifblank{#1}
    {}
    {\blx@defpagecmds@i#1&}}

\def\blx@defpagecmds@i#1{%
  \ifx&#1%
  \else
    \gappto\blx@dopagecmds{\do#1}%
    \expandafter\blx@defpagecmds@i
  \fi}

\DeclareNumChars{.}
\DeclareRangeChars{~,;-+/}
\DeclareRangeCommands{%
  \ \,\space\nobreakspace\addspace\addnbspace
  \addthinspace\addnbthinspace\addlowpenspace
  \addhighpenspace\addlpthinspace\addhpthinspace
  \adddotspace\addabbrvspace\&\psq\psqq
  \bibrangedash\bibdaterangesep\bibtimerangesep\textendash\textemdash\bibrangessep}
\DeclarePageCommands{\pno\ppno}

% *{<code>}
\newrobustcmd*{\NumCheckSetup}{\appto\blx@hook@ifnum}
\newcommand*{\NumcheckSetup}{\NumCheckSetup}

% [<pagination>][<postpro>]{<string>}
\newrobustcmd*{\blx@imc@mkpageprefix}[1][pagination]{%
  \begingroup
  \def\blx@tempa{\blx@mkpageprefix{page}}%
  \iffieldundef{#1}
    {}
    {\iffieldequalstr{#1}{none}
       {\def\blx@tempa{\blx@mkpageprefix@i}}
       {\iffieldbibstring{#1}
          {\edef\blx@tempa{\blx@mkpageprefix{\thefield{#1}}}}
          {\blx@warning@entry{%
             Unknown pagination type '\strfield{#1}'}}}}%
  \@ifnextchar[%]
    {\blx@tempa}
    {\blx@tempa[\@firstofone]}}

\protected\long\def\blx@mkpageprefix#1[#2]#3{%
  \ifnumeral{#3}
    {\bibstring{#1}\ppspace}
    {\ifnumerals{#3}
       {\bibstring{#1s}\ppspace}
       {\def\pno{\bibstring{#1}}%
        \def\ppno{\bibstring{#1s}}}}%
  \blx@mkpageprefix@i[#2]{#3}}

\long\def\blx@mkpageprefix@i[#1]#2{#1{#2}\endgroup}

% [<pagination>][<postpro>]{<string>}
\newrobustcmd*{\blx@imc@mkpagetotal}[1][bookpagination]{%
  \begingroup
  \def\blx@tempa{\blx@mkpagetotal{pagetotal}}%
  \iffieldundef{#1}
    {}
    {\iffieldequalstr{#1}{none}
       {\def\blx@tempa{\blx@mkpagetotal@i}}
       {\iffieldbibstring{#1total}
          {\edef\blx@tempa{\blx@mkpagetotal{\thefield{#1total}}}}
          {\blx@warning@entry{%
             Unknown pagination type '\strfield{#1total}'}}}}%
  \@ifnextchar[%]
    {\blx@tempa}
    {\blx@tempa[\@firstofone]}}

\protected\long\def\blx@mkpagetotal#1[#2]#3{%
  \ifnumeral{#3}
    {\setbox\@tempboxa=\hbox{%
       \blx@tempcnta0#3\relax
       \ifnum\blx@tempcnta=\@ne
         \aftergroup\@firstoftwo
       \else
         \aftergroup\@secondoftwo
       \fi}%
     {#2{#3}\ppspace\bibstring{#1}}
     {#2{#3}\ppspace\bibstring{#1s}}}
    {\def\pno{\bibstring{#1}}%
     \def\ppno{\bibstring{#1s}}%
     #2{#3}}%
  \endgroup}

\long\def\blx@mkpagetotal@i[#1]#2{#1{#2}\endgroup}

\newcounter{mincomprange}
\newcounter{maxcomprange}
\newcounter{mincompwidth}
\setcounter{mincomprange}{10}
\setcounter{maxcomprange}{100000}
\setcounter{mincompwidth}{1}
\def\abx@rangeproclimit{100000}

% {<rangefield>}
\newcommand*{\rangelen}[1]{%
  \ifcsdef{abx@range@#1}
    {\csuse{abx@range@#1}}
    {}}

% <*>[<postpro>]{<string>}
\newrobustcmd*{\mkcomprange}{%
  \begingroup
  \@ifstar
    {\blx@comprange\blx@comprange@ii}
    {\blx@comprange\blx@comprange@i}}

\def\blx@comprange#1{%
  \@ifnextchar[{#1}{#1[\@firstofone]}}

\def\blx@comprange@i[#1]#2{%
  \let\blx@tempa\@empty
  \protected\def\blx@range@out@value{\appto\blx@tempa}%
  \let\blx@range@out@delim\blx@range@out@value
  \let\blx@range@split\blx@comprange@split
  \blx@range@chunk{#2}%
  \edef\blx@tempa{\endgroup
    \unexpanded{#1}{\expandonce\blx@tempa}}%
  \blx@tempa}

\def\blx@comprange@ii[#1]#2{%
  \protected\def\blx@range@out@value{#1}%
  \let\blx@range@out@delim\@firstofone
  \let\blx@range@split\blx@comprange@split
  \blx@range@chunk{#2}%
  \endgroup}

\def\blx@comprange@split#1{%
  \def\blx@comprange@abort{\blx@range@out@value{#1}}%
  \blx@imc@ifpages{#1}
    {\blx@comprange@range#1\bibrangedash\bibrangedash&}
    {\blx@comprange@abort}}

\def\blx@comprange@range#1\bibrangedash#2\bibrangedash#3&{%
  \ifblank{#3}
    {\blx@comprange@hyphen#1--&}
    {\ifblank{#2}
       {\blx@range@out@value{#1\bibrangedash}}
       {\ifblank{#1}
          {\blx@range@out@value{\bibrangedash#2}}
          {\blx@comprange@check{#1}{#2}}}}}

\def\blx@comprange@hyphen#1-#2-#3&{%
  \ifblank{#3}
    {\blx@comprange@abort}
    {\ifblank{#2}
       {\ifblank{#1}
          {\let\blx@tempb\@empty}
          {\def\blx@tempb{#1}}%
        \blx@comprange@hyphen@i#3&}
       {\ifblank{#1}
          {\blx@range@out@value{\bibrangedash#2}}
          {\blx@comprange@check{#1}{#2}}}}}

\def\blx@comprange@hyphen@i#1-#2&{%
  \ifblank{#1#2}
    {\expandafter\blx@range@out@value
     \expandafter{\blx@tempb\bibrangedash}}
    {\notblank{#1}
       {\ifdefempty\blx@tempb
          {\blx@range@out@value{\bibrangedash#1}}
          {\expandafter\blx@comprange@check
           \expandafter{\blx@tempb}{#1}}}
       {\blx@comprange@hyphen@i#2&}}}

\def\blx@comprange@check#1#2{%
  \blx@imc@ifinteger{#1}
    {\blx@imc@ifinteger{#2}
       {\blx@comprange@comp{#1}{#2}}
       {\blx@range@out@value{#1\bibrangedash#2}}}
    {\blx@range@out@value{#1\bibrangedash#2}}}

\def\blx@comprange@comp#1#2{%
  \def\blx@tempb{#1}%
  \def\blx@tempc{#2}%
  \let\blx@tempd\blx@tempc
  \ifnum\c@maxcomprange<\abx@rangeproclimit\relax
    \numdef\blx@tempe\abx@rangeproclimit
  \else
    \numdef\blx@tempe\c@maxcomprange
  \fi
  \blx@tempcntc=\blx@tempe\relax
  \ifnum
    \ifnum\c@mincompwidth<1\space1\fi
    \ifnum\c@maxcomprange<10\space1\fi
    \ifnum\c@mincomprange<\blx@tempb\space\else1\fi
    \ifnum\blx@tempb<\numexpr\blx@tempcntc*10\relax\else1\fi
  0=\z@
    \expandafter\blx@comprange@comp@div
  \else
    \expandafter\blx@comprange@end
  \fi}

\def\blx@comprange@end{%
  \numdef\blx@tempb\blx@tempb
  \ifnum\blx@tempe>\c@maxcomprange\relax
    \numdef\blx@tempc\blx@tempc
  \else
    \numdef\blx@tempc\blx@tempd
  \fi
  \edef\blx@tempb{%
    \blx@range@out@value{\blx@tempb\noexpand\bibrangedash\blx@tempc}}%
  \blx@tempb}

\def\blx@comprange@comp@div{%
  \unless\ifnum\blx@tempb<\blx@tempcntc
    \blx@tempcnta\blx@tempb\relax
    \blx@tempcntb\blx@tempc\relax
    \divide\blx@tempcnta\blx@tempcntc
    \divide\blx@tempcntb\blx@tempcntc
    \ifnum\blx@tempcnta=\blx@tempcntb
      \edef\blx@tempd{\expandafter\@gobble\blx@tempd}%
      \numdef\blx@tempe\blx@tempcntc
    \fi
  \fi
  \divide\blx@tempcntc10\relax
  \ifnum
    \ifnum\blx@tempcntc<10 1\fi
    \ifnum\blx@tempcntc>\c@mincompwidth\else 1\fi
  0=\z@
    \expandafter\blx@comprange@comp@div
  \else
    \expandafter\blx@comprange@end
  \fi}

\def\blx@range@chunk#1{%
  \blx@range@chunk@semcol#1;&}

\def\blx@range@chunk@semcol#1;#2&{%
  \notblank{#1}
    {\blx@range@chunk@comma#1,&}
    {}%
  \notblank{#2}
    {\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}%
     \blx@range@chunk@semcol#2&}
    {}}

\def\blx@range@chunk@comma#1,#2&{%
  \notblank{#1}
    {\blx@range@chunk@sep#1\bibrangessep&}
    {}%
  \notblank{#2}
    {\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}%
     \blx@range@chunk@comma#2&}
    {}}

\def\blx@range@chunk@sep#1\bibrangessep#2&{%
  \notblank{#1}
    {\expandafter\blx@range@split
     \expandafter{\@firstofone#1}}
    {}%
  \notblank{#2}
    {\notblank{#1}{\blx@range@out@delim{\bibrangessep}}{}%
     \blx@range@chunk@sep#2&}
    {}}

% <*>[<postpro>]{<string>}
\newrobustcmd*{\mkfirstpage}{%
  \begingroup
  \@ifstar
    {\blx@firstpage\blx@firstpage@ii}
    {\blx@firstpage\blx@firstpage@i}}

\def\blx@firstpage#1{%
  \@ifnextchar[{#1}{#1[\@firstofone]}}

\def\blx@firstpage@i[#1]#2{%
  \let\blx@tempa\@empty
  \protected\def\blx@range@out@value{\appto\blx@tempa}%
  \let\blx@range@out@delim\blx@range@out@value
  \let\blx@range@split\blx@firstpage@split
  \blx@range@chunk{#2}%
  \edef\blx@tempa{\endgroup
    \unexpanded{#1}{\expandonce\blx@tempa}}%
  \blx@tempa}

\def\blx@firstpage@ii[#1]#2{%
  \protected\def\blx@range@out@value{#1}%
  \let\blx@range@out@delim\@firstofone
  \let\blx@range@split\blx@firstpage@split
  \blx@range@chunk{#2}%
  \endgroup}

\def\blx@firstpage@split#1{%
  \def\blx@firstpage@abort{\blx@range@out@value{#1}}%
  \blx@firstpage@range#1\bibrangedash\bibrangedash&}

\def\blx@firstpage@range#1\bibrangedash#2\bibrangedash#3&{%
  \ifblank{#3}
    {\blx@firstpage@hyphen#1--&}
    {\ifblank{#1}
       {\blx@range@out@value{\bibrangedash#2}}
       {\blx@range@out@value{#1}}}}

\def\blx@firstpage@hyphen#1-#2-#3&{%
  \ifblank{#3}
    {\blx@firstpage@abort}
    {\ifblank{#1}
       {\ifblank{#2}
          {\blx@firstpage@hyphen@i#3&}
          {\blx@range@out@value{\bibrangedash#2}}}
       {\blx@range@out@value{#1}}}}

\def\blx@firstpage@hyphen@i#1-#2&{%
  \ifblank{#1}
    {\ifblank{#2}
       {\blx@firstpage@abort}
       {\blx@firstpage@hyphen@i#2&}}
    {\blx@range@out@value{\bibrangedash#1}}}

\newcommand*{\ppspace}{\addnbspace}
\newcommand*{\sqspace}{\addnbspace}

\newrobustcmd*{\RN}[1]{%
  \begingroup
  \expandafter\RNfont
  \expandafter{\romannumeral#1}%
  \endgroup}
\newrobustcmd*{\Rn}[1]{%
  \begingroup
  \expandafter\Rnfont
  \expandafter{\romannumeral#1}%
  \endgroup}

\newcommand*{\RNfont}{\uppercase}
\newcommand*{\Rnfont}{}

% Delimiter interface

% [<contextname, ...>]{<name, ...>}{<code>}
\newrobustcmd*{\DeclareDelimFormat}{%
  \@ifstar
    {\blx@declaredelimclear}
    {\blx@declaredelim}}

\newrobustcmd*{\blx@declaredelimclear}[3][]{%
  \def\do##1{\global\cslet{blx@printdelim@##1@#2}=\undefined}%
  \dolistcsloop{blx@declaredelimcontexts@#2}%
  \ifblank{#1}
    {\blx@declaredelim{#2}{#3}}
    {\blx@declaredelim[#1]{#2}{#3}}}

\newrobustcmd*{\blx@declaredelim}[3][]{%
  \ifblank{#1}
    {\blx@declaredelim@i{}{}{#2}{#3}}
    {\def\do##1{%
      \listcsgadd{blx@declaredelimcontexts@#2}{##1}%
      \blx@declaredelim@i{blx@printdelim@##1@}{##1}{#2}{#3}}%
     \docsvlist{#1}}}%

\def\blx@declaredelim@i#1#2#3#4{%
  \begingroup
  \def\do##1{%
    \ifcsdef{#1##1}
      {\blx@inf@delimdeclare{##1}{#2}}
      {}%
    \csgdef{#1##1}{#4}}%
  \docsvlist{#3}%
  \endgroup}

% *[<contextname, ...>]{<alias>}{<delim>}
\newrobustcmd*{\DeclareDelimAlias}{%
  \@ifstar
    {\blx@declaredelimalias}
    {\blx@declaredelimaliasauto}}

\newrobustcmd*{\blx@declaredelimalias}[3][]{%
  \ifblank{#1}
    {\blx@declaredelimalias@i{}{#2}{#3}}
    {\def\do##1{%
      \blx@declaredelimalias@i{blx@printdelim@##1@}{#2}{#3}}%
     \docsvlist{#1}}}

\newrobustcmd*{\blx@declaredelimaliasauto}[2]{%
  \blx@declaredelimalias@i{}{#1}{#2}%
  \ifcsvoid{blx@declaredelimcontexts@#2}
    {}
    {\def\do##1{%
       \blx@declaredelimalias@i{blx@printdelim@##1@}{#1}{#2}}%
     \dolistcsloop{blx@declaredelimcontexts@#2}}}

\def\blx@declaredelimalias@i#1#2#3{%
  \ifcsdef{#1#2}
    {\blx@inf@delimdeclare{#2}{#1}}
    {}%
  \global\csletcs{#1#2}{#1#3}}

\def\blx@delimcontext{none}
\newcommand*{\printdelim}[2][]{%
  \ifblank{#1}
    {\ifcsdef{blx@printdelim@\blx@delimcontext @#2}
      {\csuse{blx@printdelim@\blx@delimcontext @#2}}
      {\ifcsdef{#2}% fall back on legacy macros
        {\csuse{#2}}
        {\blx@warn@delimuse{#2}{*}}}}
    {\ifcsdef{blx@printdelim@#1@#2}
      {\csuse{blx@printdelim@#1@#2}}
      {\blx@warn@delimuse{#2}{#1}}}}

\newcommand*{\delimcontext}[1]{%
  \edef\blx@delimcontext{\blx@delimcontextalias{#1}}}

\def\blx@delimcontextalias#1{%
  \ifcsdef{blx@delimcontextalias@#1}
    {\csuse{blx@delimcontextalias@#1}}
    {#1}}

\newcommand*{\DeclareDelimcontextAlias}[2]{%
  \csgdef{blx@delimcontextalias@#1}{#2}}

\newrobustcmd*{\AtUsedriver}{%
  \@ifstar
    {\global\undef\blx@hook@usedriver
     \gappto\blx@hook@usedriver}
    {\gappto\blx@hook@usedriver}}
\@onlypreamble\AtUsedriver
\def\blx@imc@UseUsedriverHook{\csuse{blx@hook@usedriver}}
\blx@regimcs{\UseUsedriverHook}

\AtUsedriver{%
  \let\finentry\blx@finentry@usedrv
  \let\newblock\relax
  \let\abx@macro@bibindex\@empty
  \let\abx@macro@pageref\@empty}

% {<init>}{<entrytype>}
\protected\def\blx@imc@usedriver#1#2{%
  \begingroup
  \csuse{blx@hook@usedriver}%
  \csuse{blx@hook@bbxinit}#1%
  \delimcontext{bib}%
  \blx@beglangbib
  \blx@driver{#2}%
  \blx@endlangbib
  \endgroup}

% Punctuation

\protected\def\blx@initunit{%
  \global\togglefalse{blx@block}%
  \global\togglefalse{blx@unit}%
  \global\togglefalse{blx@insert}%
  \global\togglefalse{blx@lastins}%
  \global\togglefalse{blx@keepunit}%
  \global\let\blx@unitpunct\newunitpunct
  \blx@imc@resetpunctfont}

\def\blx@begunit{%
  \toggletrue{blx@tempa}%
  \iftoggle{blx@insert}
    {\iftoggle{blx@unit}
       {\begingroup
          \let\blx@begunit\@empty
          \let\blx@endunit\@empty
          \let\blx@endnounit\@empty
          \blx@unitpunct\blx@postpunct
        \endgroup
        \global\togglefalse{blx@unit}%
        \togglefalse{blx@tempa}}
       {\blx@postpunct}%
     \iftoggle{blx@block}
       {\begingroup
          \let\blx@begunit\@empty
          \let\blx@endunit\@empty
          \let\blx@endnounit\@empty
          \newblockpunct
        \endgroup
        \global\togglefalse{blx@block}%
        \togglefalse{blx@tempa}}
       {}}
    {}%
  \blx@postpunct
  \blx@imc@resetpunctfont
  \iftoggle{blx@tempa}
    {}
    {\global\togglefalse{blx@insert}}%
  \blx@leavevmode
  \begingroup}

\def\blx@endunit{%
  \endgroup
  \global\toggletrue{blx@insert}%
  \global\toggletrue{blx@lastins}}

\def\blx@nounit{%
  \global\togglefalse{blx@lastins}}

\def\blx@endnounit{%
  \endgroup\blx@nounit}

\protected\def\blx@imc@newblock{%
  \global\toggletrue{blx@block}}%

\protected\def\blx@imc@newunit{%
  \iftoggle{blx@keepunit}
    {}
    {\global\let\blx@unitpunct\newunitpunct
     \global\toggletrue{blx@unit}}}

\protected\def\blx@imc@setunit{%
  \@ifstar\blx@setunit@i\blx@setunit}

\long\def\blx@setunit#1{%
  \iftoggle{blx@keepunit}
    {}
    {\long\gdef\blx@unitpunct{#1}%
     \global\toggletrue{blx@unit}}}

\def\blx@setunit@i{%
  \iftoggle{blx@lastins}
    {\blx@setunit}
    {\@gobble}}

\protected\def\blx@imc@printunit{%
  \@ifstar\blx@printunit@i\blx@printunit}

\def\blx@printunit#1{%
  \long\gdef\blx@unitpunct{#1\global\togglefalse{blx@keepunit}}%
  \global\toggletrue{blx@keepunit}%
  \global\toggletrue{blx@unit}}

\def\blx@printunit@i{%
  \iftoggle{blx@lastins}
    {\blx@printunit}
    {\@gobble}}

\protected\def\blx@imc@finentry{%
  \unspace\finentrypunct
  \blx@postpunct
  \blx@initunit}

\protected\def\blx@finentry@usedrv{%
  \blx@setunit\relax}

\protected\def\blx@finentry@inset{%
  \blx@setunit\entrysetpunct
  \global\toggletrue{blx@block}}

\def\ifentryseen{\blx@imc@ifentryseen}
\def\ifentryinbib{\blx@imc@ifentryinbib}
\def\ifentrycategory{\blx@imc@ifentrycategory}
\def\ifentrykeyword{\blx@imc@ifentrykeyword}

\def\blx@imc@iflabeldateisdate{%
  \ifboolexpr{%
    togl {blx@labeldateparts}
    and not test {\iffieldundef{labeldatesource}}
    and
    (test {\iffieldequalstr{labeldatesource}{}}
     or test {\iffieldequalstr{labeldatesource}{year}})}}

\def\blx@imc@ifdatehasyearonlyprecision#1{%
  \ifboolexpr{not test {\iffieldundef{#1year}}
              and (test {\ifcsstring{blx@dateformat@#1date}{year}}
                   or (test {\iffieldundef{#1month}}
                       and test {\iffieldundef{#1season}}))}}

\def\blx@imc@ifdatehastime#1{%
  \ifboolexpr{togl {blx@#1dateusetime}
                 and not test {\iffieldundef{#1hour}}}}

\def\blx@imc@ifdateshavedifferentprecision#1#2{%
  \ifboolexpr{   (test {\ifdatehasyearonlyprecision{#1}}
                  and not test {\ifdatehasyearonlyprecision{#2}})
              or (not test {\ifdatehasyearonlyprecision{#1}}
                  and test {\ifdatehasyearonlyprecision{#2}})
              or (test {\ifdatehastime{#1}}
                  and not test {\ifdatehastime{#2}})
              or (not test {\ifdatehastime{#1}}
                  and test {\ifdatehastime{#2}})}}

\blx@regimcs{%
  \ifdriver \thefield \strfield \csfield \usefield \thelist \strlist \thename \strname
  \clearfield \clearlist \clearname \restorefield \restorelist \restorename
  \ifcategory \ifkeyword
  \ifciteseen  \ifciteibid \ifciteidem \ifopcit \ifloccit
  \ifcurrentfield \ifcurrentlist \ifcurrentname \ifentrytype
  \iffieldequalcs \iffieldequals \iffieldequalstr \iffieldsequal
  \ifbibmacroundef \iffieldundef \iffieldxref \iflistequalcs \iflistequals
  \iflistsequal \iflistundef \iflistxref
  \ifmorenames \ifmoreitems \iffirstcitekey \iflastcitekey
  \ifnameequalcs \ifnameequals \ifnamesequal \ifnameundef \ifnamexref
  \iffirstonpage \ifsamepage \savefield \savefieldcs \savelist
  \savelistcs \savename \savenamecs \usedriver
  \ifinteger \ifnumeral \ifnumerals \ifpages
  \iffieldint \iffieldnum \iffieldnums \iffieldpages
  \iflabeldateisdate \ifdatehasyearonlyprecision \ifdatehastime
  \ifdateshavedifferentprecision
  \mkpageprefix \mkpagetotal
  \newblock \newunit \setunit \printunit \finentry}

\appto\blx@blxinit{%
  \def\ifnatbibmode{\iftoggle{blx@natbib}}%
  \def\ifcitation{\iftoggle{blx@citation}}%
  \def\ifbibliography{\iftoggle{blx@bibliography}}%
  \def\ifciteindex{\iftoggle{blx@citeindex}}%
  \def\ifbibindex{\iftoggle{blx@bibindex}}%
  \def\iffootnote{\iftoggle{blx@footnote}}%
  \def\ifuseprefix{\iftoggle{blx@useprefix}}%
  \def\ifterseinits{\iftoggle{blx@terseinits}}%
  \def\ifcrossrefsource{\iftoggle{abx@bool@crossrefsource}}%
  \def\ifxrefsource{\iftoggle{abx@bool@xrefsource}}%
  \def\ifsingletitle{\iftoggle{abx@bool@singletitle}}%
  \def\ifuniquetitle{\iftoggle{abx@bool@uniquetitle}}%
  \def\ifuniquebaretitle{\iftoggle{abx@bool@uniquebaretitle}}%
  \def\ifuniquework{\iftoggle{abx@bool@uniquework}}%
  \def\ifuniqueprimaryauthor{\iftoggle{abx@bool@uniqueprimaryauthor}}%
  \def\ifandothers#1{\iftoggle{abx@bool@more#1}}%
  \protected\def\pno{\bibstring{page}}%
  \protected\def\ppno{\bibstring{pages}}%
  \let\nopp\relax
  \protected\def\psq{\sqspace\bibstring{sequens}}%
  \protected\def\psqq{\sqspace\bibstring{sequentes}}}

% Make sure that commands which might pop up inside an \edef will be defined
% as something. If they are taken \AtBeginDocument then we assume that all will
% be well. If not, then provide a definition which will give an error outside
% of a citation context.
\AtBeginDocument{%
  \protected\def\do#1{%
    \ifdefined#1%
    \else
      \protected\def#1{\ERROR}%
    \fi
  }%
  \docsvlist{\pno,\ppno,\nopp,\psq,\psqq}%
}

%% Global formatting hooks

% capitalization

% {<text>}
\newrobustcmd{\MakeCapital}[1]{%
  \begingroup
  \blx@mkcp@init
  \protected@edef\blx@tempa{#1}%
  \expandafter\blx@mkcp@parse\blx@tempa\@empty\blx@mkcp@end}

\def\blx@mkcp@init{%
  \def\blx@mkcp@iec{\noexpand\blx@mkcp@iec\noexpand}%
  \def\blx@mkcp@bbl{\noexpand\blx@mkcp@bbl\noexpand}%
  \def\blx@mkcp@sgl{\noexpand\blx@mkcp@sgl\noexpand}%
  \def\blx@mkcp@dbl{\noexpand\blx@mkcp@dbl\noexpand}%
  \def\do##1{\def##1{\blx@mkcp@sgl##1}}\abx@dosingleaccents
  \def\do##1{\def##1{\blx@mkcp@dbl##1}}\abx@dodoubleaccents
  \def\IeC##1{\blx@mkcp@iec\IeC{##1}}%
  \def\@tabacckludge##1{%
    \expandafter\blx@mkcp@sgl\csname\string##1\endcsname}}

\begingroup
\catcode`\"=\active
\gappto\blx@mkcp@init{%
  \ifnum\catcode`\"=\active
    \def"#1{\blx@mkcp@bbl"\noexpand#1}%
  \fi}
\endgroup

\def\blx@mkcp@parse{%
  \futurelet\@let@token\blx@mkcp@eval}

\long\def\blx@mkcp@eval{%
  \ifx\@let@token\blx@mkcp@iec
    \expandafter\blx@mkcp@getiec
  \fi
  \ifx\@let@token\blx@mkcp@bbl
    \expandafter\blx@mkcp@gettwo
  \fi
  \ifx\@let@token\blx@mkcp@sgl
    \expandafter\blx@mkcp@gettwo
  \fi
  \ifx\@let@token\blx@mkcp@dbl
    \expandafter\blx@mkcp@getthree
  \fi
  \blx@mkcp@case}

\def\blx@mkcp@getiec#1\blx@mkcp@case#2#3#4{%
  \blx@mkcp@case{#2#3{#4}}}

\def\blx@mkcp@gettwo#1\blx@mkcp@case#2#3#4{%
  \blx@mkcp@case{#2#3#4}}

\def\blx@mkcp@getthree#1\blx@mkcp@case#2#3#4#5{%
  \blx@mkcp@case{#2#3#4#5}}

\long\def\blx@mkcp@case#1{%
  \begingroup
  \def\i{I}\def\j{J}%
  \def\do##1##2{\let##1##2\do}%
  \expandafter\do\@uclclist\relax{\relax\@gobble}%
  \uppercase{\protected@edef\blx@tempa{\endgroup\blx@mkcp@end#1}}%
  \blx@tempa}

\protected\long\def\blx@mkcp@end#1\blx@mkcp@end{%
  \let\blx@mkcp@iec\noexpand
  \let\blx@mkcp@bbl\noexpand
  \let\blx@mkcp@sgl\noexpand
  \let\blx@mkcp@dbl\noexpand
  \protected@edef\blx@tempa{\endgroup#1}%
  \blx@tempa}

\def\abx@dosingleaccents{%
  \do\"\do\'\do\`\do\^\do\~\do\=\do\.%
  \do\H\do\b\do\c\do\d\do\r\do\u\do\v}
\def\abx@dodoubleaccents{%
  \do\t}

% {<text>}
\newrobustcmd*{\MakeSentenceCase}{%
  \@ifstar\blx@mksc@i\blx@mksc@ii}

% Check, in order:
% * explicit option language=<lang>, which overrides everything
% * langid field of entry
% * babel/polyglossia lang
% * main document lang
\def\blx@mksc@i{%
  \ifdef\blx@forcelanguagename
    {\xifinlist\blx@forcelanguagename\blx@cmksc@lang
       {\blx@mksc@ii}
       {\@firstofone}}
    {\ifdef\abx@field@langid
      {\xifinlist\abx@field@langid\blx@cmksc@lang
         {\blx@mksc@ii}
         {\@firstofone}}
      {\ifdef\bbl@main@language
        {\xifinlist\bbl@main@language\blx@cmksc@lang
          {\blx@mksc@ii}
          {\@firstofone}}
        {\xifinlist\blx@languagename\blx@cmksc@lang
          {\blx@mksc@ii}
          {\@firstofone}}}}}

\long\def\blx@mksc@ii#1{%
  \begingroup
  \let\blx@tempa\@empty
  \let\blx@tempb\@empty
  \blx@mksc@init
  \protected@edef\@tempa{#1}%
  \expandafter\blx@mksc@parse\@tempa\blx@mksc@end}

\def\blx@mksc@init{%
  \blx@mkcp@init
  \def\blx@mkcp@nil{\noexpand\blx@mkcp@nil\noexpand}%
  \def\i{\blx@mkcp@nil\i}\def\j{\blx@mkcp@nil\j}%
  \def\do##1{%
    \ifx##1\relax
    \else
      \def##1{\blx@mkcp@nil##1}%
      \expandafter\do
    \fi}%
  \expandafter\do\@uclclist\relax}

\def\blx@mksc@parse{%
  \futurelet\@let@token\blx@mksc@eval}

\def\blx@mksc@eval{%
  \ifx\@let@token\blx@mksc@end
    \expandafter\blx@mksc@end
  \fi
  \ifx\@let@token\bgroup
    \expandafter\blx@mksc@group
  \fi
  \ifx\@let@token\@sptoken
    \expandafter\blx@mksc@space
  \fi
  \ifx\@let@token\blx@mkcp@nil
    \expandafter\blx@mksc@getone
  \fi
  \ifx\@let@token\blx@mkcp@iec
    \expandafter\blx@mksc@getiec
  \fi
  \ifx\@let@token\blx@mkcp@bbl
    \expandafter\blx@mksc@gettwo
  \fi
  \ifx\@let@token\blx@mkcp@sgl
    \expandafter\blx@mksc@gettwo
  \fi
  \ifx\@let@token\blx@mkcp@dbl
    \expandafter\blx@mksc@getthree
  \fi
  \if\noexpand\@let@token\relax
    \expandafter\blx@mksc@cs
  \fi
  \blx@mksc@other}

\def\blx@mksc@end#1\blx@mksc@end{%
  \blx@mksc@eject
  \let\blx@mkcp@nil\noexpand
  \let\blx@mkcp@iec\noexpand
  \let\blx@mkcp@bbl\noexpand
  \let\blx@mkcp@sgl\noexpand
  \let\blx@mkcp@dbl\noexpand
  \let\MakeUppercase\relax
  \let\MakeLowercase\relax
  \protected@edef\blx@tempa{\endgroup\blx@tempa}%
  \blx@tempa}

\long\def\blx@mksc@group#1\blx@mksc@other#2{%
  \futurelet\@let@token\blx@mksc@ingroup#2&{#2}%
  \blx@mksc@endhead
  \blx@mksc@parse}

\long\def\blx@mksc@ingroup#1&#2{%
  \if\noexpand\@let@token\relax
    \ifx\@let@token\blx@mkcp@sgl
      \blx@mksc@nocase{{#2}}%
    \else
      \ifx\@let@token\blx@mkcp@dbl
        \blx@mksc@nocase{{#2}}%
      \else
        \blx@mksc@locase{{#2}}%
      \fi
    \fi
  \else
    \blx@mksc@nocase{{#2}}%
  \fi}

\def\blx@mksc@space{\def\blx@mksc@space##1\blx@mksc@other}
\csuse{blx@mksc@space} {%
  \blx@mksc@anycase{ }%
  \blx@mksc@endhead
  \blx@mksc@parse}

\long\def\blx@mksc@cs#1\blx@mksc@other#2{%
  \ifcat\noexpand~\noexpand#2%
    \blx@mksc@locase{#2}%
  \else
    \blx@mksc@nocase{#2}%
  \fi
  \blx@mksc@endhead
  \blx@mksc@parse}

\def\blx@mksc@getiec#1\blx@mksc@other#2#3#4{%
  \blx@mksc@other{#2#3{#4}}}

\def\blx@mksc@getone#1\blx@mksc@other#2#3{%
  \blx@mksc@other{#2#3}}

\def\blx@mksc@gettwo#1\blx@mksc@other#2#3#4{%
  \blx@mksc@other{#2#3#4}}

\def\blx@mksc@getthree#1\blx@mksc@other#2#3#4#5{%
  \blx@mksc@other{#2#3#4#5}}

\long\def\blx@mksc@other#1{%
  \blx@mksc@locase{#1}%
  \blx@mksc@endhead
  \blx@mksc@parse}

\def\blx@mksc@locase{%
  \appto\blx@tempb}

\def\blx@mksc@nocase{%
  \blx@mksc@eject
  \appto\blx@tempa}

\def\blx@mksc@anycase{%
  \ifx\blx@tempb\@empty
    \expandafter\appto
    \expandafter\blx@tempa
  \else
    \expandafter\appto
    \expandafter\blx@tempb
  \fi}

\def\blx@mksc@eject{%
  \ifx\blx@tempb\@empty
  \else
    \eappto\blx@tempa{\noexpand\MakeLowercase{\expandonce\blx@tempb}}%
    \let\blx@tempb\@empty
  \fi}

\def\blx@mksc@endhead{%
  \ifx\blx@tempb\@empty
  \else
    \eappto\blx@tempa{\noexpand\MakeCapital{\expandonce\blx@tempb}}%
    \let\blx@tempb\@empty
  \fi
  \let\blx@mksc@endhead\relax}

% {<language,language,...>}
\newrobustcmd*{\DeclareCaseLangs}{%
  \@ifstar
    {\blx@defcaselangs}
    {\global\let\blx@cmksc@lang\@empty
     \blx@defcaselangs}}

\def\blx@defcaselangs#1{%
  \ifblank{#1}
    {}
    {\forcsvlist{\listgadd\blx@cmksc@lang}{#1}}}

\DeclareCaseLangs{%
  american,british,canadian,
  english,USenglish,UKenglish,
  australian,newzealand}

\newrobustcmd*{\ifcaselang}[1][]{%
  \ifblank{#1}
    {\xifinlist\blx@languagename\blx@cmksc@lang}
    {\xifinlist{#1}\blx@cmksc@lang}}

%% Main formatting commands
% They work by creating a \let alias:
% \abx@<class>@<entrytype>@<formatname> -> \blx@defformat@d
% for later use in \print*
% Then, \blx@defformat@d is defined by calling
% \def\blx@defformat@d#1{format body}

% [<entrytype>]{<name>}{<definiton>}
\newrobustcmd*{\DeclareNameFormat}{%
  \@ifstar
    {\blx@defformat\blx@defnameformat{nfd}*}
    {\blx@defformat\blx@defnameformat{nfd}{}}}

\newrobustcmd*{\DeclareIndexNameFormat}{%
  \@ifstar
    {\blx@defformat\blx@defnameformat{nid}*}
    {\blx@defformat\blx@defnameformat{nid}{}}}

\newrobustcmd*{\DeclareListFormat}{%
  \@ifstar
    {\blx@defformat\blx@defplainformat{lfd}*}
    {\blx@defformat\blx@defplainformat{lfd}{}}}
\newrobustcmd*{\DeclareIndexListFormat}{%
  \@ifstar
    {\blx@defformat\blx@defplainformat{lid}*}
    {\blx@defformat\blx@defplainformat{lid}{}}}

\newrobustcmd*{\DeclareFieldFormat}{%
  \@ifstar
    {\blx@defformat\blx@defplainformat{ffd}*}
    {\blx@defformat\blx@defplainformat{ffd}{}}}
\newrobustcmd*{\DeclareIndexFieldFormat}{%
  \@ifstar
    {\blx@defformat\blx@defplainformat{fid}*}
    {\blx@defformat\blx@defplainformat{fid}{}}}

% {<macro>}{<class>}{<*>}
\def\blx@defformat#1#2#3{%
  \@ifnextchar[%]
    {\blx@defformat@i{#1}{#2}{#3}}
    {\blx@defformat@i{#1}{#2}{#3}[*]}}

% {<macro>}{<class>}{<*>}[<entrytype>]{<name>}
\def\blx@defformat@i#1#2#3[#4]#5{%
  \notblank{#3}
    {\blx@resetformat{#2}{#5}}
    {}%
  \def\blx@defformat@a{#2}%
  \def\blx@defformat@b{#4}%
  \blx@xsanitizeafter{\def\blx@defformat@c}{#5}%
  \afterassignment\blx@defformat@ii
  #1}

\def\blx@defformat@ii{%
  \expandafter\forcsvlist
  \expandafter\blx@defformat@iii
  \expandafter{\blx@defformat@b}}

\def\blx@defformat@iii#1{%
  \cslet{abx@\blx@defformat@a @#1@\blx@defformat@c}\blx@defformat@d}

\def\blx@defplainformat{%
  \long\def\blx@defformat@d##1}

\def\blx@defnameformat{%
  \long\def\blx@defformat@d##1}

\def\blx@resetformat#1#2{%
  \let\blx@saved@do\do
  \def\do##1{\blx@resetformat@i{#1}{#2}{##1}}%
  \blx@safe@actives
  \abx@doentrytypes
  \blx@rest@actives
  \let\do\blx@saved@do}

\def\blx@resetformat@i#1#2#3{%
  \ifcsdef{abx@#1@#3@#2}
    {\csundef{abx@#1@#3@#2}}
    {}}

% {<name>}{<name>}
\def\blx@letformat#1#2{%
  \blx@safe@actives
  \afterassignment\blx@rest@actives
  \csletcs{#1}{#2}}

% [aliastype]{aliasname}[formattype]{formatname}
\def\blx@defalias#1{%
  \@ifnextchar[%]
    {\blx@defalias@i{#1}}
    {\blx@defalias@i{#1}[*]}}
\def\blx@defalias@i#1[#2]#3{%
  \@ifnextchar[%]
    {\blx@defalias@ii{#1}{#2}{#3}}
    {\blx@defalias@ii{#1}{#2}{#3}[*]}}
\def\blx@defalias@ii#1#2#3[#4]#5{%
  \blx@safe@actives
  \afterassignment\blx@rest@actives
  \csedef{abx@#1@#2@#3}{%
    \expandonce{\csname abx@#1@#4@#5\endcsname}}}



% {<macro>}{<class>}{<name>}{<field>}
\def\blx@getformat#1#2#3#4{%
  \blx@safe@actives
  \afterassignment\blx@rest@actives
  \ifcsundef{abx@#2@\blx@imc@thefield{entrytype}@#3}
    {\ifcsundef{abx@#2@*@#3}
       {\ifcsundef{abx@#2@\blx@imc@thefield{entrytype}@#4}
          {\ifcsundef{abx@#2@*@#4}
             {\letcs#1{abx@#2@*@default}}
             {\letcs#1{abx@#2@*@#4}}}
          {\letcs#1{abx@#2@\blx@imc@thefield{entrytype}@#4}}}
       {\letcs#1{abx@#2@*@#3}}}
    {\letcs#1{abx@#2@\blx@imc@thefield{entrytype}@#3}}}

% [<entrytype>]{<name>}
\newrobustcmd*{\savefieldformat}[2][*]{\blx@save{abx@ffd@#1@#2}}
\newrobustcmd*{\savelistformat}[2][*]{\blx@save{abx@lfd@#1@#2}}
\newrobustcmd*{\savenameformat}[2][*]{\blx@save{abx@nfd@#1@#2}}

\newrobustcmd*{\restorefieldformat}[2][*]{\blx@restore{abx@ffd@#1@#2}}
\newrobustcmd*{\restorelistformat}[2][*]{\blx@restore{abx@lfd@#1@#2}}
\newrobustcmd*{\restorenameformat}[2][*]{\blx@restore{abx@nfd@#1@#2}}

% [<entrytype>]{<name>}{<true>}{<false>}
\newrobustcmd*{\iffieldformatundef}[2][*]{\ifcsundef{abx@ffd@#1@#2}}
\newrobustcmd*{\iflistformatundef}[2][*]{\ifcsundef{abx@lfd@#1@#2}}
\newrobustcmd*{\ifnameformatundef}[2][*]{\ifcsundef{abx@nfd@#1@#2}}

% [<entrytype>]{<alias>}[<entrytype>]{<name>}
\newrobustcmd*{\DeclareNameAlias}{\blx@defalias{nfd}}
\newrobustcmd*{\DeclareIndexNameAlias}{\blx@defalias{nid}}

\newrobustcmd*{\DeclareListAlias}{\blx@defalias{lfd}}
\newrobustcmd*{\DeclareIndexListAlias}{\blx@defalias{lid}}

\newrobustcmd*{\DeclareFieldAlias}{\blx@defalias{ffd}}
\newrobustcmd*{\DeclareIndexFieldAlias}{\blx@defalias{fid}}

% [<format>]{<text>}
\newrobustcmd{\blx@imc@printtext}[2][]{%
  \ifblank{#2}
    {\blx@nounit}
    {\ifblank{#1}
       {\let\blx@theformat\@firstofone}
       {\blx@getformat\blx@theformat{ffd}{#1}{}}%
     \ifdefvoid\blx@theformat
       {\blx@nounit}
       {\blx@begunit
        \blx@theformat{#2}%
        \blx@endunit}}}

% [<format>]{<field>}
\newrobustcmd*{\blx@imc@printfield}[2][]{%
  \blx@imc@iffieldundef{#2}
    {\blx@nounit}
    {\blx@getformat\blx@theformat{ffd}{#1}{#2}%
     \ifdefvoid\blx@theformat
       {\blx@nounit}
       {\blx@begunit
        \edef\currentfield{#2}%
        \expandafter\expandafter
        \expandafter\blx@theformat
        \expandafter\expandafter
        \expandafter{\csname abx@field@#2\endcsname}%
        \blx@endunit}}}

% [<format>]{<field>}
\newcommand*{\blx@imc@indexfield}[2][]{%
  \blx@imc@iffieldundef{#2}
    {}
    {\blx@getformat\blx@theformat{fid}{#1}{#2}%
     \ifdefvoid\blx@theformat
       {}
       {\begingroup
        \edef\currentfield{#2}%
        \letcs\blx@tempa{abx@field@#2}%
        \expandafter\blx@theformat\expandafter{\blx@tempa}%
        \endgroup}}}

% [<format>]{<file>}
\newrobustcmd*{\blx@imc@printfile}[2][]{%
  \iftoggle{blx@loadfiles}
    {\IfFileExists{#2}
       {\listxadd\blx@list@req@edit{#2}%
        \blx@imc@printtext[#1]{\input{#2}\unspace}}
       {\blx@nounit}}
    {\blx@nounit}}

% {<macro>}[<format>][<start>-<stop>]
% => <macro>{<format>}{<start>}{<stop>}
\def\blx@listargs#1{%
  \@ifnextchar[%]
    {\blx@listargs@i{#1}}
    {#1{}{}{}}}

\def\blx@listargs@i#1[#2]{%
  \@ifnextchar[%]
    {\blx@listargs@ii{#1}{#2}}
    {#1{#2}{}{}}}

\def\blx@listargs@ii#1#2[#3]{%
  \blx@listargs@iii{#1}{#2}#3&}

\def\blx@listargs@iii#1#2#3-#4&{%
  #1{#2}{#3}{#4}}

% [<format>][<start>-<stop>]{<namelist>}
\protected\def\blx@imc@printnames{%
  \blx@listargs\blx@printnames}

% {<format>}{<start>}{<stop>}{<namelist>}
\def\blx@printnames#1#2#3#4{%
  \blx@imc@ifnameundef{#4}
    {\blx@nounit}
    {\blx@getformat\blx@theformat{nfd}{#1}{#4}%
     \ifdefvoid\blx@theformat
       {\blx@nounit}
       {\blx@begunit
        \blx@namesetup{#2}{#3}{#4}%
        \expandafter\blx@nameparser\blx@thedata{}&%
        \blx@endunit}}}

\def\blx@namesetup#1#2#3{%
  \def\currentname{#3}%
  \c@listcount\@ne
  \c@listtotal\csname c@#3\endcsname
  \blx@namesetup@i{#3}%
  \ifblank{#1}
    {\c@liststart\@ne}
    {\ifnum#1<\@ne
       \c@liststart\@ne
     \else
       \c@liststart#1\relax
     \fi}%
  \ifblank{#2}
    {\c@liststop\c@listtotal
     \ifnum\c@liststop>\c@maxnames
       \c@liststop\c@minnames
       \ifnum\c@uniquelist>\c@liststop
         \c@liststop\c@uniquelist
       \fi
     \fi}
    {\ifnum#2>\c@listtotal
       \c@liststop\c@listtotal
     \else
       \ifnum#2<\@ne
         \c@liststop\@ne
       \else
         \c@liststop#2\relax
       \fi
     \fi}%
  \blx@namecodes}

\def\blx@namesetup@i#1{%
  \expandafter\expandafter
  \expandafter\blx@namesetup@ii\csname abx@name@#1\endcsname}

\def\blx@namesetup@ii#1#2{%
  \c@uniquelist\z@
  \ifblank{#1}
    {}
    {\setkeys{blx@opt@namelist}{#1}}%
  \def\blx@thedata{#2}}

% These are options in the .bbl that biber makes explicit as they are needed in biblatex
% for various reasons. Not all namelist/name scope options are necessary in the .bbl as
% some are used by biber only and are not needed by biblatex after biber has finished
% generating the .bbl
% Per-namelist options
\define@key{blx@opt@namelist}{uniquelist}{\c@uniquelist#1\relax}
\define@key{blx@opt@namelist}{useprefix}{\settoggle{blx@useprefix}{#1}}
\define@key{blx@opt@namelist}{sortingnamekeytemplatename}{\def\blx@refcontext@sortingnamekeytemplatename{#1}}
\define@key{blx@opt@namelist}{uniquenametemplatename}{\def\blx@refcontext@uniquenametemplatename{#1}}
\define@key{blx@opt@namelist}{labelalphanametemplatename}{\def\blx@refcontext@labelalphanametemplatename{#1}}

% Per-name options
\define@key{blx@opt@name}{uniquename}{\c@uniquename#1\relax}
\define@key{blx@opt@name}{uniquepart}{\def\abx@field@uniquepart{#1}}
\define@key{blx@opt@name}{hash}{\edef\abx@field@hash{\detokenize{#1}}}
\define@key{blx@opt@name}{useprefix}{\settoggle{blx@useprefix}{#1}}
\define@key{blx@opt@name}{sortingnamekeytemplatename}{\def\blx@refcontext@sortingnamekeytemplatename{#1}}
\define@key{blx@opt@name}{uniquenametemplatename}{\def\blx@refcontext@uniquenametemplatename{#1}}
\define@key{blx@opt@name}{labelalphanametemplatename}{\def\blx@refcontext@labelalphanametemplatename{#1}}

\newrobustcmd*{\bibinitperiod}{\adddot}
\newrobustcmd*{\bibinitdelim}{\addnbspace}
\newrobustcmd*{\bibinithyphendelim}{.\mbox{-}}
\newrobustcmd*{\bibnamedelima}{\addhighpenspace}
\newrobustcmd*{\bibnamedelimb}{\addlowpenspace}
\newrobustcmd*{\bibnamedelimc}{\addhighpenspace}
\newrobustcmd*{\bibnamedelimd}{\addlowpenspace}
\newrobustcmd*{\bibnamedelimi}{\addnbspace}

% [<format>][<start>-<stop>]{<namelist>}
\protected\def\blx@imc@indexnames{%
  \blx@listargs\blx@indexnames}

% {<format>}{<start>}{<stop>}{<namelist>}
\def\blx@indexnames#1#2#3#4{%
  \blx@imc@ifnameundef{#4}
    {}
    {\blx@getformat\blx@theformat{nid}{#1}{#4}%
     \ifdefvoid\blx@theformat
       {}
       {\begingroup
        \blx@namesetup{#2}{#3}{#4}%
        \blx@indexnamesetup
        \expandafter\blx@nameparser\blx@thedata{}&%
        \endgroup}}}

\def\blx@indexnamesetup{%
  \let\bibinitperiod\bibindexinitperiod
  \let\bibinitdelim\bibindexinitdelim
  \let\bibinithyphendelim\bibindexinithyphendelim
  \let\bibnamedelima\bibindexnamedelima
  \let\bibnamedelimb\bibindexnamedelimb
  \let\bibnamedelimc\bibindexnamedelimc
  \let\bibnamedelimd\bibindexnamedelimd
  \let\bibnamedelimi\bibindexnamedelimi}

% {<name1>}{<name2>}{...}
\long\def\blx@nameparser#1{%
  \ifblank{#1}
    {\blx@namebreak}
    {\ifnum\c@listcount<\c@liststart
     \else
       \blx@nameparser@i#1%
     \fi
     \advance\c@listcount\@ne
     \ifnum\c@listcount>\c@liststop
       \expandafter\blx@namebreak
     \fi
     \blx@nameparser}}

% {name opts}{nameparts}
\long\def\blx@nameparser@i#1#2{%
  \ifblank{#1}
    {}
    {\setkeys{blx@opt@name}{#1}}%
  % reset all the nameparts to empty between names
  \def\do##1{%
    \cslet{namepart##1}\@empty
    \cslet{namepart##1i}\@empty}%
  \expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}%
  \setkeys{blx@opt@namepart}{#2}% Extract nameparts information
  % Still pass the nameparts forward for backwards compat
  % When \nameparts is finally removed, remove the "{2}" and remove the
  % arg to \blx@defformat@d in def of \blx@defnameformat
  \blx@theformat{#2}}

\long\def\blx@namebreak#1&{}

% [<format>][<start>-<stop>]{<plainlist>}
\protected\def\blx@imc@printlist{%
  \blx@listargs\blx@printlist}

% {<format>}{<start>}{<stop>}{<plainlist>}
\def\blx@printlist#1#2#3#4{%
  \blx@imc@iflistundef{#4}
    {\blx@nounit}
    {\blx@getformat\blx@theformat{lfd}{#1}{#4}%
     \ifdefvoid\blx@theformat
       {\blx@nounit}
       {\blx@begunit
        \blx@listsetup{#2}{#3}{#4}%
        \expandafter\blx@listparser\blx@thedata{}&%
        \blx@endunit}}}

\def\blx@listsetup#1#2#3{%
  \def\currentlist{#3}%
  \c@listcount\@ne
  \expandafter\c@listtotal\csname c@#3\endcsname
  \letcs\blx@thedata{abx@list@#3}%
  \ifblank{#1}
    {\c@liststart\@ne}
    {\ifnum#1<\@ne
       \c@liststart\@ne
     \else
       \c@liststart#1\relax
     \fi}%
  \ifblank{#2}
    {\c@liststop\c@listtotal
     \ifnum\c@listtotal>\c@maxitems
       \c@liststop\c@minitems
     \fi}
    {\ifnum#2>\c@listtotal
       \c@liststop\c@listtotal
     \else
       \ifnum#2<\@ne
         \c@liststop\@ne
       \else
         \c@liststop#2\relax
       \fi
     \fi}}

% [<format>][<start>-<stop>]{<plainlist>}
\protected\def\blx@imc@indexlist{%
  \blx@listargs\blx@indexlist}

% {<format>}{<start>}{<stop>}{<plainlist>}
\def\blx@indexlist#1#2#3#4{%
  \blx@imc@iflistundef{#4}
    {}
    {\blx@getformat\blx@theformat{lid}{#1}{#4}%
     \ifdefvoid\blx@theformat
       {}
       {\begingroup
        \blx@listsetup{#2}{#3}{#4}%
        \expandafter\blx@listparser\blx@thedata{}&%
        \endgroup}}}

% {<item1>}{<item2>}{...}
\long\def\blx@listparser#1{%
  \ifblank{#1}
    {\blx@listbreak}
    {\ifnum\c@listcount<\c@liststart
     \else
       \blx@theformat{#1}%
     \fi
     \advance\c@listcount\@ne
     \ifnum\c@listcount>\c@liststop
       \expandafter\blx@listbreak
     \fi
     \blx@listparser}}

\long\def\blx@listbreak#1&{}

% <*>{<key>}{<code>}
\protected\def\blx@imc@entrydata{%
  \@ifstar
    {\blx@xsanitizeafter{\blx@imc@entrydata@i\blx@saveentry}}
    {\blx@xsanitizeafter{\blx@imc@entrydata@i{}}}}

\long\def\blx@imc@entrydata@i#1#2#3{%
  \blx@getrefcontext{#2}%
  \blx@ifdata{#2}
    {\begingroup
     #1%
     \blx@resetdata
     \blx@getdata{#2}%
     \blx@entrysetcount
     \blx@setoptions@type\abx@field@entrytype
     \blx@setoptions@entry
     \addtocounter{instcount}\@ne
     \blx@execute
     \blx@beglangbib#3\blx@endlangbib
     \endgroup}
    {}}

\protected\def\blx@imc@entryset#1#2{%
  \blx@imc@iffieldundef{entrykey}
    {}
    {\begingroup
     \long\def\blx@entryset@precode{#1}%
     \long\def\blx@entryset@postcode{#2}%
     \let\finentry\blx@finentry@inset
     \let\do\blx@entryset
     \blx@imc@docsvfield{entryset}%
     \endgroup}}

\def\blx@entryset#1{%
  \blx@ifdata{#1}
    {\begingroup
     \blx@imc@clearlist{pageref}%
     \blx@getdata{#1}%
     \blx@setoptions@type\abx@field@entrytype
     \def\abx@field@entrysetcount{1}%
     \blx@anchor
     \blx@entryset@precode
     \blx@driver{\blx@imc@thefield{entrytype}}%
     \blx@entryset@postcode
     \endgroup}
    {}%
  \let\do\blx@entryset@i}

\def\blx@entryset@i#1{%
  \blx@ifdata{#1}
    {\begingroup
     \blx@resetdata
     \blx@getdata{#1}%
     \blx@entrysetcount
     \blx@setoptions@type\abx@field@entrytype
     \blx@setoptions@entry
     \addtocounter{instcount}\@ne
     \blx@execute
     \blx@begunit
     \blx@anchor
     \blx@beglangbib
     \blx@entryset@precode
     \blx@driver{\blx@imc@thefield{entrytype}}
     \blx@entryset@postcode
     \blx@endunit
     \blx@endlangbib
     \endgroup}
    {\blx@nounit}}

\blx@regimcs{%
  \printtext \printfield \printlist \printnames \printfile
  \indexfield \indexlist \indexnames \entrydata \entryset}

%% Localization

% [<wrapper>]{<string>}
\newrobustcmd*{\blx@imc@bibstring}[2][\@firstofone]{%
  \blx@bibstring{#1}{\abx@str}{#2}}

\newrobustcmd*{\blx@imc@biblstring}[2][\@firstofone]{%
  \blx@bibstring{#1}{abx@lstr}{#2}}

\newrobustcmd*{\blx@imc@bibsstring}[2][\@firstofone]{%
  \blx@bibstring{#1}{abx@sstr}{#2}}

\def\blx@bibstringsimple{%
  \let\bibstring\blx@imc@bibxstring
  \let\biblstring\blx@imc@bibxlstring
  \let\bibsstring\blx@imc@bibxsstring}

\def\blx@bibstringnormal{%
  \let\bibstring\blx@imc@bibstring
  \let\biblstring\blx@imc@biblstring
  \let\bibsstring\blx@imc@bibsstring}

\protected\def\blx@bibstring#1#2#3{%
  \blx@begunit
  \blx@hyphenreset
  \blx@bibstringsimple
  \lowercase{\edef\blx@tempa{#3}}%
  \ifcsundef{#2@\blx@tempa}
    {\blx@warn@nostring\blx@tempa
     \blx@endnounit}
    {\blx@imc@ifcapital
       {#1{\MakeCapital{\csuse{#2@\blx@tempa}}}}
       {#1{\csuse{#2@\blx@tempa}}}%
     \blx@endunit}}

% [<wrapper>]{<string>}
\newrobustcmd*{\blx@imc@bibcpstring}[2][\@firstofone]{%
  \blx@bibcpstring{#1}{\abx@str}{#2}}

\newrobustcmd*{\blx@imc@bibcplstring}[2][\@firstofone]{%
  \blx@bibcpstring{#1}{abx@lstr}{#2}}

\newrobustcmd*{\blx@imc@bibcpsstring}[2][\@firstofone]{%
  \blx@bibcpstring{#1}{abx@sstr}{#2}}

\protected\def\blx@bibcpstring#1#2#3{%
  \blx@begunit
  \blx@hyphenreset
  \blx@bibstringsimple
  \lowercase{\edef\blx@tempa{#3}}%
  \ifcsundef{#2@\blx@tempa}
    {\blx@warn@nostring\blx@tempa
     \blx@endnounit}
    {#1{\MakeCapital{\csuse{#2@\blx@tempa}}}%
     \blx@endunit}}

% [<wrapper>]{<string>}
\newrobustcmd*{\blx@imc@biblcstring}[2][\@firstofone]{%
  \blx@biblcstring{#1}{\abx@str}{#2}}

\newrobustcmd*{\blx@imc@biblclstring}[2][\@firstofone]{%
  \blx@biblcstring{#1}{abx@lstr}{#2}}

\newrobustcmd*{\blx@imc@biblcsstring}[2][\@firstofone]{%
  \blx@biblcstring{#1}{abx@sstr}{#2}}

\protected\def\blx@biblcstring#1#2#3{%
  \blx@begunit
  \blx@hyphenreset
  \blx@bibstringsimple
  \lowercase{\edef\blx@tempa{#3}}%
  \ifcsundef{#2@\blx@tempa}
    {\blx@warn@nostring\blx@tempa
     \blx@endnounit}
    {#1{\MakeLowercase{\csuse{#2@\blx@tempa}}}%
     \blx@endunit}}

% [<wrapper>]{<string>}
\newrobustcmd*{\blx@imc@bibucstring}[2][\@firstofone]{%
  \blx@bibucstring{#1}{\abx@str}{#2}}

\newrobustcmd*{\blx@imc@bibuclstring}[2][\@firstofone]{%
  \blx@bibucstring{#1}{abx@lstr}{#2}}

\newrobustcmd*{\blx@imc@bibucsstring}[2][\@firstofone]{%
  \blx@bibucstring{#1}{abx@sstr}{#2}}

\protected\def\blx@bibucstring#1#2#3{%
  \blx@begunit
  \blx@hyphenreset
  \blx@bibstringsimple
  \lowercase{\edef\blx@tempa{#3}}%
  \ifcsundef{#2@\blx@tempa}
    {\blx@warn@nostring\blx@tempa
     \blx@endnounit}
    {#1{\MakeUppercase{\csuse{#2@\blx@tempa}}}%
     \blx@endunit}}

% {<string>}
\def\blx@imc@bibxstring#1{%
  \blx@bibxstring{\abx@str}{#1}}

\def\blx@imc@bibxlstring#1{%
  \blx@bibxstring{abx@lstr}{#1}}

\def\blx@imc@bibxsstring#1{%
  \blx@bibxstring{abx@sstr}{#1}}

\def\blx@bibxstring#1#2{%
  \ifcsundef{#1@#2}
    {\protect\blx@warn@nostring{#2}}
    {\csuse{#1@#2}}}

% {<string>}{<true>}{<false>}
\def\blx@imc@ifbibstring#1{%
  \ifcsundef{\abx@str @\detokenize{#1}}
    {\@secondoftwo}
    {\@firstoftwo}}

\def\blx@imc@ifbibxstring#1{%
  \blx@xsanitizeafter\ifcsundef{\abx@str @#1}
    {\@secondoftwo}
    {\@firstoftwo}}

% {<field>}{<true>}{<false>}
\def\blx@imc@iffieldbibstring#1{%
  \blx@imc@iffieldundef{#1}
    {\@secondoftwo}
    {\ifcsundef{\abx@str @\detokenize\expandafter
                          \expandafter\expandafter{%
                \csname abx@field@#1\endcsname}}
       {\@secondoftwo}
       {\@firstoftwo}}}

\blx@regimcs{%
  \bibstring   \biblstring   \bibsstring
  \bibxstring  \bibxlstring  \bibxsstring
  \bibcpstring \bibcplstring \bibcpsstring
  \biblcstring \biblclstring \biblcsstring
  \bibucstring \bibuclstring \bibucsstring
  \ifbibstring \ifbibxstring \iffieldbibstring}

\let\blx@hook@uc\relax
\let\blx@hook@lc\relax

\AtEndPreamble{%
  \toggletrue{blx@tempa}%
  \toggletrue{blx@tempb}%
  \expandafter\patchcmd\csname MakeUppercase \endcsname
    {\protected@edef}
    {\blx@hook@uc\protected@edef}
    {\togglefalse{blx@tempa}}
    {}%
  \expandafter\patchcmd\csname MakeLowercase \endcsname
    {\protected@edef}
    {\blx@hook@lc\protected@edef}
    {\togglefalse{blx@tempb}}
    {}%
  \@ifpackageloaded{textcase}
    {\expandafter\patchcmd\csname MakeUppercase \endcsname
       {\def\i}
       {\blx@hook@uc\def\i}
       {\togglefalse{blx@tempa}}
       {}%
     \expandafter\patchcmd\csname MakeLowercase \endcsname
       {\@uclcnotmath{}}
       {\@uclcnotmath{\blx@hook@lc}}
       {\togglefalse{blx@tempb}}
       {}%
     \expandafter\patchcmd\csname MakeTextUppercase \endcsname
       {\def\i}
       {\blx@hook@uc\def\i}
       {}
       {}%
     \expandafter\patchcmd\csname MakeTextLowercase \endcsname
       {\@uclcnotmath{}}
       {\@uclcnotmath{\blx@hook@lc}}
       {}
       {}}
    {}%
  \iftoggle{blx@tempa}{\blx@err@patch{\string\MakeUppercase}}{}%
  \iftoggle{blx@tempb}{\blx@err@patch{\string\MakeLowercase}}{}%
}

\appto\blx@blxinit{%
  \def\blx@hook@uc{%
    \def\bibstring{\blx@imc@bibucstring}%
    \def\biblstring{\blx@imc@bibuclstring}%
    \def\bibsstring{\blx@imc@bibucsstring}%
    \def\biblcstring{\blx@imc@bibucstring}%
    \def\biblclstring{\blx@imc@bibuclstring}%
    \def\biblcsstring{\blx@imc@bibucsstring}%
    \def\bibcpstring{\blx@imc@bibucstring}%
    \def\bibcplstring{\blx@imc@bibuclstring}%
    \def\bibcpsstring{\blx@imc@bibucsstring}}%
  \def\blx@hook@lc{%
    \def\bibstring{\blx@imc@biblcstring}%
    \def\biblstring{\blx@imc@biblclstring}%
    \def\bibsstring{\blx@imc@biblcsstring}%
    \def\bibucstring{\blx@imc@biblcstring}%
    \def\bibuclstring{\blx@imc@biblclstring}%
    \def\bibucsstring{\blx@imc@biblcsstring}%
    \def\bibcpstring{\blx@imc@biblcstring}%
    \def\bibcplstring{\blx@imc@biblclstring}%
    \def\bibcpsstring{\blx@imc@biblcsstring}}}

\def\abx@dostrings{%
  \do{bibliography}%
  \do{references}%
  \do{shorthands}%
  \do{editor}%
  \do{editors}%
  \do{compiler}%
  \do{compilers}%
  \do{redactor}%
  \do{redactors}%
  \do{reviser}%
  \do{revisers}%
  \do{founder}%
  \do{founders}%
  \do{continuator}%
  \do{continuators}%
  \do{collaborator}%
  \do{collaborators}%
  \do{translator}%
  \do{translators}%
  \do{commentator}%
  \do{commentators}%
  \do{annotator}%
  \do{annotators}%
  \do{commentary}%
  \do{annotations}%
  \do{introduction}%
  \do{foreword}%
  \do{afterword}%
  \do{editortr}%
  \do{editorstr}%
  \do{editorco}%
  \do{editorsco}%
  \do{editoran}%
  \do{editorsan}%
  \do{editorin}%
  \do{editorsin}%
  \do{editorfo}%
  \do{editorsfo}%
  \do{editoraf}%
  \do{editorsaf}%
  \do{editortrco}%
  \do{editorstrco}%
  \do{editortran}%
  \do{editorstran}%
  \do{editortrin}%
  \do{editorstrin}%
  \do{editortrfo}%
  \do{editorstrfo}%
  \do{editortraf}%
  \do{editorstraf}%
  \do{editorcoin}%
  \do{editorscoin}%
  \do{editorcofo}%
  \do{editorscofo}%
  \do{editorcoaf}%
  \do{editorscoaf}%
  \do{editoranin}%
  \do{editorsanin}%
  \do{editoranfo}%
  \do{editorsanfo}%
  \do{editoranaf}%
  \do{editorsanaf}%
  \do{editortrcoin}%
  \do{editorstrcoin}%
  \do{editortrcofo}%
  \do{editorstrcofo}%
  \do{editortrcoaf}%
  \do{editorstrcoaf}%
  \do{editortranin}%
  \do{editorstranin}%
  \do{editortranfo}%
  \do{editorstranfo}%
  \do{editortranaf}%
  \do{editorstranaf}%
  \do{translatorco}%
  \do{translatorsco}%
  \do{translatoran}%
  \do{translatorsan}%
  \do{translatorin}%
  \do{translatorsin}%
  \do{translatorfo}%
  \do{translatorsfo}%
  \do{translatoraf}%
  \do{translatorsaf}%
  \do{translatorcoin}%
  \do{translatorscoin}%
  \do{translatorcofo}%
  \do{translatorscofo}%
  \do{translatorcoaf}%
  \do{translatorscoaf}%
  \do{translatoranin}%
  \do{translatorsanin}%
  \do{translatoranfo}%
  \do{translatorsanfo}%
  \do{translatoranaf}%
  \do{translatorsanaf}%
  \do{byauthor}%
  \do{byeditor}%
  \do{bycompiler}%
  \do{byredactor}%
  \do{byreviser}%
  \do{byreviewer}%
  \do{byfounder}%
  \do{bycontinuator}%
  \do{bycollaborator}%
  \do{bytranslator}%
  \do{bycommentator}%
  \do{byannotator}%
  \do{withcommentator}%
  \do{withannotator}%
  \do{withintroduction}%
  \do{withforeword}%
  \do{withafterword}%
  \do{organizer}%
  \do{organizers}%
  \do{byorganizer}%
  \do{byeditortr}%
  \do{byeditorco}%
  \do{byeditoran}%
  \do{byeditorin}%
  \do{byeditorfo}%
  \do{byeditoraf}%
  \do{byeditortrco}%
  \do{byeditortran}%
  \do{byeditortrin}%
  \do{byeditortrfo}%
  \do{byeditortraf}%
  \do{byeditorcoin}%
  \do{byeditorcofo}%
  \do{byeditorcoaf}%
  \do{byeditoranin}%
  \do{byeditoranfo}%
  \do{byeditoranaf}%
  \do{byeditortrcoin}%
  \do{byeditortrcofo}%
  \do{byeditortrcoaf}%
  \do{byeditortranin}%
  \do{byeditortranfo}%
  \do{byeditortranaf}%
  \do{bytranslatorco}%
  \do{bytranslatoran}%
  \do{bytranslatorin}%
  \do{bytranslatorfo}%
  \do{bytranslatoraf}%
  \do{bytranslatorcoin}%
  \do{bytranslatorcofo}%
  \do{bytranslatorcoaf}%
  \do{bytranslatoranin}%
  \do{bytranslatoranfo}%
  \do{bytranslatoranaf}%
  \do{and}%
  \do{andothers}%
  \do{andmore}%
  \do{volume}%
  \do{volumes}%
  \do{involumes}%
  \do{part}%
  \do{jourvol}%
  \do{jourser}%
  \do{newseries}%
  \do{oldseries}%
  \do{edition}%
  \do{reprint}%
  \do{reprintof}%
  \do{reprintas}%
  \do{reprintfrom}%
  \do{reviewof}%
  \do{translationof}%
  \do{translationas}%
  \do{translationfrom}%
  \do{origpubas}%
  \do{origpubin}%
  \do{astitle}%
  \do{bypublisher}%
  \do{nodate}%
  \do{page}%
  \do{pages}%
  \do{column}%
  \do{columns}%
  \do{line}%
  \do{lines}%
  \do{verse}%
  \do{verses}%
  \do{section}%
  \do{sections}%
  \do{paragraph}%
  \do{paragraphs}%
  \do{pagetotal}%
  \do{pagetotals}%
  \do{columntotal}%
  \do{columntotals}%
  \do{linetotal}%
  \do{linetotals}%
  \do{versetotal}%
  \do{versetotals}%
  \do{sectiontotal}%
  \do{sectiontotals}%
  \do{paragraphtotal}%
  \do{paragraphtotals}%
  \do{in}%
  \do{inseries}%
  \do{ofseries}%
  \do{book}%
  \do{issue}%
  \do{number}%
  \do{chapter}%
  \do{mathesis}%
  \do{phdthesis}%
  \do{candthesis}%
  \do{resreport}%
  \do{techreport}%
  \do{software}%
  \do{datacd}%
  \do{audiocd}%
  \do{version}%
  \do{url}%
  \do{urlfrom}%
  \do{urlseen}%
  \do{file}%
  \do{inpreparation}%
  \do{submitted}%
  \do{inpress}%
  \do{prepublished}%
  \do{forthcoming}%
  \do{library}%
  \do{abstract}%
  \do{annotation}%
  \do{citedas}%
  \do{seenote}%
  \do{quotedin}%
  \do{opcit}%
  \do{loccit}%
  \do{ibidem}%
  \do{idem}%
  \do{idemsf}%
  \do{idemsm}%
  \do{idemsn}%
  \do{idempf}%
  \do{idempm}%
  \do{idempn}%
  \do{idempp}%
  \do{confer}%
  \do{sequens}%
  \do{sequentes}%
  \do{passim}%
  \do{see}%
  \do{seealso}%
  \do{backrefpage}%
  \do{backrefpages}%
  \do{thiscite}%
  \do{january}%
  \do{february}%
  \do{march}%
  \do{april}%
  \do{may}%
  \do{june}%
  \do{july}%
  \do{august}%
  \do{september}%
  \do{october}%
  \do{november}%
  \do{december}%
  \do{langamerican}%
  \do{langbrazilian}%
  \do{langbulgarian}%
  \do{langcatalan}%
  \do{langcroatian}%
  \do{langczech}%
  \do{langdanish}%
  \do{langdutch}%
  \do{langenglish}%
  \do{langestonian}%
  \do{langfinnish}%
  \do{langfrench}%
  \do{langgalician}%
  \do{langgerman}%
  \do{langgreek}%
  \do{langitalian}%
  \do{langjapanese}%
  \do{langlatin}%
  \do{langnorwegian}%
  \do{langpolish}%
  \do{langportuguese}%
  \do{langrussian}%
  \do{langslovak}%
  \do{langslovene}%
  \do{langspanish}%
  \do{langswedish}%
  \do{langukrainian}%
  \do{fromamerican}%
  \do{frombrazilian}%
  \do{frombulgarian}%
  \do{fromcatalan}%
  \do{fromcroatian}%
  \do{fromczech}%
  \do{fromdanish}%
  \do{fromdutch}%
  \do{fromenglish}%
  \do{fromestonian}%
  \do{fromfinnish}%
  \do{fromfrench}%
  \do{fromgalician}%
  \do{fromgerman}%
  \do{fromgreek}%
  \do{fromitalian}%
  \do{fromjapanese}%
  \do{fromlatin}%
  \do{fromnorwegian}%
  \do{frompolish}%
  \do{fromportuguese}%
  \do{fromrussian}%
  \do{fromslovak}%
  \do{fromslovene}%
  \do{fromspanish}%
  \do{fromswedish}%
  \do{fromukrainian}%
  \do{countryde}%
  \do{countryep}%
  \do{countryeu}%
  \do{countryfr}%
  \do{countryuk}%
  \do{countryus}%
  \do{patent}%
  \do{patentde}%
  \do{patenteu}%
  \do{patentfr}%
  \do{patentuk}%
  \do{patentus}%
  \do{patreq}%
  \do{patreqde}%
  \do{patreqeu}%
  \do{patreqfr}%
  \do{patrequk}%
  \do{patrequs}%
  \do{commonera}%
  \do{beforecommonera}%
  \do{annodomini}%
  \do{beforechrist}%
  \do{circa}%
  \do{spring}%
  \do{summer}%
  \do{autumn}%
  \do{winter}%
  \do{am}%
  \do{pm}%
}

\newrobustcmd*{\NewBibliographyString}[1]{%
  \forcsvlist\blx@newstring{#1}}

\def\blx@newstring#1{%
  \ifcsundef{KV@blx@lbx@#1}
    {\gappto\abx@dostrings{\do{#1}}%
     \csgdef{KV@blx@lbx@#1}##1{\blx@defstring{#1}{##1}}}
    {}}

% in *.cbx/bbx/tex: <key> = {<string>},
% in *.lbx:         <key> = {{<longstring>}{<abbrevstring>}},
\def\do#1{\define@key{blx@lbx}{#1}{\blx@defstring{#1}{##1}}}
\abx@dostrings

% in *.cbx/bbx/tex: (implicit)
% in *.lbx:         inherit = {<language>},
\define@key{blx@lbx}{inherit}{%
  \global\toggletrue{blx@nosuffrecurse}%
  \blx@lbxinput{#1}{}{\blx@err@nolang{#1}}%
  \csuse{abx@strings@#1}}

\def\blx@cfg@defstring#1#2{%
  \csdef{abx@lstr@#1}{#2}%
  \csdef{abx@sstr@#1}{#2}}

\def\blx@lbx@defstring#1#2{%
  \blx@lbx@defstring@i{#1}#2}
\def\blx@lbx@defstring@i#1#2#3{%
  \csdef{abx@lstr@#1}{#2}%
  \csdef{abx@sstr@#1}{#3}}

% {<language>}
\def\blx@lbxcheck#1{%
  \ifcsdef{blx@lng@#1}
    {\expandafter\expandafter\expandafter\IfFileExists
     \expandafter\expandafter\expandafter{%
     \csname blx@lng@#1\endcsname.lbx}
       {}
       {\blx@err@nolang{#1}}}
    {\IfFileExists{#1.lbx}
       {}
       {\blx@err@nolang{#1}}}}

% {<language>}{<definitions>}
\newrobustcmd*{\DefineBibliographyExtras}[2]{%
  \blx@lbxcheck{#1}%
  \csgappto{blx@hook@extras@#1}{%
    \blx@defbibextras{#1}{#2}}}
\@onlypreamble\DefineBibliographyExtras

\newrobustcmd*{\UndefineBibliographyExtras}[2]{%
  \blx@lbxcheck{#1}%
  \csgappto{blx@hook@noextras@#1}{%
    \blx@undefbibextras{#1}{#2}}}
\@onlypreamble\UndefineBibliographyExtras

\def\blx@defbibextras#1{\csgappto{abx@extras@#1}}
\def\blx@undefbibextras#1{\csgappto{abx@noextras@#1}}

% {<language>}{<language>}
\def\blx@letbibextras#1#2{%
  \global\toggletrue{blx@nosuffrecurse}%
  \blx@lbxinput{#2}{}{\blx@err@nolang{#2}}%
  \global\csletcs{abx@extras@#1}{abx@extras@#2}
  \global\csletcs{abx@noextras@#1}{abx@noextras@#2}}%

% {<language>}{<strings>}
\newrobustcmd*{\DefineBibliographyStrings}[2]{%
  \blx@lbxcheck{#1}%
  \csgappto{blx@hook@strings@#1}{%
    \begingroup
    \let\blx@defstring\blx@cfg@defstring
    \blx@defbibstrings{#1}{#2}%
    \endgroup}}
\@onlypreamble\DefineBibliographyStrings

\def\blx@defbibstrings#1#2{%
  \def\do##1{\csundef{abx@lstr@##1}\csundef{abx@sstr@##1}}%
  \abx@dostrings
  \csuse{abx@strings@#1}%
  \setkeys{blx@lbx}{#2}%
  \let\do\blx@defbibstrings@i
  \csxdef{abx@strings@#1}{\abx@dostrings}%
  \csgappto{abx@strings@#1}{%
    \ifcsdef{\abx@str @bibliography}
      {\letcs\bibname{\abx@str @bibliography}}
      {\let\bibname\@empty}%
    \ifcsdef{\abx@str @references}
      {\letcs\refname{\abx@str @references}}
      {\let\refname\@empty}%
    \ifcsdef{\abx@str @shorthands}
      {\letcs\biblistname{\abx@str @shorthands}}
      {\let\biblistname\@empty}}}

\def\blx@defbibstrings@i#1{%
  \ifcsdef{abx@lstr@#1}
    {\def\expandafter\noexpand\csname abx@lstr@#1\endcsname{%
       \csexpandonce{abx@lstr@#1}}}
    {\undef\expandafter\noexpand\csname abx@lstr@#1\endcsname}%
  \ifcsdef{abx@sstr@#1}
    {\def\expandafter\noexpand\csname abx@sstr@#1\endcsname{%
       \csexpandonce{abx@sstr@#1}}}
    {\undef\expandafter\noexpand\csname abx@sstr@#1\endcsname}}

% {<language>}{<language>}
\def\blx@letbibstrings#1#2{%
  \global\toggletrue{blx@nosuffrecurse}%
  \blx@lbxinput{#2}{}{\blx@err@nolang{#2}}%
  \global\csletcs{abx@strings@#1}{abx@strings@#2}}%

% {<language>}{<exceptions>}
\newrobustcmd*{\DefineHyphenationExceptions}[2]{%
  \ifcsundef{l@#1}
    {\blx@warn@nohyph{#1}}
    {}%
  \csgappto{blx@hook@hyph@#1}{\blx@hyphexcept{#1}{#2}}}
\@onlypreamble\DefineHyphenationExceptions

\def\blx@hyphexcept#1#2{%
  \ifcsundef{l@#1}
    {\blx@warn@nohyph{#1}}
    {\begingroup
     \language\csname l@#1\endcsname\relax
     \hyphenation{#2}%
     \endgroup}}

% {<mapping suffix>}
\newrobustcmd*{\DeclareLanguageMappingSuffix}[1]{%
  \gdef\blx@lng@suff{#1}}
\@onlypreamble\DeclareLanguageMappingSuffix
\let\blx@lng@suff\@empty

% {<language>}{<mapping>}
\newrobustcmd*{\DeclareLanguageMapping}[2]{%
  \csgdef{blx@lng@#1}{#2}%
  \csgdef{blx@lng@explicit@#1}{#2}}
\@onlypreamble\DeclareLanguageMapping

% {<language>}{<success>}{<failure>}
\def\blx@lbxinput#1{%
  \ifdefempty\blx@lng@suff
    {}
    {\ifcsdef{blx@lng@explicit@#1}% \DeclareLanguageMapping overrides \DeclareLanguageMappingSuffix
      {}
      {\nottoggle{blx@nosuffrecurse}
        {\csgdef{blx@lng@#1}{#1\blx@lng@suff}}
        {}}}%
    \blx@lbxinput@0{#1}}

\def\blx@lbxinput@0#1{%
  \ifcsdef{blx@lng@#1}
    {\expandafter\expandafter\expandafter\blx@lbxinput@i
     \expandafter\expandafter\expandafter{%
       \csname blx@lng@#1\endcsname}{#1}}
    {\blx@lbxinput@ii{#1}{#1}{language '#1'}}}

% {<mapping>}{<language>}
\def\blx@lbxinput@i#1#2{%
  \global\csundef{blx@lng@#2}%
  \IfFileExists{#1.lbx}
    {\blx@lbxinput@ii{#2}{#1}{language '#2' -> '#1'}}
    {\ifcsdef{blx@suffmaptried@#2}
      {}
      {\blx@warning@noline{%
          File '#1.lbx' not found!\MessageBreak
          Ignoring mapping '#2' -> '#1'}%
       \cslet{blx@suffmaptried@#2}\@empty}%
     \blx@lbxinput@0{#2}}}

% {<language>}{<lbxfile>}{<message>}
% toggle 'blx@nosuffrecurse' is set to true at the places where recursion into here
% can occur when loading a .lbx otherwise, when using \DeclareLanguageMappingSuffix
% it is possible to get into infinite loops. We only want to apply the suffix to explicitly
% loaded languages, not those loaded by recursion.
\def\blx@lbxinput@ii#1#2#3{%
  \begingroup
  \setbox\@tempboxa=\hbox\bgroup
    \aftergroup\endgroup
    \blx@inputonce{#2.lbx}{#3}
      {\global\cslet{abx@strings@#1}\@empty
       \global\cslet{abx@extras@#1}\@empty
       \global\cslet{abx@noextras@#1}\@empty
       \blx@maplang{#1}{#1}%
       \def\InheritBibliographyStrings{%
         \blx@letbibstrings{#1}}%
       \def\DeclareBibliographyStrings####1{%
         \begingroup
         \let\blx@defstring\blx@lbx@defstring
         \blx@defbibstrings{#1}{####1}%
         \endgroup}%
       \def\InheritBibliographyExtras{\blx@letbibextras{#1}}%
       \def\DeclareBibliographyExtras{\blx@defbibextras{#1}}%
       \def\UndeclareBibliographyExtras{\blx@undefbibextras{#1}}%
       \def\DeclareHyphenationExceptions{\blx@hyphexcept{#1}}%
       \begingroup
       \blx@saneccodes
       \makeatletter}
      {\endgroup
       \csuse{blx@hook@strings@#1}%
       \csuse{blx@hook@strings@#2}%
       \csuse{blx@hook@extras@#1}%
       \csuse{blx@hook@extras@#2}%
       \csuse{blx@hook@noextras@#1}%
       \csuse{blx@hook@noextras@#2}%
       \csuse{blx@hook@hyph@#1}%
       \csuse{blx@hook@hyph@#2}%
       \global\togglefalse{blx@nosuffrecurse}}
      {\aftergroup\@firstoftwo}
      {\aftergroup\@secondoftwo}%
  \egroup}

% {<language>}
\def\blx@langsetup#1{%
  \blx@lbxinput{#1}
    {\edef\blx@languagename{#1}}
    {\blx@warning
       {Language '#1' not supported.\MessageBreak
        Using fallback language '\blx@languagename'}%
     \blx@lbxinput{\blx@languagename}
       {\blx@maplang{#1}{\blx@languagename}}
       {\blx@err@nolang{\blx@languagename}}}}

% auxiliary macros

% {<field base name>}
\newrobustcmd*{\mkdaterangeshort}{%
  \mkdaterangefull{short}}

\newrobustcmd*{\mkdaterangelong}{%
  \mkdaterangefull{long}}

\newrobustcmd*{\mkdaterangeterse}{%
  \mkdaterangetrunc{short}}

\newrobustcmd*{\mkdaterangecomp}{%
  \mkdaterangetrunc{long}}

\newrobustcmd*{\mkdaterangeshortextra}{%
  \mkdaterangefullextra{short}}

\newrobustcmd*{\mkdaterangelongextra}{%
  \mkdaterangefullextra{long}}

\newrobustcmd*{\mkdaterangeterseextra}{%
  \mkdaterangetruncextra{short}}

\newrobustcmd*{\mkdaterangecompextra}{%
  \mkdaterangetruncextra{long}}

\def\blx@metadateinfo#1{%
  \letcs\ifdateera{if#1dateera}%
  \letcs\ifenddateera{if#1enddateera}%
  \letcs\ifdatecirca{if#1datecirca}%
  \letcs\ifenddatecirca{if#1enddatecirca}%
  \letcs\ifdatejulian{if#1datejulian}%
  \letcs\ifenddatejulian{if#1enddatejulian}%
  \letcs\ifdateuncertain{if#1dateuncertain}%
  \letcs\ifenddateuncertain{if#1enddateuncertain}}

\expandafter\newrobustcmd\expandafter*\csname mktimerange24h\endcsname{%
  \mktimerange{24h}}

\expandafter\newrobustcmd\expandafter*\csname mktimerange12h\endcsname{%
  \mktimerange{12h}}

\expandafter\newrobustcmd\expandafter*\csname mktimerange24hcomp\endcsname[1]{%
  \iffieldundef{#1hour}{}
    {\ifboolexpr{test {\iffieldundef{#1endhour}}
                 or
                 test {\iffieldequalstr{#1endhour}{}}}
       {\mktimerange{24h}{#1}}
       {\iffieldsequal{#1hour}{#1endhour}
         % 14:xx:xx 14:xx:xx
         {\iffieldsequal{#1minute}{#1endminute}
         % 14:13:xx 14:13:xx
           {\toggletrue{blx@seconds}%
            \printtext[#1time]{\csuse{mkbibtime24h}{#1hour}{#1minute}{#1second}{}%
            \bibtimerangesep
            \csuse{mkbibtime24h}{}{}{#1endsecond}{}}}
           % 14:13:xx 14:14:xx
           {\toggletrue{blx@seconds}%
            \printtext[#1time]{\csuse{mkbibtime24h}{#1hour}{#1minute}{}{}%
            \bibtimerangesep
            \csuse{mkbibtime24h}{}{#1endminute}{}{}}}}
         % 14:xx:xx 15:xx:xx
         {\mktimerange{24h}{#1}}}}}

% {<24h|24hcomp|12h>}{<datetype>}
\newrobustcmd*{\mktimerange}[2]{%
  \iffieldundef{#2hour}{}
    {\blx@timepre{#2}{}%
     \printtext[#2time]{\csuse{mkbibtime#1}{#2hour}{#2minute}{#2second}{#2timezone}%
      \iffieldundef{#2endhour}
      {}
      {\blx@timepre{#2}{end}%
       \iffieldequalstr{#2endhour}{}
         {\mbox{\bibtimerangesep}}
         {\bibtimerangesep
          \csuse{mkbibtime#1}{#2endhour}{#2endminute}{#2endsecond}{#2endtimezone}}}}}}

% {<datetype>}{''|end}
\newrobustcmd*{\blx@timepre}[2]{%
  \iftoggle{blx@timezones}{}
    {\blx@imc@clearfield{#1#2timezone}}%
  \iftoggle{blx@seconds}{}
    {\blx@imc@clearfield{#1#2second}}}

% {<short|long>}{<datetype>}
\newrobustcmd*{\mkdaterangefull}[2]{%
  \blx@metadateinfo{#2}%
  \iffieldundef{#2year}
    {}
    {\datecircaprint
     \printtext[#2date]{%
       % Such a season component can only come from an EDTF 5.1.5 season which replaces
       % a normal month so if it exists, we know that a normal date print is ruled out
       \iffieldundef{#2season}
         {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
          % Optionally print the time after the date
          \blx@printtime{#2}{}}
         {\csuse{mkbibseasondate#1}{#2year}{#2season}}%
       \dateuncertainprint
       \dateeraprint{#2year}%
       \iffieldundef{#2endyear}
         {}
         {\iffieldequalstr{#2endyear}{}
            {\mbox{\bibdaterangesep}}
            {\bibdaterangesep
             \enddatecircaprint
             \iffieldundef{#2season}
               {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}%
                % Optionally print the time after the date
                \blx@printtime{#2}{end}}
               {\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}%
             \enddateuncertainprint
             \dateeraprint{#2endyear}}}}}}

\newrobustcmd*{\mkdaterangetrunc}[2]{%
  \blx@metadateinfo{#2}%
  \iffieldundef{#2year}
    {}
    {\datecircaprint
     \printtext[#2date]{%
       % Such a season component can only come from an EDTF 5.1.5 season which replaces
       % a normal month so if it exists, we know that a normal date print is ruled out
       \iffieldundef{#2season}
         {\iffieldsequal{#2year}{#2endyear}
            {\iffieldsequal{#2month}{#2endmonth}
               {\csuse{mkbibdate#1}{}{}{#2day}}
               {\csuse{mkbibdate#1}{}{#2month}{#2day}}}
            {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
             \iffieldsequal{#2dateera}{#2enddateera}{}
              {\dateeraprint{#2year}}}}
         {\iffieldsequal{#2year}{#2endyear}
           {\csuse{mkbibseasondate#1}{}{#2season}}
           {\csuse{mkbibseasondate#1}{#2year}{#2season}%
            \iffieldsequal{#2dateera}{#2enddateera}{}
              {\dateeraprint{#2year}}}}%
       \dateuncertainprint
       \iffieldundef{#2endyear}
         {}
         {\iffieldequalstr{#2endyear}{}
            {\mbox{\bibdaterangesep}}
            {\bibdaterangesep
             \enddatecircaprint
             \iffieldundef{#2season}
               {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
               {\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}%
             \enddateuncertainprint
             \dateeraprint{#2endyear}}}}}}

\newrobustcmd*{\mkdaterangefullextra}[2]{%
  \blx@metadateinfo{#2}%
  \iffieldundef{#2year}
    {}
    {\datecircaprint
     \printtext[#2date]{%
       \printtext{%
       % Such a season component can only come from an EDTF 5.1.5 season which replaces
       % a normal month so if it exists, we know that a normal date print is ruled out
       \iffieldundef{#2season}
         {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
          % Optionally print the time after the date
          \blx@printtime{#2}{}}
         {\csuse{mkbibseasondate#1}{#2year}{#2season}}%
       \dateuncertainprint
       \dateeraprint{#2year}%
       \iffieldundef{#2endyear}
         {\printfield{extradate}}
         {\iffieldequalstr{#2endyear}{}
            {\printfield{extradate}%
             \printtext{\mbox{\bibdaterangesep}}}
            {\printtext{%
               \bibdaterangesep
               \enddatecircaprint
               \iffieldundef{#2season}
                 {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}%
                  % Optionally print the time after the date
                  \blx@printtime{#2}{end}}
                 {\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}}%
               \printfield{extradate}%
               \enddateuncertainprint
               \dateeraprint{#2endyear}}}}}}}

\newrobustcmd*{\mkdaterangetruncextra}[2]{%
  \blx@metadateinfo{#2}%
  \iffieldundef{#2year}
    {}
    {\datecircaprint
     \printtext[#2date]{%
       \printtext{%
       % Such a season component can only come from an EDTF 5.1.5 season which replaces
       % a normal month so if it exists, we know that a normal date print is ruled out
       \iffieldundef{#2season}
         {\iffieldsequal{#2year}{#2endyear}
            {\iffieldsequal{#2month}{#2endmonth}
               {\csuse{mkbibdate#1}{}{}{#2day}}
               {\csuse{mkbibdate#1}{}{#2month}{#2day}}}
            {\csuse{mkbibdate#1}{#2year}{#2month}{#2day}%
             \iffieldsequal{#2dateera}{#2enddateera}{}
               {\dateeraprint{#2year}}}}
         {\iffieldsequal{#2year}{#2endyear}
           {\csuse{mkbibseasondate#1}{}{#2season}}
           {\csuse{mkbibseasondate#1}{#2year}{#2season}%
             \iffieldsequal{#2dateera}{#2enddateera}{}
              {\dateeraprint{#2year}}}}%
       \dateuncertainprint
       \iffieldundef{#2endyear}
         {\printfield{extradate}}
         {\iffieldequalstr{#2endyear}{}
            {\printfield{extradate}%
             \printtext{\mbox{\bibdaterangesep}}}
            {\printtext{%
               \bibdaterangesep
               \enddatecircaprint
               \iffieldundef{#2season}
                 {\csuse{mkbibdate#1}{#2endyear}{#2endmonth}{#2endday}}
                 {\csuse{mkbibseasondate#1}{#2endyear}{#2endseason}}}%
               \printfield{extradate}%
               \enddateuncertainprint
               \dateeraprint{#2endyear}}}}}}}

\newrobustcmd*{\mkdaterangeyear}[1]{%
  \blx@imc@clearfield{#1season}%
  \blx@imc@clearfield{#1month}%
  \blx@imc@clearfield{#1day}%
  \blx@imc@clearfield{#1hour}%
  \blx@imc@clearfield{#1minute}%
  \blx@imc@clearfield{#1second}%
  \blx@imc@clearfield{#1timezone}%
  \blx@imc@clearfield{#1endseason}%
  \blx@imc@clearfield{#1endmonth}%
  \blx@imc@clearfield{#1endday}%
  \blx@imc@clearfield{#1endhour}%
  \blx@imc@clearfield{#1endminute}%
  \blx@imc@clearfield{#1endsecond}%
  \blx@imc@clearfield{#1endtimezone}%
  \iffieldsequal{#1year}{#1endyear}
    {\blx@imc@clearfield{#1endyear}}
    {}%
  \mkdaterangefull{short}{#1}}

% {<datetype>}
\newrobustcmd*{\mkdaterangeymd}[1]{%
  \blx@metadateinfo{#1}%
  \iffieldundef{#1year}
    {}
    {\datecircaprint
     \printtext[#1date]{%
       % Such a season component can only come from an EDTF 5.1.5 season which replaces
       % a normal month so if it exists, we know that a normal date print is ruled out
       \iffieldundef{#1season}
         {\blx@ymddate{#1}{}%
          % Optionally print the time after the date
          \blx@printtime{#1}{}}
         {\csuse{mkbibseasondateshort}{#1year}{#1season}}%
       \dateuncertainprint
       \dateeraprint{#1year}%
       \iffieldundef{#1endyear}
         {}
         {\iffieldequalstr{#1endyear}{}
            {\mbox{\bibdaterangesep}}
            {\bibdaterangesep
             \enddatecircaprint
             \iffieldundef{#1season}
               {\blx@ymddate{#1}{end}%
                % Optionally print the time after the date
                \blx@printtime{#1}{end}}
               {\csuse{mkbibseasondateshort}{#1endyear}{#1endseason}}%
             \enddateuncertainprint
             \dateeraprint{#1endyear}}}}}}

% {<datetype>}
\newrobustcmd*{\mkdaterangeymdextra}[1]{%
  \blx@metadateinfo{#1}%
  \iffieldundef{#1year}
    {}
    {\datecircaprint
     \printtext[#1date]{%
       % Such a season component can only come from an EDTF 5.1.5 season which replaces
       % a normal month so if it exists, we know that a normal date print is ruled out
       \iffieldundef{#1season}
         {\blx@ymddate[extradate]{#1}{}%
          % Optionally print the time after the date
          \blx@printtime{#1}{}}
         {\csuse{mkbibseasondateshort}{#1year}{#1season}}%
       \dateuncertainprint
       \dateeraprint{#1year}%
       \iffieldundef{#1endyear}
         {}
         {\iffieldequalstr{#1endyear}{}
            {\mbox{\bibdaterangesep}}
            {\printtext{%
               \bibdaterangesep
               \enddatecircaprint
               \iffieldundef{#1season}
                 {\blx@ymddate{#1}{end}%
                  % Optionally print the time after the date
                  \blx@printtime{#1}{end}}
                 {\csuse{mkbibseasondateshort}{#1endyear}{#1endseason}}}%
             \enddateuncertainprint
             \dateeraprint{#1endyear}}}}}}

% [extradate]{<datetype>}{''|end}
\newrobustcmd*{\blx@ymddate}[3][]{%
  \dateeraprintpre{#2#3year}%
  \mkyearzeros{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}%
  \iffieldundef{#2#3month}{}{\bibdatesep\mkmonthzeros{\thefield{#2#3month}}}%
  \iffieldundef{#2#3day}{}{\bibdatesep\mkdayzeros{\thefield{#2#3day}}}}

\newrobustcmd*{\mkdaterangeyearextra}[1]{%
  \blx@imc@clearfield{#1season}%
  \blx@imc@clearfield{#1month}%
  \blx@imc@clearfield{#1day}%
  \blx@imc@clearfield{#1hour}%
  \blx@imc@clearfield{#1minute}%
  \blx@imc@clearfield{#1second}%
  \blx@imc@clearfield{#1timezone}%
  \blx@imc@clearfield{#1endseason}%
  \blx@imc@clearfield{#1endmonth}%
  \blx@imc@clearfield{#1endday}%
  \blx@imc@clearfield{#1endhour}%
  \blx@imc@clearfield{#1endminute}%
  \blx@imc@clearfield{#1endsecond}%
  \blx@imc@clearfield{#1endtimezone}%
  \iffieldsequal{#1year}{#1endyear}
    {\blx@imc@clearfield{#1endyear}}
    {}%
  \mkdaterangefullextra{short}{#1}}

% {<datetype>}{'' | end}
\newrobustcmd*{\blx@printtime}[2]{%
  \ifboolexpr{%
    togl {blx@#1dateusetime}
    and
    not test {\iffieldundef{#1#2hour}}}
    {\blx@timepre{#1}{#2}%
      \printtext{\bibdatetimesep}%
      \printtext[#1time]{\csuse{mkbibtime\csuse{blx@timeformat@#1time}}{#1#2hour}{#1#2minute}{#1#2second}{#1#2timezone}}}
    {}}

\newrobustcmd*{\mkdaterangeedtf}[1]{%
  \blx@metadateinfo{#1}%
  \def\bibdatetimesep{T}%
  \iffieldundef{#1year}
    {}
    {\printtext[#1date]{%
       \blx@edtfdate{#1}{}%
       \ifboolexpr{%
         togl {blx@#1dateusetime}
         and
         not test {\iffieldundef{#1hour}}}
         {\printtext{\bibdatetimesep}%
          \blx@edtftime{#1}{}}
         {}%
       \dateuncertainprint
       \datecircaprintedtf
       \iffieldundef{#1endyear}
         {}
         {\addslash
          \blx@edtfdate{#1}{end}%
          \ifboolexpr{%
            togl {blx@#1dateusetime}
            and
            not test {\iffieldundef{#1endhour}}}
            {\printtext{\bibdatetimesep}%
             \blx@edtftime{#1}{end}}
            {}%
         \enddateuncertainprint
         \enddatecircaprintedtf}}}}

\newrobustcmd*{\mkdaterangeedtfextra}[1]{%
  \blx@metadateinfo{#1}%
  \def\bibdatetimesep{T}%
  \iffieldundef{#1year}
    {}
    {\printtext[#1date]{%
       \blx@edtfdate[extradate]{#1}{}%
       \ifboolexpr{%
         togl {blx@#1dateusetime}
         and
         not test {\iffieldundef{#1hour}}}
         {\printtext{\bibdatetimesep}%
          \blx@edtftime{#1}{}}
         {}%
       \dateuncertainprint
       \datecircaprintedtf
       \iffieldundef{#1endyear}
         {}
         {\addslash
          \blx@edtfdate{#1}{end}}%
          \ifboolexpr{%
            togl {blx@#1dateusetime}
            and
            not test {\iffieldundef{#1endhour}}}
            {\printtext{\bibdatetimesep}%
             \blx@edtftime{#1}{end}}
            {}%
          \enddateuncertainprint
          \enddatecircaprintedtf}}}

% [extradate]{<datetype>}{''|end}
\newrobustcmd*{\blx@edtfdate}[3][]{%
  \dateeraprintpre{#2#3year}%
  \blx@imc@forcezerosy{\thefield{#2#3year}}\ifblank{#1}{}{\printfield{#1}}%
  % Such a season component can only come from an EDTF 5.1.5 season which replaces
  % a normal month so if it exists, we know that a normal date print is ruled out
  \iffieldundef{#2#3season}
    {\iffieldundef{#2#3month}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3month}}}%
     \iffieldundef{#2#3day}{}{\hyphen\blx@imc@forcezerosmdt{\thefield{#2#3day}}}}
    {\hyphen\blx@seasonmap{\thefield{#2#3season}}}}

\def\blx@seasonmap#1{%
  \blx@xifstrcmp{#1}{spring}{21}
    {\blx@xifstrcmp{#1}{summer}{22}
      {\blx@xifstrcmp{#1}{autumn}{23}
        {\blx@xifstrcmp{#1}{winter}{24}{}}}}}

\newrobustcmd*{\blx@edtftime}[2]{%
  \blx@imc@forcezerosmdt{\thefield{#1#2hour}}%
  :\blx@imc@forcezerosmdt{\thefield{#1#2minute}}%
  :\blx@imc@forcezerosmdt{\thefield{#1#2second}}%
  \iftoggle{blx@timezones}
    {\mkbibtimezone{\thefield{#1#2timezone}}}
    {}}

% times
\newrobustcmd*{\bibtimesep}{:}
\newrobustcmd*{\bibtimerangesep}{\textendash}
\newrobustcmd*{\bibutctimezone}{Z}
\newrobustcmd*{\bibtimezonesep}{}
\newrobustcmd*{\bibtzminsep}{\bibtimesep}
% dates
\newrobustcmd*{\bibdateuncertain}{?}
% \textminus is only guaranteed for non-PDFTeX
\newrobustcmd*{\bibdateeraprefix}{\ifdef\textminus\textminus\textendash}
\newrobustcmd*{\bibdateeraendprefix}{\,\bibdateeraprefix}
\newrobustcmd*{\bibdatesep}{\hyphen}
\newrobustcmd*{\bibdaterangesep}{\bibrangedash}
% date+times
\newrobustcmd*{\bibdatetimesep}{\space}
% ranges
\newrobustcmd*{\bibrangedash}{\textendash}
\newrobustcmd*{\bibrangessep}{,\space}
% formatters
\newrobustcmd*{\mkbibtimezone}[1]{\blx@xifstrcmp{#1}{UTC}{\bibutctimezone}{#1}}
\newrobustcmd*{\mkbibdatelong}[3]{}
\newrobustcmd*{\mkbibdateshort}[3]{}
\newrobustcmd*{\mkbibseasondateshort}[2]{}
\newrobustcmd*{\mkbibseasondatelong}[2]{}
\expandafter\newrobustcmd\expandafter*\csname mkbibtime24h\endcsname[4]{}
\expandafter\newrobustcmd\expandafter*\csname mkbibtime12h\endcsname[4]{}
\newrobustcmd*{\finalandcomma}{}
\newrobustcmd*{\finalandsemicolon}{}
\newrobustcmd*{\mkbibordinal}[1]{#1}
\newrobustcmd*{\mkbibmascord}{\mkbibordinal}
\newrobustcmd*{\mkbibfemord}{\mkbibordinal}
\newrobustcmd*{\mkbibneutord}{\mkbibordinal}
\newrobustcmd*{\mkbibseason}[1]{\abx@bibseason{#1}}
\newrobustcmd*{\mkbibmonth}[1]{%
  \ifcase0#1\relax
    \blx@warning@entry{Month out of range or not an integer}%
  \or\abx@bibmonth{january}%
  \or\abx@bibmonth{february}%
  \or\abx@bibmonth{march}%
  \or\abx@bibmonth{april}%
  \or\abx@bibmonth{may}%
  \or\abx@bibmonth{june}%
  \or\abx@bibmonth{july}%
  \or\abx@bibmonth{august}%
  \or\abx@bibmonth{september}%
  \or\abx@bibmonth{october}%
  \or\abx@bibmonth{november}%
  \or\abx@bibmonth{december}%
  \else
    \blx@warning@entry{Month out of range}#1%
  \fi}

% strip leading zeros and prepend zero for month/day/timeparts
% Allow for non numeric labelyear values
\protected\def\blx@imc@forcezerosmdt#1{%
  \IfInteger{#1}
    {\ifnumless{#1}{10}
      {0\the\numexpr(#1)\relax}
      {#1}}
    {#1}}

% strip leading zeros and prepend zero(s) for year
% Allow for non numeric labelyear values
\protected\def\blx@imc@forcezerosy#1{%
  \IfInteger{#1}
    {\ifnumless{#1}{10}% 1-digit year
       {000\the\numexpr(#1)\relax}
       {\ifnumless{#1}{100}% 2-digit year
         {00\the\numexpr(#1)\relax}
         {\ifnumless{#1}{1000}% 3-digit year
           {0\the\numexpr(#1)\relax}
           {#1}}}}
    {#1}}

\let\blx@imc@mkyearzeros\blx@imc@forcezerosy
\let\blx@imc@mkmonthzeros\blx@imc@forcezerosmdt
\let\blx@imc@mkdayzeros\blx@imc@forcezerosmdt
\protected\def\blx@imc@stripzeros#1{%
  \begingroup
  \setbox\@tempboxa=\hbox\bgroup
  \aftergroup\endgroup
  \abx@hook@xsanitize
  \if0#1\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {\@tempcnta#1\relax
   \expandafter\egroup
   \number\@tempcnta
   \@tempcnta#1\relax}
  {\egroup#1}}

\let\blx@imc@printlabeldate\@empty
\let\blx@imc@printlabeltime\@empty
\let\blx@imc@printlabeldateextra\@empty

\blx@regimcs{\printlabeldate \printlabeltime \printlabeldateextra \stripzeros \forcezerosy \forcezerosmdt \mkyearzeros \mkmonthzeros \mkdayzeros \mktimezeros}

% User macro for retrieving currrent language
\def\currentlang{\blx@languagename}

% {<language>}{<strings>}
\def\blx@maplang#1#2{%
  \csxappto{extras#1}{%
    \noexpand\blx@resetpunct
    \expandafter\noexpand\csname abx@extras@#2\endcsname
    \expandafter\noexpand\csname abx@strings@#2\endcsname}%
  \csxappto{noextras#1}{%
    \noexpand\blx@resetpunct
    \expandafter\noexpand\csname abx@noextras@#2\endcsname}}

%% babel/polyglossia interface
\def\blx@beglang{\blx@clearlang\begingroup}
\def\blx@endlang{\endgroup}
\let\blx@beglangbib\blx@beglang
\let\blx@endlangbib\blx@endlang
\let\blx@beglangcite\blx@beglang
\let\blx@endlangcite\blx@endlang
\let\blx@hook@endlang\@empty
\let\blx@hook@initlang\@empty
\let\blx@imc@mainlang\@empty
\def\blx@hyphenreset{%
  \ifcsundef{l@\blx@languagename}
    {}
    {\language\csname l@\blx@languagename\endcsname\relax}%
  \ifcsundef{\blx@languagename hyphenmins}
    {\blx@sethyphenmins\tw@\thr@@}
    {\expandafter\expandafter\expandafter\blx@sethyphenmins
       \csname\blx@languagename hyphenmins\endcsname}}
\def\blx@sethyphenmins#1#2{%
  \lefthyphenmin#1\relax
  \righthyphenmin#2\relax}

\begingroup
\@makeother\#
\gdef\blx@mkautolangbabel{%
  \ifundef\bbl@main@language
    {\blx@error
      {No default 'babel' language defined}
      {You must define a default language for 'babel'}}
    {}%
  \pretocmd\select@language{\blx@langsetup{#1}}
    {\ifdef\blx@thelangenv
       {\def\blx@beglang{%
          \blx@clearlang
          \begingroup
         % Need to override all entries, regardless of if there is a langid
         % if language=<language> option is given
         \ifboolexpr { test {\ifdef\abx@field@langid }
                       or
                       test {\ifdef\blx@forcelanguagename} }
            % override local langid if we forced it with
            % language=<language> option
            {\ifdef\blx@forcelanguagename
               {\let\abx@field@langid\blx@forcelanguagename}
               {}%
             \let\blx@languagename\abx@field@langid% track global language
             \ifcsundef{l@\abx@field@langid}
               {\blx@warn@nohyph{\abx@field@langid}}
               {\blx@hook@initlang
                \def\blx@endlang{%
                  \blx@hook@endlang
                  \csname end\blx@thelangenv\endcsname
                  \endgroup}%
                \iftoggle{blx@autolangbib}
                  {\let\blx@endlangbib\blx@endlang}
                  {}%
                \iftoggle{blx@autolangcite}
                  {\let\blx@endlangcite\blx@endlang}
                  {}%
                \csname\blx@thelangenv\expandafter\endcsname
                \expandafter{\abx@field@langid}}}
            {}}}
       {}%
     \def\blx@langstrings{}%
     \def\blx@imc@mainlang{\select@language{\bbl@main@language}}%
     \blx@langsetup\bbl@main@language}
    {\blx@err@patch{'babel' package}%
     \blx@mknoautolang}}

\gdef\blx@mkautolangpoly{%
  \ifundef\bbl@main@language
    {\blx@error
      {No default 'polyglossia' language defined}
      {You must define a default language for 'polyglossia'}}
    {}%
  \edef\blx@saved@underscore@catcode{\the\catcode`\_}%
  \catcode`\_=11% polyglossia uses "_" as a letter
  \pretocmd\select@language{\blx@langsetup{#1}}
    {\ifdef\blx@thelangenv
       {\def\blx@beglang{%
          \blx@clearlang
          \begingroup
         % Need to override all entries, regardless of if there is a langid
         % if language=<language> option is given
         \ifboolexpr { test {\ifdef\abx@field@langid }
                       or
                       test {\ifdef\blx@forcelanguagename} }
            % override local langid if we forced it with
            % language=<language> option
            {\ifdef\blx@forcelanguagename
               {\let\abx@field@langid\blx@forcelanguagename}
               {}%
             \let\blx@languagename\abx@field@langid% track global language
             \ifcsundef{l@\abx@field@langid}
               {\blx@warn@nohyph{\abx@field@langid}}
               {\blx@hook@initlang
                \def\blx@endlang{%
                  \blx@hook@endlang
                  % Polyglossia language envs are \<lang>[]
                  \ifcsstring{blx@thelangenv}{langname}
                    {\csname end\abx@field@langid\endcsname}
                    {\csname end\blx@thelangenv\endcsname}%
                  \endgroup}%
                \iftoggle{blx@autolangbib}
                  {\let\blx@endlangbib\blx@endlang}
                  {}%
                \iftoggle{blx@autolangcite}
                  {\let\blx@endlangcite\blx@endlang}
                  {}%
                \ifcsstring{blx@thelangenv}{langname}
                  {\ifdef\abx@field@langidopts
                     {\csname\abx@field@langid\expandafter\endcsname\expandafter[\abx@field@langidopts]}
                     {\csname\abx@field@langid\endcsname}}
                  {\csname\blx@thelangenv\expandafter\endcsname\expandafter{\abx@field@langid}}%
                % These lines are equal to \blx@maplang
                \ifcsstring{blx@thelangenv}{hyphenrules}
                  {}
                  {\blx@resetpunct
                   \csuse{abx@extras@\abx@field@langid}%
                   \csuse{abx@strings@\abx@field@langid}}}}
            {}}}
       {}%
     % polyglossia needs this - it doesn't get the
     % strings automatically set for some reason
     \def\blx@langstrings{%
       \csuse{abx@extras@\languagename}%
       \csuse{abx@strings@\languagename}}%
     \def\blx@imc@mainlang{%
       \select@language{\bbl@main@language}%
       % These lines are equal to \blx@maplang
       \blx@resetpunct
       \csuse{abx@extras@\bbl@main@language}%
       \csuse{abx@strings@\bbl@main@language}}%
     \blx@langsetup\bbl@main@language}
    {\blx@err@patch{'polyglossia' package}%
     \blx@mknoautolang}%
  \catcode`\_=\blx@saved@underscore@catcode\relax}
\endgroup

\def\blx@mknoautolang{%
  \blx@lbxinput{\blx@languagename}
    {}
    {\blx@err@nolang{\blx@languagename}}}

\blx@regimcs{\mainlang}

\newrobustcmd*{\DeclareRedundantLanguages}[2]{%
  \begingroup
  \ifblank{#2}
    {\def\do##1{%
       \global\csundef{blx@rlm@##1}%
       \global\csundef{blx@rlm@lang##1}}}
    {\def\do##1{%
       \csxdef{blx@rlm@##1}{#2}%
       \csxdef{blx@rlm@lang##1}{#2}}}%
  \docsvlist{#1}%
  \endgroup}

\def\blx@clearlang{%
  \iftoggle{blx@clearlang}
    {\iflistundef{language}
       {}
       {\ifnumgreater{\value{language}}{1}
          {}
          {\expandafter\blx@clearlang@i\abx@list@language}}}
    {}}

\def\blx@clearlang@i#1{%
  \ifcsdef{blx@rlm@#1}
    {\expandafter\expandafter\expandafter\forcsvlist
     \expandafter\expandafter\expandafter\blx@clearlang@ii
     \expandafter\expandafter\expandafter{%
       \csname blx@rlm@#1\endcsname}}
    {}}

\def\blx@clearlang@ii#1{%
  \ifdefstring\languagename{#1}
    {\clearlist{language}}
    {}}

%% Biber equivalents to bibtex data interface

\def\abx@doentrytypes{\dolistloop\blx@datamodel@entrytypes}

% fields which can be used as labels - we auto-create some macros for these
\def\abx@dolabelfields{\dolistloop\blx@datamodel@labelfields}

\def\abx@donames{\dolistloop\blx@datamodel@names}
\def\abx@donameparts{\expandafter\docsvlist\expandafter{\blx@datamodel@constant@nameparts}}

\def\abx@dofields{\dolistloop\blx@datamodel@fields}

\def\abx@dolists{%
  \dolistloop\blx@datamodel@lists%
  \do{pageref}}

% Used to pass regexps to .bcf
\def\regexp#1{\expandafter\zap@space\detokenize{#1} \@empty}

% Have to do this otherwise the '~'s in the .bcf strings are not expanded
% This is done for the .bcf later but since we have to do all the
% data model things much earlier, have to set this here and reset on finishing
\let\blx@tsave~
\let~\space
% Data model and supporting macros must be loaded early
\blx@inputonce{blx-dm.def}{biblatex default data model}{}{}{}{}
\let~\blx@tsave

% We need to now load any style data model
% Order of precedence is:
% <datamodel option>.dbx
%   <style option>.dbx
%     <citestyle option>.dbx and <bibstyle option>.dbx
% This has to be done before the real options processing so we need to
% pick out just these four options to look at. You can't do this with keyval,
% you have to use kvoptions. So, pick out these four, pass through all
% others and delete datamodel option as we don't care about it when we come
% to really set options below
\SetupKeyvalOptions{
  family=blx@opt@eldt,
  prefix=blx@opt@eldt@}
\DeclareStringOption{datamodel}
\DeclareStringOption{style}
\DeclareStringOption{citestyle}
\DeclareStringOption{bibstyle}
\DeclareDefaultOption{}
\ProcessLocalKeyvalOptions{blx@opt@eldt}
\ifx\blx@opt@eldt@datamodel\@empty
  \ifx\blx@opt@eldt@style\@empty
    \ifx\blx@opt@eldt@citestyle\@empty
    \else
      \blx@inputonce{\blx@opt@eldt@citestyle.dbx}{biblatex citestyle data model}{}{}{}{}
    \fi
    \ifx\blx@opt@eldt@bibstyle\@empty
    \else
      \blx@inputonce{\blx@opt@eldt@bibstyle.dbx}{biblatex bibstyle data model}{}{}{}{}
    \fi
  \else
    \blx@inputonce{\blx@opt@eldt@style.dbx}{biblatex style data model}{}{}{}{}
  \fi
\else
  \blx@inputonce{\blx@opt@eldt@datamodel.dbx}{biblatex style data model}{}{}{}{}
\fi
\DisableKeyvalOption[action=undef,local]{blx@opt@eldt}{datamodel}

% Override with user-defined data model if there is one
\blx@inputonce{biblatex-dm.cfg}{biblatex custom data model}{}{}{}{}

% Initialise option datatypes lists
\global\let\blx@bcf@options@scope@global\@empty
\global\let\blx@bcf@options@scope@type\@empty
\global\let\blx@bcf@options@scope@entry\@empty
\global\let\blx@bcf@options@scope@namelist\@empty
\global\let\blx@bcf@options@scope@name\@empty
\global\let\blx@globalopts@datatypes\@empty
\global\let\blx@typeopts@datatypes\@empty
\global\let\blx@entryopts@datatypes\@empty
\global\let\blx@namelistopts@datatypes\@empty
\global\let\blx@nameopts@datatypes\@empty
\def\do#1{%
  \global\cslet{blx@globalopts@#1}\@empty
  \global\cslet{blx@typeopts@#1}\@empty
  \global\cslet{blx@entryopts@#1}\@empty
  \global\cslet{blx@namelistopts@#1}\@empty
  \global\cslet{blx@nameopts@#1}\@empty}
\expandafter\expandafter\expandafter\docsvlist\expandafter\expandafter\expandafter{\csname blx@datamodel@constant@optiondatatypes\endcsname}

% Helper for collecting options and datatypes
% {<datatype>}{<scope>}{<name>}
\def\blx@collectopts#1#2#3{%
  \ifinlistcs{#1}{#2@datatypes}
    {}
    {\listcsgadd{#2@datatypes}{#1}}%
  \ifinlistcs{#3}{#2@#1}
    {}
    {\listcsgadd{#2@#1}{#3}}}

% date, eventdate, urldate etc.
\def\abx@dodates{\dolistloop\blx@datamodel@dates}
% year, endyear, month, endmonth etc.
\def\abx@dodateparts{\expandafter\docsvlist\expandafter{\blx@dateparts}}

% '', event, url, orig etc.
\def\do#1{%
  \StrCut{#1}{date}\blx@datetype\blx@tempnull
  \listxadd\blx@datetypes{\blx@datetype}}
\abx@dodates
% main date field has an empty prefix (''date) which can't be added to a list
% and so do it explicity
% This is one of the few (only?) hard-coded datamodel assumptions but it is
% very unlikely that anyone would *remove* the main date field in a custom application ...
\def\abx@dodatetypes{\do{}\dolistloop\blx@datetypes}

% per-entry inheritance blocking option for biber
\blx@collectopts{string}{blx@entryopts}{noinherit}

% useprefix namelist/name scope
\blx@collectopts{boolean}{blx@namelistopts}{useprefix}% for passing to bcf
\blx@collectopts{boolean}{blx@nameopts}{useprefix}% for passing to the .bcf

% nametemplates meta-option entry/namelist/name scope
\blx@collectopts{string}{blx@entryopts}{nametemplates}
\blx@collectopts{string}{blx@namelistopts}{nametemplates}% for passing to bcf
\blx@collectopts{string}{blx@nameopts}{nametemplates}% for passing to the .bcf

% sortingnamekeytemplate namelist/name scope
\blx@collectopts{string}{blx@namelistopts}{sortingnamekeytemplatename}% for passing to bcf
\blx@collectopts{string}{blx@nameopts}{sortingnamekeytemplatename}% for passing to the .bcf

% uniquenametemplate namelist/name scope
\blx@collectopts{string}{blx@namelistopts}{uniquenametemplatename}% for passing to bcf
\blx@collectopts{string}{blx@nameopts}{uniquenametemplatename}% for passing to the .bcf

% labelalphanametemplate namelist/name scope
\blx@collectopts{string}{blx@namelistopts}{labelalphanametemplatename}% for passing to bcf
\blx@collectopts{string}{blx@nameopts}{labelalphanametemplatename}% for passing to the .bcf

% Misc globalopts
\blx@collectopts{xml}{blx@globalopts}{datamodel}% for passing to the .bcf
\blx@collectopts{string}{blx@globalopts}{controlversion}% for passing to the .bcf

\newcommand*{\labelalphaothers}{+}
\newcommand*{\sortalphaothers}{\labelalphaothers}
\blx@collectopts{string}{blx@globalopts}{alphaothers}% for passing to the .bcf
\blx@collectopts{string}{blx@typeopts}{alphaothers}% for passing to the .bcf
\blx@collectopts{string}{blx@globalopts}{sortalphaothers}% for passing to the .bcf
\blx@collectopts{string}{blx@typeopts}{sortalphaothers}% for passing to the .bcf

% The Declare*Option macros are for options which need to be visible
% to biblatex. For options which only biber needs to see, they can be
% passed to the .bcf directly using \blx@collectopts
% [<datatype>]{<key>}[<value>]{<code>}
\newrobustcmd*{\DeclareBibliographyOption}[2][]{
  \ifblank{#1}
    {\def\blx@tempa{boolean}}
    {\ifcsundef{blx@globalopts@#1}
       {\blx@warn@badoptdt{#1}%
        \def\blx@tempa{boolean}}
       {\def\blx@tempa{#1}}}%
  \expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@globalopts}{#2}%
  \@ifnextchar[%]
    {\blx@defbibopt{#2}}
    {\blx@defbibopt{#2}[]}}

\long\def\blx@defbibopt#1[#2]#3{%
  \ifcsundef{KV@blx@opt@ldt@#1}
    {\ifcsundef{KV@blx@opt@pre@#1}
       {\ifblank{#2}
          {\define@key{blx@opt@pre}{#1}{#3}}
          {\define@key{blx@opt@pre}{#1}[#2]{#3}}}
       {\blx@err@optdef{#1}}}
    {\blx@err@optdef{#1}}}

% [<datatype>]{<key>}[<value>]{<code>}
\newrobustcmd*{\DeclareTypeOption}[2][]{%
  \ifblank{#1}
    {\def\blx@tempa{boolean}}
    {\ifcsundef{blx@typeopts@#1}
       {\blx@warn@badoptdt{#1}%
        \def\blx@tempa{boolean}}
       {\def\blx@tempa{#1}}}%
    \expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@typeopts}{#2}%
  \@ifnextchar[%]
    {\blx@deftypeopt{#2}}
    {\blx@deftypeopt{#2}[]}}

\long\def\blx@deftypeopt#1[#2]#3{%
  \ifcsundef{KV@blx@opt@typ@#1}
    {\ifblank{#2}
       {\define@key{blx@opt@typ}{#1}{#3}}
       {\define@key{blx@opt@typ}{#1}[#2]{#3}}}
    {\blx@err@optdef{#1}}}

% [<datatype>]{<key>}[<value>]{<code>}
\newrobustcmd*{\DeclareEntryOption}[2][]{%
  \ifblank{#1}
    {\def\blx@tempa{boolean}}
    {\ifcsundef{blx@entryopts@#1}
       {\blx@warn@badoptdt{#1}%
        \def\blx@tempa{boolean}}
       {\def\blx@tempa{#1}}}%
    \expandafter\blx@collectopts\expandafter{\blx@tempa}{blx@entryopts}{#2}%
  \@ifnextchar[%]
    {\blx@defentryopt{#2}}
    {\blx@defentryopt{#2}[]}}

 \long\def\blx@defentryopt#1[#2]#3{%
  \ifcsundef{KV@blx@opt@ent@#1}
    {\ifblank{#2}
       {\define@key{blx@opt@ent}{#1}{#3}}
       {\define@key{blx@opt@ent}{#1}[#2]{#3}}}
    {\blx@err@optdef{#1}}}

% Sanity check on date field names - they *must* end in 'date' to make things easier/possible later
\def\do#1{%
  \IfEndWith{#1}{date}
    {}
    {\blx@error
       {Invalid date field name '#1'}
       {Date fields in the datemodel must end in the string 'date' but '#1' doesn't}}}
\abx@dodates

% date meta-information option fallbacks
\def\do#1{%
  \cslet{#1datecircaprint}\@empty
  \cslet{#1enddatecircaprint}\@empty
  \cslet{#1datecircaprintedtf}\@empty
  \cslet{#1enddatecircaprintedtf}\@empty
  \cslet{#1dateuncertainprint}\@empty
  \cslet{#1enddateuncertainprint}\@empty
  \cslet{#1dateeraprint}\@gobble
  \cslet{#1dateeraprintpre}\@gobble
  \csdef{if#1dateera}##1{\@secondoftwo}%
  \csdef{if#1enddateera}##1{\@secondoftwo}%
  \cslet{if#1datecirca}\@secondoftwo
  \cslet{if#1enddatecirca}\@secondoftwo
  \cslet{if#1datejulian}\@secondoftwo
  \cslet{if#1enddatejulian}\@secondoftwo
  \cslet{if#1dateuncertain}\@secondoftwo
  \cslet{if#1enddateuncertain}\@secondoftwo}
\abx@dodatetypes
\do{labeldate}

% These are internal fields/booleans which are not part of the data model but
% which need to be dealt with along with data model fields in places
\def\do#1{%
  \listxadd\blx@datemetafields{#1dateera}%
  \listxadd\blx@datemetafields{#1enddateera}%
  \listxadd\blx@datemetafields{#1dateunspecified}}
\abx@dodatetypes

\def\do#1{%
  \listxadd\blx@datemetabooleans{#1datecirca}%
  \listxadd\blx@datemetabooleans{#1enddatecirca}%
  \listxadd\blx@datemetabooleans{#1datejulian}%
  \listxadd\blx@datemetabooleans{#1enddatejulian}%
  \listxadd\blx@datemetabooleans{#1dateuncertain}%
  \listxadd\blx@datemetabooleans{#1enddateuncertain}}
\abx@dodatetypes

\def\do#1{%
  \listxadd\blx@namepartmetafields{#1namehash}%
  \listxadd\blx@namepartmetafields{#1fullhash}%
  \listxadd\blx@namepartmetafields{#1bibnamehash}}
\abx@donameparts

\def\do#1{%
  \listxadd\blx@labeldatepartfields{label#1}}
\abx@dodateparts

\def\abx@dointernalfields{%
  \do{clonesourcekey}%
  \do{labeldate}%
  \do{labeldatesource}%
  \do{labeldateera}%
  \do{labelenddateera}%
  \do{entrykey}%
  \do{entryset}%
  \do{entrysetcount}%
  \do{entrytype}%
  \do{extraalpha}%
  \do{extratitle}%
  \do{extratitleyear}%
  \do{extradate}%
  \do{fullhash}%
  \do{labelalpha}%
  \do{labelnumber}%
  \do{labelprefix}%
  \do{labeltitleyear}%
  \do{localnumber}%
  \do{namehash}%
  \do{bibnamehash}%
  \do{options}%
  \do{sortinit}%
  \do{sortinithash}%
  \forlistloop{\do}\blx@datemetafields
  \forlistloop{\do}\blx@namepartmetafields
  \forlistloop{\do}\blx@labeldatepartfields}

\def\abx@dobooleans{%
  \do{crossrefsource}%
  \do{xrefsource}%
  \do{singletitle}%
  \do{uniquetitle}%
  \do{uniquebaretitle}%
  \do{uniquework}%
  \do{uniqueprimaryauthor}%
  \forlistloop{\do}\blx@datemetabooleans}

% Date datatype fields
\def\do#1{%
  \protected\csdef{blx@imc@print#1date}{}%
  \protected\csdef{blx@imc@print#1dateextra}{}%
  \protected\csdef{blx@imc@print#1time}{}}
\abx@dodatetypes

% \blx@regimcs doesn't work in do-lists nicely so use internal macro it calls
\def\do#1{%
  \xappto\blx@blxinit{\csletcs{print#1date}{blx@imc@print#1date}}%
  \xappto\blx@blxinit{\csletcs{print#1time}{blx@imc@print#1time}}%
  \xappto\blx@blxinit{\csletcs{print#1dateextra}{blx@imc@print#1dateextra}}}
\abx@dodatetypes

% Set up circa, julian and uncertain date internals
\def\blx@imc@ifdatemeta@i#1#2{%
  \appto\blx@blxinit{%
    \csdef{if#1date#2}{\iftoggle{abx@bool@#1date#2}}%
    \csdef{if#1enddate#2}{\iftoggle{abx@bool@#1enddate#2}}%
    \appto\blx@TE@hook{%
      \csdef{if#1date#2}{\blx@TE{\iftoggle{abx@bool@#1date#2}}}%
      \csdef{if#1enddate#2}{\blx@TE{\iftoggle{abx@bool@#1enddate#2}}}}}}

% Set up date era internals
\def\blx@imc@ifdatemeta@ii#1{%
  \appto\blx@blxinit{%
    \csdef{if#1dateera}##1{\ifcsstring{abx@field@#1dateera}{##1}}%
    \csdef{if#1enddateera}##1{\ifcsstring{abx@field@#1enddateera}{##1}}%
    \appto\blx@TE@hook{%
      \csdef{if#1dateera}##1{\blx@TE{\ifcsstring{abx@field@#1dateera}{##1}}}%
      \csdef{if#1enddateera}##1{\blx@TE{\ifcsstring{abx@field@#1enddateera}{##1}}}}}}

% Create date meta information boolean tests
\def\do#1{%
  \blx@imc@ifdatemeta@i{#1}{circa}%
  \blx@imc@ifdatemeta@i{#1}{julian}%
  \blx@imc@ifdatemeta@i{#1}{uncertain}}
\abx@dodatetypes

% Create date meta information field tests
\def\do#1{%
  \blx@imc@ifdatemeta@ii{#1}}
\abx@dodatetypes

% Resolve date meta information tests and print routines for labeldate
% We have to test here, in each \def, whether the labeldatesource
% is a real date field or not. If it's not, then we don't want to use
% any of the meta-information and so make the conditionals always return false
% This can't be neater by testing for the \abx@field@labeldatesource value
% earlier because its not available until the tests are in scope.
\appto\blx@blxinit{%
   \ifdefstring\blx@dateera{astronomical}
     {\protected\def\dateeraprintpre#1{%
        \iffieldnum{#1}
          {\begingroup
           \let\blx@tempa\@empty
           \IfEndWith{#1}{endyear}
             {\StrCut{#1}{endyear}\blx@datetype\blx@tempnull
              \def\blx@tempa{end}}
             {\StrCut{#1}{year}\blx@datetype\blx@tempnull}%
           \csuse{if\blx@datetype\blx@tempa dateera}{bce}
             {\ifnumless{0-\thefield{#1}}{0}
               {\printtext{\csuse{bibdateera\blx@tempa prefix}}}
               {}}
             {}%
           \endgroup}
          {}}}
     {\protected\def\dateeraprint#1{%
        \iffieldnum{#1}
          {\begingroup
           \let\blx@tempa\@empty
           \IfEndWith{#1}{endyear}
             {\StrCut{#1}{endyear}\blx@datetype\blx@tempnull
              \def\blx@tempa{end}}
             {\StrCut{#1}{year}\blx@datetype\blx@tempnull}%
           \csuse{if\blx@datetype\blx@tempa dateera}{bce}
             {\ifnum\numexpr0-\thefield{#1}\relax<\blx@dateeraauto
                % \midsentence is to suppress automatic capitalisation
                \printtext{\printdelim{dateeradelim}\midsentence\bibstring{\blx@dateera@bce}}\relax
              \fi}
             {\ifnumless{\thefield{#1}}\blx@dateeraauto
               {\printtext{\printdelim{dateeradelim}\midsentence\bibstring{\blx@dateera@ce}}}
               {}}%
           \endgroup}
          {}}}%
  \iftoggle{blx@labeldateparts}
    {\def\iflabeldateera#1{% start era
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\ifcsstring{abx@field@\abx@field@labeldatesource dateera}{#1}}
         {\@secondoftwo}}%
     \appto\blx@TE@hook{\def\iflabeldateera#1{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\blx@TE{\ifcsstring{abx@field@\abx@field@labeldatesource dateera}{#1}}}
         {\@secondoftwo}}}%
     % end era
     \def\iflabelenddateera#1{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\ifcsstring{abx@field@\abx@field@labeldatesource enddateera}{#1}}
         {\@secondoftwo}}%
     \appto\blx@TE@hook{\def\iflabelenddateera#1{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\blx@TE{\ifcsstring{abx@field@\abx@field@labeldatesource enddateera}{#1}}}
         {\@secondoftwo}}}%
     % start circa
     \def\iflabeldatecirca{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\iftoggle{abx@bool@\abx@field@labeldatesource datecirca}}
         {\@secondoftwo}}%
     \appto\blx@TE@hook{\def\iflabeldatecirca{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource datecirca}}}
         {\@secondoftwo}}}%
     % end circa
     \def\iflabelenddatecirca{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\iftoggle{abx@bool@\abx@field@labeldatesource enddatecirca}}
         {\@secondoftwo}}%
     \appto\blx@TE@hook{\def\iflabelenddatecirca{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource enddatecirca}}}
         {\@secondoftwo}}}%
     % start julian
     \def\iflabeldatejulian{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\iftoggle{abx@bool@\abx@field@labeldatesource datejulian}}
         {\@secondoftwo}}%
     \appto\blx@TE@hook{\def\iflabeldatejulian{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource datejulian}}}
         {\@secondoftwo}}}%
     % end julian
     \def\iflabelenddatejulian{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\iftoggle{abx@bool@\abx@field@labeldatesource enddatejulian}}
         {\@secondoftwo}}%
     \appto\blx@TE@hook{\def\iflabelenddatejulian{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource enddatejulian}}}
         {\@secondoftwo}}}%
     % start uncertain
     \def\iflabeldateuncertain{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\iftoggle{abx@bool@\abx@field@labeldatesource dateuncertain}}
         {\@secondoftwo}}%
     \appto\blx@TE@hook{\def\iflabeldateuncertain{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource dateuncertain}}}
         {\@secondoftwo}}}%
     % end uncertain
     \def\iflabelenddateuncertain{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\iftoggle{abx@bool@\abx@field@labeldatesource enddateuncertain}}
         {\@secondoftwo}}%
     \appto\blx@TE@hook{\def\iflabelenddateuncertain{%
       \xifinlist{\abx@field@labeldatesource date}\blx@datamodel@dates
         {\blx@TE{\iftoggle{abx@bool@\abx@field@labeldatesource enddateuncertain}}}
         {\@secondoftwo}}}}%
  {}}

% Name toggles like \ifauthor etc. need to be dynamically created for all
% name datatypes in the data model and we have to do this here after the
% datamodel is available. Need to be careful about expansions here as these
% go into hooks to be executed later

% toggle to say if we have set any <name>inits to true. Used for conflict
% tests with uniquename settings (see \AtEndPreamble below)
\newtoggle{abx@bool@xinits}
% define <name>inits options and tests (terseinits is global for all initials)
\def\do#1{%
  \newtoggle{abx@bool@#1inits}%
  \appto\blx@blxinit{%
    \csdef{if#1inits}{\iftoggle{abx@bool@#1inits}}%
    \appto\blx@TE@hook{%
      \csdef{if#1inits}{\blx@TE{\iftoggle{abx@bool@#1inits}}}}}%
  \DeclareBibliographyOption[boolean]{#1inits}[true]{%
    \settoggle{abx@bool@#1inits}{##1}}}
\abx@donameparts

\def\do#1{%
  % Define use<name> options scope for biber
  \blx@collectopts{boolean}{blx@globalopts}{use#1}%
  \blx@collectopts{boolean}{blx@typeopts}{use#1}%
  \blx@collectopts{boolean}{blx@entryopts}{use#1}%
  % Define name toggles
  \newtoggle{blx@use#1}\toggletrue{blx@use#1}%
  % Define tests
  \appto\blx@blxinit{%
    \csdef{ifuse#1}{\iftoggle{blx@use#1}}%
    \appto\blx@TE@hook{%
      \csdef{ifuse#1}{\blx@TE{\iftoggle{blx@use#1}}}}}}
\abx@donames

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Since these are bare counters which define \the<string>, save any current values
% (memoir, titling, koma etc. have a \theauthor macro, for example) and restore at
% end of package
\def\do#1{%
  \csletcs{blx@compat@the#1}{the#1}%
  \newcounter{#1}%
  \newcounter{saved#1}%
  \appto\abx@dobooleans{\do{more#1}}}

\abx@donames
\abx@dornames
\abx@dolists
%\abx@dorlists

\AtEndOfPackage{%
  \def\do#1{\csletcs{the#1}{blx@compat@the#1}}%
  \abx@donames
  \abx@dornames
  \abx@dolists}

\def\do#1{\newtoggle{abx@bool@#1}}
\abx@dobooleans

\def\do#1{\expandafter\newlength\expandafter{\csname #1width\endcsname}}
\abx@dolabelfields

\protected\def\blx@resetdata{%
  \let\blx@saved@do\do
  \let\do\blx@imc@clearname
  \abx@donames
  \let\do\blx@imc@clearlist
  \abx@dolists
  \let\do\blx@imc@clearfield
  \abx@dofields
  \abx@dointernalfields
  \def\do##1{\togglefalse{abx@bool@##1}}%
  \abx@dobooleans
  \let\do\blx@saved@do
  \c@citecounter\z@
  \iftoggle{blx@bibliography}
    {\c@maxnames\blx@maxbibnames\relax
     \c@minnames\blx@minbibnames\relax}
    {\c@maxnames\blx@maxcitenames\relax
     \c@minnames\blx@mincitenames\relax}%
  \c@maxitems\blx@maxitems\relax
  \c@minitems\blx@minitems\relax}

\protected\def\blx@saveentry{%
  \let\blx@saved@do\do
  \let\do\blx@savename
  \abx@donames
  \let\do\blx@saverelname
  \dolistloop\abx@dorelnames
  \let\do\blx@savelist
  \abx@dolists
  \let\do\blx@saverellist
  \dolistloop\abx@dorellists
  \let\do\blx@savefield
  \abx@dofields
  \let\do\blx@saverelfield
  \dolistloop\abx@dorelfields
  \abx@dointernalfields
  \let\do\blx@savebool
  \abx@dobooleans
  \c@savedcitecounter\c@citecounter
  \let\do\blx@saved@do}

\protected\def\blx@savename#1{%
  \csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@more#1}%
  \csletcs{abx@name@saved#1}{abx@name@#1}%
  \csname c@saved#1\endcsname\csname c@#1\endcsname}

% override with name saved from \clearfield for related processing
\protected\def\blx@saverelname#1{%
  \csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@morerelsaved#1}%
  \csletcs{abx@name@saved#1}{abx@name@relsaved#1}%
  \csname c@saved#1\endcsname\csname c@relsaved#1\endcsname}

\protected\def\blx@savelist#1{%
  \csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@more#1}%
  \csletcs{abx@list@saved#1}{abx@list@#1}%
  \csname c@saved#1\endcsname\csname c@#1\endcsname}

% override with list saved from \clearfield for related processing
\protected\def\blx@saverellist#1{%
  \csletcs{etb@tgl@abx@bool@moresaved#1}{etb@tgl@abx@bool@morerelsaved#1}%
  \csletcs{abx@list@saved#1}{abx@list@relsaved#1}%
  \csname c@saved#1\endcsname\csname c@relsaved#1\endcsname}

\protected\def\blx@savefield#1{%
  \csletcs{abx@field@saved#1}{abx@field@#1}}

% override with field saved from \clearfield for related processing
\protected\def\blx@saverelfield#1{%
  \csletcs{abx@field@saved@#1}{abx@field@relsaved#1}}

\protected\def\blx@savebool#1{%
  \csletcs{abx@bool@saved#1}{abx@bool@#1}}

% {<code>}
\protected\long\def\blx@bbl@preamble#1{%
  \gappto\abx@preamble{#1}}

% {<message>}
\protected\def\blx@bbl@warn#1{%
  \begingroup
  \def\item{\MessageBreak-\space}%
  \def\break{\MessageBreak\space\space}%
  \edef\blx@tempa{%
    Biber reported the following issues%
    \ifdef\abx@field@entrykey
      {\MessageBreak with '\abx@field@entrykey'}
      {}%
    :#1}%
  \blx@warning@noline{\blx@tempa}%
  \endgroup}

% {<field>}{<code>}
\newrobustcmd{\DeclareFieldInputHandler}[2]{%
  \ifblank{#2}
    {\csundef{blx@fih@#1}}
    {\long\csdef{blx@fih@#1}##1{#2}}}
\@onlypreamble\DeclareFieldInputHandler

% {<list>}{<code>}
\newrobustcmd*{\DeclareListInputHandler}[2]{%
  \ifblank{#2}
    {\csundef{blx@lih@#1}}
    {\csdef{blx@lih@#1}##1{#2}}}
\@onlypreamble\DeclareListInputHandler

% {<name>}{<code>}
\newrobustcmd*{\DeclareNameInputHandler}[2]{%
  \ifblank{#2}
    {\csundef{blx@nih@#1}}
    {\csdef{blx@nih@#1}##1{#2}}}
\@onlypreamble\DeclareNameInputHandler

% {<entrykey>}{<refsection>}{<field>}{<refcontext>}{<value>}
\long\def\blx@bbl@addentryfield#1#2#3#4#5{%
  \csxappto{blx@data@#2@#4@#1}{%
    \def\expandafter\noexpand\csname abx@field@#3\endcsname{#5}}}

% {<rangefield>}{<value>}
\protected\def\blx@bbl@rangedef#1#2{%
  \csxappto\blx@bbl@data{%
    \def\expandafter\noexpand\csname abx@range@#1\endcsname{#2}}}

% {<field>}{<value>}
\long\def\blx@bbl@addfield#1#2{%
  \csxappto\blx@bbl@data{%
    \def\expandafter\noexpand\csname abx@field@#1\endcsname{#2}}}

\protected\long\def\blx@bbl@fielddef#1#2{%
  \def\NewValue{#2}%
  \ifcsdef{blx@fih@#1}
    {\csname blx@fih@#1\endcsname{#2}%
     \ifdefvoid\NewValue}
    {\@secondoftwo}
       {}
       {\blx@bbl@addfield{#1}{\expandonce\NewValue}}}

\protected\long\def\blx@bbl@fieldedef#1#2{%
  \edef\NewValue{#2}%
  \ifcsdef{blx@fih@#1}
    {\csname blx@fih@#1\expandafter
     \endcsname\expandafter{\NewValue}%
     \ifdefvoid\NewValue}
    {\@secondoftwo}
       {}
       {\blx@bbl@addfield{#1}{\NewValue}}}

\protected\long\def\blx@bbl@stringdef#1#2{%
  \begingroup
  \edef\blx@tempa{\endgroup
    \blx@bbl@fielddef{#1}{\detokenize{#2}}}%
  \blx@tempa}

% Verbatim lists
% {<list>}{<listcount>}
\protected\def\blx@bbl@verbldef#1#2{%
  \begingroup
  \let\lverb\blx@bbl@verbladd
  \def\blx@tempa{#1}%
  \def\blx@tempb{#2}%
  \let\blx@tempc\@empty
  \let\NewValue\@empty}

\protected\def\blx@bbl@verblend{%
  \expandafter\blx@bbl@listdef\expandafter{\expandafter\blx@tempa\expandafter}\expandafter{\expandafter\blx@tempb\expandafter}\expandafter{\blx@tempc}%
  \endgroup}

\protected\def\blx@bbl@verbladd{%
  \begingroup
  \let\do\@makeother
  \dospecials
  \catcode\endlinechar=12\relax
  \blx@bbl@verbladd@i}

% Verbatim fields
% {<field>}
\protected\def\blx@bbl@verbdef#1{%
  \begingroup
  \let\verb\blx@bbl@verbadd
  \def\blx@tempa{#1}%
  \let\NewValue\@empty}

\protected\def\blx@bbl@verbend{%
  \ifcsdef{blx@fih@\blx@tempa}
    {\csname blx@fih@\blx@tempa\expandafter
     \endcsname\expandafter{\NewValue}%
     \ifdefvoid\NewValue}
    {\@secondoftwo}
       {}
       {\blx@bbl@addfield{\blx@tempa}{\NewValue}}%
  \endgroup}

\protected\def\blx@bbl@verbadd{%
  \begingroup
  \let\do\@makeother
  \dospecials
  \catcode\endlinechar=12\relax
  \blx@bbl@verbadd@i}

% {<scope>}{<field>}{<itemcount>}{<part>}{<value>}
\protected\def\blx@bbl@annotationdef#1#2#3#4#5{%
  \ifboolexpr { test {\ifstrequal{#1}{field}} }
     {\csxappto\blx@bbl@data{%
         \def\do####1{\listcsadd{abx@annotation@#1@#2}{####1}}%
         \docsvlist{#5}}}
     {}%
  \ifboolexpr { test {\ifstrequal{#1}{item}} }
     {\csxappto\blx@bbl@data{%
         \def\do####1{\listcsadd{abx@annotation@#1@#2@#3}{####1}}%
         \docsvlist{#5}}}
     {}%
  \ifboolexpr { test {\ifstrequal{#1}{part}} }
     {\csxappto\blx@bbl@data{%
         \def\do####1{\listcsadd{abx@annotation@#1@#2@#3@#4}{####1}}%
         \docsvlist{#5}}}
     {}}

% {<annotation>}
\newcommand*{\iffieldannotation}[1]{%
  \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
  \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
  \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
  \blx@resolve@annotation@label{\blx@tempa}%
  \ifinlistcs{#1}{abx@annotation@field@\blx@tempa}}

% {<annotation>}
\newcommand*{\ifitemannotation}[1]{%
  \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
  \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
  \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
  \blx@resolve@annotation@label{\blx@tempa}%
  \ifinlistcs{#1}{abx@annotation@item@\blx@tempa @\the\value{listcount}}}

% {<part>}{<annotation>}
\newcommand*{\ifpartannotation}[2]{%
  \ifdefvoid\currentfield{}{\let\blx@tempa\currentfield}%
  \ifdefvoid\currentlist{}{\let\blx@tempa\currentlist}%
  \ifdefvoid\currentname{}{\let\blx@tempa\currentname}%
  \blx@resolve@annotation@label{\blx@tempa}%
  \ifinlistcs{#2}{abx@annotation@part@\blx@tempa @\the\value{listcount}@#1}}

% {<fieldname>}
\def\blx@resolve@annotation@label#1{%
  \ifcsundef{abx@field@#1source}
    {}%
    {\letcs\blx@tempa{abx@field@#1source}}}

\begingroup
\catcode`\<=12
\catcode`\>=12
\uccode`\<=`\ %
\uccode`\>=\endlinechar
\uppercase{\gdef\blx@bbl@verbadd@i<#1>}{%
  \endgroup
  \edef\NewValue{\NewValue\detokenize{#1}}}
\uppercase{\gdef\blx@bbl@verbladd@i<#1>}{%
  \endgroup
  \eappto\blx@tempc{{\detokenize{#1}}}}%
\endgroup

% {<counter>}{<value>}
\protected\long\def\blx@bbl@cntdef#1#2{%
  \csxappto\blx@bbl@data{%
    \csname c@#1\endcsname#2\relax}}

% {<boolean>}
\protected\def\blx@bbl@booltrue#1{%
  \csgappto\blx@bbl@data{%
    \toggletrue{abx@bool@#1}}}

\protected\def\blx@bbl@boolfalse#1{%
  \csgappto\blx@bbl@data{%
    \togglefalse{abx@bool@#1}}}

% {<list>}{<itemcount>}{<value>}
\protected\def\blx@bbl@listdef#1#2#3{%
  \def\NewCount{#2}%
  \def\NewValue{#3}%
  \ifcsdef{blx@lih@#1}
    {\csname blx@lih@#1\endcsname{#3}%
     \ifdefvoid\NewValue}
    {\@secondoftwo}
       {}
       {\csxappto\blx@bbl@data{%
          \csname c@#1\endcsname\NewCount\relax
          \def\expandafter\noexpand\csname abx@list@#1\endcsname
          {\expandonce\NewValue}}}}

% {<name>}{<itemcount>}{<nameoptions>}{<value>}
\protected\def\blx@bbl@namedef#1#2#3#4{%
  \def\NewCount{#2}%
  \def\NewOption{#3}%
  \def\NewValue{#4}%
  \ifcsdef{blx@nih@#1}
    {\csname blx@nih@#1\endcsname{#4}%
     \ifdefvoid\NewValue}
    {\@secondoftwo}
       {}
       {\csxappto\blx@bbl@data{%
          \csname c@#1\endcsname\NewCount\relax
          \def\expandafter\noexpand\csname abx@name@#1\endcsname
          {{\expandonce\NewOption}{\expandonce\NewValue}}}}}

% blx@setp@<rs>@<sp> = map of set parent <sp> in a refsection <rs> to csv
%                      of set children
% blx@seti@<rs>@<sc> = position of set child <sc> in entry set in
%                      refsection <rs>
% blx@setc@<rs>@<sc> = map of set child <sc> in refsection <rs> to set parent

% {<entrykey>,...}
\protected\def\blx@bbl@set#1{%
  \blx@bbl@fieldedef{entryset}{\detokenize{#1}}%
  \csxdef{blx@setp@\the\c@refsection @\abx@field@entrykey}{\detokenize{#1}}%
  \begingroup
  \blx@tempcnta\z@
  \expandafter\forcsvlist
  \expandafter\blx@bbl@set@i
  \expandafter{\detokenize{#1}}%
  \endgroup}

\def\blx@bbl@set@i#1{%
  \advance\blx@tempcnta\@ne
  \csxdef{blx@seti@\the\c@refsection @#1}{\the\blx@tempcnta}}

% {<entrykey>}
\protected\def\blx@bbl@inset#1{%
  \toggletrue{blx@setonly}%
  \blx@bbl@fieldedef{entryset}{\detokenize{#1}}%
  \csxdef{blx@setc@\the\c@refsection @\abx@field@entrykey}{\detokenize{#1}}}

% {<entrykey>}
\protected\def\blx@bbl@xref#1{}% No-op to avoid an error with BibTeX .bbl

% {<keyword>,...}
\protected\def\blx@bbl@keyw#1{%
  \iftoggle{blx@skipbib}
    {}
    {\forcsvlist{\blx@addkeyword{\abx@field@entrykey}}{#1}%
     \blx@bbl@fielddef{keywords}{#1}}}

\def\blx@addkeyword#1#2{%
  \listcsxadd{blx@keyw@\the\c@refsection @\detokenize{#2}}{#1}}

% {<options>}
\protected\long\def\blx@bbl@options#1{%
  \begingroup
  \let\blx@tempa\@empty
  \forcsvlist\blx@bbl@options@i{#1}%
  \edef\blx@tempa{%
    \endgroup
    \ifx\blx@tempa\@empty
    \else
      \def\noexpand\abx@field@options{\expandonce\blx@tempa}%
    \fi}%
  \blx@tempa}

\long\def\blx@bbl@options@i#1{\blx@bbl@options@ii#1==&}

\long\def\blx@bbl@options@ii#1=#2=#3&{%
  \ifcsundef{KV@blx@opt@ent@#1}
    {\blx@warning@noline{%
       Ignoring undefined option '#1'\MessageBreak
       at entry '\abx@field@entrykey'}}
    {\eappto\blx@tempa{%
       \ifx\blx@tempa\@empty\else,\fi
       \unexpanded{#1}\ifblank{#2}{}{=\unexpanded{#2}}}}}

\def\blx@ifdata#1{%
  \ifcsdef{blx@data@\the\c@refsection @\blx@refcontext@context @#1}}
\let\blx@imc@ifentryinbib\blx@ifdata

\def\blx@getdata#1{%
  \csuse{blx@data@\the\c@refsection @\blx@refcontext@context @#1}%
  \blx@adjustyears
  \blx@getlabeldata
  \blx@aliasfields
  \blx@setcitecounter}

\def\blx@adjustyears{%
  % All dates by default are output from biber in astronomical era with a year 0
  % So, if we are ouputting BCE/BC era, we need to adjust the years by +1
  \def\do##1{%
    \ifdefstring\blx@dateera{astronomical}
      {}
      {\ifcsdef{abx@field@##1year}
        {\csuse{if##1dateera}{bce}
          {\csedef{abx@field@##1year}{\number\numexpr\csuse{abx@field@##1year}+1}}
          {}}
        {}%
       \ifcsdef{abx@field@##1endyear}
         {\csuse{if##1enddateera}{bce}
           {\csedef{abx@field@##1endyear}{\number\numexpr\csuse{abx@field@##1endyear}+1}}
           {}}
         {}}%
      {}}%
  \abx@dodatetypes}

\def\blx@getlabeldata{%
  % Here we resolve label* bib fields to their real fields. In fact, currently biber resolves
  % the label* fields too, as it needs to do this to generate various internal
  % counters for tracking things like singletitle etc. internally. However, it does not output
  % the resolved values to the .bbl. It is conceptually neater to have just the calculated label*
  % source field in the .bbl and let biblatex resolve the label* field using the label*source
  % fields. However, currently there is no way/need to vary the label* resolution to pick up a
  % different target field in biblatex and so practically, this resolution is being done twice,
  % once by biber, once by biblatex. It is possible in the future that it would be useful to
  % to change the resolution of the label* fields dynamically in a style/document and so this
  % biblatex-side resolution remains.
  %
  % An unanswered question is whether such dynamic resolution causes problems due to the fact
  % that biber uses the label* field to generate counters internally and changing the
  % label* field resolution in biblatex would occur after such counters have been used to
  % generate the .bbl
  % This could all be removed from biblatex if necessary and biber could output all resolved
  % label* fields to the .bbl but then it potentially removes control of such things from
  % macros
  %
  % fields
  \def\do##1{%
    \ifcsundef{abx@field@##1source}
      {}%
      {\csletcs{abx@field@##1}{abx@field@\csuse{abx@field@##1source}}}}%
  \dolistloop\abx@rfields%
  % names
  \def\do##1{%
    \ifcsundef{abx@field@##1source}
     {}
     {\csname c@##1\expandafter\endcsname\expandafter\the\csname c@\csuse{abx@field@##1source}\endcsname
      \csletcs{abx@name@##1}{abx@name@\csuse{abx@field@##1source}}}}%
  \dolistloop\abx@rnames%
  % Resolve labeldate
  % Note that here we can't refer to labelyear as this is where we create it, hence the
  % complications in constructing test names etc.
  % This also shows why biber shouldn't resolve labeldate fields as we have to add
  % circa/uncertain/era etc. information to them and that has to be done here.
  \ifundef\abx@field@labeldatesource
    {}
    {\ifcsundef{abx@field@\abx@field@labeldatesource year}
       % \DeclareLabeldate resolved to a literal/localisation string or a non-date field
       % in which case we only set labelyear.
       {\ifcsundef{abx@field@\abx@field@labeldatesource}
         % \DeclareLabeldate resolved to a literal/localisation string
         {\edef\abx@field@labelyear{\abx@field@labeldatesource}}
         % \DeclareLabeldate resolved to a non-date field.  Not safe to \edef because
         % such contents could contain arbitrary macros, unlike ETDF sourced labeldatesource values
         {\letcs\abx@field@labelyear{abx@field@\abx@field@labeldatesource}}}
       % \DeclareLabeldate resolved to a date field name prefix like '', 'event', 'url'
       % or 'orig'
       {% labeldateera/labelenddateera
        \ifcsdef{abx@field@\abx@field@labeldatesource dateera}
          {\edef\abx@field@labeldateera{\csuse{abx@field@\abx@field@labeldatesource dateera}}}
          {}%
        \ifcsdef{abx@field@\abx@field@labeldatesource enddateera}
          {\edef\abx@field@labelenddateera{\csuse{abx@field@\abx@field@labeldatesource enddateera}}}
          {}%
        % labelyear/labelendyear
        \ifcsdef{abx@field@\abx@field@labeldatesource year}
          {\edef\abx@field@labelyear{\csuse{abx@field@\abx@field@labeldatesource year}}}
          {}%
        \ifcsdef{abx@field@\abx@field@labeldatesource endyear}
          {\edef\abx@field@labelendyear{\csuse{abx@field@\abx@field@labeldatesource endyear}}}
          {}%
        % labelmonth
        \ifcsdef{abx@field@\abx@field@labeldatesource month}
          {\edef\abx@field@labelmonth{\csuse{abx@field@\abx@field@labeldatesource month}}}
          {}%
        \ifcsdef{abx@field@\abx@field@labeldatesource endmonth}
          {\edef\abx@field@labelendmonth{\csuse{abx@field@\abx@field@labeldatesource endmonth}}}
          {}%
        % labelday/labelendday
        \ifcsdef{abx@field@\abx@field@labeldatesource day}
          {\edef\abx@field@labelday{\csuse{abx@field@\abx@field@labeldatesource day}}}
          {}%
        \ifcsdef{abx@field@\abx@field@labeldatesource endday}
          {\edef\abx@field@labelendday{\csuse{abx@field@\abx@field@labeldatesource endday}}}
          {}%
        % labelhour/labelendhour
        \ifcsdef{abx@field@\abx@field@labeldatesource hour}
          {\edef\abx@field@labelhour{\csuse{abx@field@\abx@field@labeldatesource hour}}}
          {}%
        \ifcsdef{abx@field@\abx@field@labeldatesource endhour}
          {\edef\abx@field@labelendhour{\csuse{abx@field@\abx@field@labeldatesource endhour}}}
          {}%
        % labelminute/labelendminute
        \ifcsdef{abx@field@\abx@field@labeldatesource minute}
          {\edef\abx@field@labelminute{\csuse{abx@field@\abx@field@labeldatesource minute}}}
          {}%
        \ifcsdef{abx@field@\abx@field@labeldatesource endminute}
          {\edef\abx@field@labelendminute{\csuse{abx@field@\abx@field@labeldatesource endminute}}}
          {}%
        % labelsecond/labelendsecond
        \ifcsdef{abx@field@\abx@field@labeldatesource second}
          {\edef\abx@field@labelsecond{\csuse{abx@field@\abx@field@labeldatesource second}}}
          {}%
        \ifcsdef{abx@field@\abx@field@labeldatesource endsecond}
          {\edef\abx@field@labelendsecond{\csuse{abx@field@\abx@field@labeldatesource endsecond}}}
          {}%
        % labeltimezone/labelendtimezone
        \ifcsdef{abx@field@\abx@field@labeldatesource timezone}
          {\edef\abx@field@labeltimezone{\csuse{abx@field@\abx@field@labeldatesource timezone}}}
          {}%
        \ifcsdef{abx@field@\abx@field@labeldatesource endtimezone}
          {\edef\abx@field@labelendtimezone{\csuse{abx@field@\abx@field@labeldatesource endtimezone}}}
          {}%
        % labelseason/labelendseason
        \ifcsdef{abx@field@\abx@field@labeldatesource season}
          {\edef\abx@field@labelseason{\csuse{abx@field@\abx@field@labeldatesource season}}}
          {}%
        \ifcsdef{abx@field@\abx@field@labeldatesource endseason}
          {\edef\abx@field@labelendseason{\csuse{abx@field@\abx@field@labeldatesource endseason}}}
          {}}}}

% This gets the entry data for a citation
\def\blx@getdata@cite#1{%
  \blx@getdata{#1}%
  % Inject the relevant set parent fields like labelnumber/labelprefix into child
  \ifcsdef{blx@setc@\the\c@refsection @#1}
    {\blx@ifdata{#1}
       {\def\abx@field@childentrykey{#1}%LEGACY(<3.8)
        \edef\abx@field@childentrytype{\abx@field@entrytype}%LEGACY(<3.8)
        \begingroup
        \expandafter\expandafter\expandafter\blx@getdata\expandafter\expandafter\expandafter{%
          \csname blx@setc@\the\c@refsection @#1\endcsname}%
        \let\blx@tempa\@empty
        % Inject labelnumber if it exists
        \ifdef\abx@field@labelnumber
          {\appto\blx@tempa{\def\noexpand\abx@field@labelnumber{\abx@field@labelnumber}}}
          {}%
        % Inject labelprefix if it exists
        \ifdef\abx@field@labelprefix
          {\appto\blx@tempa{\def\noexpand\abx@field@labelprefix{\abx@field@labelprefix}}}
          {}%
        % Inject labelalpha if it exists
        \ifdef\abx@field@labelalpha
          {\appto\blx@tempa{\def\noexpand\abx@field@labelalpha{\abx@field@labelalpha}}}
          {}%
        % Inject extraalpha if it exists
        \ifdef\abx@field@extraalpha
          {\appto\blx@tempa{\def\noexpand\abx@field@extraalpha{\abx@field@extraalpha}}}
          {}%
        % Perform the injection
        \edef\blx@tempb{\endgroup\blx@tempa}%
        \blx@tempb}
       {}}
    {}%
  \ifcsdef{blx@seti@\the\c@refsection @#1}
    {\letcs\abx@field@entrysetcount{blx@seti@\the\c@refsection @#1}}
    {}}

\def\blx@execute{%
  \blx@imc@thefield{execute}}

\def\blx@setoptions@entry{%
  \blx@imc@iffieldundef{options}
    {}
    {\begingroup
     \edef\blx@tempa{\endgroup
       \noexpand\setkeys{blx@opt@ent}{\abx@field@options}}%
     \blx@tempa
     \blx@checkoptions@entry}}

\def\blx@setoptions@type#1{%
  \ifcsdef{blx@opts@type@#1}
    {\begingroup
     \edef\blx@tempa{\endgroup
       \noexpand\setkeys{blx@opt@typ}{\csuse{blx@opts@type@#1}}}%
     \blx@tempa}
    {}}

\def\blx@checkoptions@global{}
\def\blx@checkoptions@type{}
\def\blx@checkoptions@entry{}

\def\blx@entrysetcount{%
  \ifdef\abx@field@entrykey
    {\ifcsdef{blx@seti@\the\c@refsection @\abx@field@entrykey}
       {\letcs\abx@field@entrysetcount{%
          blx@seti@\the\c@refsection @\abx@field@entrykey}}
       {}}
    {}}

% {<section>}
\def\blx@bbl@refsection#1{%
  \begingroup
  \c@refsection#1\relax}

\def\blx@bbl@endrefsection{%
  \iftoggle{blx@addset}
    {\blx@addset
     \global\togglefalse{blx@addset}}
    {}%
  \endgroup}

% {<entrykey>}
\protected\def\blx@bbl@missing#1{%
  \listcsxadd{blx@miss@\the\c@refsection}{\detokenize{#1}}%
  \blx@warning@noline{%
    The following entry could not be found\MessageBreak
    in the database%
    \ifnumgreater\c@refsection\z@
      { (refsection \the\c@refsection)}
      {}:\MessageBreak
    \detokenize{#1}\MessageBreak
    Please verify the spelling and rerun\MessageBreak
    LaTeX afterwards}}

% We create an alias resolving macro and also a list of aliases
% which we need to add to the .bcf. We need to resolve the aliases
% for internal use but we always want the aliases themselves in the .bcf
% so that biber can correctly use and resolve them too.
\protected\def\blx@bbl@keyalias#1#2{%
  \csgdef{blx@keyalias@\the\c@refsection @#1}{\detokenize{#2}}%
  \listcsgadd{blx@keyaliases@\the\c@refsection}{#1}}

% blx@dlist@list@<section>@<refcontext> - a list of list items in a refcontext in a
%                                     section (for tracking bibliography lists,
%                                     obeys skipbiblist)
% blx@dlist@entry@<section>@<list> - a list of normal entries in a list in a
%                                      section (for tracking bibliographies,
%                                      obeys skipbib)
% blx@dlist@centry@<section>@<list> - a list of normal entries in a list in a
%                                       section (for tracking citations,
%                                       obeys skipbib). Same as @entry@ but
%                                       with added set children

% {<entrykey>}{<entrytype>}{<options>}
\protected\def\blx@bbl@entry#1#2#3{%
  \begingroup
  \edef\abx@field@entrykey{\detokenize{#1}}%
  \blx@setoptions@type{#2}%
  \blx@bbl@options{#3}%
  \blx@setoptions@entry
  \edef\blx@bbl@data{blx@data@\the\c@refsection @\blx@dlist@name @\abx@field@entrykey}%
  \csuse\blx@bbl@data
  \blx@bbl@addfield{entrykey}{\abx@field@entrykey}%
  \listxadd\blx@entries{\abx@field@entrykey}%
  \blx@bbl@addfield{entrytype}{#2}%
  \blx@imc@iffieldundef{options}
    {}
    {\blx@bbl@fieldedef{options}{\expandonce\abx@field@options}}}

\protected\def\blx@bbl@endentry{%
  \csuse\blx@bbl@data
  \ifcsundef{blx@pref@\the\c@refsection @\abx@field@entrykey}
    {}
    {\blx@addpageref{\abx@field@entrykey}}%
  \nottoggle{blx@setonly}
    {}
    {\global\toggletrue{blx@addset}%
     \toggletrue{blx@skipbib}%
     \toggletrue{blx@skipbiblist}%
     \toggletrue{blx@skiplab}}%
  \nottoggle{blx@skipbib}
    {\expandafter\ifstrequal\expandafter{\blx@dlist@type}{entry}
       {\listcsxadd{blx@dlist@entry@\the\c@refsection @\blx@dlist@name}{\abx@field@entrykey}%
        \listcsxadd{blx@dlist@centry@\the\c@refsection @\blx@dlist@name}{\abx@field@entrykey}%
        \listcsxadd{blx@type@\the\c@refsection @\abx@field@entrytype}{\abx@field@entrykey}%
        \ifdef\abx@field@entrysubtype
          {\listcsxadd{blx@subt@\the\c@refsection @\abx@field@entrysubtype}{\abx@field@entrykey}}
          {}}
       {}}%
    {}%
  \nottoggle{blx@skipbiblist}
    {\expandafter\ifstrequal\expandafter{\blx@dlist@type}{list}
      {\blx@bbl@labelfields
        \listcsxadd{blx@dlist@\blx@dlist@type @\the\c@refsection @\blx@dlist@name}{\abx@field@entrykey}}
      {}}%
    {}%
  \nottoggle{blx@skiplab}
    {\iftoggle{blx@labelnumber}
      {\blx@bbl@labelnumber}
      {}%
    \iftoggle{blx@labelalpha}
      {\blx@bbl@labelalpha}
      {}%
    \iftoggle{blx@labeltitle}
      {\blx@bbl@labeltitle}
      {}%
    \iftoggle{blx@labeltitleyear}
      {\blx@bbl@labeltitleyear}
      {}%
    \iftoggle{blx@labeldateparts}
      {\blx@bbl@labeldate}
      {}}
    {}%
  \blx@bbl@titles
  \blx@bbl@hooks
  \endgroup}

% This, at the end of the .bbl, puts any set parent children into the
% current context sort list of citations (a separate list *@centry@* to the
% bibliography *@entry@* which doesn't want the children adding if they weren't
% cited) as this is needed for the subentry citing
% when sortcites is enabled as for sortcites, the current context sorting list
% is used and the parent set of a subentry is not necessarily
% available in the current context sortlist.
\def\blx@addset{%
  \begingroup
  \ifcsdef{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}
    {\letcs\blx@tempa{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}%
     \global\cslet{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}\@empty
     \forlistloop\blx@addset@i\blx@tempa}
    {\PackageWarningNoLine{biblatex}{Sorting template has changed}}%
  \endgroup}

\def\blx@addset@i#1{%
  \listcsgadd{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}{#1}%
  \ifcsdef{blx@setp@\the\c@refsection @#1}
    {\expandafter\expandafter\expandafter\forcsvlist
     \expandafter\expandafter\expandafter\blx@addset@ii
     \expandafter\expandafter\expandafter{%
       \csname blx@setp@\the\c@refsection @#1\endcsname}}
    {}}

\def\blx@addset@ii#1{%
  \listcsgadd{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}{#1}}

\def\blx@bbl@labelfields{%
  \def\do##1{%
    \ifcsundef{abx@field@##1}
      {}
      {\blx@setlabwidth{\csname ##1width\endcsname}{%
         \csuse{abx@ffd@*@##1width}{\csname abx@field@##1\endcsname}}}}%
  \abx@dolabelfields}

\def\blx@bbl@labelnumber{%
  % Used at endentry, when reading .bbl
  % only do this for the global sorting list otherwise we increment
  % the labelnumbers for each sortlist
  \ifdefempty\abx@field@localnumber
    {}% only if omitnumbers=true
    {\ifcsundef{abx@ffd@\blx@imc@thefield{entrytype}@labelnumberwidth}
       {\letcs{\@lnw@labelnumberwidth}{abx@ffd@*@labelnumberwidth}}
       {\letcs{\@lnw@labelnumberwidth}{abx@ffd@\blx@imc@thefield{entrytype}@labelnumberwidth}}%
     \ifcsundef{abx@ffd@\blx@imc@thefield{entrytype}@labelprefix}
       {\letcs{\@lnw@labelprefix}{abx@ffd@*@labelprefix}}
       {\letcs{\@lnw@labelprefix}{abx@ffd@\blx@imc@thefield{entrytype}@labelprefix}}%
     \ifcsundef{abx@ffd@\blx@imc@thefield{entrytype}@labelnumber}
       {\letcs{\@lnw@labelnumber}{abx@ffd@*@labelnumber}}
       {\letcs{\@lnw@labelnumber}{abx@ffd@\blx@imc@thefield{entrytype}@labelnumber}}%
     \ifundef\abx@field@shorthand
      {\iftoggle{blx@defernumbers}
        % only if defernumbers=true, we have to define localnumber to
        % something to stop labelnumberwidth def complaining on first
        % post-backend run since there will be nothing in the .aux yet
        % for defernums localnumbers. On the second post-backend run,
        % it will have a value correct for generating labelnumberwidth
        % We also have to define a dummy value for labelnumber here for
        % first post-backend runs otherwise references to labelnumber
        % in cite styles like numeric-comp will die.
        {\ifundef\abx@field@localnumber
          {\numdef\abx@field@localnumber{0}%
           \blx@bbl@fielddef{labelnumber}{0}}%
          {}}
        {\csnumgdef{blx@labelnumber@\the\c@refsection}{%
            \csuse{blx@labelnumber@\the\c@refsection}+1}%
          \edef\abx@field@localnumber{%
            \csuse{blx@labelnumber@\the\c@refsection}}%
          \blx@bbl@fieldedef{labelnumber}{\abx@field@localnumber}}%
        \iftoggle{blx@skipbib}
          {}
          {\blx@setlabwidth{\labelnumberwidth}{%
             \csuse{@lnw@labelnumberwidth}{%
                \ifdef\abx@field@labelprefix
                  {\csuse{@lnw@labelprefix}{\abx@field@labelprefix}}
                  {}%
                \csuse{@lnw@labelnumber}{\abx@field@localnumber}}}}}
      {\csgappto\blx@bbl@data{\let\abx@field@labelnumber\abx@field@shorthand}%
        \iftoggle{blx@skipbib}
          {}
          {\blx@setlabwidth{\labelnumberwidth}{%
              \csuse{@lnw@labelnumberwidth}{\abx@field@shorthand}}}}}}

\def\blx@bbl@labelalpha{%
   \ifundef\abx@field@labelalpha
     {}
     {\ifundef\abx@field@extraalpha
        {}
        {\ifnum\abx@field@extraalpha>\c@maxextraalpha
           \global\c@maxextraalpha\abx@field@extraalpha\relax
         \fi}%
      \iftoggle{blx@skipbib}
        {}
        {\blx@setlabwidth{\labelalphawidth}{%
           \csuse{abx@ffd@*@labelalphawidth}{%
             \ifdef\abx@field@labelprefix
               {\csuse{abx@ffd@*@labelprefix}{\abx@field@labelprefix}}
               {}%
             \csuse{abx@ffd@*@labelalpha}{\abx@field@labelalpha}%
             \ifundef\abx@field@extraalpha
               {}
               {\csuse{abx@ffd@*@extraalpha}{\abx@field@extraalpha}}}}}}}

\def\blx@bbl@labeltitle{%
  \ifundef\abx@field@extratitle
    {}
    {\ifnum\abx@field@extratitle>\c@maxextratitle
       \global\c@maxextratitle\abx@field@extratitle\relax
     \fi}}

\def\blx@bbl@labeltitleyear{%
  \ifundef\abx@field@extratitleyear
    {}
    {\ifnum\abx@field@extratitleyear>\c@maxextratitleyear
       \global\c@maxextratitleyear\abx@field@extratitleyear\relax
     \fi}}

\def\blx@bbl@labeldate{%
  \ifundef\abx@field@extradate
    {}
    {\ifnum\abx@field@extradate>\c@maxextradate
       \global\c@maxextradate\abx@field@extradate\relax
     \fi}}

\def\blx@bbl@titles{%
  \ifundef\abx@field@indextitle
    {\csgappto\blx@bbl@data{%
       \let\abx@field@indextitle\abx@field@title}}
    {}%
  \ifundef\abx@field@indexsorttitle
    {\csgappto\blx@bbl@data{%
       \let\abx@field@indexsorttitle\abx@field@indextitle}}
    {}}

\def\blx@bbl@hooks{%
  \ifcsundef{blx@hook@bblitem@*}
    {\ifcsundef{blx@hook@bblitem@\abx@field@entrytype}
       {}
       {\csuse\blx@bbl@data
        \csuse{blx@hook@bblitem@\abx@field@entrytype}}}
    {\csuse\blx@bbl@data
     \csuse{blx@hook@bblitem@*}%
     \csuse{blx@hook@bblitem@\abx@field@entrytype}}}

\newrobustcmd*{\AtDataInput}[1][*]{\csgappto{blx@hook@bblitem@#1}}
\@onlypreamble\AtDataInput

\def\blx@setlabwidth#1#2{%
  \begingroup
  \settowidth{\@tempdima}{\bibfont#2}%
  \ifnum\@tempdima>#1%
    \global#1\@tempdima
  \fi
  \endgroup}

\def\blx@bblstart{%
  \let\preamble\blx@bbl@preamble
  \let\warn\blx@bbl@thewarn
  \let\refsection\blx@bbl@refsection
  \let\endrefsection\blx@bbl@endrefsection
  \let\entry\blx@bbl@entry
  \let\endentry\blx@bbl@endentry
  \let\missing\blx@bbl@missing
  \let\keyalias\blx@bbl@keyalias
  \let\datalist\blx@bbl@dlist
  \let\enddatalist\blx@bbl@enddlist
  \let\set\blx@bbl@set
  \let\inset\blx@bbl@inset
  \let\xref\blx@bbl@xref % A No-op for Biber
  \let\keyw\blx@bbl@keyw
  \let\name\blx@bbl@namedef
  \let\list\blx@bbl@listdef
  \let\field\blx@bbl@fielddef
  \let\range\blx@bbl@rangedef
  \let\strng\blx@bbl@stringdef
  \let\cnt\blx@bbl@cntdef
  \let\true\blx@bbl@booltrue
  \let\false\blx@bbl@boolfalse
  \let\verb\blx@bbl@verbdef
  \let\endverb\blx@bbl@verbend
  \let\lverb\blx@bbl@verbldef
  \let\endlverb\blx@bbl@verblend
  \let\annotation\blx@bbl@annotationdef}

\def\blx@bblend{%
  % Special warning for defernumbers when a citation cannot be found
  \iftoggle{blx@defernumbers}
    {\def\do##1{\ifinlist{##1}\blx@entries
                 {}
                 {\blx@warning@noline{%
                     citation '##1' was not found at all in the .bbl, bibliography labels cannot be generated, please correct the citation}}}%
     \dolistloop\blx@lastcites}
    {}}

% {<entrykey>}
% Get the saved information on which citations were mentioned last run
\protected\def\abx@aux@cite#1{%
  \listxadd\blx@lastcites{\detokenize{#1}}}

% {<refcontext>}
% Get the saved information on which refcontexts were mentioned last run
\protected\def\abx@aux@refcontext#1{%
  \listgadd\blx@lastrefcontexts{#1}}

% {<sortingtemplatename>}
% Get the saved information on which shorthand sorting templates were mentioned last run
\protected\def\abx@aux@biblist#1{%
  \listgadd\blx@lastbiblists{#1}}

% Here we mustn't change the checksum if we used localnumbers from the
% .aux file as this means that deferred numbering is
% complete. Otherwise we get in an endless rerun loop because the
% checksum due to number changes is always different.
\AtEndDocument{%
  \def\abx@aux@number#1#2#3#4#5{%
    \ifblank{#5}
      {}
      {\nottoggle{blx@localnumber}
         {\blx@addchecksum{#1}{#5}}
         {}}}}

\AtEndDocument{%
  % Here we run some tests to decide if we need to issue re-run
  % messages in certain circumstances. In general, if we add/remove
  % any citations or add/remove any sorting templates, we need to re-run
  % biber. Also, if we have to re-run biber, we need to defer writing
  % the defernumbers .aux information because it will not yet be correct.

  % Test to see if we *removed* any citations since last run
  % (adding citations is dealt with naturally in \blx@citation@entry)
  % If so, give a rerun biber message. This also sets the
  % rerun biber toggle so defernums doesn't consume the localnumbers
  % in the .aux but instead, re-writes them, which is what we need.
  \begingroup
  \def\do#1{\ifinlist{#1}\blx@cites{}{\blx@logreq@active{}}\relax}%
  \dolistloop\blx@lastcites
  % Special case - if we are using sortingtemplate "none" anywhere, then changes
  % in citation order matter and we need to re-run biber. So a special test
  % to see if the cites from last run are identical in order. We have
  % already tested for more or less cites between runs by now, we are
  % testing here for exactly the same cites by treating the cite and
  % lastcite lists as strings and comparing them. This doesn't apply
  % to biblist sortingtemplates as nobody wants to sort biblists with
  % "none", since it makes no sense
  \ifinlist{none}\blx@sortingtemplatenames
    {\ifdefstrequal{\blx@cites}{\blx@lastcites}
      {}
      {\blx@logreq@active{}}}
    {}%
  % Test if we removed any mention of a reference context since last run
  % If we did, we need to re-run biber
  \def\do#1{\ifinlist{#1}\blx@refcontexts{}{\blx@logreq@active{}}\relax}%
  \dolistloop\blx@lastrefcontexts
  % Test if we added any mention of a reference context since last run
  % If we did, we need to re-run biber
  \def\do#1{\ifinlist{#1}\blx@lastrefcontexts{}{\blx@logreq@active{}}\relax}%
  \dolistloop\blx@refcontexts
  % Test if we removed any mention of a biblist since last run.
  % If we did, we need to re-run biber
  \def\do#1{\ifinlist{#1}\blx@biblists{}{\blx@logreq@active{}}\relax}%
  \dolistloop\blx@lastbiblists
  % Test to see if we added any mention of a biblist since last run.
  % If we did, we need to re-run biber
  \def\do#1{\ifinlist{#1}\blx@lastbiblists{}{\blx@logreq@active{}}\relax}%
  \dolistloop\blx@biblists
  % If we have to run biber or latex again and we are using defernumbers,
  % don't write the localnumber information to the .aux file yet as we will
  % potentially have to regenerate sorting order first in biber
  \iftoggle{blx@defernumbers}
    {\iftoggle{blx@runbiber}
      {}
      {\def\do#1{\blx@auxwrite\@mainaux{}{#1}}
       \dolistloop\blx@localnumaux}}
    {}%
  \endgroup}

% {<instcount>}{<entrykey>}{<refsection>}{<refcontext>}{<labelnumber>}
\protected\def\blx@aux@number#1#2#3#4#5{%
  \blx@bbl@addentryfield{\detokenize{#2}}{#3}{localnumber}{#4}{#5}%
  \blx@bbl@addentryfield{\detokenize{#2}}{#3}{labelnumber}{#4}{#5}%
  \global\toggletrue{blx@localnumber}%
  \ifblank{#5}
    {}
    {\csgdef{blx@labelnumber@#3}{#5}}}

% Called as part of bib output for an entry
% Only used when defernumbers=true
\def\blx@addlabelnumber{%
  \begingroup
  \nottoggle{blx@skiplab}
    {\iftoggle{blx@labelnumber}
       {\ifundef\abx@field@shorthand
         % Need to know if we set any localnumber from .aux file, not
         % just current item. Otherwise, we may just write new
         % localnumbers but not existing ones
         % Also, don't want to regenerate localnumber for any key in a
         % refsection which we've already seen because this has the nasty
         % side-effect of incrementing the localnum counter
         {\ifboolexpr { not togl {blx@localnumber}
                        and
                        not test {\ifcsdef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey}} }
            {\iftoggle{blx@omitnumbers}
               {\let\abx@field@localnumber\@empty}
               {\csnumgdef{blx@labelnumber@\the\c@refsection}{%
                  \csuse{blx@labelnumber@\the\c@refsection}+1}%
                \edef\abx@field@localnumber{%
                  \csuse{blx@labelnumber@\the\c@refsection}}%
                \blx@bbl@addentryfield{\abx@field@entrykey}{\the\c@refsection}%
                    {localnumber}{\blx@refcontext@context}{\abx@field@localnumber}}}
            {}%
          % If localnumbers were already in the .aux, add them
          % again from the .aux. This prevents some cycling
          % problems where pagebreaks change after localnumber
          % settles down and then we need another run which then
          % regenerates localnumber requiring another run but then
          % the pagebreaks change back again ... etc.
          \ifcsundef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey}
            {\ifundef\abx@field@localnumber
               {}
                {\listxadd\blx@localnumaux{%
                   \string\abx@aux@number%
                     {\the\c@instcount}%
                     {\abx@field@entrykey}%
                     {\the\c@refsection}%
                     {\blx@refcontext@context}%
                     {\abx@field@localnumber}}%
                   % record that we have already generated and output localnum
                   % for this key in this refsection/refcontext
                   \csgdef{blx@defer@\the\c@refsection @\blx@refcontext@context @\abx@field@entrykey}{}}}
           {}}
         {}}%
       {}}
    {}%
  \endgroup}

% {<datalistname>}
\def\blx@bbl@dlist[#1]#2{%
  \begingroup
  \def\blx@dlist@type{#1}%
  \def\blx@dlist@name{#2}}

\def\blx@bbl@enddlist{%
  \csnumgdef{blx@labelnumber@\the\c@refsection}{0}%
  \endgroup}

\def\blx@addpageref#1{%
  \begingroup
  \blx@tempcnta\z@
  \let\blx@tempa\@empty
  \def\do##1{%
    \appto\blx@tempa{{##1}}%
    \advance\blx@tempcnta\@ne}%
  \dolistcsloop{blx@pref@\the\c@refsection @#1}%
  \edef\blx@tempa{\endgroup\noexpand\blx@bbl@listdef
    {pageref}{\the\blx@tempcnta}{\blx@tempa}}%
  \blx@tempa}

%% Data input
\def\blx@bblinput{%
  \begingroup
  \blx@info@noline{Trying to load bibliographic data..}%
  \blx@blxinit
  \blx@bblfile
  \endgroup}

\def\blx@bblfile{%
  \blx@secinit
  \begingroup
  \blx@bblstart
  \blx@ifsigned{\jobname}{bbl}
    {\InputIfFileExists{\jobname.bbl}
       {\blx@info@noline{... file '\jobname.bbl' found}%
        \global\toggletrue{blx@bbldone}}
       {\blx@info@noline{... file '\jobname.bbl' not found}%
        \typeout{No file \jobname.bbl.}}}
    {}%
  \blx@bblend
  \endgroup
  % global sorting as this is called at BeginDocument
  \csnumgdef{blx@labelnumber@\the\c@refsection}{0}}

%% Bibliography

% {<name>}{<start code>}[<end code>]{<item code>}
\newrobustcmd*{\defbibenvironment}[4]{%
  \long\csdef{blx@env@#1}{#2}%
  \long\csdef{blx@endenv@#1}{#3}%
  \long\csdef{blx@item@#1}{#4}}

\defbibenvironment{bibliography}
  {\list{}{%
     \leftmargin\bibhang
     \itemindent-\leftmargin
     \itemsep\bibitemsep
     \parsep\bibparsep}}
  {\endlist}
  {\item}

\def\do#1{%
  \defbibenvironment{#1}
   {\list{\thefield{#1}}{%
       \labelwidth\csname #1width\endcsname
       \labelsep\biblabelsep
       \leftmargin\labelwidth
       \advance\leftmargin\labelsep
       \itemsep\bibitemsep
       \parsep\bibparsep
       \def\makelabel####1{####1\hss}}}
    {\endlist}
    {\item}}
\abx@dolabelfields

% {<name>}[<default>]{<code>}
\newrobustcmd*{\defbibheading}[1]{%
  \@ifnextchar[%]
    {\blx@defbibheading{blx@head@#1}}
    {\blx@defbibheading{blx@head@#1}[\bibname]}}

\def\blx@defbibheading#1[#2]{%
  \csundef{#1}%
  \expandafter\newcommand\csname#1\endcsname[1][#2]}

% {<name>}{<text>}
\newrobustcmd*{\defbibnote}[1]{%
  \long\csdef{blx@note@#1}}

% {<name>}{<code>}
\newrobustcmd*{\defbibfilter}[2]{%
  \begingroup
  \def\blx@flt@error{\csname blx@flt@errortrue\endcsname}%
  \let\not\blx@flt@not \let\NOT\not
  \let\and\blx@flt@and \let\AND\and
  \let\or\blx@flt@or   \let\OR\or
  \letcs\({blx@flt@(}  \letcs\){blx@flt@)}%
  \def\section##1{\blx@flt@error}%
  \def\segment##1{segment=##1}%
  \def\type##1{type=##1}%
  \def\subtype##1{subtype=##1}%
  \def\keyword##1{keyword={##1}}%
  \def\category##1{category={##1}}%
  \edef\blx@tempa{\noexpand\blx@defbibfilter{#2}}%
  \ifdef\blx@flt@errortrue
    {\blx@err@filter}
    {\let\the\relax
     \let\blx@flt@item\relax
     \edef\blx@tempa{\blx@tempa}%
     \ifdef\blx@flt@errortrue
       {\blx@err@filter}
       {\csxdef{blx@filter@#1}{\blx@tempa}}}%
  \endgroup}

\def\blx@defbibfilter#1{%
  \blx@defbibfilter@i#1 &}
\def\blx@defbibfilter@i#1 #2&{%
  \blx@defbibfilter@ii#1==&%
  \ifblank{#2}{}{\blx@defbibfilter@i#2 &}}
\def\blx@defbibfilter@ii#1=#2=#3&{%
  \ifblank{#2}
    {\ifblank{#1}
       {}
       {\ifcsdef{blx@flt@#1}
          {\csname blx@flt@#1\endcsname}
          {\blx@flt@error}}}
    {\ifcsdef{blx@flt@#1}
       {\csname blx@flt@#1\endcsname{\detokenize{#2}}}
       {\blx@flt@error}}}

\def\blx@flt@and{ and }
\def\blx@flt@or{ or }
\def\blx@flt@not{ not }
\csdef{blx@flt@(}{ ( }
\csdef{blx@flt@)}{ ) }
\def\blx@flt@segment#1{%
  test {\xifinlistcs\blx@flt@item{blx@segm@\the\c@refsection @#1}}}
\def\blx@flt@type#1{%
  test {\xifinlistcs\blx@flt@item{blx@type@\the\c@refsection @#1}}}
\def\blx@flt@subtype#1{%
  test {\xifinlistcs\blx@flt@item{blx@subt@\the\c@refsection @#1}}}
\def\blx@flt@keyword#1{%
  test {\xifinlistcs\blx@flt@item{blx@keyw@\the\c@refsection @#1}}}
\def\blx@flt@category#1{%
  test {\xifinlistcs\blx@flt@item{blx@catg@#1}}}

% {<name>}{<code>}
\newrobustcmd*{\defbibcheck}[2]{%
  \csdef{blx@bibcheck@#1}{%
    \togglefalse{blx@skipentry}%
    \def\skipentry{\toggletrue{blx@skipentry}}%
    #2\undef\skipentry}}

% options
% We need a 2-pass structure for options in \printbibliography and
% \printbiblist because the section has to be set before any
% other options and this partly determines which list to use for later filtering
\define@key{blx@bib1}{segment}{}
\define@key{blx@bib1}{type}{}
\define@key{blx@bib1}{nottype}{}
\define@key{blx@bib1}{subtype}{}
\define@key{blx@bib1}{notsubtype}{}
\define@key{blx@bib1}{keyword}{}
\define@key{blx@bib1}{notkeyword}{}
\define@key{blx@bib1}{category}{}
\define@key{blx@bib1}{notcategory}{}
\define@key{blx@bib1}{filter}{}
\define@key{blx@bib1}{check}{}
\define@key{blx@bib1}{heading}{}
\define@key{blx@bib1}{env}{}
\define@key{blx@bib1}{title}{}
\define@key{blx@bib1}{prenote}{}
\define@key{blx@bib1}{postnote}{}
\define@key{blx@bib1}{omitnumbers}[]{}
% Here we are using the first pass to see if there is an explicit setting for resetnumbers
% If there isn't we will use the default behaviour where if there is a labelprefix,
% resetnumbers will default to "true"
\define@key{blx@bib1}{resetnumbers}[true]{%
  \toggletrue{blx@resetnumsexplicit}}

\define@key{blx@bib2}{section}{}
\define@key{blx@bib2}{sorting}{}

\define@key{blx@biblist1}{segment}{}
\define@key{blx@biblist1}{type}{}
\define@key{blx@biblist1}{nottype}{}
\define@key{blx@biblist1}{subtype}{}
\define@key{blx@biblist1}{notsubtype}{}
\define@key{blx@biblist1}{keyword}{}
\define@key{blx@biblist1}{notkeyword}{}
\define@key{blx@biblist1}{category}{}
\define@key{blx@biblist1}{notcategory}{}
\define@key{blx@biblist1}{filter}{}
\define@key{blx@biblist1}{check}{}
\define@key{blx@biblist1}{heading}{}
\define@key{blx@biblist1}{env}{}
\define@key{blx@biblist1}{title}{}
\define@key{blx@biblist1}{prenote}{}
\define@key{blx@biblist1}{postnote}{}

\define@key{blx@biblist2}{section}{}
\define@key{blx@biblist2}{sorting}{}

\define@key{blx@bib1}{section}{%
  \ifcsundef{blx@sections@#1}
    {\blx@err@nosec{#1}}
    {\c@refsection#1\relax
     \def\blx@tempe{#1}}}

\define@key{blx@biblist1}{section}{%
  \ifcsundef{blx@sections@#1}
    {\blx@err@nosec{#1}}
    {\c@refsection#1\relax
     \def\blx@tempe{#1}}}

\define@key{blx@bbg}{section}{%
  \ifcsundef{blx@sections@#1}
    {\blx@err@nosec{#1}}
    {\c@refsection#1\relax}}

\define@key{blx@bbc}{section}{%
  \ifcsundef{blx@sections@#1}
    {\blx@err@nosec{#1}}
    {\c@refsection#1\relax}}

\define@key{blx@bib2}{segment}{\blx@key@segment{#1}}
\define@key{blx@biblist2}{segment}{\blx@key@segment{#1}}

\def\blx@key@segment#1{%
  \ifcsundef{blx@segm@\the\c@refsection @#1}
    {\blx@warning{Segment '#1' not found in section '\the\c@refsection'}}
    {\c@refsegment#1\relax
     \blx@printbibchecks
     \blx@filter\blx@tempa{blx@segm@\the\c@refsection @#1}}}

\define@key{blx@bib2}{type}{\blx@key@type{#1}}
\define@key{blx@biblist2}{type}{\blx@key@type{#1}}

\def\blx@key@type#1{%
  \ifcsundef{blx@type@\the\c@refsection @#1}
    {\blx@warning{Type '#1' not found}%
     \let\blx@tempa\@empty}
    {\blx@printbibchecks
     \iftoggle{blx@tempb}
       {\togglefalse{blx@tempb}%
        \blx@filter\blx@tempa{blx@type@\the\c@refsection @#1}}
       {\let\blx@tempa\@empty
        \blx@error
          {'type' used multiple times}
          {When passing multiple filter options, each entry\MessageBreak
           must satisfy all conditions (AND conjunction),\MessageBreak
           hence some options may not be used twice.\MessageBreak
           Use 'filter' and '\string\defbibfilter' with OR conjunctions}}}}

\define@key{blx@bib2}{nottype}{\blx@key@nottype{#1}}
\define@key{blx@biblist2}{nottype}{\blx@key@nottype{#1}}

\def\blx@key@nottype#1{%
  \ifcsundef{blx@type@\the\c@refsection @#1}
    {}
    {\blx@printbibchecks
     \blx@notfilter\blx@tempa{blx@type@\the\c@refsection @#1}}}

\define@key{blx@bib2}{subtype}{\blx@key@subtype{#1}}
\define@key{blx@biblist2}{subtype}{\blx@key@subtype{#1}}

\def\blx@key@subtype#1{%
  \ifcsundef{blx@subt@\the\c@refsection @#1}
    {\blx@warning{Subtype '#1' not found}%
     \let\blx@tempa\@empty}
    {\blx@printbibchecks
     \iftoggle{blx@tempb}
       {\togglefalse{blx@tempb}%
        \blx@filter\blx@tempa{blx@subt@\the\c@refsection @#1}}
       {\let\blx@tempa\@empty
        \blx@error
          {'subtype' used multiple times}
          {When passing multiple filter options, each entry\MessageBreak
           must satisfy all conditions (AND conjunction),\MessageBreak
           hence some options may not be used twice.\MessageBreak
           Use 'filter' and '\string\defbibfilter' with OR conjunctions}}}}

\define@key{blx@bib2}{notsubtype}{\blx@key@notsubtype{#1}}
\define@key{blx@biblist2}{notsubtype}{\blx@key@notsubtype{#1}}

\def\blx@key@notsubtype#1{%
  \ifcsundef{blx@subt@\the\c@refsection @#1}
    {}
    {\blx@printbibchecks
     \blx@notfilter\blx@tempa{blx@subt@\the\c@refsection @#1}}}

\define@key{blx@bib2}{keyword}{\blx@key@keyword{#1}}
\define@key{blx@biblist2}{keyword}{\blx@key@keyword{#1}}

\def\blx@key@keyword#1{%
  \ifcsundef{blx@keyw@\the\c@refsection @\detokenize{#1}}
    {\blx@warning{Keyword '\detokenize{#1}' not found}%
     \let\blx@tempa\@empty}
    {\blx@printbibchecks
     \blx@filter\blx@tempa{blx@keyw@\the\c@refsection @\detokenize{#1}}}}

\define@key{blx@bib2}{notkeyword}{\blx@key@notkeyword{#1}}
\define@key{blx@biblist2}{notkeyword}{\blx@key@notkeyword{#1}}

\def\blx@key@notkeyword#1{%
  \ifcsundef{blx@keyw@\the\c@refsection @\detokenize{#1}}
    {}
    {\blx@printbibchecks
     \blx@notfilter\blx@tempa{blx@keyw@\the\c@refsection @\detokenize{#1}}}}

\define@key{blx@bib2}{category}{\blx@key@category{#1}}
\define@key{blx@biblist2}{category}{\blx@key@category{#1}}

\def\blx@key@category#1{%
  \ifcsundef{blx@catg@\detokenize{#1}}
    {\blx@warning{Category '\detokenize{#1}' not found}%
     \let\blx@tempa\@empty}
    {\blx@printbibchecks
     \blx@filter\blx@tempa{blx@catg@\detokenize{#1}}}}

\define@key{blx@bib2}{notcategory}{\blx@key@notcategory{#1}}
\define@key{blx@biblist2}{notcategory}{\blx@key@notcategory{#1}}

\def\blx@key@notcategory#1{%
  \ifcsundef{blx@catg@#1}
    {}
    {\blx@printbibchecks
     \blx@notfilter\blx@tempa{blx@catg@#1}}}

\define@key{blx@bib2}{filter}{\blx@key@filter{#1}}
\define@key{blx@biblist2}{filter}{\blx@key@filter{#1}}

\def\blx@key@filter#1{%
  \ifcsdef{blx@filter@#1}
    {\blx@printbibchecks
     \blx@bibfilter\blx@tempa{blx@filter@#1}}
    {\let\blx@tempa\@empty
     \blx@error
       {Filter '#1' not found}
       {The filter '#1' could not be found.\MessageBreak
        Use \string\defbibfilter\space to define it}}}

\define@key{blx@bib2}{check}{\blx@key@bibcheck{#1}}
\define@key{blx@biblist2}{check}{\blx@key@bibcheck{#1}}

\def\blx@key@bibcheck#1{%
  \ifcsdef{blx@bibcheck@#1}
    {\letcs\blx@bibcheck{blx@bibcheck@#1}}
    {\let\blx@tempa\@empty
     \blx@error
       {Check '#1' not found}
       {The check '#1' could not be found.\MessageBreak
        Use \string\defbibcheck\space to define it}}}

\define@key{blx@bhd}{heading}{\blx@key@heading{#1}}
\define@key{blx@bib2}{heading}{\blx@key@heading{#1}}
\define@key{blx@biblist2}{heading}{\blx@key@heading{#1}}
\define@key{blx@bbs}{heading}{\blx@key@heading{#1}}
\define@key{blx@bbg}{heading}{\blx@key@heading{#1}}

\def\blx@key@heading#1{%
  \ifcsundef{blx@head@#1}
     {\blx@error
        {Heading '#1' not found}
        {The heading '#1' could not be found.\MessageBreak
         Use \string\defbibheading\space to define it}}
     {\def\blx@theheading{#1}}}

\define@key{blx@bib2}{env}{\blx@key@env{#1}}
\define@key{blx@biblist2}{env}{\blx@key@env{#1}}
\define@key{blx@bbs}{env}{\blx@key@env{#1}}
\define@key{blx@bbg}{env}{\blx@key@env{#1}}
\define@key{blx@bbc}{env}{\blx@key@env{#1}}

\def\blx@key@env#1{%
  \ifcsundef{blx@env@#1}
     {\blx@error
        {Environment '#1' not found}
        {The environment '#1' could not be found.\MessageBreak
         Use \string\defbibenvironment\space to define it}}
     {\def\blx@theenv{#1}}}

\define@key{blx@bhd}{title}{\def\blx@thetitle{#1}}
\define@key{blx@bib2}{title}{\def\blx@thetitle{#1}}
\define@key{blx@biblist2}{title}{\def\blx@thetitle{#1}}

\define@key{blx@bib2}{prenote}{\blx@key@prenote{#1}}
\define@key{blx@biblist2}{prenote}{\blx@key@prenote{#1}}
\define@key{blx@bbs}{prenote}{\blx@key@prenote{#1}}
\define@key{blx@bbg}{prenote}{\blx@key@prenote{#1}}
\define@key{blx@bbc}{prenote}{\blx@key@prenote{#1}}
\def\blx@key@prenote#1{%
  \ifcsundef{blx@note@#1}
     {\blx@error
        {Note '#1' not found}
        {The note '#1' could not be found.\MessageBreak
         Use \string\defbibnote\space to define it}}
     {\def\blx@theprenote{#1}}}

\define@key{blx@bib2}{postnote}{\blx@key@postnote{#1}}
\define@key{blx@biblist2}{postnote}{\blx@key@postnote{#1}}
\define@key{blx@bbs}{postnote}{\blx@key@postnote{#1}}
\define@key{blx@bbg}{postnote}{\blx@key@postnote{#1}}
\define@key{blx@bbc}{postnote}{\blx@key@postnote{#1}}

\def\blx@key@postnote#1{%
  \ifcsundef{blx@note@#1}
     {\blx@error
        {Note '#1' not found}
        {The note '#1' could not be found.\MessageBreak
         Use \string\defbibnote\space to define it}}
     {\def\blx@thepostnote{#1}}}

\define@key{blx@bib2}{resetnumbers}[true]{%
  \iftoggle{blx@defernumbers}
    {\ifstrequal{#1}{true}
       {\csnumdef{blx@labelnumber@\the\c@refsection}{0}}
       {\ifstrequal{#1}{false}
         {}
         {\csnumdef{blx@labelnumber@\the\c@refsection}{#1-1}}}}
    {\blx@warning{%
       Option 'resetnumbers' requires 'defernumbers=true'.\MessageBreak
       Ignoring 'resetnumbers=true'}}}

\define@key{blx@bib2}{omitnumbers}[true]{%
  \ifstrequal{#1}{true}
    {\iftoggle{blx@defernumbers}
       {\toggletrue{blx@omitnumbers}}
       {\blx@warning{%
          Option 'omitnumbers' requires 'defernumbers=true'.\MessageBreak
          Ignoring 'omitnumbers=true'}}}
    {}}

% [<options>]
\newrobustcmd*{\printbibheading}{%
  \begingroup
  \edef\on@line{\on@line}%
  \@ifnextchar[%]
    {\blx@printbibheading}
    {\blx@printbibheading[]}}

\def\blx@printbibheading[#1]{%
  \def\blx@theheading{bibliography}%
  \let\blx@thetitle\@empty
  \blx@safe@actives
  \setkeys{blx@bhd}{#1}%
  \blx@rest@actives
  \blx@langstrings
  \blx@bibheading\blx@theheading\blx@thetitle
  \endgroup}

% We use this to determine whether an explicit value for resetnumbers is passed to
% \printbibliography, if not, then we use the default behaviour where a labelprefix forces
% a reset. It is useful that we have a 2-pass structure for \printbibliography keys anyway.
\newtoggle{blx@resetnumsexplicit}

% [<options>]
\newrobustcmd*{\printbibliography}{%
  \begingroup
  \delimcontext{bib}%
  \edef\on@line{\on@line}%
  \@ifnextchar[%]
    {\blx@printbibliography}
    {\blx@printbibliography[]}}

\def\blx@printbibliography[#1]{%
  \toggletrue{blx@tempa}%
  \toggletrue{blx@tempb}%
  \def\blx@theheading{bibliography}%
  \def\blx@theenv{bibliography}%
  \let\blx@theprenote\@empty
  \let\blx@thepostnote\@empty
  \let\blx@thetitle\@empty
  % defaults
  \let\blx@tempa\@empty% before there is a .bbl, this must not be undef
  \edef\blx@tempe{\the\c@refsection}% default refsection is current
  \blx@safe@actives
  \togglefalse{blx@resetnumsexplicit}%
  \setkeys{blx@bib1}{#1}% First pass options keys - section and resetnumbers
  % Is there a user-specified option for resetnumbers? If so, this overrides the default
  % "labelprefix implies resetnumbers" behaviour
  \iftoggle{blx@resetnumsexplicit}
    {}
    {\ifdefempty\blx@refcontext@labelprefix
      {}
      {\setkeys{blx@bib2}{resetnumbers}}}%
  \blx@rest@actives
  \ifcsvoid{blx@dlist@entry@\blx@tempe @\blx@refcontext@context}
    {}
    {\letcs\blx@tempa{blx@dlist@entry@\blx@tempe @\blx@refcontext@context}}%
  \blx@safe@actives
  % Must reset omitnumbers as it's a global macro and if we don't, any
  % \printbibliography following one with this set will inherit any
  % previous "true" value
  \togglefalse{blx@omitnumbers}%
  \setkeys{blx@bib2}{#1}% ... now we have correct \blx@tempa, set rest of options
  \blx@rest@actives
  % Add datalist to list of seen datalists to prevent duplicates
  \xifinlist{\blx@refcontext@context @entry}\blx@dlistnames
    {}
    {\listxadd\blx@dlistnames{\blx@refcontext@context @entry}%
     \csxappto{blx@dlists}{%
       \blx@xml@dlist{\blx@refcontext@context}{entry}{\blx@tempe}{\blx@xml@dlist@refcontext{\blx@refcontext@sortingtemplatename}{\blx@refcontext@sortingnamekeytemplatename}{\blx@refcontext@labelprefix}{\blx@refcontext@uniquenametemplatename}{\blx@refcontext@labelalphanametemplatename}}{}}}%
  \ifdefvoid\blx@tempa
    {\blx@warn@bibempty\endgroup}
    {\blx@bibliography\blx@tempa}}

% [<options>]
\newrobustcmd*{\bibbysection}{%
  \begingroup
  \delimcontext{bib}%
  \ifnum\blx@maxsection=\z@
    \blx@warning{No reference sections found}%
  \fi
  \edef\on@line{\on@line}%
  \@ifnextchar[%]
    {\blx@bibbysection}
    {\blx@bibbysection[]}}

\def\blx@bibbysection[#1]{%
  \def\blx@theheading{bibliography}%
  \def\blx@theenv{bibliography}%
  \let\blx@theprenote\@empty
  \let\blx@thepostnote\@empty
  \let\blx@thetitle\@empty
  \c@refsection\z@
  \blx@safe@actives
  \setkeys{blx@bbs}{#1}%
  \blx@rest@actives
  \togglefalse{blx@tempa}%
  \blx@refsections}

\def\blx@refsections{%
  \ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}
    {}
    {\toggletrue{blx@tempa}%
     \begingroup
     \expandafter\blx@bibliography\csname blx@dlist@entry@\the\c@refsection @\blx@refcontext@context\endcsname}%
  \ifnum\c@refsection<\blx@maxsection
    \advance\c@refsection\@ne
    \expandafter\blx@refsections
  \else
    \iftoggle{blx@tempa}{}{\blx@warn@bibempty}%
    \endgroup
  \fi}

% [<options>]
\newrobustcmd*{\bibbysegment}{%
  \begingroup
  \delimcontext{bib}%
  \edef\on@line{\on@line}%
  \ifnum\csname blx@maxsegment@\the\c@refsection\endcsname=\z@
    \blx@warning{No reference segments found}%
  \fi
  \@ifnextchar[%]
    {\blx@bibbysegment}
    {\blx@bibbysegment[]}}

\def\blx@bibbysegment[#1]{%
  \def\blx@theheading{bibliography}%
  \def\blx@theenv{bibliography}%
  \let\blx@theprenote\@empty
  \let\blx@thepostnote\@empty
  \let\blx@thetitle\@empty
  \c@refsegment\@ne
  \blx@safe@actives
  \setkeys{blx@bbg}{#1}%
  \blx@rest@actives
  \togglefalse{blx@tempa}%
  \blx@refsegments}

\def\blx@refsegments{%
  \ifcsvoid{blx@segm@\the\c@refsection @\the\c@refsegment}
    {}
    {\toggletrue{blx@tempa}%
     \begingroup
     \let\blx@tempa\@empty
     \ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}
       {}
       {\letcs\blx@tempa{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}}%
     \blx@filter\blx@tempa{blx@segm@\the\c@refsection @\the\c@refsegment}%
     \blx@bibliography\blx@tempa}%
  \ifnum\c@refsegment<\csname blx@maxsegment@\the\c@refsection\endcsname
    \advance\c@refsegment\@ne
    \expandafter\blx@refsegments
  \else
    \iftoggle{blx@tempa}{}{\blx@warn@bibempty}%
    \endgroup
  \fi}

% [<options>]
\newrobustcmd*{\bibbycategory}{%
  \begingroup
  \delimcontext{bib}%
  \edef\on@line{\on@line}%
  \ifx\blx@categories\@empty
    \blx@warning{No categories found}%
  \fi
  \@ifnextchar[%]
    {\blx@bibbycategory}
    {\blx@bibbycategory[]}}

\def\blx@bibbycategory[#1]{%
  \def\blx@theheading{bibliography}%
  \def\blx@theenv{bibliography}%
  \let\blx@theprenote\@empty
  \let\blx@thepostnote\@empty
  \let\blx@thetitle\@empty
  \c@refsection\z@
  \blx@safe@actives
  \setkeys{blx@bbc}{#1}%
  \blx@rest@actives
  \togglefalse{blx@tempa}%
  \forlistloop\blx@bibcategory\blx@categories
  \blx@endbibcategory}

\def\blx@bibcategory#1{%
  \ifcsvoid{blx@catg@#1}
    {}
    {\toggletrue{blx@tempa}%
     \begingroup
     \blx@key@heading{#1}%
     \let\blx@tempa\@empty
     \ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}
       {}
       {\letcs\blx@tempa{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}}%
     \blx@filter\blx@tempa{blx@catg@#1}%
     \blx@bibliography\blx@tempa}}%

\def\blx@endbibcategory{%
  \iftoggle{blx@tempa}{}{\blx@warn@bibempty}%
  \endgroup}

% {<entrykey>,...}
\def\blx@bibliography{%
  \blx@langstrings
  \blx@bibheading\blx@theheading\blx@thetitle
  \blx@bibnote\blx@theprenote
  \begingroup
  \blx@bibinit
  \let\@noitemerr\@empty
  \let\blx@noitem\blx@warn@bibempty
  \ifnum\bibinitsep=\z@
    \let\blx@initsep\relax
  \fi
  \ifnum\bibnamesep=\z@
    \let\blx@namesep\relax
  \fi
  \csuse{blx@env@\blx@theenv}%
  \csuse{blx@hook@bibinit}%
  \csuse{blx@hook@bibinit@next}%
  \let\blx@do\blx@bibitem
  \let\blx@done\blx@endbibliography
  \blx@listloop}

\def\blx@endbibliography{%
  \csuse{blx@endenv@\blx@theenv}%
  \blx@noitem
  \endgroup
  \blx@bibnote\blx@thepostnote
  \endgroup}

\def\blx@bibheading#1#2{%
  \begingroup
  \edef\blx@tempa{\endgroup
    \noexpand\blx@bibheading@i{\expandonce#1}{\expandonce#2}}%
  \blx@tempa}

\def\blx@bibheading@i#1#2{%
  \let\newrefsection\relax
  \let\newrefsegment\relax
  \ifblank{#2}
    {\csuse{blx@head@#1}}
    {\csuse{blx@head@#1}[#2]}%
  \let\newrefsection\blx@newrefsection
  \let\newrefsegment\blx@newrefsegment}

\def\blx@bibnote#1{%
  \ifdefempty#1
    {}
    {\begingroup
     \let\newrefsection\relax
     \let\newrefsegment\relax
     \noindent
     \csuse{blx@note@#1}\par\nobreak
     \endgroup}}

\def\blx@bibinit{%
  \iftoggle{blx@citation}
    {}
    {\toggletrue{blx@bibliography}}%
  \blx@blxinit
  \blx@resetdata
  \csuse{blx@hook@bbxinit}%
  \bibsetup\bibfont
  \blx@setsfcodes
  \csuse{blx@bibsetup}}

% {<entrykey>}
% output a bib item, this is why \blx@thelabelnumber is here so that
% labelnumber is deferred if defernumbers=true
\def\blx@bibitem#1{%
  \blx@ifdata{#1}
    {\begingroup
     \blx@getdata{#1}%
     \blx@bibcheck
     \iftoggle{blx@skipentry}{}{%
       \blx@setdefaultrefcontext{#1}%
       \global\let\blx@noitem\@empty
       \blx@setoptions@type\abx@field@entrytype
       \blx@setoptions@entry
       \blx@thelabelnumber
       \addtocounter{instcount}\@ne
       \csuse{blx@item@\blx@theenv}\relax
       \blx@initsep
       \blx@namesep
       \csuse{blx@hook@bibitem}%
       \blx@execute
       \blx@initunit
       \blx@anchor
       \blx@beglangbib
       \bibsentence
       \blx@pagetracker
       \blx@driver\abx@field@entrytype
       \blx@postpunct
       \blx@endlangbib}%
     \endgroup}
    {}}

\let\blx@bibcheck\relax

% This sets and saves to the .aux the default refcontext for an entry. The
% default refcontext for an entry is the refcontext of the last
% bibliography in the refsection in which it is actually printed. This
% allows citations to default to selecting data from the correct
% bibliography list in standard cases where entries are not listed in
% multiple bibliographies
\def\blx@setdefaultrefcontext#1{%
  \ifbool{refcontextdefaults}
    {\blx@rerun@latex}%
    {}%
  \ifinlistcs{#1}{blx@defaultrefcontexts@\the\c@refsection}
    {}
    {\listcsgadd{blx@defaultrefcontexts@\the\c@refsection}{#1}}%
  \csxdef{blx@assignedrefcontextbib@\the\c@refsection @#1}{\blx@refcontext@context}}
% <refsection><key><refcontext>
\def\abx@aux@defaultrefcontext#1#2#3{%
  \global\boolfalse{refcontextdefaults}%
  \csxdef{blx@assignedrefcontextbib@#1@#2}{#3}}
\def\abx@aux@refcontextdefaultsdone{%
  \global\boolfalse{refcontextdefaults}}

\AtEndDocument{%
  % write the .aux to say we don't need to re-run to consume refcontext defaults
  \ifbool{refcontextdefaults}
    {}
    {\blx@auxwrite\@mainaux{}{\string\abx@aux@refcontextdefaultsdone}}%
  % always add default refcontext declarations to .aux after biber run
  \iftoggle{blx@bbldone}
    {\def\do#1{%
       \begingroup
       \def\do##1{%
         \blx@auxwrite\@mainaux{}{\string\abx@aux@defaultrefcontext{#1}{##1}{\csuse{blx@assignedrefcontextbib@#1@##1}}}}%
       \dolistcsloop{blx@defaultrefcontexts@#1}%
       \endgroup}
     \dolistloop\blx@allrefsections}
    {}}

\def\blx@initsep{%
  \blx@imc@iffieldundef{sortinithash}
    {}
    {\ifnum\c@instcount>\@ne
       \blx@imc@iffieldequals{sortinithash}\blx@previnithash
         {}
         {\addvspace{\bibinitsep}}%
     \fi
     \global\let\blx@previnithash\abx@field@sortinithash}}

\def\blx@namesep{%
  \ifnum\c@instcount>\@ne
    \blx@imc@iffieldequals{fullhash}\blx@prevhash
      {}
      {\addvspace{\bibnamesep}}%
  \fi
  \global\let\blx@prevhash\abx@field@fullhash}

\newrobustcmd*{\AtBeginBibliography}{\gappto\blx@hook@bibinit}
\newrobustcmd*{\AtEveryBibitem}{\gappto\blx@hook@bibitem}
\@onlypreamble\AtBeginBibliography
\@onlypreamble\AtEveryBibitem

\def\blx@imc@UseBibitemHook{\csuse{blx@hook@bibitem}}

\blx@regimcs{\UseBibitemHook}

\newrobustcmd*{\AtNextBibliography}{%
  \ifundef\blx@hook@bibinit@next
    {\gdef\blx@hook@bibinit@next{\global\undef\blx@hook@bibinit@next}}
    {}%
  \gappto\blx@hook@bibinit@next}

% page tracker
\def\blx@pagetracker@context{%
  \blx@leavevmode
  \ifbool{@filesw}
    {\ifbool{pagetracker}
       {\protected@write\@mainaux{}{%
          \iftoggle{blx@footnote}
            {\string\abx@aux@fnpage}
            {\string\abx@aux@page}%
          {\the\c@instcount}{\noexpand\the\c@page}}}
       {}}
    {}}

% {<instcount>}{<page>}
\protected\def\blx@aux@page#1#2{%
  \csgdef{blx@page@#1}{#2}%
  \blx@addpagesum{#1}{#2}}
\protected\def\blx@aux@spread#1#2{%
  \ifodd#2\relax
    \csxdef{blx@page@#1}{\number\numexpr#2-1}%
  \else
    \csgdef{blx@page@#1}{#2}%
  \fi
  \blx@addpagesum{#1}{#2}}

\protected\def\blx@aux@fnpage#1#2{%
  \csgdef{blx@fnpage@#1}{#2}%
  \blx@addpagesum{#1}{#2}}
\protected\def\blx@aux@fnspread#1#2{%
  \ifodd#2\relax
    \csxdef{blx@fnpage@#1}{\number\numexpr#2-1}%
  \else
    \csgdef{blx@fnpage@#1}{#2}%
  \fi
  \blx@addpagesum{#1}{#2}}

\AtEndDocument{%
  \def\abx@aux@page#1#2{\blx@addpagesum{#1}{#2}}%
  \def\abx@aux@fnpage#1#2{\blx@addpagesum{#1}{#2}}}

% hyperref interface
\appto\blx@mkhyperref{%
  \let\blx@anchors\@empty
  \ifundef\hyper@natanchorstart
    {\protected\def\blx@anchor{%
       \xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors}
         {}
         {\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}%
          \hypertarget{cite.\the\c@refsection @\abx@field@entrykey}{}}}}
    {\protected\def\blx@anchor{%
       \xifinlist{\the\c@refsection @\abx@field@entrykey}{\blx@anchors}
         {}
         {\listxadd\blx@anchors{\the\c@refsection @\abx@field@entrykey}%
          \hyper@natanchorstart{\the\c@refsection @\abx@field@entrykey}%
          \hyper@natanchorend}}}}

\appto\blx@mknohyperref{\let\blx@anchor\relax}

% Custom bibliography list
% [<otions>]{biblistname}
\newrobustcmd*{\printbiblist}[2][]{%
  \begingroup
  \delimcontext{biblist}%
  \edef\on@line{\on@line}%
  \toggletrue{blx@tempa}%
  \toggletrue{blx@tempb}%
  \def\blx@theheading{biblist}% default to biblist heading
  \def\blx@theenv{#2}% default to list name
  \def\blx@thebiblist{#2}%
  \let\blx@theprenote\@empty
  \let\blx@thepostnote\@empty
  \let\blx@thetitle\@empty
  % defaults
  \let\blx@tempa\@empty% before there is a .bbl, this must not be undef
  % default sorting template and template name for list is same name as list
  % name, then current context if not found
  \edef\blx@tempc{%
    \ifcsdef{blx@sortingtemplate@#2}
      {#2}
      {\blx@refcontext@sortingtemplatename}}%
  % locally define this since we want to fetch data from the datalist named
  % after the list we are printing rather than the data in refcontext list
  \edef\blx@refcontext@context{\blx@tempc/\blx@refcontext@sortingnamekeytemplatename/\blx@refcontext@labelprefix/\blx@refcontext@uniquenametemplatename/\blx@refcontext@labelalphanametemplatename}%
  \xifinlist\blx@tempc\blx@sortingtemplatenames
    {}
    {\listxadd\blx@sortingtemplatenames\blx@tempc}%
  \let\blx@printbibchecks\relax
  \edef\blx@tempe{\the\c@refsection}% default refsection is current
  \blx@safe@actives
  \blx@printbibchecks
  % Add the sortingtemplate to the list of sortingtemplates for this biblist
  % so we can compare on next run
  \xifinlist\blx@tempc\blx@biblists
    {}
    {\listxadd\blx@biblists\blx@tempc
     \blx@auxwrite\@mainaux{}{\string\abx@aux@biblist{\blx@tempc}}}%
  \setkeys{blx@biblist1}{#1}% Set section only, if present ...
  \blx@rest@actives
  \ifcsvoid{blx@dlist@list@\blx@tempe @\blx@refcontext@context}
    {}
    {\letcs\blx@tempa{blx@dlist@list@\blx@tempe @\blx@refcontext@context}}%
  \blx@safe@actives
  \setkeys{blx@biblist2}{#1}% ... now we have correct \blx@tempa, set rest of options
  \ifundef\blx@bibcheck
    {\ifcsdef{blx@bibcheck@#2}
      {\letcs\blx@bibcheck{blx@bibcheck@#2}}
      {}}
    {}%
  \blx@rest@actives
  % Add datalist to list of seen datalists to prevent duplicates
  \xifinlist{\blx@refcontext@context @list}\blx@dlistnames
    {}
    {\listxadd\blx@dlistnames{\blx@refcontext@context @list}%
     \csxappto{blx@dlists}{%
       \blx@xml@dlist{\blx@refcontext@context}{list}{\blx@tempe}{\blx@xml@dlist@refcontext{\blx@tempc}{\blx@refcontext@sortingnamekeytemplatename}{\blx@refcontext@labelprefix}{\blx@refcontext@uniquenametemplatename}{\blx@refcontext@labelalphanametemplatename}}{\csuse{blx@biblistfilters@#2}}}}%
  \ifdefvoid\blx@tempa
    {\blx@warn@biblistempty{#2}\endgroup}
    {\blx@biblist\blx@tempa}}

\def\blx@printbibchecks{%
  \togglefalse{blx@tempa}%
  \iftoggle{blx@defernumbers}
    {\global\let\blx@printbibchecks\relax}
    {\iftoggle{blx@labelnumber}
       {}
       {\global\let\blx@printbibchecks\relax}}}

% {<entrykey>,...}
\def\blx@biblist{%
  \if@twocolumn
    \@restonecoltrue\onecolumn
  \else
    \@restonecolfalse
  \fi
  \blx@langstrings
  \blx@bibheading\blx@theheading\blx@thetitle
  \blx@bibnote\blx@theprenote
  \begingroup
  \blx@bibinit
  \let\@noitemerr\@empty
  \def\blx@noitem{\blx@warn@biblistempty{\blx@thebiblist}}%
  \csuse{blx@env@\blx@theenv}%
  \csuse{blx@hook@biblistinit@\blx@thebiblist}%
  \let\blx@do\blx@biblistitem
  \let\blx@done\blx@endbiblist
  \blx@listloop}

\def\blx@endbiblist{%
  \csuse{blx@endenv@\blx@theenv}%
  \blx@noitem
  \endgroup
  \blx@bibnote\blx@thepostnote
  \endgroup
  \if@restonecol\twocolumn\fi}

% {<biblistname>}
\newrobustcmd*{\AtBeginBiblist}[1]{\csgappto{blx@hook@biblistinit@#1}}
\newrobustcmd*{\AtEveryBiblistitem}[1]{\csgappto{blx@hook@biblistitem@#1}}
\@onlypreamble\AtBeginBiblist
\@onlypreamble\AtEveryBiblistitem

% {<entrykey>}
\def\blx@biblistitem#1{%
  \blx@ifdata{#1}
    {\begingroup
     \blx@getdata{#1}%
     \blx@bibcheck
     \iftoggle{blx@skipentry}{}{%
       \blx@setdefaultrefcontext{#1}%
       \global\let\blx@noitem\@empty
       \blx@setoptions@type\abx@field@entrytype
       \blx@setoptions@entry
       \addtocounter{instcount}\@ne
       \csuse{blx@item@\blx@theenv}\relax
       \csuse{blx@hook@biblistitem@\blx@thebiblist}%
       \blx@execute
       \blx@initunit
       \blx@beglangbib
       \bibsentence
       \blx@pagetracker
       \blx@driver{\blx@thebiblist}%
       \blx@postpunct
       \blx@endlangbib}%
     \endgroup}
    {}}

% Just a default in case .bbx doesn't define it. standard.bbx defines
% it to print a complete entry, like the bibliography.
\DeclareBibliographyDriver{shorthand}{%
  \iffieldundef{shorttitle}
    {\printfield{title}}
    {\printfield{shorttitle}}}

% Reference contexts
\newcommand*{\DeclareRefcontext}[2]{%
  \csgdef{blx@refcontext@name@#1}{#2}}
\@onlypreamble\DeclareRefcontext

\def\newrefcontext{%
  \endrefcontext
  \refcontext}

% Backwards compat for older \refcontext[] format
\def\refcontext{%
  \@ifnextchar[%]
    {\refcontext@i}
    {\refcontext@i[]}}

\def\refcontext@i[#1]{%
  \@ifnextchar\bgroup
    {\refcontext@ii[#1]}
    {\refcontext@ii[#1]{}}}

\newcommand*{\refcontext@ii}[2][]{%
  \iftoggle{blx@refcontext}
    {\blx@err@nestenv{refcontext}%
     \endrefcontext}
    {\toggletrue{blx@refcontext}%
     % Set refcontext from named refcontext, if given
     \ifblank{#2}
       {}
       {\edef\z{\noexpand\setkeys{blx@refcontext}{\csuse{blx@refcontext@name@#2}}}\z}%
     % Override with explicit refcontext keyvals, if given
     \setkeys{blx@refcontext}{#1}%
     % Add the sortingtemplate to the list of sortingtemplates so we can track
     % special cases like sorting=none which need cite order change detection
     \xifinlist\blx@refcontext@sortingtemplatename\blx@sortingtemplatenames
       {}
       {\listxadd\blx@sortingtemplatenames\blx@refcontext@sortingtemplatename}%
     \xdef\blx@refcontext@context{\blx@refcontext@sortingtemplatename/\blx@refcontext@sortingnamekeytemplatename/\blx@refcontext@labelprefix/\blx@refcontext@uniquenametemplatename/\blx@refcontext@labelalphanametemplatename}%
     % Add the refcontext to the list of refcontexts so we can compare on next run
     \xifinlist\blx@refcontext@context\blx@refcontexts
       {}
       {\listxadd\blx@refcontexts\blx@refcontext@context
        \blx@auxwrite\@mainaux{}{\string\abx@aux@refcontext{\blx@refcontext@context}}}%
     \ifcsundef{blx@sortingtemplate@\blx@refcontext@sortingtemplatename}
       {\blx@err@invopt{sorting=\blx@refcontext@sortingtemplatename}{}}
       {}%
     \ifcsundef{blx@sortingnamekeytemplate@\blx@refcontext@sortingnamekeytemplatename}
       {\blx@err@invopt{sortingnamekeytemplate=\blx@refcontext@sortingnamekeytemplatename}{}}
       {}%
     \ifcsundef{blx@uniquenametemplate@\blx@refcontext@uniquenametemplatename}
       {\blx@err@invopt{uniquenametemplate=\blx@refcontext@uniquenametemplatename}{}}
       {}%
     \ifcsundef{blx@labelalphanametemplate@\blx@refcontext@labelalphanametemplatename}
       {\blx@err@invopt{labelalphanametemplate=\blx@refcontext@labelalphanametemplatename}{}}
       {}}}

% Reset to global sorting etc. when we leave a ref context (since they can't be nested)
\protected\def\endrefcontext{%
  \togglefalse{blx@refcontext}%
  \global\let\blx@refcontext@labelprefix\@empty
  \xdef\blx@refcontext@sortingtemplatename{\blx@sorting}%
  \gdef\blx@refcontext@sortingnamekeytemplatename{global}%
  \gdef\blx@refcontext@uniquenametemplatename{global}%
  \gdef\blx@refcontext@labelalphanametemplatename{global}%
  \xdef\blx@refcontext@context{\blx@refcontext@sortingtemplatename/\blx@refcontext@sortingnamekeytemplatename//\blx@refcontext@uniquenametemplatename/\blx@refcontext@labelalphanametemplatename}}

% Meta option to set all name template options
\define@key{blx@refcontext}{nametemplates}{%
  \gdef\blx@refcontext@sortingnamekeytemplatename{#1}%
  \gdef\blx@refcontext@uniquenametemplatename{#1}%
  \gdef\blx@refcontext@labelalphanametemplatename{#1}}

\define@key{blx@refcontext}{sorting}{\gdef\blx@refcontext@sortingtemplatename{#1}}
\define@key{blx@refcontext}{sortingnamekeytemplatename}{\gdef\blx@refcontext@sortingnamekeytemplatename{#1}}
\define@key{blx@refcontext}{uniquenametemplatename}{\gdef\blx@refcontext@uniquenametemplatename{#1}}
\define@key{blx@refcontext}{labelalphanametemplatename}{\gdef\blx@refcontext@labelalphanametemplatename{#1}}
\define@key{blx@refcontext}{labelprefix}{%
  \gdef\blx@refcontext@labelprefix{#1}%
  \iftoggle{blx@defernumbers}
    {}%
    {\iftoggle{blx@labelnumber}
       {\blx@warning{%
          Option 'labelprefix' requires global\MessageBreak
          'defernumbers=true'}}
       {}}}

% [refcontext keys]{<keyword1>,<keyword2>,...}
\newcommand*{\assignrefcontextkeyws}{%
  \@ifstar
    {\blx@assignrefcontextkeyws[*]}
    {\blx@assignrefcontextkeyws[]}}

\def\blx@assignrefcontextkeyws[#1][#2]#3{%
  \edef\blx@tempa{\blx@sorting}%
  \def\blx@tempb{global}%
  \let\blx@tempc\@empty%
  \def\blx@tempd{global}%
  \def\blx@tempe{global}%
  \setkeys{blx@assignrefcontext}{#2}%
  \def\do##1{%
    \listxadd\blx@assignedrefcontextkeywlist{##1}%
    \csxdef{blx@assignedrefcontextkeyws#1@\the\c@refsection @##1}{\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}
  \docsvlist{#3}}

% [refcontext keys]{<category1>,<category2>,...}
\newcommand*{\assignrefcontextcats}{%
  \@ifstar
    {\blx@assignrefcontextcats[*]}
    {\blx@assignrefcontextcats[]}}

\def\blx@assignrefcontextcats[#1][#2]#3{%
  \edef\blx@tempa{\blx@sorting}%
  \def\blx@tempb{global}%
  \let\blx@tempc\@empty%
  \def\blx@tempd{global}%
  \def\blx@tempe{global}%
  \setkeys{blx@assignrefcontext}{#2}%
  \def\do##1{%
    \listxadd\blx@assignedrefcontextcatlist{##1}%
    \csxdef{blx@assignedrefcontextcats#1@\the\c@refsection @##1}{\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}
  \docsvlist{#3}}

% [refcontext keys]{<entrykey1>,<entrykey2>,...}
\newcommand*{\assignrefcontextentries}{%
  \@ifstar
    {\blx@assignrefcontextentries[*]}
    {\blx@assignrefcontextentries[]}}

\def\blx@assignrefcontextentries[#1][#2]#3{%
  \edef\blx@tempa{\blx@sorting}%
  \def\blx@tempb{global}%
  \let\blx@tempc\@empty%
  \def\blx@tempd{global}%
  \def\blx@tempe{global}%
  \setkeys{blx@assignrefcontext}{#2}%
  \def\do##1{%
    \csxdef{blx@assignedrefcontextkeys#1@\the\c@refsection @##1}{\blx@tempa/\blx@tempb/\blx@tempc/\blx@tempd/\blx@tempe}}%
  \docsvlist{#3}}

% Meta option to set all name template options
\define@key{blx@assignrefcontext}{nametemplates}{%
  \def\blx@tempb{#1}%
  \def\blx@tempd{#1}%
  \def\blx@tempe{#1}}

\define@key{blx@assignrefcontext}{sorting}{\def\blx@tempa{#1}}
\define@key{blx@assignrefcontext}{sortingnamekeytemplatename}{\def\blx@tempb{#1}}
\define@key{blx@assignrefcontext}{labelprefix}{\def\blx@tempc{#1}}
\define@key{blx@assignrefcontext}{uniquenametemplatename}{\def\blx@tempd{#1}}
\define@key{blx@assignrefcontext}{labelalphanametemplatename}{\def\blx@tempe{#1}}

% Reference sections
\newrobustcmd*{\newrefsection}{%
  \ifnum\c@refsection>\z@
    \endrefsection
  \fi
  \refsection}
\let\blx@newrefsection\newrefsection

\newrobustcmd*{\refsection}{%
  \begingroup
  \edef\on@line{\on@line}%
  \ifnum\c@refsection>\z@
    \blx@err@nestenv{refsection}%
    \blx@endrefsection
  \fi
  \ifnum\c@refsegment>\z@
    \blx@err@nestenv{refsection}%
    \blx@endrefsegment
  \fi
  \@ifnextchar[%]
    {\blx@refsection}
    {\blx@refsection[]}}

\def\blx@refsection{%
  \begingroup
  \blx@hook@fileverb
  \blx@refsection@i}

\def\blx@refsection@i[#1]{%
  \endgroup
  \global\advance\blx@maxsection\@ne
  \global\c@refsection\blx@maxsection
  \xifinlist{\the\c@refsection}\blx@allrefsections
    {}
    {\listxadd\blx@allrefsections{\the\c@refsection}}%
  \ifcsdef{blx@defaultrefcontexts@\the\c@refsection}
    {}
    {\global\cslet{blx@defaultrefcontexts@\the\c@refsection}\@empty}%
  \expandafter\newcount\csname blx@maxsegment@\the\c@refsection\endcsname
  \expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname
  \blx@inf@refsec
  \blx@secinit
  \if@filesw
    \blx@auxwrite\@mainaux{}{%
      \string\abx@aux@refsection{\the\c@refsection}{\the\c@page}}%
    \ifblank{#1}
      {}
      {\let\blx@bibfiles\@empty
       % globals should be first as it might contain macros needed for others
       \forlistloop{\listadd\blx@bibfiles}\blx@bibfiles@global}%
       \blx@xsanitizeafter{\forcsvlist\blx@refsection@addfile}{#1}%
    \blx@refsection@ii
  \fi
  \blx@info{Setting label 'refsection:\the\c@refsection'}%
  \label{refsection:\the\c@refsection}%
  \endgroup}

\def\blx@refsection@addfile#1{%
  \ifcsdef{blx@res@labl@#1}
    {\blx@refsection@addfile@i{\csuse{blx@res@labl@#1}}}
    {\blx@refsection@addfile@i{#1}}}

\def\blx@refsection@addfile@i#1{%
  \ifcsdef{blx@res@loca@#1}
    {\listeadd\blx@bibfiles{#1}}
    {\listeadd\blx@bibfiles{\blx@stripbib{#1}\detokenize{.bib}}}}

\def\blx@refsection@ii{%
  \blx@regbibfiles\jobname\blx@bibfiles
  \begingroup
  \let\blx@tempa\@empty
  \blx@bibdata\blx@tempa\blx@bibfiles
  \blx@auxwrite\blx@bcfout
    {\let\do\blx@datasource}
    {\blx@xml@endsection\blx@nl
     \blx@xml@comment{SECTION \the\c@refsection}%
     \blx@xml@bibdata{\the\c@refsection}{\blx@tempa}%
     \blx@xml@section{\the\c@refsection}}%
  \endgroup}

\protected\def\endrefsection{%
  \blx@endrefsection
  \blx@inf@refsec}

\def\blx@endrefsection{%
  \blx@endrefsegment
  % make sure we always output aliases to the .bcf otherwise after their
  % first resolution by biber, they will be invisible to subsequent biber
  % runs since biblatex will resolve the \keyalias{} macro to the main
  % entry key, biber won't put \keyalias{}in the .bbl on subsequent runs
  % and biblatex will report a missing citekey
  \def\do##1{%
    % Make sure this counter exists. Sometimes it might not when using, e.g:
    % refsection=chapter and \includeonly to put in the chapters or when
    % inserting citations into table of contents
    \ifcsname blx@sectionciteorder@\the\c@refsection\endcsname\else
      \expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname
    \fi
    \global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
    \blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{##1}{\expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname}}}%
  \dolistcsloop{blx@keyaliases@\the\c@refsection}%
  \ifnum\c@refsection>\z@
    \blx@auxwrite\blx@bcfout{}{%
      \blx@xml@endsection\blx@nl
      \blx@xml@comment{SECTION 0 (cont.)}%
      \blx@xml@section{0}}%
  \fi
  \global\c@refsection\z@}

\AtEndDocument{%
  \endrefcontext
  \blx@endrefsection
  \def\abx@aux@refsection#1#2{\blx@addchecksum{#1}{#2}}}

\protected\def\abx@aux@refsection#1#2{%
  \ifnum#1>\blx@maxsection
    \global\blx@maxsection#1\relax
  \fi
  \blx@addchecksum{#1}{#2}}

% Reference segments
\newrobustcmd*{\newrefsegment}{%
  \ifnum\c@refsegment>\z@
    \blx@endrefsegment
  \fi
  \refsegment}
\let\blx@newrefsegment\newrefsegment

\newrobustcmd*{\refsegment}{%
  \ifnum\c@refsegment>\z@
    \blx@err@nestenv{refsegment}%
    \blx@endrefsegment
  \fi
  \global\advance\csname blx@maxsegment@\the\c@refsection\endcsname\@ne
  \global\c@refsegment\csname blx@maxsegment@\the\c@refsection\endcsname
  \blx@inf@refseg
  \blx@info{Setting label 'refsegment:\the\c@refsection\the\c@refsegment'}%
  \label{refsegment:\the\c@refsection\the\c@refsegment}%
  \ifcsundef{blx@segm@\the\c@refsection @\the\c@refsegment}
    {\global\cslet{blx@segm@\the\c@refsection @\the\c@refsegment}\@empty}
    {}}

\protected\def\endrefsegment{%
  \blx@endrefsegment
  \blx@inf@refseg}

\def\blx@endrefsegment{%
  \global\c@refsegment\z@}

% Reference section/segment auto-reset
% we are prepending to the commands so that the resets happen before
% the part title is typeset otherwise \cites in there could be "ibid"
% which makes no sense
\def\blx@refpatch@part#1{%
    \ifundef\part
      {\blx@err@nodocdiv{part}}
      {\toggletrue{blx@tempa}%
       \def\do##1{%
         \pretocmd##1{#1}
           {\togglefalse{blx@tempa}\listbreak}
           {}}%
       \docsvlist{%
         \H@old@part,%    hyperref
         \NR@part,%       nameref
         \@part}%         latex/koma-script/memoir
       \iftoggle{blx@tempa}
         {\blx@err@patch{\string\@part}}
         {}%
       \let\do\noexpand}}

\def\blx@refpatch@chapter#1{%
  \ifundef\chapter
    {\blx@err@nodocdiv{chapter}}
    {\pretocmd\@makechapterhead{#1}
       {}
       {\blx@err@patch{\string\@makechapterhead}}
     \pretocmd\@makeschapterhead{#1}
       {}
       {\blx@err@patch{\string\@makeschapterhead}}}}

\def\blx@refpatch@sect#1{%
  \ifcsundef{#1}
    {\blx@err@nodocdiv{#1}\@gobbletwo}
    {\blx@refpatch@sect@i}}

\edef\blx@refpatch@sect@i#1#2{%
  \def\noexpand\do##1{%
     \pretocmd##1%
       {\noexpand\blx@refpatch@sect@ii{#1}{#2}{\string#2}}
      {\togglefalse{blx@tempa}\noexpand\listbreak}
      {}}%
  \noexpand\blx@refpatch@sect@iii}

\def\blx@refpatch@sect@ii#1#2#3{%
  \ifnumequal{#2}{#3}{#1}{}}

\def\blx@refpatch@sect@iii{%
  \toggletrue{blx@tempa}%
  \docsvlist{%       order does matter:
    \H@old@sectm@m,% memoir+hyperref (what a mess...)
    \M@sect,%        memoir
    \H@old@sect,%    hyperref
    \NR@sect,%       nameref
    \scr@sect,%      koma-script 3.x
    \@startsection}%         latex
  \iftoggle{blx@tempa}
    {\blx@err@patch{\string\@sect}}
    {}%
  \let\do\noexpand}

% Bibliography categories

\let\blx@categories\@empty

% {<category>}
\newrobustcmd*{\DeclareBibliographyCategory}[1]{%
  \ifcsundef{blx@catg@#1}
    {\global\cslet{blx@catg@#1}\@empty
     \listgadd\blx@categories{#1}}
    {\blx@error
       {Category '#1' already declared}
       {The bibliography category '#1'\MessageBreak
        has already been declared}}}
\@onlypreamble\DeclareBibliographyCategory

% {<category>}{<entrykey>,...}
\newrobustcmd*{\addtocategory}[2]{%
  \ifcsundef{blx@catg@#1}
    {\blx@error
       {Category '#1' not declared}
       {Use \string\DeclareBibliographyCategory\space to declare}}
    {\AfterPreamble{%
       \blx@xsanitizeafter{\forcsvlist{\blx@addtocategory{#1}}}{#2}}}}

% {<category>}{<entrykey>,...}
\def\blx@addtocategory#1#2{%
  % If we are adding a set member to a category, make sure we also add the
  % set parent if it is cited. If it is cited, we should be using the set
  % parent in the category, not the set child member. blx@setc@... will
  % only exist if the set parent is also cited as it is only defined when a
  % member contains \inset which only happens when the set parent is cited.
  \ifcsdef{blx@setc@\the\c@refsection @#2}
    {\blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{\csuse{blx@setc@\the\c@refsection @#2}}}%
     \abx@aux@category{#1}{\csuse{blx@setc@\the\c@refsection @#2}}}
    {}%
  \blx@auxwrite\@mainaux{}{\string\abx@aux@category{#1}{#2}}%
  \abx@aux@category{#1}{#2}}

% {<category>}{<entrykey>,...}
\protected\def\abx@aux@category#1#2{%
  \xifinlistcs{\detokenize{#2}}{blx@catg@#1}
    {}
    {\listcsxadd{blx@catg@#1}{\detokenize{#2}}}}

\AtEndDocument{\let\abx@aux@category\@gobbletwo}

% [<options>]{<resource>,...}
\renewrobustcmd*{\bibliography}[1]{%
  \begingroup
  \def\blx@tempa{file}%
  \def\blx@tempb{bibtex}%
  \def\blx@tempc{local}%
  \blx@xsanitizeafter{\forcsvlist\blx@addbib@legacy}{#1}%
  \endgroup}
\@onlypreamble\bibliography

\def\blx@addbib@legacy#1{%
  \begingroup
  \edef\blx@tempa{\endgroup
    \noexpand\blx@addbib@resource{\blx@stripbib{#1}\detokenize{.bib}}}%
  \blx@tempa}

\def\blx@stripbib#1{%
  \expandafter\blx@stripbib@i\detokenize{#1.bib}&}
\edef\blx@stripbib@i{%
  \def\noexpand\blx@stripbib@i##1\detokenize{.bib}##2&}
\blx@stripbib@i{#1}

% [<options>]{<resource>,...}
\newrobustcmd*{\addbibresource}{%
  \blx@addbib\blx@addbib@resource}
\@onlypreamble\addbibresource

\newrobustcmd*{\addglobalbib}{%
  \blx@addbib\blx@addbib@global}
\@onlypreamble\addglobalbib

\newrobustcmd*{\addsectionbib}{%
  \blx@addbib\blx@addbib@register}
\@onlypreamble\addsectionbib

\def\blx@addbib#1{%
  \@ifnextchar[%]
    {\blx@addbib@i{#1}}
    {\blx@addbib@i{#1}[]}}

\def\blx@addbib@i#1[#2]{%
  \begingroup
  \blx@hook@fileverb
  \blx@addbib@ii{#1}{#2}}

\def\blx@addbib@ii#1#2#3{%
  \endgroup
  \begingroup
  \def\blx@tempa{file}%
  \def\blx@tempb{bibtex}%
  \def\blx@tempc{local}%
  \undef\blx@tempd
  \setkeys{blx@addbib}{#2}%
  \blx@xsanitizeafter{#1}{#3}%
  \endgroup}

\def\blx@hook@fileverb{%
  \let\do\@makeother
  \dospecials
  \catcode`\\=\z@
  \catcode`\{=\@ne
  \catcode`\}=\tw@}

\define@key{blx@addbib}{type}{\def\blx@tempa{#1}}
\define@key{blx@addbib}{datatype}{\def\blx@tempb{#1}}
\define@key{blx@addbib}{location}{\def\blx@tempc{#1}}
\define@key{blx@addbib}{label}{\edef\blx@tempd{\detokenize{#1}}}

% \blx@res@type@<resource>      resource -> type
% \blx@res@data@<resource>      resource -> datatype
% \blx@res@loca@<resource>      resource -> datatype
% \blx@res@labl@<resource>      label    -> resource

\def\blx@addbib@register#1{%
  \csxdef{blx@res@type@#1}{\blx@tempa}%
  \csxdef{blx@res@data@#1}{\blx@tempb}%
  \csxdef{blx@res@loca@#1}{\blx@tempc}%
  \ifdef\blx@tempd
    {\csxdef{blx@res@labl@\blx@tempd}{#1}}
    {}}

\def\blx@addbib@resource#1{%
  \blx@addbib@register{#1}%
  \listgadd\blx@bibfiles{#1}%
  \blx@regbibfile\jobname{#1}}

\def\blx@addbib@global#1{%
  \blx@addbib@resource{#1}%
  \listgadd\blx@bibfiles@global{#1}}

\let\blx@bibfiles\@empty
\let\blx@bibfiles@global\@empty

\def\blx@bibdata#1#2{%
  \forlistloop{\blx@bibdata@i{#1}}#2}
\def\blx@bibdata@i#1#2{%
  \blx@xmlsanitizeafter{\blx@bibdata@ii{#1}{#2}}{#2}}
\def\blx@bibdata@ii#1#2#3{%
  \eappto#1{%
    \blx@xml@datasource
      {\ifcsdef{blx@res@type@#2}
         {\csuse{blx@res@type@#2}}
         {file}}
      {\ifcsdef{blx@res@data@#2}
        {\csuse{blx@res@data@#2}}
        {bibtex}}
      {#3}}}

%% Citations

\newrobustcmd*{\AtEveryCite}{\gappto\blx@hook@cite}
\newrobustcmd*{\AtEveryCitekey}{\gappto\blx@hook@citekey}
\newrobustcmd*{\AtEveryMultiCite}{\gappto\blx@hook@mcite}
\@onlypreamble\AtEveryCite
\@onlypreamble\AtEveryCitekey
\@onlypreamble\AtEveryMultiCite

\newrobustcmd*{\AtEachCitekey}{%
  \iftoggle{blx@citation}{\appto\blx@hook@citekey}{\@gobble}}

\def\blx@imc@UseEveryCiteHook{\csuse{blx@hook@cite}}
\def\blx@imc@UseEveryCitekeyHook{\csuse{blx@hook@citekey}}
\def\blx@imc@UseEveryMultiCiteHook{\csuse{blx@hook@mcite}}

\newrobustcmd*{\AtNextCite}{%
  \ifundef\blx@hook@cite@next
    {\gdef\blx@hook@cite@next{\global\undef\blx@hook@cite@next}}
    {}%
  \gappto\blx@hook@cite@next}

\newrobustcmd*{\AtNextCitekey}{%
  \ifundef\blx@hook@citekey@next
    {\gdef\blx@hook@citekey@next{\global\undef\blx@hook@citekey@next}}
    {}%
  \gappto\blx@hook@citekey@next}

\newrobustcmd*{\AtNextMultiCite}{%
  \ifundef\blx@hook@mcite@next
    {\gdef\blx@hook@mcite@next{\global\undef\blx@hook@mcite@next}}
    {}%
  \gappto\blx@hook@mcite@next}

\def\blx@imc@UseNextCiteHook{\csuse{blx@hook@cite@next}}
\def\blx@imc@UseNextCitekeyHook{\csuse{blx@hook@citekey@next}}
\def\blx@imc@UseNextMultiCiteHook{\csuse{blx@hook@mcite@next}}

\def\blx@imc@DeferNextCitekeyHook{\undef\blx@hook@citekey@next}

\blx@regimcs{%
  \UseEveryCiteHook \UseEveryCitekeyHook \UseEveryMultiCiteHook
  \UseNextCiteHook \UseNextCitekeyHook \UseNextMultiCiteHook
  \DeferNextCitekeyHook}

% {<style>}

\newrobustcmd*{\RequireCitationStyle}[1]{%
  \blx@inputonce{#1.cbx}{citation style '#1'}{}{}{}
    {\blx@error
       {Style '#1' not found}
       {The citation style '#1' could not be found}}}
\@onlypreamble\RequireCitationStyle

% {<code>}

\newrobustcmd*{\InitializeCitationStyle}{\appto\blx@hook@cbxinit}
\@onlypreamble\InitializeCitationStyle

% {<code>}

\newrobustcmd*{\OnManualCitation}{\appto\blx@hook@mancite}
\@onlypreamble\OnManualCitation

\newrobustcmd*{\mancite}{%
  \csuse{blx@hook@mancite}%
  \blx@ibidreset
  \blx@idemreset
  \blx@opcitreset
  \blx@loccitreset}

% {<entrykey>}{<message>}
% Just a wrapper to suppress citation tracking in toc/lof etc.
\def\blx@citation#1#2{%
  \ifbool{citerequest}
    {\blx@citation@entry{#1}{#2}}
    {}}

\def\blx@citation@entry#1#2{%
  \blx@bibreq{#1}%
  \ifinlist{#1}\blx@cites
    {}
    {\listgadd{\blx@cites}{#1}%
     \blx@auxwrite\@mainaux{}{\string\abx@aux@cite{#1}}}%
  \ifinlistcs{#1}{blx@segm@\the\c@refsection @\the\c@refsegment}
    {}
    {\listcsgadd{blx@segm@\the\c@refsection @\the\c@refsegment}{#1}}%
  \blx@auxwrite\@mainaux{}{\string\abx@aux@segm{\the\c@refsection}{\the\c@refsegment}{\detokenize{#1}}}%
  \blx@ifdata{#1}
    {}
    {\ifcsdef{blx@miss@\the\c@refsection}
       {\ifinlistcs{#1}{blx@miss@\the\c@refsection}
          {}
          {\blx@logreq@active{#2{#1}}}}
       {\blx@logreq@active{#2{#1}}}}}

\protected\def\abx@aux@segm#1#2#3{%
  \listcsxadd{blx@segm@#1@#2}{\detokenize{#3}}}

\def\blx@citation@all{%
  \ifbool{citerequest}
    {\blx@bibreq{*}%
     \global\csletcs
       {blx@segm@\the\c@refsection @\the\c@refsegment}
       {blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}%
      \ifcsvoid{blx@dlist@entry@\the\c@refsection @\blx@refcontext@context}
       {\blx@logreq@active{}}
       {}}
    {}}

\protected\def\blx@bibreq#1{%
  \begingroup
  \blx@xmlsanitizeafter{\def\blx@tempa}{#1}%
  % citeall is always order "0" - this makes no real difference as biber
  % ignores all other citekeys in the section if citeall is present
  \ifstrequal{*}{#1}
    {\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{0}}}
    {\blx@auxwrite\blx@bcfout{}{\blx@xml@citekey{\blx@tempa}{\expandafter\the\csname blx@sectionciteorder@\the\c@refsection\endcsname}}}%
  \endgroup}

% {<set>}{<key1,key2,key3>}

\newrobustcmd*{\defbibentryset}[2]{%
  \@bsphack
  \begingroup
  \blx@xsanitizeafter{\def\blx@tempa}{#1}%
  \let\blx@tempb\@empty
  \let\blx@tempc\@empty
  \blx@xsanitizeafter{\forcsvlist\blx@defentryset@add}{#2}%
  \ifcsdef{blx@set@\the\c@refsection @\blx@tempa}
    {\expandafter\ifdefequal
       \csname blx@set@\the\c@refsection @\blx@tempa\endcsname
       \blx@tempb
       {}
       {\blx@error
          {Conflicting definitions of '\blx@tempa'}
          {The entry set '\blx@tempa' been defined before.\MessageBreak
           old: \blx@tempa\space = %
           \csuse{blx@set@\the\c@refsection @\blx@tempa}\MessageBreak
           new: \blx@tempa\space = \blx@tempb\MessageBreak
           I'm ignoring the new definition}}}
    {\global\cslet{blx@set@\the\c@refsection @\blx@tempa}\blx@tempb
     \edef\blx@tempa{%
       \AfterPreamble{\blx@setreq{\blx@tempa}{\blx@tempb}}}%
     \blx@tempa}%
  \endgroup
  \@esphack}

\def\blx@defentryset@add#1{%
  \edef\blx@tempb{\blx@tempb\blx@tempc#1}%
  \def\blx@tempc{,}}

\protected\def\blx@setreq#1#2{%
  \begingroup
  \blx@xmlsanitizeafter{\def\blx@tempa}{#1}%
  \blx@xmlsanitizeafter{\def\blx@tempb}{#2}%
  \blx@auxwrite\blx@bcfout{}{\blx@xml@citeset{\blx@tempa}{\blx@tempb}}%
  \endgroup}

% {<entrykey>,...}
\protected\def\blx@citeloop#1{%
  \begingroup
  % This must be here and not after \blx@citeadd as this changes the refcontext
  \letcs\blx@tempb{blx@dlist@centry@\the\c@refsection @\blx@refcontext@context}%
  % Make sure this counter exists. Sometimes it might not when using, e.g:
  % refsection=chapter and \includeonly to put in the chapters or when
  % inserting citations into table of contents
  \ifcsname blx@sectionciteorder@\the\c@refsection\endcsname\else
    \expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname
  \fi
  \global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
  \blx@tempcnta\z@
  \blx@tempcntb\z@
  \let\blx@tempa\@empty
  \forcsvlist\blx@citeadd{#1}% adds to \blx@tempa
  \blx@thenotecheck
  \ifnum\blx@tempcnta>\z@
    \ifnum\blx@tempcntb>\z@
      \multicitedelim
    \fi
  \else
    \blx@postpunct@saved
  \fi
  % \blx@tempb is a sorted list of all cites, \blx@tempa is the list of cites to
  % sort using this list
  \blx@thecitesort
  \edef\blx@tempa{\endgroup
    \c@citecount\z@
    \c@citetotal\the\blx@tempcnta\relax
    \unexpanded{\forlistloop\blx@citeprint}{\blx@tempb}}%
  \blx@tempa}

\def\blx@notecheck{%
  \ifnum\blx@tempcnta>\@ne
    \blx@warning{%
      Package option 'sortcites' enabled.\MessageBreak
      Verify postnote placement}%
  \fi}

\def\blx@citesort{%
  \ifnum\blx@tempcnta>\@ne
    \blx@filtercitesort\blx@tempb{blx@tempa}%
  \else
    \blx@citenosort
  \fi}

\def\blx@citenosort{%
  \let\blx@tempb\blx@tempa}

% {<entrykey>}
\def\blx@citeadd#1{%
  \ifcsdef{blx@keyalias@\the\c@refsection @#1}
    {\edef\blx@realkey{\csuse{blx@keyalias@\the\c@refsection @#1}}}
    {\def\blx@realkey{#1}}%
  \expandafter\blx@getrefcontext\expandafter{\blx@realkey}% needed for \ifdata
  \expandafter\blx@citation\expandafter{\blx@realkey}\blx@msg@cundefon
  \expandafter\blx@ifdata\expandafter{\blx@realkey}
    {\advance\blx@tempcnta\@ne
     \listeadd\blx@tempa{\blx@realkey}}
    {\ifnum\blx@tempcntb>\z@\multicitedelim\fi
     \expandafter\abx@missing\expandafter{\blx@realkey}%
     \advance\blx@tempcntb\@ne}}

% set default refcontext for one citation key
% and then override with data from auto-assign \assignrefcontext* macros, if any
% <entrykey>
\def\blx@getrefcontext#1{%
  % Save refcontext for restoration at end of \citeprint
  \let\blx@refcontext@context@saved\blx@refcontext@context
  % Get the default refcontext
  % If there was one due to appearance in a bib/biblist, use it
  % otherwise fall back on global refcontext. This can happen for cites
  % made (a bit strangely but some styles do this) inside a biblist
  % which never appear in any printed bib/biblist and therefore have no default
  % refcontext defined
  \ifcsdef{blx@assignedrefcontextbib@\the\c@refsection @#1}
    {\letcs\blx@refcontext@context{blx@assignedrefcontextbib@\the\c@refsection @#1}}
    {\edef\blx@refcontext@context{\blx@sorting/global//global/global}}%
  % assignment via keyword list
  \ifdef\blx@assignedrefcontextkeywlist
    {\def\do##1{%
       \blx@imc@ifentrykeyword{#1}{##1}
         {% weak version
          \ifboolexpr{test {\ifcsdef{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}}
                      and
                      not togl {blx@refcontext}}% inside explicit non-global refcontext
            {\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws*@\the\c@refsection @##1}}
            {}%
          % strong version
          \ifcsdef{blx@assignedrefcontextkeyws@\the\c@refsection @##1}
            {\letcs\blx@refcontext@context{blx@assignedrefcontextkeyws@\the\c@refsection @##1}}
            {}}
         {}}%
     \dolistloop\blx@assignedrefcontextkeywlist}
    {}%
  % assignment via category
  \ifdef\blx@assignedrefcontextcatlist
    {\def\do##1{%
       \blx@imc@ifentrycategory{#1}{##1}
         {% weak version
          \ifboolexpr{test {\ifcsdef{blx@assignedrefcontextcats*@\the\c@refsection @##1}}
                      and
                      not togl {blx@refcontext}}% inside explicit non-global refcontext
            {\letcs\blx@refcontext@context{blx@assignedrefcontextcats*@\the\c@refsection @##1}}
            {}%
          % strong version
          \ifcsdef{blx@assignedrefcontextcats@\the\c@refsection @##1}
            {\letcs\blx@refcontext@context{blx@assignedrefcontextcats@\the\c@refsection @##1}}
            {}}
         {}}%
     \dolistloop\blx@assignedrefcontextcatlist}
    {}%
  % assignment via entrykeys
  % weak version
  \nottoggle{blx@refcontext}
    {\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @*}
       {\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @*}}
       {\ifcsdef{blx@assignedrefcontextkeys*@\the\c@refsection @#1}
         {\letcs\blx@refcontext@context{blx@assignedrefcontextkeys*@\the\c@refsection @#1}}
         {}}}
    {}%
  % strong version
  \ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @*}
    {\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @*}}
    {\ifcsdef{blx@assignedrefcontextkeys@\the\c@refsection @#1}
      {\letcs\blx@refcontext@context{blx@assignedrefcontextkeys@\the\c@refsection @#1}}
      {}}}

% {<entrykey>}
\protected\def\blx@citeprint#1{%
  \blx@getrefcontext{#1}%
  \advance\c@citecount\@ne
  \addtocounter{instcount}\@ne
  \ifnum\c@citecount=\@ne
    \blx@getdata@cite{#1}%
    \blx@precode
    \ifnum\c@citetotal>\@ne
      \blx@resetdata
    \fi
  \else
    \blx@dlimcode
  \fi
  \begingroup
  \ifnum\c@citetotal>\@ne
    \blx@getdata@cite{#1}%
  \fi
  \blx@entrysetcount
  \blx@setoptions@type\abx@field@entrytype
  \blx@setoptions@entry
  \blx@backref{#1}%
  \blx@pagetracker
  \csuse{blx@hook@citekey}%
  \csuse{blx@hook@citekey@next}%
  \blx@beglangcite
  \blx@execute
  \blx@loopcode
  \blx@citecounter
  \blx@citetracker
  \blx@ibidtracker
  \blx@idemtracker
  \blx@opcittracker
  \blx@loccittracker
  \ifnum\c@citecount=\c@citetotal
    \def\blx@thecheckpunct{\blx@err@nestcite\@gobble}%
    \blx@postcode
    \blx@postpunct@saved
  \fi
  \blx@endlangcite
  \endgroup
  \let\blx@refcontext@context\blx@refcontext@context@saved}

% cite counter
\def\blx@citecounter@global{%
  \ifbool{@filesw}
    {\ifbool{citetracker}
       {\immediate\write\@mainaux{%
          \string\abx@aux@count
          {\the\c@refsection}{\abx@field@entrykey}}}
       {}}
    {}}

\def\blx@citecounter@context{%
  \ifbool{@filesw}
    {\ifbool{citetracker}
       {\immediate\write\@mainaux{%
          \iftoggle{blx@footnote}
            {\string\abx@aux@fncount}
            {\string\abx@aux@count}%
          {\the\c@refsection}{\abx@field@entrykey}}}
       {}}
    {}}

% {<refsection>}{<entrykey>}
\protected\def\blx@aux@count#1#2{%
  \csnumgdef{blx@count@#1@\detokenize{#2}}{\csuse{blx@count@#1@\detokenize{#2}}+1}}
\protected\def\blx@aux@fncount#1#2{%
  \csnumgdef{blx@fncount@#1@\detokenize{#2}}{\csuse{blx@fncount@#1@\detokenize{#2}}+1}}

\let\abx@aux@count\@gobbletwo
\let\abx@aux@fncount\@gobbletwo

\AtEndDocument{%
  \let\abx@aux@count\@gobbletwo
  \let\abx@aux@fncount\@gobbletwo}

\protected\def\blx@setcitecounter@global{%
  \c@citecounter0%
  \csuse{blx@count@\the\c@refsection @\abx@field@entrykey}%
  \relax}

\protected\def\blx@setcitecounter@context{%
  \c@citecounter0%
  \iftoggle{blx@footnote}
    {\csuse{blx@fncount@\the\c@refsection @\abx@field@entrykey}}
    {\csuse{blx@count@\the\c@refsection @\abx@field@entrykey}}%
  \relax}

% cite tracker
\def\blx@citetracker@global{%
  \ifbool{citetracker}
    {\xifinlistcs\abx@field@entrykey{blx@bsee@\the\c@refsection}
       {}
       {\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@entrykey}}
    {}}

\def\blx@citetracker@context{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\xifinlistcs\abx@field@entrykey{blx@fsee@\the\c@refsection}
          {}
          {\listcsxadd{blx@fsee@\the\c@refsection}\abx@field@entrykey}}
       {\xifinlistcs{\abx@field@entrykey}{blx@bsee@\the\c@refsection}
          {}
          {\listcsxadd{blx@bsee@\the\c@refsection}\abx@field@entrykey}}}
    {}}

\protected\appto\abx@savetrackers{%
  \global\csletcs{blx@saved@bsee@\the\c@refsection}{blx@bsee@\the\c@refsection}%
  \global\csletcs{blx@saved@fsee@\the\c@refsection}{blx@fsee@\the\c@refsection}}

\protected\appto\abx@resttrackers{%
  \global\csletcs{blx@bsee@\the\c@refsection}{blx@saved@bsee@\the\c@refsection}%
  \global\csletcs{blx@fsee@\the\c@refsection}{blx@saved@fsee@\the\c@refsection}}

\protected\appto\abx@cleartrackers{%
  \global\cslet{blx@saved@bsee@\the\c@refsection}\@empty
  \global\cslet{blx@saved@fsee@\the\c@refsection}\@empty}

% ibidem tracker
\def\blx@ibidtracker@global{%
  \ifbool{citetracker}
    {\global\let\blx@lastkey@text\abx@field@entrykey}
    {}}

\def\blx@ibidtracker@context{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\global\let\blx@lastkey@foot\abx@field@entrykey}
       {\global\let\blx@lastkey@text\abx@field@entrykey}}
    {}}

\def\blx@ibidtracker@strict{%
  \blx@ifcitesingle
    {\blx@ibidtracker@global}
    {\blx@ibidreset@global}}%

\def\blx@ibidtracker@constrict{%
  \blx@ifcitesingle
    {\blx@mpfnsave
     \blx@ibidtracker@context}
    {\blx@ibidreset@context}}%

\def\blx@ibidreset@force{%
  \global\undef\blx@lastkey@text
  \global\undef\blx@lastkey@foot
  \blx@mpfnreset}

\def\blx@ibidreset@global{%
  \global\undef\blx@lastkey@text}

\def\blx@ibidreset@context{%
  \iftoggle{blx@footnote}
    {\blx@mpfnreset
     \global\undef\blx@lastkey@foot}
    {\global\undef\blx@lastkey@text}}

\protected\appto\abx@savetrackers{%
  \global\let\blx@saved@lastkey@text\blx@lastkey@text
  \global\let\blx@saved@lastkey@foot\blx@lastkey@foot}

\protected\appto\abx@resttrackers{%
  \global\let\blx@lastkey@text\blx@saved@lastkey@text
  \global\let\blx@lastkey@foot\blx@saved@lastkey@foot}

\protected\appto\abx@cleartrackers{%
  \global\undef\blx@saved@lastkey@text
  \global\undef\blx@saved@lastkey@foot}

% idem tracker
\def\blx@idemtracker@global{%
  \ifbool{citetracker}
    {\global\let\blx@lasthash@text\abx@field@fullhash}
    {}}

\def\blx@idemtracker@context{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\global\let\blx@lasthash@foot\abx@field@fullhash}
       {\global\let\blx@lasthash@text\abx@field@fullhash}}
    {}}

\let\blx@idemtracker@strict\blx@idemtracker@global

\def\blx@idemtracker@constrict{%
  \blx@mpfnsave
  \blx@idemtracker@context}

\def\blx@idemreset@force{%
  \global\undef\blx@lasthash@text
  \global\undef\blx@lasthash@foot
  \blx@mpfnreset}

\def\blx@idemreset@global{%
  \global\undef\blx@lasthash@text}

\def\blx@idemreset@context{%
  \iftoggle{blx@footnote}
    {\blx@mpfnreset
     \global\undef\blx@lasthash@foot}
    {\global\undef\blx@lasthash@text}}

\protected\appto\abx@savetrackers{%
  \global\let\blx@saved@lasthash@text\blx@lasthash@text
  \global\let\blx@saved@lasthash@text\blx@lasthash@text}

\protected\appto\abx@resttrackers{%
  \global\let\blx@lasthash@text\blx@saved@lasthash@text
  \global\let\blx@lasthash@text\blx@saved@lasthash@text}

\protected\appto\abx@cleartrackers{%
  \global\undef\blx@saved@lasthash@text
  \global\undef\blx@saved@lasthash@foot}

% opcit tracker
\def\blx@opcittracker@global{%
  \ifbool{citetracker}
    {\blx@opcit@tracker{text}}
    {}}

\def\blx@opcittracker@context{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\blx@opcit@tracker{foot}}
       {\blx@opcit@tracker{text}}}
    {}}

\def\blx@opcittracker@strict{%
  \blx@ifcitesingle
    {\blx@opcittracker@global}
    {\blx@opcitreset@global}}%

\def\blx@opcittracker@constrict{%
  \blx@ifcitesingle
    {\blx@mpfnsave
     \blx@opcittracker@context}
    {\blx@opcitreset@context}}%

\def\blx@opcit@tracker#1{%
  \blx@imc@iffieldundef{namehash}
    {}
    {\global\cslet{blx@lastkey@#1@\abx@field@namehash}\abx@field@entrykey
     \xifinlistcs\abx@field@namehash{blx@trackhash@#1}
       {}
       {\listcsxadd{blx@trackhash@#1}\abx@field@namehash}}}

\def\blx@opcit@reset#1{%
  \begingroup
  \def\do##1{\global\csundef{blx@lastkey@#1@##1}}%
  \dolistcsloop{blx@trackhash@#1}%
  \global\cslet{blx@trackhash@#1}\@empty
  \endgroup}

\def\blx@opcitreset@force{%
  \blx@opcit@reset{text}%
  \blx@opcit@reset{foot}%
  \blx@mpfnreset}

\def\blx@opcitreset@global{%
  \blx@opcit@reset{text}}

\def\blx@opcitreset@context{%
  \iftoggle{blx@footnote}
    {\blx@opcit@reset{foot}%
     \blx@mpfnreset}
    {\blx@opcit@reset{text}}}

\let\blx@trackhash@text\@empty
\let\blx@trackhash@foot\@empty

\protected\appto\abx@savetrackers{%
  \begingroup
  \def\do#1{\global\csletcs{blx@saved@lastkey@text@#1}{blx@lastkey@text@#1}}%
  \dolistloop\blx@trackhash@text
  \global\let\blx@saved@trackhash@text\blx@trackhash@text
  \def\do#1{\global\csletcs{blx@saved@lastkey@foot@#1}{blx@lastkey@foot@#1}}%
  \dolistloop\blx@trackhash@foot
  \global\let\blx@saved@trackhash@foot\blx@trackhash@foot
  \endgroup}

\protected\appto\abx@resttrackers{%
  \begingroup
  \blx@opcit@reset{text}%
  \global\let\blx@trackhash@text\blx@saved@trackhash@text
  \def\do#1{\global\csletcs{blx@lastkey@text@#1}{blx@saved@lastkey@text@#1}}%
  \dolistloop\blx@trackhash@text
  \blx@opcit@reset{foot}%
  \global\let\blx@trackhash@foot\blx@saved@trackhash@foot
  \def\do#1{\global\csletcs{blx@lastkey@foot@#1}{blx@saved@lastkey@foot@#1}}%
  \dolistloop\blx@trackhash@foot
  \endgroup}

\protected\appto\abx@cleartrackers{%
  \begingroup
  \def\do#1{\global\csundef{blx@saved@lastkey@text@#1}}%
  \dolistloop\blx@saved@trackhash@text
  \global\undef\blx@saved@trackhash@text
  \def\do#1{\global\csundef{blx@saved@lastkey@foot@#1}}%
  \dolistloop\blx@saved@trackhash@foot
  \global\undef\blx@saved@trackhash@foot
  \endgroup}

% loccit tracker
\def\blx@loccittracker@global{%
  \ifbool{citetracker}
    {\blx@loccit@tracker{text}}
    {}}

\def\blx@loccittracker@context{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\blx@loccit@tracker{foot}}
       {\blx@loccit@tracker{text}}}
    {}}

\def\blx@loccittracker@strict{%
  \ifbool{citetracker}
    {\blx@loccit@stricttracker{text}}
    {}}

\def\blx@loccittracker@constrict{%
  \ifbool{citetracker}
    {\iftoggle{blx@footnote}
       {\blx@mpfnsave
        \blx@loccit@stricttracker{foot}}
       {\blx@loccit@stricttracker{text}}}
    {}}

\def\blx@loccit@tracker#1{%
  \global\csundef{blx@lastnote@#1@\abx@field@entrykey}%
  \blx@imc@iffieldundef{postnote}
    {}
    {\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote
     \xifinlistcs\abx@field@entrykey{blx@trackkeys@#1}
       {}
       {\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}}}

\def\blx@loccit@stricttracker#1{%
  \global\csundef{blx@lastnote@#1@\abx@field@entrykey}%
  \blx@imc@iffieldundef{postnote}
    {}
    {\blx@ifcitesingle
       {\expandafter\blx@imc@ifpages
        \expandafter{\abx@field@postnote}
          {\global\cslet{blx@lastnote@#1@\abx@field@entrykey}\abx@field@postnote
           \xifinlistcs\abx@field@entrykey{blx@trackkeys@#1}
             {}
             {\listcsxadd{blx@trackkeys@#1}\abx@field@entrykey}}
          {}}
       {}}}

\def\blx@loccit@reset#1{%
  \begingroup
  \def\do##1{\global\csundef{blx@lastnote@#1@##1}}%
  \dolistcsloop{blx@trackkeys@#1}%
  \global\cslet{blx@trackkeys@#1}\@empty
  \endgroup}

\def\blx@loccitreset@force{%
  \blx@loccit@reset{text}%
  \blx@loccit@reset{foot}%
  \blx@mpfnreset}

\def\blx@loccitreset@global{%
  \blx@loccit@reset{text}}

\def\blx@loccitreset@context{%
  \iftoggle{blx@footnote}
    {\blx@loccit@reset{foot}%
     \blx@mpfnreset}
    {\blx@loccit@reset{text}}}

\let\blx@trackkeys@text\@empty
\let\blx@trackkeys@foot\@empty

\protected\appto\abx@savetrackers{%
  \begingroup
  \def\do#1{\global\csletcs{blx@saved@lastnote@text@#1}{blx@lastnote@text@#1}}%
  \dolistloop\blx@trackkeys@text
  \global\let\blx@saved@trackkeys@text\blx@trackkeys@text
  \def\do#1{\global\csletcs{blx@saved@lastnote@foot@#1}{blx@lastnote@foot@#1}}%
  \dolistloop\blx@trackkeys@foot
  \global\let\blx@saved@trackkeys@foot\blx@trackkeys@foot
  \endgroup}

\protected\appto\abx@resttrackers{%
  \begingroup
  \blx@loccit@reset{text}%
  \global\let\blx@trackkeys@text\blx@saved@trackkeys@text
  \def\do#1{\global\csletcs{blx@lastnote@text@#1}{blx@saved@lastnote@text@#1}}%
  \dolistloop\blx@trackkeys@text
  \blx@loccit@reset{foot}%
  \global\let\blx@trackkeys@foot\blx@saved@trackkeys@foot
  \def\do#1{\global\csletcs{blx@lastnote@foot@#1}{blx@saved@lastnote@foot@#1}}%
  \dolistloop\blx@trackkeys@foot
  \endgroup}

\protected\appto\abx@cleartrackers{%
  \begingroup
  \def\do#1{\global\csundef{blx@saved@lastnote@text@#1}}%
  \dolistloop\blx@saved@trackkeys@text
  \global\undef\blx@saved@trackkeys@text
  \def\do#1{\global\csundef{blx@saved@lastnote@foot@#1}}%
  \dolistloop\blx@saved@trackkeys@foot
  \global\undef\blx@saved@trackkeys@foot
  \endgroup}

\def\blx@addbackref#1{%
  \ifcsdef{blx@setp@\the\c@refsection @#1}
    {\ifcase\blx@backrefsetstyle
       \blx@addbackref@i{#1}%
     \or
       \blx@addbackref@ii{setp}{#1}%
     \or
       \blx@addbackref@i{#1}%
     \or
       \blx@addbackref@i{#1}%
     \or
       \blx@addbackref@i{#1}%
       \blx@addbackref@ii{setp}{#1}%
     \or
       \blx@addbackref@i{#1}%
       \blx@addbackref@ii{setp}{#1}%
     \fi}
    {\ifcsdef{blx@setc@\the\c@refsection @#1}
       {\ifcase\blx@backrefsetstyle
          \blx@addbackref@ii{setc}{#1}%
        \or
          \blx@addbackref@i{#1}%
        \or
          \blx@addbackref@i{#1}%
        \or
          \blx@addbackref@i{#1}%
          \blx@addbackref@ii{setc}{#1}%
        \or
          \blx@addbackref@i{#1}%
        \or
          \blx@addbackref@i{#1}%
          \blx@addbackref@ii{setc}{#1}%
        \fi}
       {\blx@addbackref@i{#1}}}}

\def\blx@addbackref@i#1{%
  \ifbacktracker
    \blx@leavevmode
    \if@filesw
      \protected@write\@mainaux{}{\string\abx@aux@backref
        {\the\c@instcount}{#1}{\the\c@refsection}%
        {\thepage}{\noexpand\the\c@page}}%
    \fi
  \fi}

\def\blx@addbackref@ii#1#2{%
  \expandafter\expandafter\expandafter\forcsvlist
  \expandafter\expandafter\expandafter\blx@addbackref@i
  \expandafter\expandafter\expandafter{%
    \csname blx@#1@\the\c@refsection @#2\endcsname}}

% {<instcount>}{<entrykey>}{<refsection>}{<page>}{<page int>}
\protected\def\blx@aux@backref#1#2#3#4#5{%
  \ifcsundef{blx@pref@#3@\detokenize{#2}}
    {\global\cslet{blx@pref@#3@\detokenize{#2}}\@empty
     \expandafter\blx@onlypreamble\csname blx@pref@#3@\detokenize{#2}\endcsname}
    {}%
  \ifinlistcs{#4}{blx@pref@#3@\detokenize{#2}}
    {}
    {\listcsgadd{blx@pref@#3@\detokenize{#2}}{#4}}%
  \blx@addpagesum{#1}{#5}}

\AtEndDocument{%
  \def\abx@aux@backref#1#2#3#4#5{\blx@addpagesum{#1}{#5}}}

% {<true>}{<false>}
\def\blx@ifcitesingle{%
  \ifnum\c@citetotal=\@ne
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}

%  hyperref interface
\appto\blx@mkhyperref{%
  \protected\def\blx@imc@bibhyperref{%
    \@ifnextchar[%]
      {\blx@bibhyperref}
      {\blx@bibhyperref[\abx@field@entrykey]}}%
  \ifundef\hyper@natanchorstart
    {\long\def\blx@bibhyperref[#1]#2{%
       \blx@sfsave\hyperlink{cite.\the\c@refsection @#1}{\blx@sfrest
         #2%
       \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@sfsave\hyperlink{cite.\the\c@refsection:#1}{\blx@sfrest
         #2%
       \blx@sfsave}\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@sfsave\hypertarget{cite.\the\c@refsection:#1}{\blx@sfrest
         #2%
       \blx@sfsave}\blx@sfrest}}%
    {\long\def\blx@bibhyperref[#1]#2{%
       \blx@sfsave\hyper@natlinkstart{\the\c@refsection @#1}\blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhyperlink#1#2{%
       \blx@sfsave\hyper@natlinkstart{\the\c@refsection:#1}\blx@sfrest
       #2%
       \blx@sfsave\hyper@natlinkend\blx@sfrest}%
     \protected\long\def\blx@imc@bibhypertarget#1#2{%
       \blx@sfsave\hyper@natanchorstart{\the\c@refsection:#1}\blx@sfrest
       #2%
       \blx@sfsave\hyper@natanchorend\blx@sfrest}}
  \let\blx@imc@ifhyperref\@firstoftwo
  \def\blx@sf{\spacefactor}%
  \def\blx@sfsave{%
    \blx@leavevmode
    \numgdef\blx@sf{\spacefactor}}%
  \def\blx@sfrest{%
    \ifhmode\spacefactor\blx@sf\relax\fi
    \gdef\blx@sf{\spacefactor}}}

\appto\blx@mknohyperref{%
  \protected\def\blx@imc@bibhyperref{\@ifnextchar[\blx@nohyperref\@firstofone}%
  \def\blx@nohyperref[#1]#2{#2}%
  \let\blx@imc@bibhyperlink\@secondoftwo
  \let\blx@imc@bibhypertarget\@secondoftwo
  \let\blx@imc@ifhyperref\@secondoftwo}

\blx@regimcs{%
  \bibhyperref \bibhyperlink \bibhypertarget \ifhyperref}

% {<entrykey>,...}
\protected\def\nocite#{\blx@nocite}

\def\blx@nocite#1{%
  \@bsphack
  \AfterPreamble{%
    \iftoggle{blx@bibliography}
      {}
      {\ifstrequal{*}{#1}
        {\blx@citation@all}
        {\blx@xsanitizeafter{\forcsvlist\blx@nocite@do}{#1}}}}%
  \@esphack}

\def\blx@nocite@do#1{%
    % Make sure this counter exists. Sometimes it might not when using, e.g:
    % refsection=chapter and \includeonly to put in the chapters or when
    % inserting citations into table of contents
    \ifcsname blx@sectionciteorder@\the\c@refsection\endcsname\else
      \expandafter\newcount\csname blx@sectionciteorder@\the\c@refsection\endcsname
    \fi
  \global\advance\csname blx@sectionciteorder@\the\c@refsection\endcsname\@ne
  \blx@citation{#1}\blx@msg@cundef}

% {<macro>}[<arg1>][<arg2>]{<arg3>}
% => <macro>{<arg1>}{<arg2>}{<arg3>}
\protected\def\blx@citeargs#1{%
  \@ifnextchar[%]
    {\blx@citeargs@i{#1}}
    {\blx@citeargs@iii{#1{}{}}}}
\long\def\blx@citeargs@i#1[#2]{%
  \@ifnextchar[%]
    {\blx@citeargs@ii{#1{#2}}}
    {\blx@citeargs@iii{#1{}{#2}}}}
\long\def\blx@citeargs@ii#1[#2]{%
  \blx@citeargs@iii{#1{#2}}}
\long\def\blx@citeargs@iii#1#2{%
  \blx@xsanitizeafter{#1}{#2}}

% {<macro>}(<arg1>)(<arg2>)
% => <macro>{<arg1>}{<arg2>}
\protected\def\blx@multiargs#1{%
  \@ifnextchar(%)
    {\blx@multiargs@i{#1}}
    {#1{}{}}}
\long\def\blx@multiargs@i#1(#2){%
  \@ifnextchar(%)
    {\blx@multiargs@ii{#1{#2}}}
    {#1{}{#2}}}
\long\def\blx@multiargs@ii#1(#2){#1{#2}}

% {<macro>}[<arg1>][<arg2>]{<arg3>}<punct>
% => <macro>{<arg1>}{<arg2>}{<arg3>}{<punctcmd>}
\protected\def\blx@citepunct#1{%
  \blx@citeargs{\blx@citepunct@i{#1}}}
\long\def\blx@citepunct@i#1#2#3#4{%
  \blx@thecheckpunct{#1{#2}{#3}{#4}}}

% {<csname>}[<arg1>][<arg2>]{arg3}[arg4]{arg5}<punct>
% => <macro>{<arg1>}{<arg2>}{<arg3>}{<arg4>}{arg5}{<punctcmd>}
\protected\def\blx@citexpunct#1{%
  \blx@citeargs{\blx@citexpunct@i{#1}}}
\long\def\blx@citexpunct@i#1#2#3#4{%
  \@ifnextchar[%]
    {\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}}
    {\blx@citexpunct@ii{#1}{{#2}{#3}{#4}}[#1]}}
\long\def\blx@citexpunct@ii#1#2[#3]#4{%
  \blx@thecheckpunct{\blxcitecmd{#1}#2{#3}{#4}}}

% {<code>}<punct> => <code>{<punctcmd>}
\long\def\blx@checkpunct#1{%
  \begingroup
  \def\blx@tempa{\endgroup#1}%
  \futurelet\blx@tempb\blx@checkpunct@i}
\def\blx@checkpunct@i{%
  \expandafter\blx@checkpunct@ii\blx@autopunct&}
\def\blx@checkpunct@ii#1{%
  \ifx#1&%
    \expandafter\blx@checkpunct@iii
  \fi
  \ifx#1\blx@tempb
    \expandafter\blx@checkpunct@iv
  \fi
  \blx@checkpunct@ii}
\def\blx@checkpunct@iii#1\blx@checkpunct@ii{%
  \global\undef\abx@field@postpunct
  \blx@tempa{\blx@postpunct}}
\def\blx@checkpunct@iv#1\blx@checkpunct@ii#2&#3{%
  \gdef\abx@field@postpunct{#3}%
  \edef\blx@tempa{%
    \expandonce\blx@tempa{%
    \ifcsdef{blx@pm@\detokenize{#3}}
      {\csname blx@imc@add\csname blx@pm@\detokenize{#3}\endcsname
       \endcsname}
      {\noexpand#3}}}%
  \blx@tempa}

\long\def\blx@nocheckpunct#1{#1{}}

\protected\def\blx@citeinit{%
  \iftoggle{blx@bibliography}
    {}
    {\toggletrue{blx@citation}}%
  \blx@blxinit
  \blx@langstrings
  \citesetup
  \blx@setsfcodes
  \blx@postpunct@agroup
  \blx@resetdata
  \blx@leavevmode
  \csuse{blx@hook@cite}%
  \csuse{blx@hook@cite@next}%
  \let\blx@citeinit\blx@resetdata}

\protected\def\blx@citecmdinit{%
  \blx@leavevmode@cite
  \iftoggle{blx@bibliography}
    {}
    {\blx@initunit}}

% *{<command>}[<wrapper>]{<precode>}{<loopcode>}{<delimcode>}{<postcode>}
\newrobustcmd*{\DeclareCiteCommand}{%
  \@ifstar{\blx@defcitecmd*}{\blx@defcitecmd{}}}

\def\blx@defcitecmd#1#2{%
  \begingroup
  \escapechar\m@ne
  \edef\blx@tempa{\endgroup
    \noexpand\blx@defcitecmd@i{#1}{\string#2}}%
  \blx@tempa}

\def\blx@defcitecmd@i#1#2{%
  \blx@checkcitecmd{#2}{#1}%
  \protected\csdef{#2}{%
    \blx@citecmdinit
    \@ifstar
      {\blx@citepunct{\blxcitecmd{#2*}}}
      {\blx@citepunct{\blxcitecmd{#2}}}}%
  \@ifnextchar[%]
    {\blx@defcitecmd@iii{#2#1}}
    {\blx@defcitecmd@ii{#2#1}}}

\long\def\blx@defcitecmd@ii#1{%
  \protected\csedef{blx@cite@#1}{\blxciteicmd{#1}}%
  \blx@defcitecmd@iv{#1}}

\long\def\blx@defcitecmd@iii#1[#2]{%
  \protected\long\csedef{blx@cite@#1}##1##2##3##4{%
    \begingroup
    \blx@citeinit
    \unexpanded{#2}{\blxciteicmd{#1}{##1}{##2}{##3}{}}%
    ##4\endgroup}%
  \blx@defcitecmd@iv{#1}}

\long\def\blx@defcitecmd@iv#1#2#3#4#5{%
  \protected\long\csdef{blx@citei@#1}##1##2##3##4{%
    \ifblank{##1}
      {}
      {\def\abx@field@prenote{##1}}%
    \ifblank{##2}
      {\let\blx@thenotecheck\relax}
      {\def\abx@field@postnote{##2}}%
    \def\blx@precode{\delimcontext{#1}#2}%
    \def\blx@loopcode{#3}%
    \def\blx@dlimcode{#4}%
    \def\blx@postcode{#5}%
    \def\blx@postpunct@saved{##4}%
    \blx@citeloop{##3}%
    \endgroup}}

% {<type>}{<name>}{*}
\def\blx@checkcitecmd#1#2{%
  \ifblank{#2}
    {\ifcsdef{blx@cite@#1}
       {\blx@info{Redefining '\@backslashchar#1'}}
       {\ifcsundef{#1}
          {}
          {\blx@warning@noline{Redefining '\@backslashchar#1'}}}%
     \ifcsdef{blx@cite@#1*}
       {}
       {\csedef{blx@cite@#1*}{%
          \expandafter\noexpand\csname blx@cite@#1\endcsname}%
        \csedef{blx@citei@#1*}{%
          \expandafter\noexpand\csname blx@citei@#1\endcsname}}}
    {\ifcsdef{blx@cite@#1}
       {}
       {\csdef{blx@cite@#1}{\blx@err@citecmd{#1}}%
        \csdef{blx@citei@#1}{\blx@err@citecmd{#1}}}}}

% {<name>}{prenote}{postnote}{citekey}{punct}
\newrobustcmd*{\blxcitecmd}[1]{%
  \ifcsundef{blx@cite@#1}
    {\blx@err@citecmd{#1}}
    {\csuse{blx@cite@#1}}}

\newrobustcmd*{\blxciteicmd}[1]{%
  \begingroup
  \blx@citeinit
  \ifcsundef{blx@citei@#1}
    {\blx@err@citecmd{#1}}
    {\csuse{blx@citei@#1}}}

% {<multicitecount>}{<name>}{prenote}{postnote}{citekey}{punct}
\protected\def\blxmciteicmd#1{%
  \c@multicitecount#1\relax
  \blxciteicmd}

% {<multicitetotal>}{<multiprenote>}{<multipostnote>}
\protected\def\blxmcites#1#2#3{%
  \begingroup
  \blx@citeinit
  \c@multicitecount\z@
  \c@multicitetotal#1\relax
  \ifnum\c@multicitetotal>\@ne
    \let\blx@ifcitesingle\@secondoftwo
  \fi
  \csuse{blx@hook@mcite}%
  \csuse{blx@hook@mcite@next}%
  \ifblank{#2}%
    {}
    {\def\abx@field@multiprenote{#2}}%
  \ifblank{#3}%
    {}
    {\def\abx@field@multipostnote{#3}}%
  \usebibmacro{multiprenote}}

\protected\def\blxendmcites{%
  \usebibmacro{multipostnote}%
  \endgroup}

% {<command>}[<wrapper>]{<cite>}{<delimiter>}
\newrobustcmd{\DeclareMultiCiteCommand}[1]{%
  \ifundef#1%
    {}
    {\blx@info{Redefining '\string#1'}}%
  \@ifnextchar[%]
    {\blx@defmcitecmd{#1}}
    {\blx@defmcitecmd{#1}[\@firstofone]}}

\def\blx@defmcitecmd#1[#2]#3#4{%
  \begingroup
  \escapechar\m@ne
  \edef\blx@tempa{\endgroup
    \protected\def\noexpand#1{%
      \blx@citecmdinit
      \noexpand\@ifstar
        {\expandafter\noexpand
         \csname blx@mcite@\string#1\endcsname*%
         \expandafter\noexpand
         \csname blx@mcitei@\string#1\endcsname}
        {\expandafter\noexpand
         \csname blx@mcite@\string#1\endcsname{}%
         \expandafter\noexpand
         \csname blx@mcitei@\string#1\endcsname}}%
    \protected\csdef{blx@mcite@\string#1}####1####2{%
      \begingroup
      \blx@citeinit
      \noexpand\blx@multicite
        ####2%
        {\unexpanded{#2}}%
        {\string#3####1}%
        {\unexpanded{#4}}}%
    \protected\long\csdef{blx@mcitei@\string#1}}%
  \blx@tempa##1##2##3{##1{##2}##3\endgroup}}

% {<command>}{<wrapper>}{<citecmd>}{<delimiter>} =>
%  <init><command>{<wrapper>}{<cites>}{<punct>}
\def\blx@multicite#1#2#3#4{%
  \begingroup
  \csuse{blx@hook@mcite@before}%
  \def\blx@tempa{#1}%
  \def\blx@tempb{#2}%
  \def\blx@tempc{#3}%
  \def\blx@tempd{#4}%
  \c@multicitetotal\z@
  \blx@multiargs\blx@multicite@i}

\def\blx@multicite@i#1#2{%
  \ifblank{#1}%
    {\let\abx@field@multiprenote\@empty}%
    {\def\abx@field@multiprenote{#1}}%
  \ifblank{#2}%
    {\let\abx@field@multipostnote\@empty}%
    {\def\abx@field@multipostnote{#2}}%
  \let\blx@tempe\@empty
  \let\blx@tempf\@empty
  \togglefalse{blx@tempa}%
  \blx@multiparse}

\def\blx@multicite@add#1#2#3{%
  \togglefalse{blx@tempa}%
  \advance\c@multicitetotal\@ne
  \eappto\blx@tempe{%
    \expandonce\blx@tempf
    \blxmciteicmd{\the\c@multicitetotal}%
    {\expandonce\blx@tempc}\unexpanded{{#1}{#2}{#3}}{}}%
  \let\blx@tempf\blx@tempd
  \blx@multiparse}

\def\blx@multicite@end#1{%
  \edef\blx@tempa{\endgroup
    \expandonce\blx@tempa
      {\expandonce\blx@tempb}%
      {\blxmcites
         {\the\c@multicitetotal}%
         {\expandonce\abx@field@multiprenote}%
         {\expandonce\abx@field@multipostnote}%
       \expandonce\blx@tempe
       \blxendmcites}%
      {#1}%
    \iftoggle{blx@tempa}{\relax\space}{}}%
  \blx@tempa}

\def\blx@multiparse{%
  \futurelet\@let@token\blx@multiparse@i}

\def\blx@multiparse@i{%
  \ifx\@let@token\relax
    \blx@multiparse@ii{\blx@multicite@end{}}%
  \fi
  \ifx\@let@token[%]
    \blx@multiparse@ii{\blx@citeargs\blx@multicite@add}%
  \fi
  \ifx\@let@token\bgroup
    \blx@multiparse@ii{\blx@citeargs\blx@multicite@add}%
  \fi
  \ifx\@let@token\@sptoken
    \blx@multiparse@ii\blx@multiparse@iii
  \fi
  \iftrue
    \iftoggle{blx@tempa}
      {\blx@multiparse@ii{\blx@multicite@end{}}}
      {\blx@multiparse@ii{\blx@thecheckpunct\blx@multicite@end}}%
  \fi
  &}

\def\blx@multiparse@ii#1#2&{\fi#1}
\csdef{blx@multiparse@iii} {\toggletrue{blx@tempa}\blx@multiparse}

% {<name>}[l|i|r]{<cite>}{<multicite>}
\newrobustcmd*{\DeclareAutoCiteCommand}[1]{%
  \ifcsundef{blx@acite@#1}
    {}
    {\blx@info{Redefining autocite command '#1'}}%
  \@ifnextchar[%]
    {\blx@defautocmd@i{#1}}
    {\blx@defautocmd@i{#1}[r]}}

\def\blx@defautocmd@i#1[#2]#3#4{%
  \begingroup
  \escapechar\m@ne
  \edef\blx@tempa{\endgroup
    \noexpand\blx@defautocmd@ii{#1}{#2}%
      {\string#3}{\string#4}}%
  \blx@tempa}

\def\blx@defautocmd@ii#1#2#3#4{%
  \protected\csedef{blx@acite@#1}{%
    \blx@citecmdinit
    \noexpand\@ifstar
      {\blx@citepunct{\expandafter\noexpand
       \csname blx@acitei@#1\endcsname*}}
      {\blx@citepunct{\expandafter\noexpand
       \csname blx@acitei@#1\endcsname{}}}}%
  \protected\csedef{blx@acitei@#1}##1##2##3##4##5{%
    \begingroup
    \blx@citeinit
    \if l#2\noexpand\unspace##5\fi
    \if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##5}\fi
    \blxcitecmd{#3##1}{##2}{##3}{##4}{}%
    \if r#2##5\fi
    \if f#2\noexpand\iftoggle{blx@footnote}{##5}{}\fi
    \endgroup}%
  \protected\csedef{blx@macite@#1}{%
    \blx@citecmdinit
    \noexpand\@ifstar
      {\expandafter\noexpand
       \csname blx@mcite@#4\endcsname*%
       \expandafter\noexpand
       \csname blx@macitei@#1\endcsname}
      {\expandafter\noexpand
       \csname blx@mcite@#4\endcsname{}%
       \expandafter\noexpand
       \csname blx@macitei@#1\endcsname}}%
  \protected\csedef{blx@macitei@#1}##1##2##3{%
    \if l#2\noexpand\unspace##3\fi
    \if f#2\noexpand\iftoggle{blx@footnote}{}{\unspace##3}\fi
    ##1{##2}%
    \if r#2##3\fi
    \if f#2\noexpand\iftoggle{blx@footnote}{##3}{}\fi
    \endgroup}}

% {<characters>}
\newrobustcmd*{\DeclareAutoPunctuation}[1]{%
  \ifblank{#1}
    {\let\blx@thecheckpunct\blx@nocheckpunct}
    {\let\blx@thecheckpunct\blx@checkpunct
     \def\blx@autopunct{#1}}}

\AfterEndPreamble{% babel
  \begingroup
  \makeatletter
  \endlinechar\m@ne
  \scantokens\expandafter{%
    \expandafter\gdef
    \expandafter\blx@autopunct
    \expandafter{\blx@autopunct}}%
  \endgroup}

% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<namelist>}<punct>
\newrobustcmd*{\citename}{\blx@citexpunct{citename}}
\long\csdef{blx@cite@citename}#1#2#3#4#5#6{%
  \begingroup
  \blx@citecmdinit
  \blx@citeinit
  \ifblank{#1}
    {}
    {\def\abx@field@prenote{#1}}%
  \ifblank{#2}
    {\let\blx@thenotecheck\relax}
    {\def\abx@field@postnote{#2}}%
  \def\blx@precode{\usebibmacro{prenote}}%
  \def\blx@loopcode{%
    \ifnameundef{#5}
      {\blx@warning@entry{'#5' undefined or not a name list}%
       \abx@missing{#5}}
      {\printnames[#4]{#5}}}%
  \def\blx@dlimcode{\multicitedelim}%
  \def\blx@postpunct@saved{#6}%
  \ifblank{#2}
    {\let\blx@postcode\@empty}
    {\def\blx@postcode{\usebibmacro{postnote}}}%
  \boolfalse{citetracker}%
  \boolfalse{pagetracker}%
  \blx@citeloop{#3}%
  \endgroup}

% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<list>}<punct>
\newrobustcmd*{\citelist}{\blx@citexpunct{citelist}}
\long\csdef{blx@cite@citelist}#1#2#3#4#5#6{%
  \begingroup
  \blx@citecmdinit
  \blx@citeinit
  \ifblank{#1}
    {}
    {\def\abx@field@prenote{#1}}%
  \ifblank{#2}
    {\let\blx@thenotecheck\relax}
    {\def\abx@field@postnote{#2}}%
  \def\blx@precode{\usebibmacro{prenote}}%
  \def\blx@loopcode{%
    \iflistundef{#5}
      {\blx@warning@entry{'#5' undefined or not a literal list}%
       \abx@missing{#5}}
      {\printlist[#4]{#5}}}%
  \def\blx@dlimcode{\multicitedelim}%
  \def\blx@postpunct@saved{#6}%
  \ifblank{#2}
    {\let\blx@postcode\@empty}
    {\def\blx@postcode{\usebibmacro{postnote}}}%
  \boolfalse{citetracker}%
  \boolfalse{pagetracker}%
  \blx@citeloop{#3}%
  \endgroup}

% [<prenote>][<postnote>]{<entrykey>,...}[<format>]{<field>}<punct>

\newrobustcmd*{\citefield}{\blx@citexpunct{citefield}}
\long\csdef{blx@cite@citefield}#1#2#3#4#5#6{%
  \begingroup
  \blx@citecmdinit
  \blx@citeinit
  \ifblank{#1}
    {}
    {\def\abx@field@prenote{#1}}%
  \ifblank{#2}
    {\let\blx@thenotecheck\relax}
    {\def\abx@field@postnote{#2}}%
  \def\blx@precode{\usebibmacro{prenote}}%
  \def\blx@loopcode{%
    \iffieldundef{#5}
      {\blx@warning@entry{'#5' undefined or not a field}%
       \abx@missing{#5}}
      {\printfield[#4]{#5}}}%
  \def\blx@dlimcode{\multicitedelim}%
  \def\blx@postpunct@saved{#6}%
  \ifblank{#2}
    {\let\blx@postcode\@empty}
    {\def\blx@postcode{\usebibmacro{postnote}}}%
  \boolfalse{citetracker}%
  \boolfalse{pagetracker}%
  \blx@citeloop{#3}%
  \endgroup}

\renewrobustcmd*{\cite}{\blx@err@citecmd\cite}
\let\blx@cite@cite\relax
\newrobustcmd*{\parencite}{\blx@warn@citecmd\parencite\cite}
\let\blx@cite@parencite\relax
\newrobustcmd*{\footcite}{\blx@warn@citecmd\footcite\cite}
\let\blx@cite@footcite\relax
\newrobustcmd*{\footcitetext}{\blx@warn@citecmd\footcitetext\cite}
\let\blx@cite@footcitetext\relax
\newrobustcmd*{\smartcite}{\blx@warn@citecmd\smartcite\cite}
\let\blx@cite@smartcite\relax
\newrobustcmd*{\textcite}{\blx@warn@citecmd\textcite\cite}
\let\blx@cite@textcite\relax
\newrobustcmd*{\supercite}{\blx@warn@citecmd\supercite\cite}
\let\blx@cite@supercite\relax

%% ifthen interface

\def\blx@TE#1#2{%
  \TE@throw
  \unexpanded{%
    \iftrue\@nameuse{fi}%
    #1{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2}

\def\blx@xTE#1#2{%
  \TE@throw
  \unexpanded{\iftrue\@nameuse{fi}}%
  #1\unexpanded{{\@nameuse{iftrue}}{\@nameuse{iffalse}}}#2}

\let\blx@TE@hook\@empty

\appto\blx@blxinit{%
  \appto\blx@TE@hook{%
    \def\ifhyperref{\blx@TE\blx@imc@ifhyperref}%
    \def\ifmorenames{\blx@TE\blx@imc@ifmorenames}%
    \def\ifmoreitems{\blx@TE\blx@imc@ifmoreitems}%
    \def\iffirstcitekey{\blx@TE\blx@imc@iffirstcitekey}%
    \def\iflastcitekey{\blx@TE\blx@imc@iflastcitekey}%
    \def\ifciteseen{\blx@TE\blx@imc@ifciteseen}%
    \def\ifentryseen{\blx@TE\blx@imc@ifentryseen}%
    \def\ifentryinbib{\blx@TE\blx@imc@ifentryinbib}%
    \def\ifciteibid{\blx@TE\blx@imc@ifciteibid}%
    \def\ifciteidem{\blx@TE\blx@imc@ifciteidem}%
    \def\ifopcit{\blx@TE\blx@imc@ifopcit}%
    \def\ifloccit{\blx@TE\blx@imc@ifloccit}%
    \def\ifsamepage{\blx@TE\blx@imc@ifsamepage}%
    \def\iffirstonpage{\blx@TE\blx@imc@iffirstonpage}%
    \def\ifcurrentfield#1{\blx@TE{\blx@imc@ifcurrentfield{#1}}}%
    \def\ifcurrentlist#1{\blx@TE{\blx@imc@ifcurrentlist{#1}}}%
    \def\ifcurrentname#1{\blx@TE{\blx@imc@ifcurrentname{#1}}}%
    \def\ifentrytype#1{\blx@TE{\blx@imc@ifentrytype{#1}}}%
    \def\iffieldequalcs#1#2{\blx@TE{\blx@imc@iffieldequalcs{#1}{#2}}}%
    \def\iffieldequals#1#2{\blx@TE{\blx@imc@iffieldequals{#1}{#2}}}%
    \def\iffieldequalstr#1#2{\blx@TE{\blx@imc@iffieldequalstr{#1}{#2}}}%
    \def\iffieldsequal#1#2{\blx@TE{\blx@imc@iffieldsequal{#1}{#2}}}%
    \def\ifbibmacroundef#1{\blx@TE{\blx@imc@ifbibmacroundef{#1}}}%
    \def\iffieldundef#1{\blx@TE{\blx@imc@iffieldundef{#1}}}%
    \def\ifnameequalcs#1#2{\blx@TE{\blx@imc@ifnameequalcs{#1}{#2}}}%
    \def\ifnameequals#1#2{\blx@TE{\blx@imc@ifnameequals{#1}{#2}}}%
    \def\ifnamesequal#1#2{\blx@TE{\blx@imc@ifnamesequal{#1}{#2}}}%
    \def\ifnameundef#1{\blx@TE{\blx@imc@ifnameundef{#1}}}%
    \def\ifcategory#1{\blx@TE{\blx@imc@ifcategory{#1}}}%
    \def\ifkeyword#1{\blx@TE{\blx@imc@ifkeyword{#1}}}%
    \def\ifentrycategory#1#2{\blx@TE{\blx@imc@ifentrycategory{#1}{#2}}}%
    \def\ifentrykeyword#1#2{\blx@TE{\blx@imc@ifentrykeyword{#1}{#2}}}%
    \def\ifcapital{\blx@TE\blx@imc@ifcapital}%
    \def\ifinteger#1{\blx@TE{\blx@imc@ifinteger{#1}}}%
    \def\iffieldint#1{\blx@TE{\blx@imc@iffieldint{#1}}}%
    \def\ifnumeral#1{\blx@TE{\blx@imc@ifnumeral{#1}}}%
    \def\ifnumerals#1{\blx@TE{\blx@imc@ifnumerals{#1}}}%
    \def\ifpages#1{\blx@TE{\blx@imc@ifpages{#1}}}%
    \def\iffieldnum#1{\blx@TE{\blx@imc@iffieldnum{#1}}}%
    \def\iffieldnums#1{\blx@TE{\blx@imc@iffieldnums{#1}}}%
    \def\iffieldpages#1{\blx@TE{\blx@imc@iffieldpages{#1}}}%
    \def\ifbibstring#1{\blx@TE{\blx@imc@ifbibstring{#1}}}%
    \def\iffieldbibstring#1{\blx@TE{\blx@imc@iffieldbibstring{#1}}}%
    \def\ifnatbibmode{\blx@TE{\iftoggle{blx@natbib}}}%
    \def\ifcitation{\blx@TE{\iftoggle{blx@citation}}}%
    \def\ifbibliography{\blx@TE{\iftoggle{blx@bibliography}}}%
    \def\ifciteindex{\blx@TE{\iftoggle{blx@citeindex}}}%
    \def\ifbibindex{\blx@TE{\iftoggle{blx@bibindex}}}%
    \def\iffootnote{\blx@TE{\iftoggle{blx@footnote}}}%
    \def\ifuseprefix{\blx@TE{\iftoggle{blx@useprefix}}}%
    \def\ifterseinits{\blx@TE{\iftoggle{blx@terseinits}}}%
    \def\ifsingletitle{\blx@TE{\iftoggle{abx@bool@singletitle}}}%
    \def\ifuniquetitle{\blx@TE{\iftoggle{abx@bool@uniquetitle}}}%
    \def\ifuniquebaretitle{\blx@TE{\iftoggle{abx@bool@uniquebaretitle}}}%
    \def\ifuniquework{\blx@TE{\iftoggle{abx@bool@uniquework}}}%
    \def\ifuniqueprimaryauthor{\blx@TE{\iftoggle{abx@bool@uniqueprimaryauthor}}}%
    \def\ifandothers#1{\blx@TE{\iftoggle{abx@bool@more#1}}}%
    \def\iflabeldateisdate{\blx@TE\blx@imc@iflabeldateisdate}%
    \def\ifdatehasyearonlyprecision#1{%
      \blx@TE{\blx@imc@ifdatehasyearonlyprecision{#1}}}%
    \def\ifdatehastime#1{\blx@TE{\blx@imc@ifdatehastime{#1}}}%
    \def\ifdateshavedifferentprecision#1#2{%
      \blx@TE{\blx@imc@ifdateshavedifferentprecision{#1}{#2}}}}}

% {<listmacro>}{<filtercsname>} => matches in <listmacro>
\protected\def\blx@bibfilter#1#2{%
  \begingroup
  \edef\blx@do##1{%
    \def\noexpand\blx@flt@item{##1}%
    \ifboolexpr{\csexpandonce{#2}}%
      {\listadd\noexpand\blx@tempa{##1}}%
      {}}%
  \let\blx@done\relax
  \edef\blx@tempa{%
    \let\noexpand\blx@tempa\noexpand\@empty
    \blx@listloop{#1}}%
  \blx@tempa
  \edef\blx@tempa{\endgroup
    \def\noexpand#1{\blx@tempa}}%
  \blx@tempa}

%% Auxiliary macros
\newrobustcmd*{\mkbibquote}{\enquote}
\protected\def\blx@imc@mkbibquote{%
  \blx@ifuspunct\blx@usquote\enquote}

\def\blx@usquote{%
  \ifnum\@quotelevel>\z@
    \expandafter\blx@usiquote
  \else
    \expandafter\blx@usoquote
  \fi}

\long\def\blx@usoquote#1{%
  \begingroup
  \initoquote
  \textooquote#1%
  \futurelet\@let@token\blx@usoquote@i}

\def\blx@usoquote@i{%
  \blx@usqcheck
    {\ifx\blx@postpunct\@empty\else\blx@dopostpunct\fi
     \textcoquote\endgroup}
    {\blx@setpostpunct\textcoquote\endgroup}}

\long\def\blx@usiquote#1{%
  \begingroup
  \initiquote
  \textoiquote#1%
  \futurelet\@let@token\blx@usiquote@i}

\def\blx@usiquote@i{%
  \blx@usqcheck
    {\textciquote\endgroup}
    {\blx@setpostpunct\textciquote\endgroup}}

\long\def\blx@usqcheck#1#2{%
  \def\blx@tempa{#1}%
  \def\blx@tempb{#2}%
  \ifx\@let@token\space
    \blx@usqcheck@i\blx@tempa
  \fi
  \ifx\@let@token\@sptoken
    \blx@usqcheck@i\blx@tempa
  \fi
  \if\noexpand\@let@token\relax
    \expandafter\blx@usqcheck@iv
  \fi
  \expandafter\blx@usqcheck@ii\blx@quotepunct\relax&}

\long\def\blx@usqcheck@i#1#2&{\fi#1}

\long\def\blx@usqcheck@ii#1{%
  \if\noexpand#1\relax
    \blx@usqcheck@i\blx@tempa
  \fi
  \if\noexpand#1\noexpand\@let@token
    \blx@usqcheck@i{\blx@usqcheck@iii\blx@tempa}%
  \fi
  \blx@usqcheck@ii
}

\long\def\blx@usqcheck@iii#1#2{#2#1}

\long\def\blx@usqcheck@iv#1&#2{%
  \begingroup
    \escapechar=-1 %
    \edef\blx@tempa{\expandafter\@gobble\string#2}%
    \expandafter\endgroup
    \ifx\blx@tempa\@empty
    \else
      \blx@usqcheck@i\blx@tempb
    \fi
    #1&#2%
}

\newrobustcmd*{\mkbibemph}{\emph}
\protected\long\def\blx@imc@mkbibemph#1{%
  \emph{#1}\blx@imc@setpunctfont\emph}

\newrobustcmd*{\mkbibbold}{\textbf}
\protected\long\def\blx@imc@mkbibbold#1{%
  \textbf{#1}\blx@imc@setpunctfont\textbf}

\newrobustcmd*{\mkbibitalic}{\textit}
\protected\long\def\blx@imc@mkbibitalic#1{%
  \textit{#1}\blx@imc@setpunctfont\textit}

\blx@regimcs{\mkbibquote \mkbibemph \mkbibbold \mkbibitalic}

\newcommand*{\bibleftparen}{\blx@postpunct(}
\newcommand*{\bibrightparen}{\blx@postpunct)\midsentence}
\newcommand*{\bibleftbracket}{\blx@postpunct[}
\newcommand*{\bibrightbracket}{\blx@postpunct]\midsentence}

\def\blx@parenlevel{%
  \iftoggle{blx@footnote}
    {\blx@parenlevel@foot}
    {\blx@parenlevel@text}}

\newrobustcmd*{\blx@bibopenparen}{%
  \blx@opencheck\bibopenparen
  \blx@postpunct
  \ifnum\blx@parenlevel=\z@
    \global\blx@parenlevel\@ne
    \global\c@parenlevel\@ne
    \expandafter\bibleftparen
  \else
    \expandafter\blx@openparen
  \fi}

\newrobustcmd*{\blx@bibopenbracket}{%
  \blx@opencheck\bibopenbracket
  \blx@postpunct
  \ifnum\blx@parenlevel=\z@
    \global\blx@parenlevel1002
    \global\c@parenlevel\@ne
    \expandafter\bibleftbracket
  \else
    \expandafter\blx@openparen
  \fi}

\newrobustcmd*{\blx@bibcloseparen}{%
  \blx@closecheck\bibcloseparen
  \blx@postpunct\blx@closeparen}

\newrobustcmd*{\blx@bibclosebracket}{%
  \blx@closecheck\bibclosebracket
  \blx@postpunct\blx@closeparen}

\def\blx@openparen{%
  \ifodd\blx@parenlevel
    \global\advance\blx@parenlevel\@ne
    \global\advance\c@parenlevel\@ne
    \expandafter\bibleftbracket
  \else
    \global\advance\blx@parenlevel\@ne
    \global\advance\c@parenlevel\@ne
    \expandafter\bibleftparen
  \fi}

\def\blx@closeparen{%
  \ifodd\blx@parenlevel
    \blx@closeparen@i
    \expandafter\bibrightparen
  \else
    \blx@closeparen@i
    \expandafter\bibrightbracket
  \fi}

\def\blx@closeparen@i{%
  \ifnum\blx@parenlevel=1002
    \global\blx@parenlevel\z@
    \global\c@parenlevel\z@
  \else
    \global\advance\blx@parenlevel\m@ne
    \global\advance\c@parenlevel\m@ne
  \fi}

\def\blx@opencheck#1{%
  \ifnum\numexpr\blx@parenlevel+\@ne
    \ifnum\blx@parenlevel>\@m -1001\fi
  >\c@maxparens
    \blx@err@nestparen{\string#1}%
    \blx@errormark
  \fi}

\def\blx@closecheck#1{%
  \ifnum\numexpr\blx@parenlevel
    \ifnum\blx@parenlevel>\@m -1001\fi
  >\c@maxparens
    \blx@err@nestparen{\string#1}%
    \blx@errormark
  \fi
  \ifnum\blx@parenlevel<\@ne
    \blx@err@matchparen{Unmatched \string#1}%
    \blx@errormark
  \fi}

\protected\def\blx@errormark{%
  \rule[0.25ex]{1.25ex}{1.25ex}}

\AtEndDocument{%
  \unless\ifnum\blx@parenlevel@text=\z@
    \blx@err@matchparen{%
      Unbalanced parentheses or brackets in the document body}%
  \fi
  \unless\ifnum\blx@parenlevel@foot=\z@
    \blx@err@matchparen{%
      Unbalanced parentheses or brackets in a foot or endnote}%
  \fi}

\newrobustcmd{\mkbibparens}[1]{%
  \begingroup
  \blx@blxinit
  \blx@setsfcodes
  \bibopenparen#1\bibcloseparen
  \endgroup}

\newrobustcmd{\mkbibbrackets}[1]{%
  \begingroup
  \blx@blxinit
  \blx@setsfcodes
  \bibopenbracket#1\bibclosebracket
  \endgroup}

\newrobustcmd*{\parentext}{\mkbibparens}
\newrobustcmd*{\brackettext}{\mkbibbrackets}

\newrobustcmd{\mkbibsuperscript}[1]{%
  \unspace\allowhyphens\textsuperscript{%
    \begingroup
    \protected\long\def\mkbibsuperscript##1{%
      \blx@warning{Nested superscript}%
      \mkbibbrackets{##1}}%
    #1\endgroup}}

\newrobustcmd{\mkbibfootnote}{\blx@mkbibfootnote{}}
\newrobustcmd{\mkbibfootnotetext}{\blx@mkbibfootnote{text}}
\newrobustcmd{\blx@mkbibfootnote}[2]{%
  \iftoggle{blx@footnote}
    {\blx@warning{Nested notes}%
     \addspace\mkbibparens{#2}}
    {\unspace
     \ifnum\blx@notetype=\tw@
       \expandafter\@firstoftwo
     \else
       \expandafter\@secondoftwo
     \fi
       {\csuse{blx@theendnote#1}{\protecting{\blxmkbibnote{end}{#2}}}}
       {\csuse{footnote#1}{\protecting{\blxmkbibnote{foot}{#2}}}}}}

\newrobustcmd{\mkbibendnote}{\blx@mkbibendnote{}}
\newrobustcmd{\mkbibendnotetext}{\blx@mkbibendnote{text}}
\newrobustcmd{\blx@mkbibendnote}[2]{%
  \iftoggle{blx@footnote}
    {\blx@warning{Nested notes}%
     \addspace\mkbibparens{#2}}
    {\unspace
     \ifnum\blx@notetype=\@ne
       \expandafter\@firstoftwo
     \else
       \expandafter\@secondoftwo
     \fi
       {\csuse{footnote#1}{\protecting{\blxmkbibnote{foot}{#2}}}}
       {\csuse{blx@theendnote#1}{\protecting{\blxmkbibnote{end}{#2}}}}}}

\newrobustcmd{\blxmkbibnote}[2]{%
  \begingroup
  \blx@blxinit
  \blx@setsfcodes
  \blx@postpunct@agroup
  \toggletrue{blx@footnote}%
  \csuse{bib#1notewrapper}{#2}%
  \endgroup}

\newcommand{\bibfootnotewrapper}[1]{%
  \bibsentence#1\addperiod}

\newcommand{\bibendnotewrapper}[1]{%
  \bibsentence#1\addperiod}

\AtEndPreamble{%
  \def\blx@theendnote{\blx@err@endnote\footnote}%
  \def\blx@theendnotetext{\blx@err@endnote\footnotetext}%
  \ifdef\endnote
    {\def\blx@theendnote{\endnote}%
     \ifdef\endnotetext
       {\def\blx@theendnotetext{\endnotetext}}
       {}}
    {\ifdef\pagenote
       {\def\blx@theendnote{\pagenote}%
        \ifdef\pagenotetext
          {\def\blx@theendnotetext{\pagenotetext}}
          {}}
       {}}}

\newrobustcmd*{\mknumalph}[1]{%
  \begingroup
  \blx@tempcnta=#1\relax
  \ifnum\blx@tempcnta>702 %
  \else
    \ifnum\blx@tempcnta>26 %
      \advance\blx@tempcnta\m@ne
      \divide\blx@tempcnta26\relax
      \blx@numalph\blx@tempcnta
      \multiply\blx@tempcnta26\relax
      \blx@tempcnta=\numexpr#1-\blx@tempcnta\relax
    \fi
  \fi
  \blx@numalph\blx@tempcnta
  \endgroup}
\def\blx@numalph#1{%
  \ifcase#1\relax\blx@warning@entry{Value out of range}\number#1\or
  a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or
  n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else
  \blx@warning@entry{Value out of range}\number#1\fi}

% {<macro>}[<pre>]{<vol>}[<post>] => <macro>{<pre>}{{<vol>}{<post>}}

\newrobustcmd*{\volcitecmd}{%
  \AtNextCite{\DeclareFieldAlias{postnote}{volcitenote}}%
  \begingroup\let\blx@citeargs\blx@volciteargs}

\protected\def\blx@volciteargs#1{%
  \endgroup
  \@ifnextchar[%]
    {\blx@volciteargs@i{#1}}
    {\blx@volciteargs@i{#1}[]}}

\long\def\blx@volciteargs@i#1[#2]#3{%
  \@ifnextchar[%]
    {\blx@volciteargs@ii{#1}{#2}{#3}}
    {\blx@citeargs@iii{#1{#2}{{#3}{}}}}}

\long\def\blx@volciteargs@ii#1#2#3[#4]{%
  \blx@citeargs@iii{#1{#2}{{#3}{#4}}}}

\newrobustcmd*{\multivolcitecmd}{%
  \AtNextCite{\DeclareFieldAlias{postnote}{volcitenote}}%
  \def\blx@hook@mcite@before{%
    \global\undef\blx@hook@mcite@before
    \let\blx@citeargs\blx@volmciteargs}}

\protected\def\blx@volmciteargs#1{%
  \@ifnextchar[%]
    {\blx@volciteargs@i{#1}}
    {\blx@volciteargs@i{#1}[]}}

%% Control file

\begingroup
\let~\space
\@makeother\<
\@makeother\>
\@makeother\.
\@makeother\:
\@makeother\?
\@makeother\"
\@makeother\-
\@makeother\=
\@makeother\/
\xdef\blx@xml@file{%
  \blx@sig@bcf\blx@nl
  \blx@ver@bcf\blx@nl}
\xdef\blx@xml@endfile{%
  </bcf:controlfile>}
\xdef\blx@xml@comment#1{%
  ~~<!-- #1 -->\blx@nl}
\xdef\blx@xml@options#1#2#3{%
  ~~<bcf:options%
    \noexpand\ifblank{#1}{}{ component="#1"}%
    \noexpand\ifblank{#2}{}{ type="#2"}%
  >\blx@nl
  #3%
  ~~</bcf:options>\blx@nl}
\xdef\blx@xml@option#1#2{%
  ~~~~<bcf:option type="#1">\blx@nl
  #2%
  ~~~~</bcf:option>\blx@nl}
\xdef\blx@xml@ordered#1#2#3{%
  ~~~~~~<bcf:value order="#1"#2%
  >#3</bcf:value>\blx@nl}

\xdef\blx@xml@datafieldset#1#2{%
  ~~<bcf:datafieldset name="#1">\blx@nl
  #2%
  ~~</bcf:datafieldset>\blx@nl}

\xdef\blx@xml@datafieldsets@member#1{%
  ~~~~<bcf:member#1/>\blx@nl}

\xdef\blx@xml@transliteration#1#2{%
  ~~<bcf:transliteration entrytype="#1">\blx@nl
  #2%
  ~~</bcf:transliteration>\blx@nl}
\xdef\blx@xml@translit#1#2#3{%
  ~~~~<bcf:translit target="#1" from="#2" to="#3"/>\blx@nl}

\xdef\blx@xml@sourcemap#1{%
  ~~<bcf:sourcemap>\blx@nl
  #1%
  ~~</bcf:sourcemap>\blx@nl}
\xdef\blx@xml@sourcemap@maps#1#2{%
  ~~~~<bcf:maps#1>\blx@nl
  #2%
  ~~~~</bcf:maps>\blx@nl}
\xdef\blx@xml@sourcemap@map#1#2{%
  ~~~~~~<bcf:map#1>\blx@nl
  #2%
  ~~~~~~</bcf:map>\blx@nl}
\xdef\blx@xml@sourcemap@perdatasource#1{%
  ~~~~~~~~<bcf:per\string_datasource>#1</bcf:per\string_datasource>\blx@nl}
\xdef\blx@xml@sourcemap@pertype#1{%
  ~~~~~~~~<bcf:per\string_type>#1</bcf:per\string_type>\blx@nl}
\xdef\blx@xml@sourcemap@pernottype#1{%
  ~~~~~~~~<bcf:per\string_nottype>#1</bcf:per\string_nottype>\blx@nl}
\xdef\blx@xml@sourcemap@step#1{%
  ~~~~~~~~<bcf:map\string_step#1/>\blx@nl}

\xdef\blx@xml@labelalphanametemplate#1#2{%
  ~~<bcf:labelalphanametemplate name="#1">\blx@nl
  #2%
  ~~</bcf:labelalphanametemplate>\blx@nl}
\xdef\blx@xml@labelalphanametemplatenamepart#1#2#3{%
  ~~~~<bcf:namepart #1#2>#3</bcf:namepart>\blx@nl}

\xdef\blx@xml@labelalphatemplate#1#2{%
  ~~<bcf:labelalphatemplate type="#1">\blx@nl
  #2%
  ~~</bcf:labelalphatemplate>\blx@nl}
\xdef\blx@xml@labelalpha@element#1#2{%
  ~~~~<bcf:labelelement order="#1">\blx@nl
  #2%
  ~~~~</bcf:labelelement>\blx@nl}
\xdef\blx@xml@labelalpha@part#1#2{%
  ~~~~~~<bcf:labelpart#1>#2</bcf:labelpart>\blx@nl}

\xdef\blx@xml@extradate#1{%
  ~~<bcf:extradatespec>\blx@nl
  #1%
  ~~</bcf:extradatespec>\blx@nl}
\xdef\blx@xml@extradatescope#1{%
  ~~~~<bcf:scope>\blx@nl
  #1%
  ~~~~</bcf:scope>\blx@nl}
\xdef\blx@xml@edordered#1#2{%
  ~~~~~~<bcf:field order="#1">#2</bcf:field>\blx@nl}

\xdef\blx@xml@inheritance#1{%
  ~~<bcf:inheritance>\blx@nl
  #1%
  ~~</bcf:inheritance>\blx@nl}
\xdef\blx@xml@inherit@defaults#1#2{%
  ~~~~<bcf:defaults#1>\blx@nl
  #2%
  ~~~~</bcf:defaults>\blx@nl}
\xdef\blx@xml@inherit@data#1#2{%
  ~~~~<bcf:inherit#1>\blx@nl
  #2%
  ~~~~</bcf:inherit>\blx@nl}
\xdef\blx@xml@inherit@type#1#2#3{%
  ~~~~~~<bcf:type\string_pair source="#1" target="#2"#3/>\blx@nl}
\xdef\blx@xml@inherit@field#1#2#3{%
  ~~~~~~<bcf:field source="#1" target="#2"#3/>\blx@nl}
\xdef\blx@xml@inherit@block#1{%
  ~~~~~~<bcf:field source="#1" skip="true"/>\blx@nl}

\xdef\blx@xml@nosorts#1{%
  ~~<bcf:nosorts>\blx@nl
  #1%
  ~~</bcf:nosorts>\blx@nl}
\xdef\blx@xml@nosort#1#2{%
  ~~~~<bcf:nosort field="#1" value="#2"/>\blx@nl}

\xdef\blx@xml@noinits#1{%
  ~~<bcf:noinits>\blx@nl
  #1%
  ~~</bcf:noinits>\blx@nl}
\xdef\blx@xml@noinit#1{%
  ~~~~<bcf:noinit value="#1"/>\blx@nl}

\xdef\blx@xml@nolabels#1{%
  ~~<bcf:nolabels>\blx@nl
  #1%
  ~~</bcf:nolabels>\blx@nl}
\xdef\blx@xml@nolabel#1{%
  ~~~~<bcf:nolabel value="#1"/>\blx@nl}

\xdef\blx@xml@nolabelwidthcounts#1{%
  ~~<bcf:nolabelwidthcounts>\blx@nl
  #1%
  ~~</bcf:nolabelwidthcounts>\blx@nl}
\xdef\blx@xml@nolabelwidthcount#1{%
  ~~~~<bcf:nolabelwidthcount value="#1"/>\blx@nl}

\xdef\blx@xml@uniquenametemplate#1#2{%
  ~~<bcf:uniquenametemplate name="#1">\blx@nl%
  #2%
  ~~</bcf:uniquenametemplate>\blx@nl}

\xdef\blx@xml@uniquenametemplatenamepart#1#2#3{%
  ~~~~<bcf:namepart #1#2>#3</bcf:namepart>\blx@nl}

\xdef\blx@xml@sortingnamekeytemplate#1#2{%
  ~~<bcf:sortingnamekeytemplate name="#1">\blx@nl%
  #2%
  ~~</bcf:sortingnamekeytemplate>\blx@nl}

\xdef\blx@xml@sortingnamekeykeypart#1#2{%
  ~~~~<bcf:keypart#1>\blx@nl
  #2%
  ~~~~</bcf:keypart>\blx@nl}

\xdef\blx@xml@sortingnamekeynamepart#1#2#3{%
  ~~~~~~<bcf:part type="namepart"#1#2>#3</bcf:part>\blx@nl}

\xdef\blx@xml@sortingnamekeyliteral#1#2{%
  ~~~~~~<bcf:part type="literal"#1>#2</bcf:part>\blx@nl}

\xdef\blx@xml@sortingtemplate#1#2#3{%
  ~~<bcf:sortingtemplate name="#1"#2>\blx@nl%
  #3%
  ~~</bcf:sortingtemplate>\blx@nl}
\xdef\blx@xml@presort#1#2{%
  ~~<bcf:presort\noexpand\ifblank{#1}{}{ type="#1"}>%
  #2</bcf:presort>\blx@nl}

\xdef\blx@xml@sortexclude#1#2{%
  ~~<bcf:sortexclusion\noexpand\ifblank{#1}{}{ type="#1"}>\blx@nl
  #2%
  ~~</bcf:sortexclusion>\blx@nl}
\xdef\blx@xml@exclude#1{%
  ~~~~<bcf:exclusion>#1</bcf:exclusion>\blx@nl}
\xdef\blx@xml@sortinclude#1#2{%
  ~~<bcf:sortinclusion\noexpand\ifblank{#1}{}{ type="#1"}>\blx@nl
  #2%
  ~~</bcf:sortinclusion>\blx@nl}
\xdef\blx@xml@include#1{%
  ~~~~<bcf:inclusion>#1</bcf:inclusion>\blx@nl}
\xdef\blx@xml@sort#1#2{%
  ~~~~<bcf:sort #1>\blx@nl
  #2%
  ~~~~</bcf:sort>\blx@nl}
\xdef\blx@xml@sortitem#1#2{%
  ~~~~~~<bcf:sortitem #1>#2</bcf:sortitem>\blx@nl}
\xdef\blx@xml@section#1{%
  ~~<bcf:section number="#1">}
\xdef\blx@xml@endsection{%
  ~~</bcf:section>}

\xdef\blx@xml@dlist@refcontext#1#2#3#4#5{%
  ~~~~~~~~~~~~~~~~sortingtemplatename="#1"\blx@nl
  ~~~~~~~~~~~~~~~~sortingnamekeytemplatename="#2"\blx@nl
  ~~~~~~~~~~~~~~~~labelprefix="#3"\blx@nl
  ~~~~~~~~~~~~~~~~uniquenametemplatename="#4"\blx@nl
  ~~~~~~~~~~~~~~~~labelalphanametemplatename="#5"}
\xdef\blx@xml@dlist#1#2#3#4#5{%
  ~~<bcf:datalist section="#3"\blx@nl
  ~~~~~~~~~~~~~~~~name="#1"\blx@nl
  ~~~~~~~~~~~~~~~~type="#2"\blx@nl
  #4>\blx@nl
  #5%
  ~~</bcf:datalist>\blx@nl}
\xdef\blx@xml@dlistfilterorbegin{%
  ~~~~<bcf:filteror>\blx@nl}
\xdef\blx@xml@dlistfilterorend{%
  ~~~~</bcf:filteror>\blx@nl}
\xdef\blx@xml@dlistfilter#1#2{%
  ~~~~<bcf:filter type="#1">#2</bcf:filter>\blx@nl}

\xdef\blx@xml@bibdata#1#2{%
  ~~<bcf:bibdata section="#1">\blx@nl
  #2%
  ~~</bcf:bibdata>\blx@nl}
\xdef\blx@xml@datasource#1#2#3{%
  ~~~~<bcf:datasource type="#1" datatype="#2">#3</bcf:datasource>\blx@nl}
\xdef\blx@xml@citekey#1#2{%
  ~~~~<bcf:citekey order="#2">#1</bcf:citekey>}
\xdef\blx@xml@citeset#1#2{%
  ~~~~<bcf:citekey type="set" members="#2">#1</bcf:citekey>}
\xdef\blx@xml@svalue#1#2{%
  \blx@xml@option{singlevalued}{%
  ~~~~~~<bcf:key>#1</bcf:key>\blx@nl
  ~~~~~~<bcf:value>#2</bcf:value>\blx@nl}}
\xdef\blx@xml@mvalue#1#2{%
  \blx@xml@option{multivalued}{%
  ~~~~~~<bcf:key>#1</bcf:key>\blx@nl
  #2}}
\xdef\blx@xml@toggle#1{%
  \blx@xml@svalue{#1}{\noexpand\iftoggle{blx@#1}{1}{0}}}
\xdef\blx@xml@options@scope#1#2{%
  ~~<bcf:optionscope type="#1">\blx@nl
  #2%
  ~~</bcf:optionscope>\blx@nl}
\xdef\blx@xml@option@scope#1#2{%
  ~~~~<bcf:option datatype="#1">#2</bcf:option>\blx@nl}
\endgroup

\def\blx@bcf@options@global{%
  \blx@xml@comment{GLOBAL}%
  \blx@xml@options{biblatex}{global}{%
    \blx@xml@svalue{alphaothers}{\labelalphaothers}%
    \blx@xml@toggle{labelalpha}%
    \blx@xml@mvalue{labelnamespec}{\blx@bcf@labelnamespec}%
    \blx@xml@toggle{labeltitle}%
    \blx@xml@mvalue{labeltitlespec}{\blx@bcf@labeltitlespec}%
    \blx@xml@toggle{labeltitleyear}%
    \blx@xml@toggle{labeldateparts}%
    \blx@xml@mvalue{labeldatespec}{\blx@bcf@labeldatespec}%
    \blx@xml@toggle{julian}%
    \blx@xml@svalue{gregorianstart}{\blx@gregorianstart}%
    \blx@xml@svalue{maxalphanames}{\blx@maxalphanames}%
    \blx@xml@svalue{maxbibnames}{\blx@maxbibnames}%
    \blx@xml@svalue{maxcitenames}{\blx@maxcitenames}%
    \blx@xml@svalue{maxitems}{\blx@maxitems}%
    \blx@xml@svalue{minalphanames}{\blx@minalphanames}%
    \blx@xml@svalue{minbibnames}{\blx@minbibnames}%
    \blx@xml@svalue{mincitenames}{\blx@mincitenames}%
    \blx@xml@svalue{minitems}{\blx@minitems}%
    \blx@xml@toggle{singletitle}%
    \blx@xml@svalue{sortalphaothers}{\sortalphaothers}%
    \blx@xml@svalue{sortlocale}{\blx@sortlocale}%
    \blx@xml@svalue{sortingtemplatename}{\blx@sorting}%
    \blx@xml@toggle{sortsets}%
    \blx@xml@svalue{uniquelist}{\blx@uniquelist}%
    \blx@xml@svalue{uniquename}{\blx@uniquename}%
    \blx@xml@toggle{uniqueprimaryauthor}%
    \blx@xml@toggle{uniquetitle}%
    \blx@xml@toggle{uniquebaretitle}%
    \blx@xml@toggle{uniquework}%
    \blx@xml@toggle{useprefix}%
    \blx@xml@nametoggles
  }%
}

\def\blx@bcf@options@type#1{%
  \blx@xml@comment{#1}%
  \blx@xml@options{biblatex}{#1}{%
    \blx@xml@toggle{labelalpha}%
    \blx@xml@mvalue{labelnamespec}{%
      \ifcsdef{blx@bcf@labelnamespec@#1}
        {\csuse{blx@bcf@labelnamespec@#1}}
        {\blx@bcf@labelnamespec}}%
    \blx@xml@toggle{labeltitle}%
    \blx@xml@mvalue{labeltitlespec}{%
      \ifcsdef{blx@bcf@labeltitlespec@#1}
        {\csuse{blx@bcf@labeltitlespec@#1}}
        {\blx@bcf@labeltitlespec}}%
    \blx@xml@toggle{labeltitleyear}%
    \blx@xml@toggle{labeldateparts}%
    \blx@xml@mvalue{labeldatespec}{%
      \ifcsdef{blx@bcf@labeldatespec@#1}
        {\csuse{blx@bcf@labeldatespec@#1}}
        {\blx@bcf@labeldatespec}}%
    \blx@xml@svalue{maxalphanames}{\blx@maxalphanames}%
    \blx@xml@svalue{maxbibnames}{\blx@maxbibnames@type}%
    \blx@xml@svalue{maxcitenames}{\blx@maxcitenames@type}%
    \blx@xml@svalue{maxitems}{\blx@maxitems@type}%
    \blx@xml@svalue{minalphanames}{\blx@minalphanames}%
    \blx@xml@svalue{minbibnames}{\blx@minbibnames@type}%
    \blx@xml@svalue{mincitenames}{\blx@mincitenames@type}%
    \blx@xml@svalue{minitems}{\blx@minitems@type}%
    \blx@xml@toggle{singletitle}%
    \blx@xml@toggle{skipbib}%
    \blx@xml@toggle{skiplab}%
    \blx@xml@toggle{skipbiblist}%
    \blx@xml@svalue{uniquelist}{\blx@uniquelist}%
    \blx@xml@svalue{uniquename}{\blx@uniquename}%
    \blx@xml@toggle{uniqueprimaryauthor}%
    \blx@xml@toggle{uniquetitle}%
    \blx@xml@toggle{uniquebaretitle}%
    \blx@xml@toggle{uniquework}%
    \blx@xml@toggle{useprefix}%
    \blx@xml@nametoggles
  }%
}

\def\blx@ctrlwrite{%
  \begingroup
  \blx@safe@actives
  \let\protect\string
  % options
  \edef\labelalphaothers{\labelalphaothers}%
  \edef\sortalphaothers{\sortalphaothers}%
  \blx@xmlsanitizeafter{\def\labelalphaothers}{\labelalphaothers}%
  \blx@xmlsanitizeafter{\def\sortalphaothers}{\sortalphaothers}%
  % Expand the global use* name toggles
  \let\blx@xml@nametoggles\@empty
  \def\do##1{\eappto\blx@xml@nametoggles{\blx@xml@toggle{use##1}}}%
  \abx@donames
  \edef\blx@tempa{%
    \blx@xml@file
    \blx@xml@comment{BIBER OPTIONS}%
    \blx@xml@options{biber}{global}{%
      \blx@xml@svalue{output_encoding}{\blx@texencoding}%
      \blx@xml@svalue{input_encoding}{\blx@bibencoding}%
      \blx@xml@toggle{debug}%
      \blx@xml@svalue{mincrossrefs}{\blx@mincrossrefs}%
      \blx@xml@svalue{minxrefs}{\blx@minxrefs}%
      \blx@xml@toggle{sortcase}%
      \blx@xml@toggle{sortupper}%
    }%
    \blx@xml@comment{BIBLATEX OPTIONS}%
    \blx@bcf@options@global
  }%
  \ifdef\blx@opts@type
    {\def\do##1{%
       \begingroup
       \blx@setoptions@type{##1}%
       % Expand the type use* name toggles
       \let\blx@xml@nametoggles\@empty
       \def\do####1{\eappto\blx@xml@nametoggles{\blx@xml@toggle{use####1}}}%
       \abx@donames
       \begingroup
       \let\protect\relax
       \blx@checkoptions@type
       \endgroup
       \xappto\blx@tempa{\blx@bcf@options@type{##1}}%
       \endgroup}%
     \dolistloop\blx@opts@type}
    {}%
  % options scope
  % GLOBAL
  \def\do##1{%
    \begingroup
    \def\do####1{\xappto\blx@bcf@options@scope@global{\blx@xml@option@scope{##1}{####1}}}%
    \dolistcsloop{blx@globalopts@##1}%
    \endgroup}%
  \dolistloop\blx@globalopts@datatypes
  % ENTRYTYPE
  \def\do##1{%
    \begingroup
    \def\do####1{\xappto\blx@bcf@options@scope@type{\blx@xml@option@scope{##1}{####1}}}%
    \dolistcsloop{blx@typeopts@##1}%
    \endgroup}%
  \dolistloop\blx@typeopts@datatypes
  % ENTRY
  \def\do##1{%
    \begingroup
    \def\do####1{\xappto\blx@bcf@options@scope@entry{\blx@xml@option@scope{##1}{####1}}}%
    \dolistcsloop{blx@entryopts@##1}%
    \endgroup}%
  \dolistloop\blx@entryopts@datatypes
  % NAMELIST
  \def\do##1{%
    \begingroup
    \def\do####1{\xappto\blx@bcf@options@scope@namelist{\blx@xml@option@scope{##1}{####1}}}%
    \dolistcsloop{blx@namelistopts@##1}%
    \endgroup}%
  \dolistloop\blx@entryopts@datatypes
  % NAME
  \def\do##1{%
    \begingroup
    \def\do####1{\xappto\blx@bcf@options@scope@name{\blx@xml@option@scope{##1}{####1}}}%
    \dolistcsloop{blx@nameopts@##1}%
    \endgroup}%
  \dolistloop\blx@entryopts@datatypes

  \eappto\blx@tempa{%
    \blx@xml@comment{BIBLATEX OPTION SCOPE}%
    \blx@xml@options@scope{GLOBAL}{\blx@bcf@options@scope@global}%
    \blx@xml@options@scope{ENTRYTYPE}{\blx@bcf@options@scope@type}%
    \blx@xml@options@scope{ENTRY}{\blx@bcf@options@scope@entry}%
    \blx@xml@options@scope{NAMELIST}{\blx@bcf@options@scope@namelist}%
    \blx@xml@options@scope{NAME}{\blx@bcf@options@scope@name}}
  % datafieldsets
  \def\do##1{%
    \xappto\blx@bcf@datafieldsets{\blx@xml@datafieldset{##1}{\csuse{blx@datafieldsetmembers@##1}}}}
  \dolistloop\blx@datafieldsets

  \eappto\blx@tempa{%
    \blx@xml@comment{DATAFIELDSETS}%
    \blx@bcf@datafieldsets}%
  % sourcemap
  \ifbool{sourcemap}
  {\eappto\blx@tempa{%
     \blx@xml@comment{SOURCEMAP}%
     \blx@xml@sourcemap{%
       \ifdef\blx@sourcemap@user
         {\blx@sourcemap@user}
         {}%
       \ifdef\blx@sourcemap@style
         {\blx@sourcemap@style}
         {}%
       \ifdef\blx@sourcemap@defaults@bibtex
         {\blx@sourcemap@defaults@bibtex}
         {}%
       \ifdef\blx@sourcemap@defaults@biblatexml
         {\blx@sourcemap@defaults@biblatexml}
         {}}}}
  {}%
  % labelalpha name template
  \eappto\blx@tempa{\blx@xml@comment{LABELALPHA NAME TEMPLATE}}%
  \def\do##1{%
    \eappto\blx@tempa{%
      \blx@xml@labelalphanametemplate{##1}{\csuse{blx@labelalphanametemplate@##1}}}}%
  \dolistloop\blx@lantemplatespecs
  % labelalpha template
  \eappto\blx@tempa{%
    \blx@xml@comment{LABELALPHA TEMPLATE}}%
  \def\do##1{%
    \eappto\blx@tempa{%
      \blx@xml@labelalphatemplate{##1}{%
      \csuse{blx@labelalphatemplate@##1}}}}%
  \dolistloop\blx@latem@type
  % extradate specification
  \eappto\blx@tempa{%
    \blx@xml@comment{EXTRADATE}%
    \blx@xml@extradate{\csuse{blx@bcf@extradatespec}}}%
  % data inheritance
  \eappto\blx@tempa{%
    \blx@xml@comment{INHERITANCE}%
    \blx@xml@inheritance{%
      \csuse{blx@inherit@default}%
      \csuse{blx@inherit@data}}}%
  % noinit
  \ifcsdef{blx@noinit}
    {\eappto\blx@tempa{%
      \blx@xml@comment{NOINIT}%
      \blx@xml@noinits{%
        \csuse{blx@noinit}}}}%
    {}%
  % nolabel
  \ifcsdef{blx@nolabel}
    {\eappto\blx@tempa{%
      \blx@xml@comment{NOLABEL}%
      \blx@xml@nolabels{%
        \csuse{blx@nolabel}}}}%
    {}%
  % nolabel
  \ifcsdef{blx@nolabelwidthcount}
    {\eappto\blx@tempa{%
      \blx@xml@comment{NOLABELWIDTHCOUNT}%
      \blx@xml@nolabelwidthcounts{%
        \csuse{blx@nolabelwidthcount}}}}%
    {}%
  % nosort
  \ifcsdef{blx@nosort}
    {\eappto\blx@tempa{%
      \blx@xml@comment{NOSORT}%
      \blx@xml@nosorts{%
        \csuse{blx@nosort}}}}%
    {}%
  % transliteration
  \ifdefempty\blx@translits
    {}
    {\eappto\blx@tempa{\blx@xml@comment{TRANSLITERATION}}%
     \def\do##1{%
       \eappto\blx@tempa{\blx@xml@transliteration{##1}{\csuse{blx@translit@##1}}}}%
     \dolistloop\blx@translits}%
  % uniquenametemplate
  \eappto\blx@tempa{\blx@xml@comment{UNIQUENAME TEMPLATES}}%
  \def\do##1{%
    \eappto\blx@tempa{%
      \blx@xml@uniquenametemplate{##1}{\csuse{blx@uniquenametemplate@##1}}}}%
  \dolistloop\blx@untemplatespecs
  % sortingnamekeytemplate
  \eappto\blx@tempa{\blx@xml@comment{SORTING NAME KEY TEMPLATES}}%
  \def\do##1{%
    \eappto\blx@tempa{%
      \blx@xml@sortingnamekeytemplate{##1}{\csuse{blx@sortingnamekeytemplate@##1}}}}%
  \dolistloop\blx@sortingnamekeytemplates
  % presort/sorting excludes/sorting includes
  \def\do##1{%
    \eappto\blx@bcf@presort{\csuse{blx@bcf@presort@##1}}%
    \eappto\blx@bcf@exclude{\csuse{blx@bcf@exclude@##1}}%
    \eappto\blx@bcf@include{\csuse{blx@bcf@include@##1}}}%
  \abx@doentrytypes
  \do{*}% entrytype wildcard
  \eappto\blx@tempa{%
    \blx@bcf@presort
    \blx@bcf@exclude
    \blx@bcf@include}%
  % datamodel
  \eappto\blx@tempa{%
    \blx@xml@comment{DATA MODEL}%
    \blx@xml@datamodel{%
      \blx@xml@datamodel@constants{%
        \blx@bcf@datamodel@constants
      }%
      \blx@xml@datamodel@entrytypes{%
        \blx@bcf@datamodel@entrytypes
      }%
      \blx@xml@datamodel@fields{%
        \blx@bcf@datamodel@fields
      }%
      \blx@bcf@datamodel@entryfields
      \blx@bcf@datamodel@constraints
    }%
  }%
  % files
  \let\blx@tempb\@empty
  \blx@bibdata\blx@tempb\blx@bibfiles
  \eappto\blx@tempa{%
    \blx@xml@comment{CITATION DATA}%
    \blx@xml@comment{SECTION 0}%
    \blx@xml@bibdata{0}{\blx@tempb}%
    \blx@xml@section{0}%
  }%
  \immediate\openout\blx@bcfout\jobname.bcf\relax
  \blx@auxwrite\blx@bcfout{}{\blx@tempa}%
  \global\undef\blx@tempa
  \endgroup
  \AfterEndDocument{%
    \def\do##1{%
      \csxappto{blx@sortingtemplates}{%
        \blx@xml@sortingtemplate{##1}
                        {\ifcsdef{blx@sortdef@locale@##1}{ locale="\csuse{blx@sortdef@locale@##1}"}{}}
                        {\csuse{blx@sortingtemplate@##1}}}}%
      \dolistloop\blx@sortingtemplatenames
    \blx@auxwrite\blx@bcfout{}{%
      \blx@xml@endsection\blx@nl
      \blx@xml@comment{SORTING TEMPLATES}%
      \csuse{blx@sortingtemplates}%
      \blx@xml@comment{DATALISTS}%
      \csuse{blx@dlists}%
      \blx@xml@endfile}%
    \immediate\closeout\blx@bcfout}}

%% Customisation

% nolabel
\newrobustcmd*{\DeclareNolabel}[1]{%
  \begingroup
  \let\nolabel\blx@nolabel@setup
  \let\blx@tempa\@empty
  #1%
  \global\let\blx@nolabel\blx@tempa
  \endgroup}
\@onlypreamble\DeclareNolabel

\newcommand*{\blx@nolabel@setup}[1]{%
  \eappto\blx@tempa{%
    \blx@xml@nolabel{#1}}}

% nolabelwidthcount
\newrobustcmd*{\DeclareNolabelwidthcount}[1]{%
  \begingroup
  \let\nolabel\blx@nolabelwidthcount@setup
  \let\blx@tempa\@empty
  #1%
  \global\let\blx@nolabelwidthcount\blx@tempa
  \endgroup}
\@onlypreamble\DeclareNolabelwidthcount

\newcommand*{\blx@nolabelwidthcount@setup}[1]{%
  \eappto\blx@tempa{%
    \blx@xml@nolabelwidthcount{#1}}}

% nosort
\newrobustcmd*{\DeclareNosort}[1]{%
  \begingroup
  \let\nosort\blx@nosort@setup
  \let\blx@tempa\@empty
  #1%
  \global\let\blx@nosort\blx@tempa
  \endgroup}
\@onlypreamble\DeclareNosort

\newcommand*{\blx@nosort@setup}[2]{%
  \eappto\blx@tempa{%
    \blx@xml@nosort{#1}{#2}}}

% noinit
\newrobustcmd*{\DeclareNoinit}[1]{%
  \begingroup
  \let\noinit\blx@noinit@setup
  \let\blx@tempa\@empty
  #1%
  \global\let\blx@noinit\blx@tempa
  \endgroup}
\@onlypreamble\DeclareNoinit

\newcommand*{\blx@noinit@setup}[1]{%
  \eappto\blx@tempa{%
    \blx@xml@noinit{#1}}}

% datafieldsets
\newrobustcmd*{\DeclareDatafieldSet}[2]{%
  \begingroup
  \let\member\blx@datafieldset@member
  \let\blx@tempa\@empty
  \def\blx@setname{#1}
  \cslet{blx@datafieldset@#1}\@empty
  #2%
  \csxdef{blx@datafieldsetmembers@#1}{\blx@tempa}%
  \listgadd\blx@datafieldsets{#1}%
  \global\csletcs{datafieldset#1}{blx@datafieldset@#1}% expose user-facing macro
  \endgroup}
\@onlypreamble\DeclareDatafieldSet

\newcommand*{\blx@datafieldset@member}[1][2]{%
  \let\blx@dm@fieldtype\@empty
  \let\blx@dm@datatype\@empty
  \let\blx@member@field\@empty
  \let\blx@tempb\@empty
  \setkeys{blx@datafieldsets@member}{#1}%
  \eappto\blx@tempa{%
    \blx@xml@datafieldsets@member{\blx@tempb}}%
  \ifdefempty\blx@member@field
    {}
    {\listcsxadd{blx@datafieldset@\blx@setname}{\blx@member@field}}%
  % Set some internal macros in case biblatex needs to use the set
  \ifboolexpr{%
    not test {\ifdefempty{\blx@dm@fieldtype}}
    and
    not test {\ifdefempty{\blx@dm@datatype}}}
      {\def\do##1{%
         \listcsxadd{blx@datafieldset@\blx@setname}{##1}}
       \dolistcsloop{blx@datamodelfields@types@\blx@dm@fieldtype @\blx@dm@datatype}}
      {\ifdefempty{\blx@dm@fieldtype}
         {}
         {\def\do##1{%
           \listcsxadd{blx@datafieldset@\blx@setname}{##1}}
          \dolistcsloop{blx@datamodelfields@fieldtypes@\blx@dm@fieldtype}}%
       \ifdefempty{\blx@dm@datatype}
         {}
         {\def\do##1{%
           \listcsxadd{blx@datafieldset@\blx@setname}{##1}}
          \dolistcsloop{blx@datamodelfields@datatypes@\blx@dm@datatype}}}}

\define@key{blx@datafieldsets@member}{datatype}{% characters
  \appto\blx@tempb{ datatype="#1"}%
  \def\blx@dm@datatype{#1}}
\define@key{blx@datafieldsets@member}{fieldtype}{% characters
  \appto\blx@tempb{ fieldtype="#1"}%
  \def\blx@dm@fieldtype{#1}}
\define@key{blx@datafieldsets@member}{field}{% characters
  \appto\blx@tempb{ field="#1"}%
  \def\blx@member@field{#1}}

% sourcemap
\newrobustcmd*{\DeclareSourcemap}[1]{%
  \booltrue{sourcemap}%
  \begingroup
  \let\maps\blx@usersourcemap@maps
  \let\blx@tempa\@empty
  #1%
  \csxdef{blx@sourcemap@user}{\blx@tempa}%
  \endgroup}
\@onlypreamble\DeclareSourcemap

\newrobustcmd*{\DeclareStyleSourcemap}[1]{%
  \booltrue{sourcemap}%
  \begingroup
  \let\maps\blx@stylesourcemap@maps
  \let\blx@tempa\@empty
  #1%
  \xappto\blx@sourcemap@style\blx@tempa%
  \endgroup}

\@onlypreamble\DeclareStyleSourcemap

\newrobustcmd*{\DeclareDriverSourcemap}[2][]{%
  \booltrue{sourcemap}%
  \begingroup
  \let\blx@tempa\@empty
  \let\blx@tempb\@empty
  \let\blx@tempc\@empty
  \let\blx@tempd\@empty
  \let\map\blx@sourcemap@map
  #2%
  \ifblank{#1}
    {\setkeys{blx@sourcemap@maps}{datatype=bibtex, level=driver}}
    {\setkeys{blx@sourcemap@maps}{#1, level=driver}}%
  \eappto\blx@tempa{%
    \blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}%
  \csxdef{blx@sourcemap@defaults@\blx@tempd}{\blx@tempa}%
  \endgroup}
\@onlypreamble\DeclareDriverSourcemap

\newcommand*{\blx@usersourcemap@maps}[2][]{%
  \let\blx@tempb\@empty
  \let\blx@tempc\@empty
  \let\map\blx@sourcemap@map
  \ifblank{#1}
    {\setkeys{blx@sourcemap@maps}{datatype=bibtex, level=user}}
    {\setkeys{blx@sourcemap@maps}{#1, level=user}}%
  #2%
  \eappto\blx@tempa{%
    \blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}}

\newcommand*{\blx@stylesourcemap@maps}[2][]{%
  \let\blx@tempb\@empty
  \let\blx@tempc\@empty
  \let\map\blx@sourcemap@map
  \ifblank{#1}
    {\setkeys{blx@sourcemap@maps}{datatype=bibtex, level=style}}
    {\setkeys{blx@sourcemap@maps}{#1, level=style}}%
  #2%
  \eappto\blx@tempa{%
    \blx@xml@sourcemap@maps{\blx@tempb}{\blx@tempc}}}

\define@key{blx@sourcemap@maps}{datatype}{% characters
  \eappto\blx@tempb{ datatype="#1"}%
  \eappto\blx@tempd{#1}}
\define@key{blx@sourcemap@maps}{overwrite}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempb{ map\string_overwrite="1"}}
    {}}
\define@key{blx@sourcemap@maps}{level}{% user|style|driver
    \appto\blx@tempb{ level="#1"}}

\newcommand*{\blx@sourcemap@map}[2][]{%
  \let\blx@tempm\@empty
  \let\blx@tempe\@empty
  \let\perdatasource\blx@sourcemap@perdatasource
  \let\pertype\blx@sourcemap@pertype
  \let\pernottype\blx@sourcemap@pernottype
  \let\step\blx@sourcemap@step
  \ifblank{#1}
    {}
    {\setkeys{blx@sourcemap@map}{#1}}%
  #2%
  \eappto\blx@tempc{%
    \blx@xml@sourcemap@map{\blx@tempm}{\blx@tempe}}}

\define@key{blx@sourcemap@map}{overwrite}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempm{ map\string_overwrite="1"}}
    {}}
\define@key{blx@sourcemap@map}{foreach}{% characters
  \eappto\blx@tempm{ map\string_foreach="#1"}}
\define@key{blx@sourcemap@map}{refsection}{% integer
  \eappto\blx@tempm{ refsection="#1"}}

\newcommand*{\blx@sourcemap@perdatasource}[1]{%
  \eappto\blx@tempe{%
    \blx@xml@sourcemap@perdatasource{#1}}}

\newcommand*{\blx@sourcemap@pertype}[1]{%
  \eappto\blx@tempe{%
    \blx@xml@sourcemap@pertype{#1}}}

\newcommand*{\blx@sourcemap@pernottype}[1]{%
  \eappto\blx@tempe{%
    \blx@xml@sourcemap@pernottype{#1}}}

\newcommand*{\blx@sourcemap@step}[1][2]{%
  \let\blx@tempf\@empty
  \setkeys{blx@sourcemap@step}{#1}%
  \eappto\blx@tempe{%
    \blx@xml@sourcemap@step{\blx@tempf}}}

\define@key{blx@sourcemap@step}{typesource}{% characters
  \eappto\blx@tempf{ map\string_type\string_source="#1"}}
\define@key{blx@sourcemap@step}{typetarget}{% characters
  \eappto\blx@tempf{ map\string_type\string_target="#1"}}
\define@key{blx@sourcemap@step}{final}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempf{ map\string_final="1"}}
    {}}
\define@key{blx@sourcemap@step}{fieldsource}{% characters
  \eappto\blx@tempf{ map\string_field\string_source="#1"}}
\define@key{blx@sourcemap@step}{notfield}{% characters
  \eappto\blx@tempf{ map\string_notfield="#1"}}
\define@key{blx@sourcemap@step}{fieldtarget}{% characters
  \eappto\blx@tempf{ map\string_field\string_target="#1"}}
\define@key{blx@sourcemap@step}{fieldset}{% characters
  \eappto\blx@tempf{ map\string_field\string_set="#1"}}
% We are sanitising the XML here as it's the value of an attribute which
% might contain quotes or ampersands (URLs, for example)
\define@key{blx@sourcemap@step}{fieldvalue}{% characters
  \blx@xmlsanitizeafter{\def\blx@temps}{#1}%
  \eappto\blx@tempf{ map\string_field\string_value="\blx@temps"}}
\define@key{blx@sourcemap@step}{append}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempf{ map\string_append="1"}}
    {}}
\define@key{blx@sourcemap@step}{null}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempf{ map\string_null="1"}}
    {}}
\define@key{blx@sourcemap@step}{entrynull}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempf{ map\string_entry\string_null="1"}}
    {}}
\define@key{blx@sourcemap@step}{entrynew}{% characters
  \appto\blx@tempf{ map\string_entry\string_new="#1"}}
\define@key{blx@sourcemap@step}{entrynewtype}{% characters
  \appto\blx@tempf{ map\string_entry\string_newtype="#1"}}
\define@key{blx@sourcemap@step}{entrytarget}{% characters
  \appto\blx@tempf{ map\string_entrytarget="#1"}}
\define@key{blx@sourcemap@step}{entryclone}{% characters
  \appto\blx@tempf{ map\string_entry\string_clone="#1"}}
\define@key{blx@sourcemap@step}{origfield}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempf{ map\string_origfield="1"}}
    {}}
\define@key{blx@sourcemap@step}{origfieldval}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempf{ map\string_origfieldval="1"}}
    {}}
\define@key{blx@sourcemap@step}{origentrytype}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempf{ map\string_origentrytype="1"}}
    {}}
\define@key{blx@sourcemap@step}{match}{% characters
  \appto\blx@tempf{ map\string_match="#1"}}
\define@key{blx@sourcemap@step}{notmatch}{% characters
  \appto\blx@tempf{ map\string_notmatch="#1"}}
\define@key{blx@sourcemap@step}{replace}{% characters
  \eappto\blx@tempf{ map\string_replace="#1"}}

% [<specname>]{<spec>}
\newrobustcmd*{\DeclareLabelalphaNameTemplate}[2][]{%
  \begingroup
  \ifblank{#1}
    {\def\blx@lantname{global}}% default
    {\def\blx@lantname{#1}}%
  \let\namepart\blx@lantem@namepart
  \let\blx@tempa\@empty
  \blx@tempcnta\z@
  #2%
  \global\cslet{blx@labelalphanametemplate@\blx@lantname}\blx@tempa
  \xifinlist\blx@lantname\blx@lantemplatespecs
    {}
    {\listxadd\blx@lantemplatespecs\blx@lantname}%
  \endgroup}
\@onlypreamble\DeclareLabelalphaNameTemplate
\blx@collectopts{xml}{blx@globalopts}{labelalphanametemplate}% for passing to the .bcf
\DeclareEntryOption[string]{labelalphanametemplatename}{%
  \def\blx@refcontext@labelalphanametemplatename{#1}}

\newcommand*{\blx@lantem@namepart}[2][]{%
  \advance\blx@tempcntb\@ne
  \edef\blx@tempe{order="\the\blx@tempcntb"}%
  \let\blx@tempc\@empty
  \ifblank{#1}
    {}
    {\setkeys{blx@lantem@namepart}{#1}}%
  \eappto\blx@tempa{%
    \blx@xml@labelalphanametemplatenamepart{\blx@tempe}{\blx@tempc}{#2}}}

\define@key{blx@lantem@namepart}{use}[true]{% use* option for namepart true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ use="1"}}
    {}}

\define@key{blx@lantem@namepart}{pre}[true]{% pre option for namepart true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ pre="1"}}
    {}}

\define@key{blx@lantem@namepart}{compound}[true]{% base option for namepart true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ substring\string_compound="1"}}
    {}}

\define@key{blx@lantem@namepart}{strwidth}{% integer
  \eappto\blx@tempc{ substring\string_width="#1"}}

\define@key{blx@lantem@field}{strside}{% left|right
  \ifstrequal{#1}{right}
    {\eappto\blx@tempc{ substring\string_side="right"}}
    {\eappto\blx@tempc{ substring\string_side="left"}}}

% [<entrytype>]{<spec>}
\newrobustcmd*{\DeclareLabelalphaTemplate}[2][]{%
   \ifblank{#1}
     {\blx@latem{#2}{global}}
     {\forcsvlist{\blx@latem{#2}}{#1}}}
\@onlypreamble\DeclareLabelalphaTemplate
\blx@collectopts{xml}{blx@globalopts}{labelalphatemplate}% for passing to the .bcf
\blx@collectopts{xml}{blx@typeopts}{labelalphatemplate}% for passing to the .bcf

\def\blx@latem#1#2{%
  \begingroup
  \let\labelelement\blx@latem@element
  \let\field\blx@latem@field
  \let\literal\blx@latem@literal
  \blx@tempcnta\z@
  \let\blx@tempa\@empty
  #1%
  \ifdef\blx@latem@type
    {\ifinlist{#2}\blx@latem@type
      {\global\cslet{blx@labelalphatemplate@#2}\blx@tempa}
      {\listgadd\blx@latem@type{#2}%
       \global\cslet{blx@labelalphatemplate@#2}\blx@tempa}}
    {\listgadd\blx@latem@type{#2}%
     \global\cslet{blx@labelalphatemplate@#2}\blx@tempa}%
  \endgroup}

\newcommand*{\blx@latem@element}[1]{%
  \advance\blx@tempcnta\@ne
  \let\blx@tempb\@empty
  #1%
  \eappto\blx@tempa{%
    \blx@xml@labelalpha@element{\the\blx@tempcnta}{\blx@tempb}}}

\newcommand*{\blx@latem@literal}[1]{%
  \blx@xmlsanitizeafter{\def\blx@temps}{#1}%
  \eappto\blx@tempb{%
    \blx@xml@labelalpha@part{}{\expandafter\regexp\expandafter{\blx@temps}}}}

\newcommand*{\blx@latem@field}[2][]{%
  \let\blx@tempc\@empty
  \ifblank{#1}
    {}
    {\setkeys{blx@latem@field}{#1}}%
  \eappto\blx@tempb{%
    \blx@xml@labelalpha@part{\blx@tempc}{#2}}}

\define@key{blx@latem@field}{uppercase}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ uppercase="1"}}
    {}}
\define@key{blx@latem@field}{lowercase}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ lowercase="1"}}
    {}}
\define@key{blx@latem@field}{final}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ final="1"}}
    {}}
\define@key{blx@latem@field}{strwidth}{% integer
    \eappto\blx@tempc{ substring\string_width="#1"}}
\define@key{blx@latem@field}{varwidth}[true]{% "v"
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ substring\string_width="v"}}
    {}}
\define@key{blx@latem@field}{varwidthnorm}[true]{% "vf"
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ substring\string_width="vf"}}
    {}}
\define@key{blx@latem@field}{varwidthlist}[true]{% "l"
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ substring\string_width="l"}}
    {}}
\define@key{blx@latem@field}{strfixedcount}{%
    \eappto\blx@tempc{ substring\string_fixed\string_threshold="#1"}}
\define@key{blx@latem@field}{strwidthmax}{%
    \eappto\blx@tempc{ substring\string_width\string_max="#1"}}
\define@key{blx@latem@field}{strside}{% left|right
  \ifstrequal{#1}{right}
    {\eappto\blx@tempc{ substring\string_side="right"}}
    {\eappto\blx@tempc{ substring\string_side="left"}}}
\define@key{blx@latem@field}{namessep}{%
    \eappto\blx@tempc{ namessep="#1"}}
\define@key{blx@latem@field}{ifnames}{%
    \eappto\blx@tempc{ ifnames="#1"}}
\define@key{blx@latem@field}{names}{%
    \eappto\blx@tempc{ names="#1"}}
\define@key{blx@latem@field}{noalphaothers}[true]{%
    \eappto\blx@tempc{ noalphaothers="1"}}
\define@key{blx@latem@field}{padchar}{%
  \blx@xmlsanitizeafter{\def\blx@temps}{#1}%
  \eappto\blx@tempc{ pad\string_char="\expandafter\regexp\expandafter{\blx@temps}"}}
\define@key{blx@latem@field}{padside}{% left|right
  \ifstrequal{#1}{left}
    {\eappto\blx@tempc{ pad\string_side="left"}}
    {\eappto\blx@tempc{ pad\string_side="right"}}}

% [<exceptions>]{<options>}
\newrobustcmd*{\DefaultInheritance}[2][]{%
  \begingroup
  \let\blx@tempf\@empty
  \ifblank{#2}
    {}
    {\setkeys{blx@inherit@default}{#2}}%
  \edef\blx@tempa{\space
    inherit\string_all="\iftoggle{blx@inherit@all}{true}{false}"\space
    override\string_target="\iftoggle{blx@inherit@override}{true}{false}"%
    \blx@tempf}%
  \let\blx@tempb\@empty
  \let\except\blx@inherit@except
  #1%
  \xdef\blx@inherit@default{%
    \blx@xml@inherit@defaults{\blx@tempa}{\blx@tempb}}%
  \endgroup}
\@onlypreamble\DefaultInheritance

\newtoggle{blx@inherit@all}
\newtoggle{blx@inherit@override}

\define@key{blx@inherit@default}{all}[true]{% true|false
  \settoggle{blx@inherit@all}{#1}}
\define@key{blx@inherit@default}{override}[true]{% true|false
  \settoggle{blx@inherit@override}{#1}}
\define@key{blx@inherit@default}{ignore}{% csv list
  \edef\blx@tempf{ ignore="#1"}}

% {<source>}{<target>}{<options>}
\newcommand*{\blx@inherit@except}[3]{%
  \let\blx@tempc\@empty
  \ifblank{#3}
    {}
    {\setkeys{blx@inherit@except}{#3}}%
  \eappto\blx@tempb{%
    \blx@xml@inherit@type{#1}{#2}{\blx@tempc}}}

\define@key{blx@inherit@except}{all}[true]{% true|false
  \eappto\blx@tempc{ inherit\string_all="#1"}}
\define@key{blx@inherit@except}{override}[true]{% true|false
  \eappto\blx@tempc{ override\string_target="#1"}}
\define@key{blx@inherit@except}{ignore}{% csv list
  \eappto\blx@tempc{ ignore="#1"}}

% {<type,type,...>}{<type,type,...>}{<spec>}
\newrobustcmd*{\DeclareDataInheritance}[4][]{%
  \begingroup
  \let\blx@tempa\@empty
  \let\blx@tempf\@empty
  \ifblank{#1}
    {}
    {\setkeys{blx@inherit}{#1}}%
  \forcsvlist{\blx@inherit@i{#3}}{#2}%
  \let\blx@tempb\@empty
  \let\inherit\blx@inherit@field
  \let\noinherit\blx@inherit@block
  #4%
  \xappto\blx@inherit@data{%
    \blx@xml@inherit@data{\blx@tempf}{%
      \blx@tempa
      \blx@tempb}}%
  \endgroup}
\@onlypreamble\DeclareDataInheritance

\def\blx@inherit@i#1#2{%
  \forcsvlist{\blx@inherit@ii{#2}}{#1}}

\def\blx@inherit@ii#1#2{%
  \eappto\blx@tempa{\blx@xml@inherit@type{#1}{#2}{}}}

\blx@collectopts{xml}{blx@globalopts}{inheritance}% for passing to the .bcf

% [<options>]{<source>}{<target>}
\newcommand*{\blx@inherit@field}[3][]{%
  \let\blx@tempc\@empty
  \ifblank{#1}
    {}
    {\setkeys{blx@inherit@field}{#1}}%
  \eappto\blx@tempb{%
    \blx@xml@inherit@field{#2}{#3}{\blx@tempc}}}

\newcommand*{\blx@inherit@block}[1]{%
  \eappto\blx@tempb{\blx@xml@inherit@block{#1}}}

\define@key{blx@inherit}{ignore}{% csv list
  \edef\blx@tempf{ ignore="#1"}}

\define@key{blx@inherit@field}{override}[true]{% true|false
  \ifstrequal{#1}{true}
    {\edef\blx@tempc{ override\string_target="true"}}
    {\edef\blx@tempc{ override\string_target="false"}}}

\newrobustcmd*{\ResetDataInheritance}{%
  \global\csundef{blx@inherit@data}}
\@onlypreamble\ResetDataInheritance

% {<name>}{<spec>}
\newrobustcmd*{\DeclareBiblistFilter}[2]{%
  \begingroup
  \let\filteror\blx@biblistfilteror
  \let\filter\blx@biblistfilter
  \let\blx@tempa\@empty
  #2%
  \global\cslet{blx@biblistfilters@#1}\blx@tempa
  \endgroup}
\@onlypreamble\DeclareBiblistFilter

\newcommand*{\blx@biblistfilteror}[1]{%
  \eappto\blx@tempa{\blx@xml@dlistfilterorbegin}%
  #1%
  \eappto\blx@tempa{\blx@xml@dlistfilterorend}}

\newcommand*{\blx@biblistfilter}[1][2]{%
  \let\blx@tempc\@empty
  \let\blx@tempd\@empty
  \setkeys{blx@biblistfilter@filter}{#1}%
  \eappto\blx@tempa{%
    \blx@xml@dlistfilter{\blx@tempc}{\blx@tempd}}}

\define@key{blx@biblistfilter@filter}{type}{%
  \def\blx@tempc{#1}}
\define@key{blx@biblistfilter@filter}{filter}{%
  \def\blx@tempd{#1}}

% Predefine filters for label fields
\def\do#1{\DeclareBiblistFilter{#1}{\filter[type=field,filter=#1]}}
\abx@dolabelfields

% [<entrytype>]
\newrobustcmd*{\DeclareSortTranslit}[2][]{%
  \begingroup
  \ifblank{#1}
    {\def\blx@tempa{*}}
    {\def\blx@tempa{#1}}%
    \let\translit\blx@translit@setup
    \let\blx@tempb\@empty
    #2%
  \global\cslet{blx@translit@\blx@tempa}\blx@tempb
  \xifinlist\blx@tempa\blx@translits
    {}
    {\listxadd\blx@translits\blx@tempa}%
  \endgroup}
\@onlypreamble\DeclareSortTranslit
\blx@collectopts{xml}{blx@globalopts}{translit}% for passing to the .bcf
\blx@collectopts{xml}{blx@typeopts}{translit}% for passing to the .bcf

\newcommand*{\blx@translit@setup}[3][*]{%
  \eappto\blx@tempb{%
    \blx@xml@translit{#1}{#2}{#3}}}

% [<specname>]{<spec>}
\newrobustcmd*{\DeclareUniquenameTemplate}[2][]{%
  \begingroup
  \ifblank{#1}
    {\def\blx@untname{global}}% default
    {\def\blx@untname{#1}}%
  \let\namepart\blx@untemp@namepart
  \let\blx@tempa\@empty
  \blx@tempcnta\z@
  #2%
  \global\cslet{blx@uniquenametemplate@\blx@untname}\blx@tempa
  \xifinlist\blx@untname\blx@untemplatespecs
    {}
    {\listxadd\blx@untemplatespecs\blx@untname}%
  \endgroup}
\@onlypreamble\DeclareUniquenameTemplate
\blx@collectopts{xml}{blx@globalopts}{uniquenametemplate}% for passing to the .bcf
\DeclareEntryOption[string]{uniquenametemplatename}{%
  \def\blx@refcontext@uniquenametemplatename{#1}}

\newcommand*{\blx@untemp@namepart}[2][]{%
  \advance\blx@tempcntb\@ne
  \edef\blx@tempe{order="\the\blx@tempcntb"}%
  \let\blx@tempc\@empty
  \ifblank{#1}
    {}
    {\setkeys{blx@untemp@namepart}{#1}}%
  \eappto\blx@tempa{%
    \blx@xml@uniquenametemplatenamepart{\blx@tempe}{\blx@tempc}{#2}}}

\define@key{blx@untemp@namepart}{use}[true]{% use* option for namepart true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ use="1"}}
    {}}

\define@key{blx@untemp@namepart}{base}[true]{% base option for namepart true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ base="1"}}
    {}}

\define@key{blx@untemp@namepart}{disambiguation}{% disambiguation option for namepart none|inits|full|fullonly
  \appto\blx@tempc{ disambiguation="#1"}}

% [<templatename>]{<template>}
\newrobustcmd*{\DeclareSortingNamekeyTemplate}[2][]{%
  \begingroup
  \ifblank{#1}
    {\def\blx@snkname{global}}% default
    {\def\blx@snkname{#1}}%
  \let\namepart\blx@sortnk@namepart
  \let\keypart\blx@sortnk@keypart
  \let\literal\blx@sortnk@literal
  \let\blx@tempa\@empty
  \blx@tempcnta\z@
  #2%
  \global\cslet{blx@sortingnamekeytemplate@\blx@snkname}\blx@tempa
  \xifinlist\blx@snkname\blx@sortingnamekeytemplates
    {}
    {\listxadd\blx@sortingnamekeytemplates\blx@snkname}%
  \endgroup}
\@onlypreamble\DeclareSortingNamekeyTemplate
\blx@collectopts{xml}{blx@globalopts}{sortingnamekeytemplate}% for passing to the .bcf
\DeclareEntryOption[string]{sortingnamekeytemplatename}{%
  \def\blx@refcontext@sortingnamekeytemplatename{#1}}

% User-mode macro for checking sorting name template options
\def\ifuniquenametemplatename#1{%
  \expandafter\ifstrequal\expandafter{\blx@refcontext@uniquenametemplatename}{#1}}
\def\iflabelalphanametemplatename#1{%
  \expandafter\ifstrequal\expandafter{\blx@refcontext@labelalphanametemplatename}{#1}}
\def\ifsortingnamekeytemplatename#1{%
  \expandafter\ifstrequal\expandafter{\blx@refcontext@sortingnamekeytemplatename}{#1}}

\newcommand*{\blx@sortnk@keypart}[1]{%
  \advance\blx@tempcnta\@ne
  \blx@tempcntb\z@
  \edef\blx@tempd{ order="\the\blx@tempcnta"}%
  \let\blx@tempb\@empty
  #1%
  \eappto\blx@tempa{%
    \blx@xml@sortingnamekeykeypart{\blx@tempd}{\blx@tempb}}}

\newcommand*{\blx@sortnk@literal}[1]{%
  \advance\blx@tempcntb\@ne
  \edef\blx@tempe{ order="\the\blx@tempcntb"}%
  \let\blx@tempc\@empty
  \eappto\blx@tempb{%
    \blx@xml@sortingnamekeyliteral{\blx@tempe}{#1}}}

\newcommand*{\blx@sortnk@namepart}[2][]{%
  \advance\blx@tempcntb\@ne
  \edef\blx@tempe{ order="\the\blx@tempcntb"}%
  \let\blx@tempc\@empty
  \ifblank{#1}
    {}
    {\setkeys{blx@sortnk@namepart}{#1}}%
  \eappto\blx@tempb{%
    \blx@xml@sortingnamekeynamepart{\blx@tempe}{\blx@tempc}{#2}}}

\define@key{blx@sortnk@namepart}{use}[true]{% use* option for namepart true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ use="1"}}
    {\appto\blx@tempc{ use="0"}}}

\define@key{blx@sortnk@namepart}{inits}[true]{% initials only option for namepart true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ inits="1"}}
    {\appto\blx@tempc{ inits="0"}}}

% [options]{<templatename>}{<template>}
\newrobustcmd*{\DeclareSortingTemplate}[3][]{%
  \ifblank{#1}
    {}
    {\setkeys{blx@sortdef@sorting}{#1}%
     \csxdef{blx@sortdef@locale@#2}{\blx@templ}}%
  \begingroup
  \def\name{%LEGACY(<2.0)
    \blx@warning@noline{%
      '\string\name' is deprecated in sorting specifications, please use '\string\field'}%
    \blx@sortdef@field}%
  \def\list{%LEGACY(<2.0)
    \blx@warning@noline{%
      '\string\list' is deprecated in sorting specifications, please use '\string\field'}%
    \blx@sortdef@field}%
  \let\sort\blx@sortdef@sort
  \let\field\blx@sortdef@field
  \let\literal\blx@sortdef@literal
  \def\citeorder{\blx@sortdef@field{citeorder}}%
  \blx@tempcnta\z@
  \let\blx@tempa\@empty
  #3%
  \global\cslet{blx@sortingtemplate@#2}\blx@tempa
  \endgroup}
\@onlypreamble\DeclareSortingTemplate
\blx@collectopts{xml}{blx@globalopts}{sortingtemplate}% for passing to the .bcf

\define@key{blx@sortdef@sorting}{locale}{% locale name
  \def\blx@templ{#1}}

\newcommand*{\blx@sortdef@sort}[2][]{%
  \advance\blx@tempcnta\@ne
  \blx@tempcntb\z@
  \let\blx@tempb\@empty
  \edef\blx@tempc{order="\the\blx@tempcnta"}%
  \ifblank{#1}
    {}
    {\setkeys{blx@sortdef@sort}{#1}}%
  \let\do\@firstofone
  #2%
  \eappto\blx@tempa{%
    \blx@xml@sort{\blx@tempc}{\blx@tempb}}}

\define@key{blx@sortdef@sort}{locale}{% locale name
  \eappto\blx@tempc{ locale="#1"}}
\define@key{blx@sortdef@sort}{direction}{% ascending|descending
  \ifstrequal{#1}{ascending}
    {\eappto\blx@tempc{ sort\string_direction="ascending"}}
    {\eappto\blx@tempc{ sort\string_direction="descending"}}}
\define@key{blx@sortdef@sort}{final}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ final="1"}}
    {}}
\define@key{blx@sortdef@sort}{sortcase}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ sortcase="1"}}
    {\appto\blx@tempc{ sortcase="0"}}}
\define@key{blx@sortdef@sort}{sortupper}[true]{% true|false
  \ifstrequal{#1}{true}
    {\appto\blx@tempc{ sortupper="1"}}
    {\appto\blx@tempc{ sortupper="0"}}}

\newcommand*{\blx@sortdef@field}[2][]{%
  \advance\blx@tempcntb\@ne
  \edef\blx@tempd{order="\the\blx@tempcntb"}%
  \ifblank{#1}
    {}
    {\setkeys{blx@sortdef@field}{#1}}%
  \eappto\blx@tempb{%
    \blx@xml@sortitem{\blx@tempd}{#2}}}

\define@key{blx@sortdef@field}{padside}{% left|right
  \ifstrequal{#1}{right}
    {\eappto\blx@tempd{ pad\string_side="right"}}
    {\eappto\blx@tempd{ pad\string_side="left"}}}
\define@key{blx@sortdef@field}{padwidth}{% integer
  \eappto\blx@tempd{ pad\string_width="#1"}}
\define@key{blx@sortdef@field}{padchar}{% character
  \blx@xmlsanitizeafter{\def\blx@tempe}{#1}%
  \eappto\blx@tempd{ pad\string_char="\blx@tempe"}}
\define@key{blx@sortdef@field}{strside}{% left|right
  \ifstrequal{#1}{right}
    {\eappto\blx@tempd{ substring\string_side="right"}}
    {\eappto\blx@tempd{ substring\string_side="left"}}}
\define@key{blx@sortdef@field}{strwidth}{% integer
  \eappto\blx@tempd{ substring\string_width="#1"}}

\def\blx@sortdef@literal#1{%
  \advance\blx@tempcntb\@ne
  \blx@xmlsanitizeafter{\def\blx@tempe}{#1}%
  \eappto\blx@tempb{%
    \blx@xml@sortitem{order="\the\blx@tempcntb"}{\blx@tempe}}}

% [<type,type,...>]{<string>}
\newrobustcmd*{\DeclarePresort}[2][]{%
  \begingroup
  \blx@xmlsanitizeafter{\def\blx@tempa}{#2}%
  \ifblank{#1}
    {\xdef\blx@bcf@presort{\blx@xml@presort{}{\blx@tempa}}}
    {\notblank{#2}
       {\forcsvlist{\blx@defpresort\blx@tempa}{#1}}
       {\forcsvlist\blx@undefpresort{#1}}}%
  \endgroup}
\@onlypreamble\DeclarePresort
\blx@collectopts{string}{blx@globalopts}{presort}% for passing to the .bcf
\blx@collectopts{string}{blx@typeopts}{presort}% for passing to the .bcf
\blx@collectopts{string}{blx@entryopts}{presort}% for passing to the .bcf

\def\blx@defpresort#1#2{%
  \csxdef{blx@bcf@presort@#2}{\blx@xml@presort{#2}{#1}}}
\def\blx@undefpresort#1{%
  \global\csundef{blx@bcf@presort@#1}}

% {<entrytype,...>}{<field,...>}
\newrobustcmd*{\DeclareSortExclusion}[2]{%
  \forcsvlist{\blx@sortexclude{#2}}{#1}}
\blx@collectopts{xml}{blx@typeopts}{sortexclusion}% for passing to the .bcf

% {<field>}{<entrytype>}
\def\blx@sortexclude#1#2{%
  \begingroup
  \ifblank{#1}
    {\global\csundef{blx@bcf@exclude@#2}}
    {\let\blx@tempa\@empty
     \forcsvlist\blx@sortexclude@i{#1}%
     \csxdef{blx@bcf@exclude@#2}{%
       \blx@xml@sortexclude{#2}{\blx@tempa}}}
  \endgroup}

\def\blx@sortexclude@i#1{%
  \appto\blx@tempa{\blx@xml@exclude{#1}}}

% {<entrytype,...>}{<field,...>}
\newrobustcmd*{\DeclareSortInclusion}[2]{%
  \forcsvlist{\blx@sortinclude{#2}}{#1}}
\blx@collectopts{xml}{blx@typeopts}{sortinclusion}% for passing to the .bcf

% {<field>}{<entrytype>}
\def\blx@sortinclude#1#2{%
  \begingroup
  \ifblank{#1}
    {\global\csundef{blx@bcf@include@#2}}
    {\let\blx@tempa\@empty
     \forcsvlist\blx@sortinclude@i{#1}%
     \csxdef{blx@bcf@include@#2}{%
       \blx@xml@sortinclude{#2}{\blx@tempa}}}
  \endgroup}

\def\blx@sortinclude@i#1{%
  \appto\blx@tempa{\blx@xml@include{#1}}}

% {<field,field,...>}
\newrobustcmd*{\DeclareExtradate}[1]{%
  \begingroup
  \let\blx@tempa\@empty
  \let\scope\blx@extradate@scope
  #1%
  \global\let\blx@bcf@extradatespec\blx@tempa
  \endgroup}
\@onlypreamble\DeclareExtradate
\blx@collectopts{xml}{blx@globalopts}{extradatespec}% for passing to the .bcf

\newrobustcmd*{\blx@extradate@scope}[1]{%
  \let\blx@tempb\@empty
  \let\field\blx@ordereded@field
  #1%
  \csxappto{blx@tempa}{%
    \noexpand\blx@xml@extradatescope{\blx@tempb}}}

\newcommand*{\blx@ordereded@field}[1]{%
  \advance\blx@tempcnta\@ne
    \csxappto{blx@tempb}{%
      \noexpand\blx@xml@edordered{\the\blx@tempcnta}{#1}}}

% [<type,type,...>]{<field,field,...>}
\newrobustcmd*{\DeclareLabelname}[2][]{%
  \begingroup
  \let\blx@tempa\@empty
  \def\blx@tempb{labelnamespec}%
  \let\field\blx@ordered@field
  \ifblank{#1}
    {\global\cslet{blx@bcf@labelnamespec}\@empty}
    {\def\blx@tempa{#1}%
     \def\do##1{\global\cslet{blx@bcf@labelnamespec@##1}\@empty}%
     \expandafter\docsvlist\expandafter{#1}}%
  #2%
  \endgroup}
\@onlypreamble\DeclareLabelname
\blx@collectopts{xml}{blx@globalopts}{labelnamespec}% for passing to the .bcf
\blx@collectopts{xml}{blx@typeopts}{labelnamespec}% for passing to the .bcf

\newrobustcmd*{\DeclareLabeltitle}[2][]{%
  \begingroup
  \let\blx@tempa\@empty
  \def\blx@tempb{labeltitlespec}%
  \let\field\blx@ordered@field
  \ifblank{#1}
    {\global\cslet{blx@bcf@labeltitlespec}\@empty}
    {\def\blx@tempa{#1}%
     \def\do##1{\global\cslet{blx@bcf@labeltitlespec@##1}\@empty}%
     \expandafter\docsvlist\expandafter{#1}}%
  #2%
  \endgroup}
\@onlypreamble\DeclareLabeltitle
\blx@collectopts{xml}{blx@globalopts}{labeltitlespec}% for passing to the .bcf
\blx@collectopts{xml}{blx@typeopts}{labeltitlespec}% for passing to the .bcf

\newrobustcmd*{\DeclareLabeldate}[2][]{%
  \begingroup
  \let\blx@tempa\@empty
  \def\blx@tempb{labeldatespec}%
  \let\field\blx@orderedld@field
  \let\literal\blx@orderedld@literal
  \ifblank{#1}
    {\global\cslet{blx@bcf@labeldatespec}\@empty}
    {\def\blx@tempa{#1}%
     \def\do##1{\global\cslet{blx@bcf@labeldatespec@##1}\@empty}%
     \expandafter\docsvlist\expandafter{#1}}%
  #2%
  \endgroup}
\@onlypreamble\DeclareLabeldate
\blx@collectopts{xml}{blx@globalopts}{labeldatespec}% for passing to the .bcf
\blx@collectopts{xml}{blx@typeopts}{labeldatespec}% for passing to the .bcf

\newcommand*{\blx@ordered@field}[2][]{%
  \let\blx@tempc\@empty
  \ifblank{#1}
    {}
    {\setkeys{blx@ordered@field}{#1}}%
  \advance\blx@tempcnta\@ne
  \ifdefempty{\blx@tempa}
    {\csxappto{blx@bcf@\blx@tempb}{%
       \noexpand\blx@xml@ordered{\the\blx@tempcnta}{\blx@tempc}{#2}}}
    {\def\do##1{%
       \blx@addtypeopt{##1}%
       \csxappto{blx@bcf@\blx@tempb @##1}{%
         \noexpand\blx@xml@ordered{\the\blx@tempcnta}{\blx@tempc}{#2}}}%
     \expandafter\docsvlist\expandafter{\blx@tempa}}}

\newcommand*{\blx@orderedld@field}[2][]{%
  \let\blx@tempc\@empty
  \ifblank{#1}
    {}
    {\setkeys{blx@ordered@field}{#1}}%
  \advance\blx@tempcnta\@ne
  \ifdefempty{\blx@tempa}
    {\csxappto{blx@bcf@\blx@tempb}{%
       \noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="field"\blx@tempc}{#2}}}
    {\def\do##1{%
       \blx@addtypeopt{##1}%
       \csxappto{blx@bcf@\blx@tempb @##1}{%
         \noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="field"\blx@tempc}{#2}}}%
     \expandafter\docsvlist\expandafter{\blx@tempa}}}

\newcommand*{\blx@orderedld@literal}[1]{%
  \advance\blx@tempcnta\@ne
  \ifdefempty{\blx@tempa}
    {\csxappto{blx@bcf@\blx@tempb}{%
       \noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="string"}{#1}}}
    {\def\do##1{%
       \blx@addtypeopt{##1}%
       \csxappto{blx@bcf@\blx@tempb @##1}{%
         \noexpand\blx@xml@ordered{\the\blx@tempcnta}{ type="string"}{#1}}}%
     \expandafter\docsvlist\expandafter{\blx@tempa}}}

%% Package options

% [<entrytype,entrytype,...>]{<options>}

\newrobustcmd*{\ExecuteBibliographyOptions}[2][]{%
  \ifblank{#1}
    {\setkeys{blx@opt@pre}{#2}}
    {\forcsvlist{\blx@typeoptions{#2}}{#1}}}
\@onlypreamble\ExecuteBibliographyOptions

\def\blx@typeoptions#1#2{%
  \blx@addtypeopt{#2}%
  \csappto{blx@opts@type@#2}{#1,}}

\def\blx@addtypeopt#1{%
  \notblank{#1}
    {\ifdef\blx@opts@type
       {\ifinlist{#1}\blx@opts@type
          {}
          {\listgadd\blx@opts@type{#1}}}
       {\listgadd\blx@opts@type{#1}}}
    {}}

% load-time only

% Have to have a dummy for this as it's set much earlier but is passed
% through to here where we just ignore it
\define@key{blx@opt@ldt}{datamodel}{}

\define@key{blx@opt@ldt}{backend}{%
  \ifstrequal{#1}{biber}
    {}
    {\ifboolexpr{
       test {\ifstrequal{#1}{bibtex}}
       or
       test {\ifstrequal{#1}{bibtex8}}}
       {\settoggle{blx@bibtex}{true}%
        \newtoggle{blx@bibtex8}%
        \ifstrequal{#1}{bibtex8}
          {\settoggle{blx@bibtex8}{true}}
          {}}%
       {\blx@err@invopt{backend=#1}{}}}}

\define@key{blx@opt@ldt}{style}{%
  \def\blx@cbxfile{#1}%
  \def\blx@bbxfile{#1}}

\define@key{blx@opt@ldt}{bibstyle}{%
  \def\blx@bbxfile{#1}}

\define@key{blx@opt@ldt}{citestyle}{%
  \def\blx@cbxfile{#1}}

\define@key{blx@opt@ldt}{natbib}[true]{%
  \settoggle{blx@natbib}{#1}}

\define@key{blx@opt@ldt}{mcite}[true]{%
  \settoggle{blx@mcite}{#1}}

% load-time and preamble

\DeclareBibliographyOption[boolean]{debug}[true]{%
  \settoggle{blx@debug}{#1}}

\DeclareBibliographyOption[boolean]{loadfiles}[true]{%
  \settoggle{blx@loadfiles}{#1}}

\DeclareBibliographyOption[integer]{mincrossrefs}{%
  \ifnum#1<\z@
    \def\blx@mincrossrefs{1}%
  \else
    \def\blx@mincrossrefs{#1}%
  \fi}

\DeclareBibliographyOption[integer]{minxrefs}{%
  \ifnum#1<\z@
    \def\blx@minxrefs{1}%
  \else
    \def\blx@minxrefs{#1}%
  \fi}
\def\blx@minxrefs{2}

\DeclareBibliographyOption[string]{texencoding}{%
  \ifstrequal{#1}{auto}
    {\undef\blx@texencoding}
    {\def\blx@texencoding{#1}}}

\DeclareBibliographyOption[string]{bibencoding}{%
  \ifcsdef{blx@bibenc@#1}
    {\letcs\blx@bibencoding{blx@bibenc@#1}}
    {\def\blx@bibencoding{#1}}}

\def\abx@mapbibenc#1#2{\csdef{blx@bibenc@#1}{#2}}
\abx@mapbibenc{inputenc}{auto}
\abx@mapbibenc{x-ascii}{ascii}

\def\abx@mapinpenc#1#2{\csdef{blx@inpenc@#1}{#2}}
\abx@mapinpenc{utf8x}{utf8}
\abx@mapinpenc{lutf8}{utf8}
\abx@mapinpenc{x-ascii}{ascii}

\DeclareBibliographyOption[boolean]{safeinputenc}[true]{%
  \settoggle{blx@safeinputenc}{#1}}
\newtoggle{blx@safeinputenc}

% global "sorting" option becomes "sortingtemplatename" in the .bcf and so
% don't use \DeclareBibliographyOption. This is a legacy naming issue
% unlikely to be corrected as "sorting" is an obvious name for biblatex users
% "sorting" is used in the .bcf for the actual sorting template definitions and is
% an XML format option
\define@key{blx@opt@pre}{sorting}{%
  \def\blx@sorting{#1}%
  \def\blx@refcontext@sortingtemplatename{#1}}
\blx@collectopts{string}{blx@globalopts}{sortingtemplatename}% for passing to the .bcf

\AtEndPreamble{%
  \ifcsdef{blx@sortingtemplate@\blx@sorting}
    {}
    {\blx@err@invopt{sorting=\blx@sorting}{}%
     \def\blx@sorting{nty}%
     \def\blx@refcontext@sortingtemplatename{nty}}%
  \listxadd\blx@sortingtemplatenames\blx@sorting
  \def\blx@refcontext@sortingnamekeytemplatename{global}%
  \let\blx@refcontext@labelprefix\@empty
  \def\blx@refcontext@uniquenametemplatename{global}%
  \def\blx@refcontext@labelalphanametemplatename{global}%
  \xdef\blx@refcontext@context{\blx@refcontext@sortingtemplatename/\blx@refcontext@sortingnamekeytemplatename/\blx@refcontext@labelprefix/\blx@refcontext@uniquenametemplatename/\blx@refcontext@labelalphanametemplatename}%
  \listxadd\blx@refcontexts\blx@refcontext@context}

\DeclareBibliographyOption[boolean]{sortcase}[true]{%
  \settoggle{blx@sortcase}{#1}}

\DeclareBibliographyOption[boolean]{sortupper}[true]{%
  \settoggle{blx@sortupper}{#1}}

\DeclareBibliographyOption[integer]{maxnames}{%
  \numdef\blx@maxcitenames{#1}%
  \numdef\blx@maxbibnames{#1}}
\DeclareBibliographyOption[integer]{minnames}{%
  \numdef\blx@mincitenames{#1}%
  \numdef\blx@minbibnames{#1}}
\DeclareTypeOption[integer]{maxnames}{%
  \numdef\blx@maxcitenames@type{#1}%
  \numdef\blx@maxbibnames@type{#1}%
  \c@maxnames#1\relax}
\DeclareTypeOption[integer]{minnames}{%
  \numdef\blx@mincitenames@type{#1}%
  \numdef\blx@minbibnames@type{#1}%
  \c@minnames#1\relax}
\DeclareEntryOption[integer]{maxnames}{%
  \c@maxnames#1\relax}
\DeclareEntryOption[integer]{minnames}{%
  \c@minnames#1\relax}

\DeclareBibliographyOption[integer]{maxbibnames}{%
  \numdef\blx@maxbibnames{#1}}
\DeclareBibliographyOption[integer]{minbibnames}{%
  \numdef\blx@minbibnames{#1}}
\DeclareTypeOption[integer]{maxbibnames}{%
  \numdef\blx@maxbibnames@type{#1}%
  \iftoggle{blx@bibliography}
    {\c@maxnames#1\relax}
    {}}
\DeclareTypeOption[integer]{minbibnames}{%
  \numdef\blx@minbibnames@type{#1}%
  \iftoggle{blx@bibliography}
    {\c@minnames#1\relax}
    {}}
\DeclareEntryOption[integer]{maxbibnames}{%
  \iftoggle{blx@bibliography}
    {\c@maxnames#1\relax}
    {}}
\DeclareEntryOption[integer]{minbibnames}{%
  \iftoggle{blx@bibliography}
    {\c@minnames#1\relax}
    {}}

\DeclareBibliographyOption[integer]{maxcitenames}{%
  \numdef\blx@maxcitenames{#1}}
\DeclareBibliographyOption[integer]{mincitenames}{%
  \numdef\blx@mincitenames{#1}}
\DeclareTypeOption[integer]{maxcitenames}{%
  \numdef\blx@maxcitenames@type{#1}%
  \iftoggle{blx@bibliography}
    {}
    {\c@maxnames#1\relax}}
\DeclareTypeOption[integer]{mincitenames}{%
  \numdef\blx@mincitenames@type{#1}%
  \iftoggle{blx@bibliography}
    {}
    {\c@minnames#1\relax}}
\DeclareEntryOption[integer]{maxcitenames}{%
  \iftoggle{blx@bibliography}
    {}
    {\c@maxnames#1\relax}}
\DeclareEntryOption[integer]{mincitenames}{%
  \iftoggle{blx@bibliography}
    {}
    {\c@minnames#1\relax}}

\appto\blx@checkoptions@global{%
  \blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames\blx@minbibnames
  \blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames\blx@mincitenames}
\appto\blx@checkoptions@type{%
  \blx@maxmin@num{maxbibnames}{minbibnames}\blx@maxbibnames@type\blx@minbibnames@type
  \blx@maxmin@num{maxcitenames}{mincitenames}\blx@maxcitenames@type\blx@mincitenames@type}
\appto\blx@checkoptions@entry{%
  \blx@maxmin@cnt{maxnames}{minnames}\c@maxnames\c@minnames}

\DeclareBibliographyOption[integer]{maxitems}{%
  \numdef\blx@maxitems{#1}}
\DeclareBibliographyOption[integer]{minitems}{%
  \numdef\blx@minitems{#1}}
\DeclareTypeOption[integer]{maxitems}{%
  \numdef\blx@maxitems@type{#1}%
  \c@maxitems#1\relax}
\DeclareTypeOption[integer]{minitems}{%
  \numdef\blx@minitems@type{#1}%
  \c@minitems#1\relax}
\DeclareEntryOption[integer]{maxitems}{%
  \c@maxitems#1\relax}
\DeclareEntryOption[integer]{minitems}{%
  \c@minitems#1\relax}

\appto\blx@checkoptions@global{%
  \blx@maxmin@num{maxitems}{minitems}\blx@maxitems\blx@minitems}
\appto\blx@checkoptions@type{%
  \blx@maxmin@num{maxitems}{minitems}\blx@maxitems@type\blx@minitems@type}
\appto\blx@checkoptions@entry{%
  \blx@maxmin@cnt{maxitems}{minitems}\c@maxitems\blx@minitems}

\DeclareBibliographyOption[integer]{maxalphanames}{%
  \numdef\blx@maxalphanames{#1}}
\DeclareBibliographyOption[integer]{minalphanames}{%
  \numdef\blx@minalphanames{#1}}
\DeclareTypeOption[integer]{maxalphanames}{%
  \numdef\blx@maxalphanames{#1}}
\DeclareTypeOption[integer]{minalphanames}{%
  \numdef\blx@minalphanames{#1}}
\DeclareEntryOption[integer]{maxalphanames}{%
  \numdef\blx@maxalphanames{#1}}
\DeclareEntryOption[integer]{minalphanames}{%
  \numdef\blx@minalphanames{#1}}

\appto\blx@checkoptions@global{%
  \blx@maxmin@num{maxalphanames}{minalphanames}\blx@maxalphanames\blx@minalphanames}
\appto\blx@checkoptions@type{%
  \blx@maxmin@num{maxalphanames}{minalphanames}\blx@maxalphanames\blx@minalphanames}

\def\blx@maxmin@num#1#2#3#4{%
  \ifnumless#3\@ne
    {\blx@err@invopt{#1=#3}{'#1' must be greater than zero}%
     \let#3\@ne}
    {}%
  \ifnumless#4\@ne
    {\blx@err@invopt{#2=#4}{'#2' must be greater than zero}%
     \let#4\@ne}
    {}%
  \ifnumless#3#4
    {\blx@err@confopt{#1/#2}{'#1' must be greater than or equal to '#2'}%
     \let#3#4}
    {}}

\def\blx@maxmin@cnt#1#2#3#4{%
  \ifnumless#3\@ne
    {\blx@err@invopt{#1=\number#3}{'#1' must be greater than zero}%
     #3\@ne}
    {}%
  \ifnumless#4\@ne
    {\blx@err@invopt{#2=\number#4}{'#2' must be greater than zero}%
     #4\@ne}
    {}%
  \ifnumless#3#4
    {\blx@err@confopt{#1/#2}{'#1' must be greater than or equal to '#2'}%
     #3=#4}
    {}}

\DeclareBibliographyOption[boolean]{terseinits}[true]{%
  \ifstrequal{#1}{true}
    {\toggletrue{blx@terseinits}
     \renewrobustcmd*{\bibinitperiod}{}
     \renewrobustcmd*{\bibinitdelim}{}
     \renewrobustcmd*{\bibinithyphendelim}{}}
    {\togglefalse{blx@terseinits}
     \renewrobustcmd*{\bibinitperiod}{\adddot}
     \renewrobustcmd*{\bibinitdelim}{\addnbspace}
     \renewrobustcmd*{\bibinithyphendelim}{\adddot\mbox{-}}}}

\DeclareBibliographyOption[boolean]{abbreviate}[true]{%
  \ifstrequal{#1}{true}
    {\def\abx@str{abx@sstr}}
    {\def\abx@str{abx@lstr}}}

\DeclareBibliographyOption[boolean]{dateabbrev}[true]{%
  \ifstrequal{#1}{true}
    {\let\abx@bibmonth\blx@imc@bibsstring
     \let\abx@bibseason\blx@imc@bibsstring}
    {\let\abx@bibmonth\blx@imc@biblstring
     \let\abx@bibseason\blx@imc@biblstring}}

\DeclareBibliographyOption[string]{sortlocale}{%
  \edef\blx@sortlocale{\detokenize{#1}}}

\DeclareBibliographyOption[string]{language}{%
  \togglefalse{blx@autolangbib}%
  \togglefalse{blx@autolangcite}%
  \ifboolexpr{
    test {\ifstrequal{#1}{auto}}
    or
    test {\ifstrequal{#1}{autobib}}
    or
    test {\ifstrequal{#1}{autocite}}
  }
  {\def\blx@languagename{english}%
   \ifstrequal{#1}{auto}
    {\toggletrue{blx@autolangbib}%
     \toggletrue{blx@autolangcite}}
    {}%
   \ifstrequal{#1}{autobib}
    {\toggletrue{blx@autolangbib}}
    {}%
   \ifstrequal{#1}{autocite}
    {\toggletrue{blx@autolangcite}}
    {}}
  % If language is explicit, we do want to auto-switch but only to the
  % selected language
  {\IfFileExists{#1.lbx}
    {\toggletrue{blx@autolangbib}%
     \toggletrue{blx@autolangcite}%
     \edef\blx@languagename{#1}%
     \edef\blx@forcelanguagename{#1}}
    {\blx@error
      {Language '#1' not supported}
      {Failed to find a matching '#1.lbx' file}}}}

\DeclareBibliographyOption[boolean]{clearlang}[true]{%
  \settoggle{blx@clearlang}{#1}}

\DeclareBibliographyOption[string]{autolang}{%
  \blx@autolang@i{#1}}

\def\blx@autolang@i#1{%
  \ifcsdef{blx@opt@autolang@#1}
    {\csuse{blx@opt@autolang@#1}}
    {\blx@err@invopt{autolang=#1}{}}}

\def\blx@opt@autolang@none{%
  \undef\blx@thelangenv
  \let\blx@hook@initlang\@empty
  \let\blx@hook@endlang\@empty}
\def\blx@opt@autolang@hyphen{%
  \def\blx@thelangenv{hyphenrules}%
  \let\blx@hook@initlang\@empty
  \let\blx@hook@endlang\@empty}
\csdef{blx@opt@autolang@other*}{%
  \def\blx@thelangenv{otherlanguage*}%
  \def\blx@hook@initlang{\@quotereset\@ne}%
  \def\blx@hook@endlang{\blx@postpunct}}
\def\blx@opt@autolang@other{%
  \def\blx@thelangenv{otherlanguage}%
  \def\blx@hook@initlang{\@quotereset\@ne}%
  \def\blx@hook@endlang{\blx@postpunct}}
\def\blx@opt@autolang@langname{%
  \@ifpackageloaded{polyglossia}
    {\def\blx@thelangenv{langname}}
    {\def\blx@thelangenv{otherlanguage}}%
  \def\blx@hook@initlang{\@quotereset\@ne}%
  \def\blx@hook@endlang{\blx@postpunct}}

\DeclareBibliographyOption[boolean]{indexing}[true]{%
  \blx@opt@index{#1}}
\DeclareTypeOption[boolean]{indexing}[true]{%
  \blx@opt@index{#1}}
\DeclareEntryOption[boolean]{indexing}[true]{%
  \blx@opt@index{#1}}
\def\blx@opt@index#1{%
  \ifcsdef{blx@opt@index@#1}
    {\csuse{blx@opt@index@#1}}
    {\blx@err@invopt{indexing=#1}{}}}
\def\blx@opt@index@true{%
  \toggletrue{blx@citeindex}%
  \toggletrue{blx@bibindex}}
\def\blx@opt@index@false{%
  \togglefalse{blx@citeindex}%
  \togglefalse{blx@bibindex}}
\def\blx@opt@index@cite{%
  \toggletrue{blx@citeindex}%
  \togglefalse{blx@bibindex}}
\def\blx@opt@index@bib{%
  \togglefalse{blx@citeindex}%
  \toggletrue{blx@bibindex}}

\DeclareBibliographyOption[boolean]{sortcites}[true]{%
  \ifstrequal{#1}{true}
    {\let\blx@thecitesort\blx@citesort
     \let\blx@thenotecheck\blx@notecheck
     \booltrue{sortcites}}
    {\let\blx@thecitesort\blx@citenosort
     \let\blx@thenotecheck\relax}}

\DeclareBibliographyOption[boolean]{sortsets}[true]{%
  \settoggle{blx@sortsets}{#1}}

\DeclareBibliographyOption[boolean]{hyperref}[true]{%
  \ifcsdef{blx@opt@hyperref@#1}
    {\letcs\blx@hyperref{blx@opt@hyperref@#1}}
    {\blx@err@invopt{hyperref=#1}{}}}
\def\blx@opt@hyperref@false{0}
\def\blx@opt@hyperref@true{1}
\def\blx@opt@hyperref@auto{2}
\def\blx@opt@hyperref@manual{3}

\def\blx@warn@usedmanualhyperrefs#1{%
  \blx@warning@noline{The command '\string#1' can\MessageBreak
    only be used with 'hyperref=manual'}}
\def\blx@warn@multiplemanualhyperrefs{%
  \blx@warning@noline{You must call either '\string\BiblatexManualHyperrefOn'\MessageBreak
    or '\string\BiblatexManualHyperrefOff' exactly once.\MessageBreak
    Subsequent calls to either command will be ignored}}
\def\BiblatexManualHyperrefOn{%
  \ifnum\blx@hyperref=\thr@@
    \blx@mkhyperref
    \global\undef\blx@mkhyperref
    \global\undef\blx@mknohyperref
    \global\let\BiblatexManualHyperrefOn\blx@warn@multiplemanualhyperrefs
    \global\let\BiblatexManualHyperrefOff\blx@warn@multiplemanualhyperrefs
  \else
    \blx@warn@usedmanualhyperrefs{\BiblatexManualHyperrefOn}%
  \fi}
\def\BiblatexManualHyperrefOff{%
  \ifnum\blx@hyperref=\thr@@
    \blx@mknohyperref
    \global\undef\blx@mkhyperref
    \global\undef\blx@mknohyperref
    \global\let\BiblatexManualHyperrefOn\blx@warn@multiplemanualhyperrefs
    \global\let\BiblatexManualHyperrefOff\blx@warn@multiplemanualhyperrefs
  \else
    \blx@warn@usedmanualhyperrefs{\BiblatexManualHyperrefOff}%
  \fi}

\DeclareBibliographyOption[boolean]{backref}[true]{%
  \ifstrequal{#1}{true}
    {\let\blx@backref\blx@addbackref
     \let\abx@aux@backref\blx@aux@backref
     \booltrue{backtracker}}
    {\let\blx@backref\@gobble
     \let\abx@aux@backref\@gobblefive
     \boolfalse{backtracker}}}

\DeclareBibliographyOption[string]{backrefsetstyle}{%
  \ifcsdef{blx@opt@backrefsetstyle@#1}
    {\letcs\blx@backrefsetstyle{blx@opt@backrefsetstyle@#1}}
    {\blx@err@invopt{backrefsetstyle=#1}{}}}
\def\blx@opt@backrefsetstyle@setonly{0}
\def\blx@opt@backrefsetstyle@memonly{1}
\def\blx@opt@backrefsetstyle@setormem{2}
\def\blx@opt@backrefsetstyle@setandmem{3}
\def\blx@opt@backrefsetstyle@memandset{4}
\def\blx@opt@backrefsetstyle@setplusmem{5}

\appto\blx@mkhyperref{%
  \ifHy@plainpages
    \blx@warning@noline{%
      hyperref package option 'plainpages' enabled.\MessageBreak
      This may cause problems with hyperlinked back\MessageBreak
      references. 'plainpages=false' is recommended}%
  \fi
  \ifHy@pageanchor\else
    \blx@warning@noline{%
      hyperref package option 'pageanchor' disabled.\MessageBreak
      This will cause problems with hyperlinked back\MessageBreak
      references. 'pageanchor=true' is required}%
  \fi}

\DeclareBibliographyOption[string]{block}{%
  \ifcsdef{blx@opt@block@#1}
    {\csuse{blx@opt@block@#1}}
    {\blx@err@invopt{block=#1}{}}}
\def\blx@opt@block@none{%
  \let\blx@bibsetup\@empty
  \let\newblockpunct\@empty}
\def\blx@opt@block@par{%
  \let\blx@bibsetup\@empty
  \def\newblockpunct{\par}}
\def\blx@opt@block@nbpar{%
  \def\blx@bibsetup{\interlinepenalty\@M}%
  \def\newblockpunct{\par\nobreak}}
\def\blx@opt@block@space{%
  \let\blx@bibsetup\@empty
  \def\newblockpunct{%
    \unspace\space
    \hskip  0.11em
    \@plus  0.33em
    \@minus 0.07em}}
\def\blx@opt@block@ragged{%
  \let\blx@bibsetup\raggedright
  \def\newblockpunct{%
    \unspace\penalty-9\relax\space}}

\DeclareBibliographyOption[boolean]{pagetracker}[true]{%
  \ifcsdef{blx@opt@pagetracker@#1}
    {\csuse{blx@opt@pagetracker@#1}}
    {\blx@err@invopt{pagetracker=#1}{}}}
\def\blx@opt@pagetracker@true{%
  \if@twoside
    \blx@opt@pagetracker@spread
  \else
    \blx@opt@pagetracker@page
  \fi}
\def\blx@opt@pagetracker@false{%
  \let\blx@pagetracker\relax
  \let\abx@aux@page\@gobbletwo
  \let\abx@aux@fnpage\@gobbletwo
  \boolfalse{pagetracker}}
\def\blx@opt@pagetracker@page{%
  \let\blx@pagetracker\blx@pagetracker@context
  \let\abx@aux@page\blx@aux@page
  \let\abx@aux@fnpage\blx@aux@fnpage
  \booltrue{pagetracker}}
\def\blx@opt@pagetracker@spread{%
  \if@twoside
    \let\blx@pagetracker\blx@pagetracker@context
    \let\abx@aux@page\blx@aux@spread
    \let\abx@aux@fnpage\blx@aux@fnspread
    \booltrue{pagetracker}%
  \else
    \blx@warning@noline{%
      LaTeX not in twoside mode\MessageBreak
      Falling back to 'pagetracker=page'}%
    \blx@opt@pagetracker@page
  \fi}

\DeclareBibliographyOption[boolean]{citecounter}[true]{%
  \ifcsdef{blx@opt@citecounter@#1}
    {\csuse{blx@opt@citecounter@#1}}
    {\blx@err@invopt{citecounter=#1}{}}}
\def\blx@opt@citecounter@true{%
  \let\blx@setcitecounter\blx@setcitecounter@global
  \let\blx@citecounter\blx@citecounter@global
  \let\abx@aux@count\blx@aux@count
  \let\abx@aux@fncount\blx@aux@fncount
  \booltrue{citetracker}}
\def\blx@opt@citecounter@context{%
  \let\blx@setcitecounter\blx@setcitecounter@context
  \let\blx@citecounter\blx@citecounter@context
  \let\abx@aux@count\blx@aux@count
  \let\abx@aux@fncount\blx@aux@fncount
  \booltrue{citetracker}}
\def\blx@opt@citecounter@false{%
  \let\blx@setcitecounter\relax
  \let\blx@citecounter\relax
  \let\abx@aux@count\@gobbletwo
  \let\abx@aux@fncount\@gobbletwo}

\DeclareBibliographyOption[boolean]{citetracker}[true]{%
  \ifcsdef{blx@opt@citetracker@#1}
    {\csuse{blx@opt@citetracker@#1}}
    {\blx@err@invopt{citetracker=#1}{}}}
\def\blx@opt@citetracker@true{%
  \let\blx@imc@ifciteseen\blx@ifciteseen@global
  \let\blx@imc@ifentryseen\blx@ifentryseen@global
  \let\blx@citetracker\blx@citetracker@global
  \booltrue{citetracker}}
\def\blx@opt@citetracker@false{%
  \let\blx@imc@ifciteseen\@secondoftwo
  \protected\long\def\blx@imc@ifentryseen##1##2##3{##3}%
  \let\blx@citetracker\relax}
\def\blx@opt@citetracker@context{%
  \let\blx@imc@ifciteseen\blx@ifciteseen@context
  \let\blx@imc@ifentryseen\blx@ifentryseen@context
  \let\blx@citetracker\blx@citetracker@context
  \booltrue{citetracker}}
\def\blx@opt@citetracker@strict{%
  \let\blx@imc@ifciteseen\blx@ifciteseen@global
  \let\blx@imc@ifentryseen\blx@ifentryseen@global
  \def\blx@citetracker{%
    \blx@ifcitesingle{\blx@citetracker@global}{}}%
  \booltrue{citetracker}}
\def\blx@opt@citetracker@constrict{%
  \let\blx@imc@ifciteseen\blx@ifciteseen@context
  \let\blx@imc@ifentryseen\blx@ifentryseen@context
  \def\blx@citetracker{%
    \blx@ifcitesingle{\blx@citetracker@context}{}}%
  \booltrue{citetracker}}

\DeclareBibliographyOption[boolean]{ibidtracker}[true]{%
  \ifcsdef{blx@opt@ibidtracker@#1}
    {\csuse{blx@opt@ibidtracker@#1}}
    {\blx@err@invopt{ibidtracker=#1}{}}}
\def\blx@opt@ibidtracker@true{%
  \let\blx@imc@ifciteibid\blx@ifciteibid@global
  \let\blx@ibidtracker\blx@ibidtracker@global
  \let\blx@ibidreset\blx@ibidreset@global
  \booltrue{citetracker}}
\def\blx@opt@ibidtracker@false{%
  \let\blx@imc@ifciteibid\@secondoftwo
  \let\blx@ibidtracker\relax
  \let\blx@ibidreset\relax}
\def\blx@opt@ibidtracker@context{%
  \let\blx@imc@ifciteibid\blx@ifciteibid@context
  \let\blx@ibidtracker\blx@ibidtracker@context
  \let\blx@ibidreset\blx@ibidreset@context
  \booltrue{citetracker}}
\def\blx@opt@ibidtracker@strict{%
  \let\blx@imc@ifciteibid\blx@ifciteibid@strict
  \let\blx@ibidtracker\blx@ibidtracker@strict
  \let\blx@ibidreset\blx@ibidreset@global
  \booltrue{citetracker}}
\def\blx@opt@ibidtracker@constrict{%
  \let\blx@imc@ifciteibid\blx@ifciteibid@constrict
  \let\blx@ibidtracker\blx@ibidtracker@constrict
  \let\blx@ibidreset\blx@ibidreset@context
  \booltrue{citetracker}}

\DeclareBibliographyOption[boolean]{idemtracker}[true]{%
  \ifcsdef{blx@opt@idemtracker@#1}
    {\csuse{blx@opt@idemtracker@#1}}
    {\blx@err@invopt{idemtracker=#1}{}}}
\def\blx@opt@idemtracker@true{%
  \let\blx@imc@ifciteidem\blx@ifciteidem@global
  \let\blx@idemtracker\blx@idemtracker@global
  \let\blx@idemreset\blx@idemreset@global
  \booltrue{citetracker}}
\def\blx@opt@idemtracker@false{%
  \let\blx@imc@ifciteidem\@secondoftwo
  \let\blx@idemtracker\relax
  \let\blx@idemreset\relax}
\def\blx@opt@idemtracker@context{%
  \let\blx@imc@ifciteidem\blx@ifciteidem@context
  \let\blx@idemtracker\blx@idemtracker@context
  \let\blx@idemreset\blx@idemreset@context
  \booltrue{citetracker}}
\def\blx@opt@idemtracker@strict{%
  \let\blx@imc@ifciteidem\blx@ifciteidem@strict
  \let\blx@idemtracker\blx@idemtracker@strict
  \let\blx@idemreset\blx@idemreset@global
  \booltrue{citetracker}}
\def\blx@opt@idemtracker@constrict{%
  \let\blx@imc@ifciteidem\blx@ifciteidem@constrict
  \let\blx@idemtracker\blx@idemtracker@constrict
  \let\blx@idemreset\blx@idemreset@context
  \booltrue{citetracker}}

\DeclareBibliographyOption[boolean]{opcittracker}[true]{%
  \ifcsdef{blx@opt@opcittracker@#1}
    {\csuse{blx@opt@opcittracker@#1}}
    {\blx@err@invopt{opcittracker=#1}{}}}
\def\blx@opt@opcittracker@true{%
  \let\blx@imc@ifopcit\blx@ifopcit@global
  \let\blx@opcittracker\blx@opcittracker@global
  \let\blx@opcitreset\blx@opcitreset@global
  \booltrue{citetracker}}
\def\blx@opt@opcittracker@false{%
  \let\blx@imc@ifopcit\@secondoftwo
  \let\blx@opcittracker\relax
  \let\blx@opcitreset\relax}
\def\blx@opt@opcittracker@context{%
  \let\blx@imc@ifopcit\blx@ifopcit@context
  \let\blx@opcittracker\blx@opcittracker@context
  \let\blx@opcitreset\blx@opcitreset@context
  \booltrue{citetracker}}
\def\blx@opt@opcittracker@strict{%
  \let\blx@imc@ifopcit\blx@ifopcit@strict
  \let\blx@opcittracker\blx@opcittracker@strict
  \let\blx@opcitreset\blx@opcitreset@global
  \booltrue{citetracker}}
\def\blx@opt@opcittracker@constrict{%
  \let\blx@imc@ifopcit\blx@ifopcit@constrict
  \let\blx@opcittracker\blx@opcittracker@constrict
  \let\blx@opcitreset\blx@opcitreset@context
  \booltrue{citetracker}}

\DeclareBibliographyOption[boolean]{loccittracker}[true]{%
  \ifcsdef{blx@opt@loccittracker@#1}
    {\csuse{blx@opt@loccittracker@#1}}
    {\blx@err@invopt{loccittracker=#1}{}}}
\def\blx@opt@loccittracker@true{%
  \let\blx@imc@ifloccit\blx@ifloccit@global
  \let\blx@loccittracker\blx@loccittracker@global
  \let\blx@loccitreset\blx@loccitreset@global
  \booltrue{citetracker}}
\def\blx@opt@loccittracker@false{%
  \let\blx@imc@ifloccit\@secondoftwo
  \let\blx@loccittracker\relax
  \let\blx@loccitreset\relax}
\def\blx@opt@loccittracker@context{%
  \let\blx@imc@ifloccit\blx@ifloccit@context
  \let\blx@loccittracker\blx@loccittracker@context
  \let\blx@loccitreset\blx@loccitreset@context
  \booltrue{citetracker}}
\def\blx@opt@loccittracker@strict{%
  \let\blx@imc@ifloccit\blx@ifloccit@strict
  \let\blx@loccittracker\blx@loccittracker@strict
  \let\blx@loccitreset\blx@loccitreset@global
  \booltrue{citetracker}}
\def\blx@opt@loccittracker@constrict{%
  \let\blx@imc@ifloccit\blx@ifloccit@constrict
  \let\blx@loccittracker\blx@loccittracker@constrict
  \let\blx@loccitreset\blx@loccitreset@context
  \booltrue{citetracker}}

\DeclareBibliographyOption[boolean]{parentracker}[true]{%
  \ifstrequal{#1}{true}
    {\let\bibopenparen\blx@bibopenparen
     \let\bibcloseparen\blx@bibcloseparen
     \let\bibopenbracket\blx@bibopenbracket
     \let\bibclosebracket\blx@bibclosebracket}
    {\protected\def\bibopenparen{\bibleftparen}%
     \protected\def\bibcloseparen{\bibrightparen}%
     \protected\def\bibopenbracket{\bibleftbracket}%
     \protected\def\bibclosebracket{\bibrightbracket}}}

\DeclareBibliographyOption[integer]{maxparens}{%
  \ifnumless{#1}{1}
    {\blx@err@invopt{maxparens=#1}{}}
    {\setcounter{maxparens}{#1}}}

\newtoggle{blx@labeldateusetime}
\DeclareBibliographyOption[boolean]{labeldateusetime}[true]{%
  \ifstrequal{#1}{true}
    {\toggletrue{blx@labeldateusetime}}
    {\togglefalse{blx@labeldateusetime}}}

\DeclareBibliographyOption[string]{labeldate}{%
   % 'true' or 'false' means that the user thinks that this is the old 'labeldate'
   % option which is now 'labeldateparts' (which is a boolean).
   \ifboolexpr{%
     test {\ifstrequal{#1}{true}}
     or
     test {\ifstrequal{#1}{false}}}
     {\blx@warning@noline{%
       'labeldate' option used to determine whether to provide label date fields and\MessageBreak
       extradate field is renamed to 'labeldateparts', setting this instead. This option is
       now used to set the format of the labeldate}%
      \settoggle{blx@labeldateparts}{#1}}
     {\ifstrequal{#1}{iso8601}
       {\blx@warning@noline{%
        'iso8601' date format specifier is deprecated, use 'edtf' instead}%
        \def\blx@dateformat@labeldate{edtf}%
        \renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
       {\def\blx@dateformat@labeldate{#1}}%
      \ifstrequal{#1}{ymd}
         {\renewrobustcmd*{\bibdaterangesep}{\slash}%
          \renewrobustcmd*{\bibtimerangesep}{\slash}%
          \renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
         {}%
      \ifstrequal{#1}{edtf}% bibdaterangesep hard-coded to slash, no extra space before prefices
        {\renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
        {}%
      \ifcsdef{mkdaterange#1}
       {\protected\def\blx@imc@printlabeldate{\csuse{mkdaterange#1}{label}}
        \protected\def\blx@imc@printlabeldateextra{\csuse{mkdaterange#1extra}{label}}}
       {\ifcsdef{mkbibrange#1}%LEGACY(<3.5)
         {\protected\def\blx@imc@printlabeldate{\csuse{mkbibrange#1}{label}}
          \protected\def\blx@imc@printlabeldateextra{\csuse{mkbibrange#1extra}{label}}}
         {\blx@err@invopt{labeldate=#1}{}}}}}

\DeclareBibliographyOption[string]{labeltime}{%
  \ifcsdef{mktimerange#1}
    {\def\blx@timeformat@labeltime{#1}%
     \protected\def\blx@imc@printlabeltime{\csuse{mktimerange#1}{label}}}
    {\blx@err@invopt{labeltime=#1}{}}}

% Date meta-information
\DeclareBibliographyOption[string]{dateera}{%
  \ifboolexpr{%
              test {\ifstrequal{#1}{astronomical}}
              or
              test {\ifstrequal{#1}{secular}}
              or
              test {\ifstrequal{#1}{christian}}}
  {\def\blx@dateera{#1}%
   \ifstrequal{#1}{secular}
     {\def\blx@dateera@bce{beforecommonera}%
      \def\blx@dateera@ce{commonera}}
     {}%
   \ifstrequal{#1}{christian}
     {\def\blx@dateera@bce{beforechrist}%
      \def\blx@dateera@ce{annodomini}}
     {}}
  {\blx@err@invopt{dateera=#1}{}}}

% Effectively turns off dateeraauto since it's only used on ce dates which
% are never less than zero (as that would be a bce date)
\numdef\blx@dateeraauto{0}
\DeclareBibliographyOption[integer]{dateeraauto}{%
  \numdef\blx@dateeraauto{#1}}

\newtoggle{blx@datecirca}
\DeclareBibliographyOption[boolean]{datecirca}[true]{%
  \ifstrequal{#1}{true}
    {\toggletrue{blx@datecirca}%
     \protected\def\datecircaprint{%
       \ifdatecirca{\bibstring{circa}\printdelim{datecircadelim}}{}}%
     \protected\def\enddatecircaprint{%
       \ifenddatecirca{\bibstring{circa}\printdelim{datecircadelim}}{}}%
     \protected\def\datecircaprintedtf{%
       \ifdatecirca{\textasciitilde}{}}%
     \protected\def\enddatecircaprintedtf{%
       \ifenddatecirca{\textasciitilde}{}}}
    {\togglefalse{blx@datecirca}}}

\newtoggle{blx@dateuncertain}
\DeclareBibliographyOption[boolean]{dateuncertain}[true]{%
  \ifstrequal{#1}{true}
    {\toggletrue{blx@dateuncertain}%
     \protected\def\dateuncertainprint{%
       \ifdateuncertain{\bibdateuncertain}{}}%
     \protected\def\enddateuncertainprint{%
       \ifenddateuncertain{\bibdateuncertain}{}}}
    {\togglefalse{blx@dateuncertain}}}

% *time format options - auto-created for all datamodel date fields
% *date format options - auto-created for all datamodel date fields
% *dateusetime options - auto-created for all datamodel date fields
% Date metadata toggles are defined in one of the \abx@dobooleans calls
\def\do#1{%
  \DeclareBibliographyOption[string]{#1date}{%
    \ifstrequal{##1}{iso8601}
      {\blx@warning@noline{'iso8601' date format specifier is deprecated, use 'edtf' instead}%
       \csdef{blx@dateformat@#1date}{edtf}}
      {\csdef{blx@dateformat@#1date}{##1}}%
    \ifstrequal{##1}{ymd}
      {\renewrobustcmd*{\bibdaterangesep}{\slash}%
       \renewrobustcmd*{\bibtimerangesep}{\slash}%
       \renewrobustcmd*{\bibdateeraendprefix}{\bibdateeraprefix}}
      {}%
    \ifcsdef{mkdaterange##1}
      {\protected\csedef{blx@imc@print#1date}{\noexpand\csuse{mkdaterange##1}{#1}}%
       \protected\csedef{blx@imc@print#1dateextra}{\noexpand\csuse{mkdaterange##1extra}{#1}}}
      {\ifcsdef{mkbibrange##1}%LEGACY(<3.5)
        {\blx@warning@noline{%
           '\string\mkbibrange##1(extra)' date range macro in style is deprecated,\MessageBreak
           please define '\string\mkdaterange##1(extra)' instead}%
         \protected\csedef{blx@imc@print#1date}{\noexpand\csuse{mkbibrange##1}{#1}}%
         \protected\csedef{blx@imc@print#1dateextra}{\noexpand\csuse{mkbibrange##1extra}{#1}}}
        {\blx@err@invopt{#1date=##1}{}}}}%
    % Default for new date fields is "comp" but this is overridden below by
    % biblatex defaults
    \setkeys{blx@opt@pre}{#1date=comp}%
    % Time format options
    \DeclareBibliographyOption[string]{#1time}{%
      \csdef{blx@timeformat@#1time}{##1}%
      \ifcsdef{mktimerange##1}
        {\protected\csedef{blx@imc@print#1time}{\csuse{mktimerange##1}{#1}}}
        {\blx@err@invopt{#1time=##1}{}}}%
    % Default for new time fields is "24h"
    \setkeys{blx@opt@pre}{#1time=24h}%
    % Boolean for unknown dates
    \newtoggle{abx@bool@#1dateunknown}%
    \newtoggle{abx@bool@end#1dateunknown}%
    % Boolean to determine if times are printed with dates
    \newtoggle{blx@#1dateusetime}%
    \DeclareBibliographyOption[boolean]{#1dateusetime}{%
      \ifstrequal{##1}{true}
        {\toggletrue{blx@#1dateusetime}}
        {\togglefalse{blx@#1dateusetime}}}}
\abx@dodatetypes

\DeclareBibliographyOption[string]{alldatesusetime}{%
  \def\do##1{\ExecuteBibliographyOptions{##1usetime=#1}}%
  \abx@dodates
  \do{labeldate}}

\DeclareBibliographyOption[string]{alldates}{%
  \def\do##1{\ExecuteBibliographyOptions{##1=#1}}%
  \abx@dodates
  \do{labeldate}}

\DeclareBibliographyOption[string]{alltimes}{%
  \def\do##1{%
    \ExecuteBibliographyOptions{##1time=#1}}%
  \abx@dodatetypes
  \do{label}}

\newtoggle{blx@julian}
\def\blx@gregorianstart{1582-10-15}
\DeclareBibliographyOption[boolean]{julian}[true]{%
  \ifstrequal{#1}{true}
    {\toggletrue{blx@julian}}
    {\togglefalse{blx@julian}}}

\DeclareBibliographyOption[string]{gregorianstart}{%
  \def\blx@gregorianstart{#1}}

\newtoggle{blx@datezeros}\toggletrue{blx@datezeros}
\DeclareBibliographyOption[boolean]{datezeros}[true]{%
  \ifstrequal{#1}{true}
    {\toggletrue{blx@datezeros}%
     \let\blx@imc@mkyearzeros\blx@imc@forcezerosy
     \let\blx@imc@mkmonthzeros\blx@imc@forcezerosmdt
     \let\blx@imc@mkdayzeros\blx@imc@forcezerosmdt}
    {\togglefalse{blx@datezeros}%
     \let\blx@imc@mkyearzeros\blx@imc@stripzeros
     \let\blx@imc@mkmonthzeros\blx@imc@stripzeros
     \let\blx@imc@mkdayzeros\blx@imc@stripzeros}}

\newtoggle{blx@timezeros}\toggletrue{blx@timezeros}
\DeclareBibliographyOption[boolean]{timezeros}[true]{%
  \ifstrequal{#1}{true}
    {\toggletrue{blx@timezeros}%
     \let\blx@imc@mktimezeros\blx@imc@forcezerosmdt}
    {\togglefalse{blx@timezeros}%
     \let\blx@imc@mktimezeros\blx@imc@stripzeros}}

\newtoggle{blx@timezones}
\DeclareBibliographyOption[boolean]{timezones}[true]{%
  \ifstrequal{#1}{true}
    {\toggletrue{blx@timezones}}
    {\togglefalse{blx@timezones}}}

\newtoggle{blx@seconds}
\DeclareBibliographyOption[boolean]{seconds}[true]{%
  \ifstrequal{#1}{true}
    {\toggletrue{blx@seconds}}
    {\togglefalse{blx@seconds}}}

\DeclareBibliographyOption[string]{autocite}{%
  \ifcsundef{blx@acite@#1}
    {\blx@error
       {Autocite command '#1' undefined}
       {The autocite command '#1' has not been defined by
        the\MessageBreak selected citation style}}
    {\letcs\autocite{blx@acite@#1}%
     \letcs\autocites{blx@macite@#1}}}

\DeclareBibliographyOption[string]{notetype}{%
  \ifcsdef{blx@opt@notetype@#1}
    {\blx@notetype\csuse{blx@opt@notetype@#1}}
    {\blx@err@invopt{notetype=#1}{}}}
\cslet{blx@opt@notetype@foot+end}\z@
\let\blx@opt@notetype@footonly\@ne
\let\blx@opt@notetype@endonly\tw@

\DeclareBibliographyOption[boolean]{autopunct}[true]{%
  \ifstrequal{#1}{true}
    {\DeclareAutoPunctuation{.,;:!?}}
    {\DeclareAutoPunctuation{}}}

\DeclareBibliographyOption[boolean]{punctfont}[true]{%
  \ifstrequal{#1}{true}
    {\let\blx@ifpuncthook\@firstoftwo}
    {\let\blx@ifpuncthook\@secondoftwo}}

\DeclareBibliographyOption[boolean]{labelnumber}[true]{%
  \settoggle{blx@labelnumber}{#1}%
  \iftoggle{blx@labelnumber}
    {}
    {\setkeys{blx@opt@pre}{defernumbers=false}}}
\DeclareTypeOption[boolean]{labelnumber}[true]{%
  \settoggle{blx@labelnumber}{#1}}

\DeclareBibliographyOption[boolean]{labelalpha}[true]{%
  \settoggle{blx@labelalpha}{#1}}
\DeclareTypeOption[boolean]{labelalpha}[true]{%
  \settoggle{blx@labelalpha}{#1}}

\DeclareBibliographyOption[boolean]{labeltitle}[true]{%
  \settoggle{blx@labeltitle}{#1}}
\DeclareTypeOption[boolean]{labeltitle}[true]{%
  \settoggle{blx@labeltitle}{#1}}

\DeclareBibliographyOption[boolean]{labeltitleyear}[true]{%
  \settoggle{blx@labeltitleyear}{#1}}
\DeclareTypeOption[boolean]{labeltitleyear}[true]{%
  \settoggle{blx@labeltitleyear}{#1}}

\DeclareBibliographyOption[boolean]{labeldateparts}[true]{%
  \settoggle{blx@labeldateparts}{#1}}
\DeclareTypeOption[boolean]{labeldateparts}[true]{%
  \settoggle{blx@labeldateparts}{#1}}

\DeclareBibliographyOption[boolean]{uniquelist}[true]{%
  \ifcsdef{blx@opt@uniquelist@#1}
    {\letcs\blx@uniquelist{blx@opt@uniquelist@#1}}
    {\blx@err@invopt{uniquelist=#1}{}}}
\DeclareTypeOption[boolean]{uniquelist}[true]{%
  \ifcsdef{blx@opt@uniquelist@#1}
    {\letcs\blx@uniquelist{blx@opt@uniquelist@#1}}
    {\blx@err@invopt{uniquelist=#1}{}}}
\DeclareEntryOption[boolean]{uniquelist}[true]{%
  \ifcsdef{blx@opt@uniquelist@#1}
    {\letcs\blx@uniquelist{blx@opt@uniquelist@#1}}
    {\blx@err@invopt{uniquelist=#1}{}}}
\def\blx@opt@uniquelist@false{0}
\def\blx@opt@uniquelist@true{1}
\def\blx@opt@uniquelist@minyear{2}

\DeclareBibliographyOption[boolean]{uniquename}[true]{%
  \ifcsdef{blx@opt@uniquename@#1}
    {\letcs\blx@uniquename{blx@opt@uniquename@#1}}
    {\blx@err@invopt{uniquename=#1}{}}}
\DeclareTypeOption[boolean]{uniquename}[true]{%
  \ifcsdef{blx@opt@uniquename@#1}
    {\letcs\blx@uniquename{blx@opt@uniquename@#1}}
    {\blx@err@invopt{uniquename=#1}{}}}
\DeclareEntryOption[boolean]{uniquename}[true]{%
  \ifcsdef{blx@opt@uniquename@#1}
    {\letcs\blx@uniquename{blx@opt@uniquename@#1}}
    {\blx@err@invopt{uniquename=#1}{}}}
\def\blx@opt@uniquename@false{0}
\def\blx@opt@uniquename@init{1}
\def\blx@opt@uniquename@true{2}
\def\blx@opt@uniquename@full{2}
\def\blx@opt@uniquename@allinit{3}
\def\blx@opt@uniquename@allfull{4}
\def\blx@opt@uniquename@mininit{5}
\def\blx@opt@uniquename@minfull{6}

\DeclareBibliographyOption[boolean]{singletitle}[true]{%
  \settoggle{blx@singletitle}{#1}}
\DeclareTypeOption[boolean]{singletitle}[true]{%
  \settoggle{blx@singletitle}{#1}}

\DeclareBibliographyOption[boolean]{uniquetitle}[true]{%
  \settoggle{blx@uniquetitle}{#1}}
\DeclareTypeOption[boolean]{uniquetitle}[true]{%
  \settoggle{blx@uniquetitle}{#1}}

\DeclareBibliographyOption[boolean]{uniquebaretitle}[true]{%
  \settoggle{blx@uniquebaretitle}{#1}}
\DeclareTypeOption[boolean]{uniquebaretitle}[true]{%
  \settoggle{blx@uniquebaretitle}{#1}}

\DeclareBibliographyOption[boolean]{uniquework}[true]{%
  \settoggle{blx@uniquework}{#1}}
\DeclareTypeOption[boolean]{uniquework}[true]{%
  \settoggle{blx@uniquework}{#1}}

\DeclareBibliographyOption[boolean]{uniqueprimaryauthor}[true]{%
  \settoggle{blx@uniqueprimaryauthor}{#1}}

\DeclareBibliographyOption[boolean]{defernumbers}[true]{%
  \settoggle{blx@defernumbers}{#1}%
  \iftoggle{blx@defernumbers}
    {\setkeys{blx@opt@pre}{labelnumber}%
     \let\blx@thelabelnumber\blx@addlabelnumber
     \let\abx@aux@number\blx@aux@number}
    {\let\blx@thelabelnumber\relax
     \let\abx@aux@number\@gobblefive}}

\DeclareBibliographyOption[string]{refsection}{%
  \ifcsdef{blx@opt@refsection@#1}
    {\letcs\blx@refsecreset@level{blx@opt@refsection@#1}}
    {\blx@err@invopt{refsection=#1}{}}}
\def\blx@opt@refsection@none{0}
\def\blx@opt@refsection@part{1}
\def\blx@opt@refsection@chapter{2}
\def\blx@opt@refsection@section{3}
\def\blx@opt@refsection@subsection{4}

\AtEndPreamble{%
  \ifcase\blx@refsecreset@level
  \or % 1
    \blx@refpatch@part\newrefsection
  \or % 2
    \blx@refpatch@chapter\newrefsection
  \or % 3
    \blx@refpatch@sect{section}{\newrefsection}{1}%
  \or % 4
    \blx@refpatch@sect{subsection}{\newrefsection}{2}%
  \fi}

\DeclareBibliographyOption[string]{refsegment}{%
  \ifcsdef{blx@opt@refsegment@#1}
    {\letcs\blx@refsegreset@level{blx@opt@refsegment@#1}}
    {\blx@err@invopt{refsegment=#1}{}}}
\def\blx@opt@refsegment@none{0}
\def\blx@opt@refsegment@part{1}
\def\blx@opt@refsegment@chapter{2}
\def\blx@opt@refsegment@section{3}
\def\blx@opt@refsegment@subsection{4}

\AtEndPreamble{%
  \ifnumgreater\blx@refsegreset@level\z@
    {\ifnumgreater\blx@refsegreset@level\blx@refsecreset@level
       {}
       {\blx@err@confopt
          {refsegment/refsection}
          {The 'refsegment' option must point to a
           lower-level\MessageBreak document division
           than 'refsection'}%
        \def\blx@refsegreset@level{0}}}
    {}%
  \ifcase\blx@refsegreset@level
  \or % 1
    \blx@refpatch@part\newrefsegment
  \or % 2
    \blx@refpatch@chapter\newrefsegment
  \or % 3
    \blx@refpatch@sect{section}{\newrefsegment}{1}%
  \or % 4
    \blx@refpatch@sect{subsection}{\newrefsegment}{2}%
  \fi}

\DeclareBibliographyOption[string]{citereset}{%
  \ifcsdef{blx@opt@citereset@#1}
    {\letcs\blx@citereset@level{blx@opt@citereset@#1}}
    {\blx@err@invopt{citereset=#1}{}}}
\def\blx@opt@citereset@none{0}
\def\blx@opt@citereset@part{1}
\def\blx@opt@citereset@chapter{2}
\def\blx@opt@citereset@section{3}
\def\blx@opt@citereset@subsection{4}

\AtEndPreamble{%
  \ifcase\blx@citereset@level
  \or % 1
    \blx@refpatch@part{\citereset\blx@inf@creset}%
  \or % 2
    \blx@refpatch@chapter{\citereset\blx@inf@creset}%
  \or % 3
    \blx@refpatch@sect{section}{\citereset\blx@inf@creset}{1}%
  \or % 4
    \blx@refpatch@sect{subsection}{\citereset\blx@inf@creset}{2}%
  \fi}

\DeclareBibliographyOption[boolean]{bibwarn}[true]{%
  \ifstrequal{#1}{true}
    {\let\blx@bbl@thewarn\blx@bbl@warn}
    {\let\blx@bbl@thewarn\@gobble}}

% Name field options
\def\do#1{%
  \DeclareBibliographyOption[boolean]{use#1}[true]{%
    \settoggle{blx@use#1}{##1}}
  \DeclareTypeOption[boolean]{use#1}[true]{%
    \settoggle{blx@use#1}{##1}}
  \DeclareEntryOption[boolean]{use#1}[true]{%
    \settoggle{blx@use#1}{##1}}}
\abx@donames

% Entry options
\DeclareBibliographyOption[boolean]{useprefix}[true]{%
  \settoggle{blx@useprefix}{#1}}
\DeclareTypeOption[boolean]{useprefix}[true]{%
  \settoggle{blx@useprefix}{#1}}
\DeclareEntryOption[boolean]{useprefix}[true]{%
  \settoggle{blx@useprefix}{#1}}

\DeclareTypeOption[boolean]{skipbib}[true]{%
  \settoggle{blx@skipbib}{#1}}
\DeclareEntryOption[boolean]{skipbib}[true]{%
  \settoggle{blx@skipbib}{#1}}

\DeclareTypeOption[boolean]{skipbiblist}[true]{%
  \settoggle{blx@skipbiblist}{#1}}
\DeclareEntryOption[boolean]{skipbiblist}[true]{%
  \settoggle{blx@skipbiblist}{#1}}

\DeclareTypeOption[boolean]{skiplab}[true]{%
  \settoggle{blx@skiplab}{#1}}
\DeclareEntryOption[boolean]{skiplab}[true]{%
  \settoggle{blx@skiplab}{#1}}

\DeclareTypeOption[boolean]{dataonly}[true]{%
  \settoggle{blx@skipbib}{#1}%
  \settoggle{blx@skipbiblist}{#1}%
  \settoggle{blx@skiplab}{#1}}
\DeclareEntryOption[boolean]{dataonly}[true]{%
  \settoggle{blx@skipbib}{#1}%
  \settoggle{blx@skipbiblist}{#1}%
  \settoggle{blx@skiplab}{#1}}

% Option processor/scheduler
\DeclareOption*{%
  \begingroup
  \def\blx@tempa#1=#2&{#1}%
  \edef\blx@tempa{%
    \expandafter\blx@tempa\CurrentOption=&}%
  \ifcsundef{KV@blx@opt@ldt@\blx@tempa}
    {\endgroup
     \eappto\blx@theoptions{\CurrentOption,}}
    {\edef\blx@tempa{\endgroup
       \noexpand\setkeys{blx@opt@ldt}{\CurrentOption}}%
     \blx@tempa}}

\def\blx@processoptions{%
  \ifundef\blx@theoptions
    {}
    {\begingroup
     \edef\blx@tempa{\endgroup
       \noexpand\setkeys{blx@opt@pre}{\blx@theoptions}}%
     \blx@tempa}}

%% Initial setup

% Set defaults
\setkeys{blx@opt@ldt}{style=numeric}
\setkeys{blx@opt@pre}{%
  sorting=nty,sortlocale=auto,sortcase,sortupper,sortcites=false,
  maxnames=3,minnames=1,maxalphanames=3,minalphanames=1,
  maxitems=3,minitems=1,mincrossrefs=2,minxrefs=2,useauthor=true,useeditor=true,
  usetranslator=false,indexing=false,abbreviate=true,dateabbrev=true,dateera=astronomical,
  backref=false,backrefsetstyle=setonly,pagetracker=false,ibidtracker=false,
  idemtracker=false,opcittracker=false,loccittracker=false,citetracker=false,
  citecounter=false,block=none,language=autobib,clearlang=true,autolang=none,
  date=comp,labeldate=year,origdate=comp,eventdate=comp,urldate=short,
  autopunct=true,punctfont=false,defernumbers=false,timezeros=true,
  refsection=none,refsegment=none,citereset=none,hyperref=auto,
  parentracker,maxparens=3,bibencoding=auto,bibwarn,timezones=false,
  seconds=false,julian=false,labeltime=24h}

% Load compatibility code
\blx@inputonce{blx-compat.def}{compatibility code}{}{}{}{}

% Restore catcodes
\blx@catcodes
\undef\blx@catcodes

% Process load-time options
\ProcessOptions*

% Switch to BibTeX support if requests
\iftoggle{blx@bibtex}
  {\blx@inputonce{blx-bibtex.def}{BibTeX backend compatibility}{}{}{}{}}
  {}

% Load citation and bibliography styles, configuration file
\blx@inputonce{biblatex.def}{generic definitions}{}{}{}{}
\iftoggle{blx@natbib}
  {\blx@inputonce{blx-natbib.def}{natbib compatibility}{}{}{}{}}
  {}
\iftoggle{blx@mcite}
  {\blx@inputonce{blx-mcite.def}{mcite-like commands}{}{}{}{}}
  {}
\RequireBibliographyStyle{\blx@bbxfile}
\RequireCitationStyle{\blx@cbxfile}
\blx@secinit
\citereset
\blx@inputonce{biblatex.cfg}{configuration file}{}{}{}{}

% Process preamble options
\blx@processoptions

% Deferred setup at end of preamble
\AtEndPreamble{%
  \blx@checkoptions@global
  \c@maxnames\blx@maxcitenames\relax
  \c@minnames\blx@mincitenames\relax
  \c@maxitems\blx@maxitems\relax
  \c@minitems\blx@minitems\relax
  \togglefalse{abx@bool@xinits}
  \def\do#1{\iftoggle{abx@bool@#1inits}{\toggletrue{abx@bool@xinits}}{}}
  \abx@donameparts
  \iftoggle{abx@bool@xinits}
    {\ifnumequal\blx@uniquename\blx@opt@uniquename@full
       {\blx@warn@conflopt{%
          '<namepart>inits' conflicts with 'uniquename=full'.\MessageBreak
          Setting 'uniquename=init'}%
        \setkeys{blx@opt@pre}{uniquename=init}}
       {}%
     \ifnumequal\blx@uniquename\blx@opt@uniquename@allfull
       {\blx@warn@conflopt{%
          '<namepart>inits' conflicts with 'uniquename=allfull'.\MessageBreak
          Setting 'uniquename=allinit}%
        \setkeys{blx@opt@pre}{uniquename=allinit}}
       {}%
     \ifnumequal\blx@uniquename\blx@opt@uniquename@minfull
       {\blx@warn@conflopt{%
          '<namepart>inits' conflicts with 'uniquename=minfull'.\MessageBreak
          Setting 'uniquename=mininit}%
        \setkeys{blx@opt@pre}{uniquename=mininit}}
       {}}
    {}%
  \nottoggle{blx@labeldateparts}
    {\ifnumequal\blx@uniquelist\blx@opt@uniquelist@minyear
       {\blx@warn@conflopt{%
          'uniquelist=minyear' requires 'labeldateparts'.\MessageBreak
          Setting 'uniquelist=true'}%
        \setkeys{blx@opt@pre}{uniquelist}}
       {}}
    {}%
    \def\do#1{%
      \ifcsstring{blx@dateformat@#1}{edtf}
        {\StrCut{#1}{date}\blx@datetype\blx@tempnull
         \ifdefstring\blx@dateera{astronomical}{}
           {\blx@warn@conflopt{%
              '#1=edtf' requires 'dateera=astronomical'.\MessageBreak
              Setting 'dateera=astrononmical'}%
            \setkeys{blx@opt@pre}{dateera=astronomical}}%
          \ifcsstring{blx@timeformat@\blx@datetype time}{24h}%
           {}
           {\blx@warn@conflopt{%
              '#1=edtf' requires '\blx@datetype time=24h'.\MessageBreak
              Setting '\blx@datetype time=24h'}%
            \setkeys{blx@opt@pre}{\blx@datetype time=24h}}%
         \iftoggle{blx@julian}
           {\blx@warn@conflopt{%
              '#1=edtf' requires 'julian=false'.\MessageBreak
              Setting 'julian=false'}%
            \setkeys{blx@opt@pre}{julian=false}}
           {}%
         \nottoggle{blx@datezeros}
           {\blx@warn@conflopt{%
              '#1=edtf' requires 'datezeros=true'.\MessageBreak
              Setting 'datezeros=true'}%
            \setkeys{blx@opt@pre}{datezeros=true}}
           {}%
         \nottoggle{blx@timezeros}
           {\blx@warn@conflopt{%
              '#1=edtf' requires 'timezeros=true'.\MessageBreak
              Setting 'timezeros=true'}%
            \setkeys{blx@opt@pre}{timezeros=true}}
           {}%
         \nottoggle{blx@seconds}
           {\blx@warn@conflopt{%
              '#1=edtf' requires 'seconds=true'.\MessageBreak
              Setting 'seconds=true'}%
            \setkeys{blx@opt@pre}{seconds=true}}
           {}}
        {}}%
    \abx@dodates
    \do{labeldate}}

\def\blx@checkencoding{%
  \ifdef\blx@texencoding
    {\blx@info@noline{%
       Input encoding '\blx@texencoding' specified}}
    {\ifundef\inputencodingname
       {\ifundef\XeTeXrevision
          {\ifundef\luatexversion
             {\def\blx@texencoding{ascii}%
              \blx@info@noline{%
                No input encoding detected.\MessageBreak
                Assuming '\blx@texencoding'}}
             {\def\blx@texencoding{utf8}%
              \blx@info@noline{%
                LuaTeX detected.\MessageBreak
                Assuming input encoding '\blx@texencoding'}}}
          {\def\blx@texencoding{utf8}%
           \blx@info@noline{%
             XeTeX detected.\MessageBreak
             Assuming input encoding '\blx@texencoding'}}}
       {\ifcsdef{blx@inpenc@\inputencodingname}
          {\letcs\blx@texencoding{blx@inpenc@\inputencodingname}}
          {\let\blx@texencoding\inputencodingname}%
        \blx@info@noline{%
          Input encoding '\blx@texencoding' detected}}}%
  \ifdef\blx@bibencoding
    {\ifdefstring\blx@bibencoding{ascii}
       {\blx@info@noline{%
          Data encoding '\blx@bibencoding' specified.\MessageBreak
          No need to reencode data}}
       {\ifdefstring\blx@bibencoding{auto}
          {\let\blx@bibencoding\blx@texencoding
           \blx@info@noline{%
             Automatic encoding selection.\MessageBreak
             Assuming data encoding '\blx@bibencoding'}}
          {\ifdefstrequal\blx@bibencoding\blx@texencoding
             {\blx@info@noline{%
                Data encoding '\blx@bibencoding' specified.\MessageBreak
                No need to reencode data}}
             {\blx@info@noline{%
                   Data encoding '\blx@bibencoding' specified.\MessageBreak
                   Backend will reencode on the fly}}}}}
    {\def\blx@bibencoding{ascii}%
     \blx@info@noline{%
        Data encoding not specified.\MessageBreak
        Assuming '\blx@bibencoding'}}%
  \ifboolexpr{%
    togl {blx@safeinputenc}
    and ( test {\@ifpackageloaded{inputenc}}
          or
          test {\@ifpackageloaded{inputenx}} )
  }
    {\def\blx@texencoding{ascii}%
     \blx@info@noline{%
        Input encoding '\blx@texencoding' forced by\MessageBreak
        'safeinputenc' option}}
    {}%
}

% Deferred last minute setup
\AtBeginDocument{%
  \blx@auxwrite\@mainaux{}{\string\abx@aux@refcontext{\blx@refcontext@context}}
  \blx@checkencoding
  \if@filesw
    \blx@ctrlwrite
    \blx@bblinput
    \blx@maxsection\z@
  \fi
  \csuse{abx@preamble}%
  \blx@inf@refsec
  \blx@inf@refseg}

\AtEndOfPackage{%
  % Data model macros are forbidden after package load is finished
  \def\blx@warn@dm#1{\blx@warning@noline{Data model macro '#1' cannot be used in preamble}}
  \def\ResetDatamodelEntrytypes{\blx@warn@dm{ResetDatamodelEntrytypes}}
  \def\ResetDatamodelFields{\blx@warn@dm{ResetDatamodelFields}}
  \def\ResetDatamodelEntryfields{\blx@warn@dm{ResetDatamodelEntryfields}}
  \def\ResetDatamodelConstraints{\blx@warn@dm{ResetDatamodelConstraints}}
  \renewcommand*{\DeclareDatamodelEntrytypes}[2][]{\blx@warn@dm{DeclareDatamodelEntrytypes}}
  \renewcommand*{\DeclareDatamodelFields}[2][]{\blx@warn@dm{DeclareDatamodelFields}}
  \renewcommand*{\DeclareDatamodelEntryfields}[2][]{\blx@warn@dm{DeclareDatamodelEntryfields}}
  \renewcommand*{\DeclareDatamodelConstraints}[2][]{\blx@warn@dm{DeclareDatamodelConstraints}}
  \renewcommand*{\DeclareDatamodelConstant}[3][]{\blx@warn@dm{DeclareDatamodelConstant}}
  \AtBeginDocument{%
    \let\do\undef
    \blx@dopreamblecmds
    \let\do\noexpand}}

\endinput
