%%
%% This is file `siunitx-v2.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% siunitx-v2.dtx  (with options: `package')
%% ---------------------------------------------------------------
%% The siunitx package --- A comprehensive (SI) units package
%% Maintained by Joseph Wright
%% E-mail: joseph.wright@morningstar2.co.uk
%% Released under the LaTeX Project Public License v1.3c or later
%% See http://www.latex-project.org/lppl.txt
%% ---------------------------------------------------------------
%% 
\RequirePackage{expl3}[2020/01/12]
\RequirePackage{xparse}
\ProvidesExplPackage {siunitx} {2021-04-17} {2.8e}
  {A comprehensive (SI) units package}
\@ifpackagelater { expl3 } { 2020/01/12 }
  { }
  {
    \PackageError { siunitx } { Support~package~expl3~too~old }
      {
        You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~
        'l3packages'.\MessageBreak
        Loading~siunitx~will~abort!
      }
    \tex_endinput:D
  }
\msg_new:nnnn { siunitx } { incompatible-package }
  { Package~'#1'~incompatible. }
  { The~#1~package~and~siunitx~are~incompatible. }
\cs_new_protected:Npn \__siunitx_load_check:n #1 {
  \group_begin:
    \@ifpackageloaded {#1}
      { \msg_error:nnx { siunitx } { incompatible-package } {#1} }
      { }
  \group_end:
}
\clist_map_function:nN
  { SIunits , sistyle , siunits , SIstyle , unitsdef , fancyunits }
  \__siunitx_load_check:n
\AtBeginDocument {
  \clist_map_function:nN { SIunits , sistyle , siunits , SIstyle }
    \__siunitx_load_check:n
}
\RequirePackage{ amstext , array , l3keys2e }
\@ifl@t@r \fmtversion { 2020-10-01 }
  { \cs_new_eq:NN \__siunitx_if_hooks:TF \use_i:nn }
  { \cs_new_eq:NN \__siunitx_if_hooks:TF \use_ii:nn }
\cs_new:Npn \__siunitx_tmp:w { }
\cs_generate_variant:Nn \clist_map_function:nN { nc }
\cs_generate_variant:Nn \tl_if_blank:nTF { V }
\cs_generate_variant:Nn \tl_replace_all:Nnn  { No, NV , Nx }
\bool_new:N \l__siunitx_tmp_bool
\box_new:N \l__siunitx_tmp_box
\dim_new:N \l__siunitx_tmp_dim
\int_new:N \l__siunitx_tmp_int
\tl_new:N \l__siunitx_tmpa_tl
\tl_new:N \l__siunitx_tmpb_tl
\cs_new_protected:Npn \__siunitx_error:nxx #1#2#3 {
  \bool_set_true:N \l__siunitx_error_bool
  \msg_error:nnxx { siunitx } {#1} {#2} {#3}
}
\cs_new_protected:Npn \__siunitx_error:nx #1#2 {
  \__siunitx_error:nxx {#1} {#2} { }
}
\cs_new_protected:Npn \__siunitx_error:n #1 {
  \__siunitx_error:nxx {#1} { } { }
}
\bool_new:N \l__siunitx_error_bool
\AtBeginDocument {
  \cs_if_free:cT { T@TS1 }
    { \RequirePackage { textcomp } }
}
\cs_new_protected:Npn \__siunitx_tl_put_left_math:Nn #1#2
  { \tl_put_left:Nn #1 { \ensuremath {#2} } }
\cs_generate_variant:Nn \__siunitx_tl_put_left_math:Nn { NV }
\exp_args:NNx \seq_const_from_clist:Nn \c__siunitx_old_options_seq
  {
    \tl_to_str:n
      {
        addsign ,
        allowlitunits ,
        allowoptarg ,
        allowzeroexp ,
        alsoload ,
        angformat ,
        anglesep ,
        astroang ,
        closeerr ,
        closrfrac ,
        closerange ,
        colour ,
        colorall ,
        colourall ,
        colorneg ,
        colourneg ,
        colourunits ,
        colourunits ,
        colorvalues ,
        colourvalues ,
        decimalsymbol ,
        debug ,
        detectdisplay ,
        digitsep ,
        dp ,
        emulate ,
        errspace ,
        eVcorra ,
        eVcorrb ,
        expbase ,
        expproduct ,
        fixdp ,
        fixsf ,
        fraction ,
        inlinebold ,
        loctolang ,
        log ,
        load ,
        mathOmega ,
        mathcelsius ,
        mathdegree ,
        mathminute ,
        mathmu ,
        mathringA ,
        mathrm ,
        mathsOmega ,
        mathscelsius ,
        mathsdegree ,
        mathsecond ,
        mathsf ,
        mathsminute ,
        mathsmu ,
        mathsringA ,
        mathsrm ,
        mathssecond ,
        mathssf ,
        mathstt ,
        mathtt ,
        negcolor ,
        negcolour ,
        noload ,
        numaddn ,
        numcloseerr ,
        numdecimal ,
        numdigits ,
        numdiv ,
        numexp ,
        numgobble ,
        numopenerr ,
        numprod ,
        numsign ,
        obeyall ,
        obeybold ,
        obeyfamily ,
        obeymode ,
        obeyitalic ,
        openerr ,
        openfrac ,
        openrange ,
        padangle ,
        padnumber ,
        per ,
        prefixbase ,
        prefixproduct ,
        prefixsymbolic ,
        prespace ,
        redefsymbols ,
        repeatunits ,
        retainplus ,
        seperr ,
        sepfour ,
        sf ,
        sign ,
        slash ,
        stickyper ,
        strictarc ,
        tabalign ,
        tabalignexp ,
        tabautofit ,
        tabexpalign ,
        tabformat ,
        tabnumalign ,
        tabparseonly ,
        tabtextalign ,
        textOmega ,
        textcelsius ,
        textdegree ,
        textminute ,
        textmode ,
        textmu ,
        textringA ,
        textrm ,
        textsecond ,
        textsf ,
        texttt ,
        tightpm ,
        tophrase ,
        trapamigerr ,
        trapambigfrac ,
        trapambigrange ,
        unitcolor ,
        unitcolour ,
        unitmathrm ,
        unitmathsf ,
        unitmathsrm ,
        unitmathssf ,
        unitmathstt ,
        unitmathtt ,
        unitmode ,
        unitsep ,
        unitspace ,
        valuecolor ,
        valuecolour ,
        valuemathrm ,
        valuemathsf ,
        valuemathsrm ,
        valuemathssf ,
        valuemathstt ,
        valuemathtt ,
        valuemode ,
        valuesep ,
        xspace
    }
  }
\tl_new:N  \l__siunitx_key_tl
\keys_define:nn { siunitx } {
  unknown .code:n =
    {
      \seq_if_in:NVTF \c__siunitx_old_options_seq \l_keys_key_tl
        {
          \msg_warning:nnx { siunitx } { version-1-option }
            { \exp_not:V \l_keys_key_tl }
          \tl_set:Nx \l__siunitx_key_tl
            {
              \keys_set:nn { siunitx }
                {
                  \exp_not:V \l_keys_key_tl
                    \tl_if_blank:nF {#1} { = \exp_not:n {#1} }
                }
            }
          \keys_set:nn { siunitx } { version-1-compatibility }
          \tl_use:N \l__siunitx_key_tl
        }
        {
          \msg_error:nnx { siunitx } { unknown-option }
            { \exp_not:V \l_keys_key_tl }
        }
    }
}
\AtBeginDocument {
  \keys_define:nn { siunitx } {
    unknown .code:n =
      {
        \seq_if_in:NVTF \c__siunitx_old_options_seq \l_keys_key_tl
          {
            \msg_error:nnx { siunitx } { version-1-option }
              { \exp_not:V \l_keys_key_tl }
          }
          {
            \msg_error:nnx { siunitx } { unknown-option }
              { \exp_not:V \l_keys_key_tl }
          }
      }
}
}
\cs_new_protected:Npn \__siunitx_option_deactivate:n #1 {
  \clist_put_right:Nn \l__siunitx_option_deactivate_clist {#1}
}
\cs_new_protected:Npn \__siunitx_option_deactivate_aux:n #1 {
  \keys_define:nn { siunitx }
    {
      #1 .code:n =
        { \msg_warning:nnx { siunitx } { option-preamble-only } {#1} }
    }
}
\AtBeginDocument {
  \clist_map_function:NN \l__siunitx_option_deactivate_clist
    \__siunitx_option_deactivate_aux:n
}
\clist_new:N \l__siunitx_option_deactivate_clist
\cs_new_protected:Npn \__siunitx_option_unchanged:Nnn #1#2#3
  {
    \str_if_eq:VnT #1 {#2}
      { \tl_set:Nn #1 {#3} }
  }
\cs_generate_variant:Nn \tl_if_empty_p:n { f }
\cs_generate_variant:Nn \tl_if_empty:nT  { f }
\cs_generate_variant:Nn \tl_if_in:NnTF { NV }
\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV }
\prg_new_conditional:Npnn \__siunitx_cs_if_tl:N #1 { T, F , TF , p }
  {
    \bool_lazy_and:nnTF
      {
        \tl_if_empty_p:f
          {
            \cs_prefix_spec:N   #1
            \cs_argument_spec:N #1
          }
      }
      { \bool_not_p:n { \cs_if_exist_p:c { \cs_to_str:N #1 ~ } } }
      { \prg_return_true: }
      { \prg_return_false: }
  }
\prg_new_conditional:Npnn \__siunitx_number_if_zero:n #1 { p , TF }
  {
    \tl_map_function:nN {#1} \__siunitx_number_if_zero_aux:n
    \prg_return_true:
  }
\cs_generate_variant:Nn \__siunitx_number_if_zero_p:n { V }
\cs_new:Npn \__siunitx_number_if_zero_aux:n #1
  {
    \token_if_eq_charcode:NNF #1 0
      { \tl_map_break:n { \prg_return_false: \use_none:n } }
  }
\AtBeginDocument
  {
    \@ifpackageloaded { tex4ht }
      {
        \cs_set_eq:NN \__siunitx_print_text_super:n \textsuperscript
        \__siunitx_option_unchanged:Nnn \l__siunitx_qualifier_mode_tl
          { subscript } { brackets }
        \keys_set:nn { siunitx } { mode = text }
      }
      { }
  }
\cs_new_eq:NN \__siunitx_ensure_ltr:n \use:n
\AtBeginDocument
  {
     \@ifpackageloaded { bidi }
       {
         \sys_if_engine_xetex:T
           { \cs_set_protected:Npn \__siunitx_ensure_ltr:n #1 { \LRE {#1} } }
       }
       { }
  }
\cs_new_protected:Npn \__siunitx_textsuperscript:n #1
  {
    \m@th
    \ensuremath { ^ { \mbox { \fontsize \sf@size \z@ \selectfont #1 } } }
  }
\bool_new:N \l__siunitx_display_math_bool
\tex_everydisplay:D \exp_after:wN
  {
    \tex_the:D \tex_everydisplay:D
    \bool_set_true:N \l__siunitx_display_math_bool
  }
\cs_generate_variant:Nn \prop_get:NnNT  { NV }
\cs_generate_variant:Nn \prop_get:NnNF  { NV }
\cs_generate_variant:Nn \prop_get:NnNTF { NV }
\cs_new_protected:Npn \__siunitx_set_math_fam:n #1 {
  \group_begin:
    \hbox_set:Nn \l__siunitx_tmp_box
      {
        \ensuremath
          {
            \use:c { math #1 }
              {
                \int_const:cn { c__siunitx_math #1 _int } { \fam }
              }
          }
      }
  \group_end:
}
\__siunitx_if_hooks:TF
  {
    \AddToHook { begindocument / end } [ siunitx ]
      {
        \__siunitx_set_math_fam:n { sf }
        \__siunitx_set_math_fam:n { tt }
      }
  }
  {
    \tl_put_right:Nn \document
      {
        \__siunitx_set_math_fam:n { sf }
        \__siunitx_set_math_fam:n { tt }
        \ignorespaces
      }
  }
\cs_new_protected:Npn \__siunitx_set_text_fam:n #1 {
  \tl_const:cx { c__siunitx_text #1 _tl } { \use:c { #1 default } }
}
\AtBeginDocument {
  \__siunitx_set_text_fam:n { sf }
  \__siunitx_set_text_fam:n { tt }
}
\tl_new:N \l__siunitx_detect_inline_weight_tl
\tl_new:N \l__siunitx_detect_inline_family_tl
\keys_define:nn { siunitx } {
  detect-all .choice:,
  detect-all .default:n = true,
  detect-all / false .meta:n =
    {
      detect-family = false ,
      detect-mode   = false ,
      detect-shape  = false ,
      detect-weight = false ,
    },
  detect-all / true .meta:n =
    {
      detect-family = true ,
      detect-mode   = true ,
      detect-shape  = true ,
      detect-weight = true ,
    },
  detect-display-math  .bool_set:N =
    \l__siunitx_detect_display_math_bool,
  detect-family        .bool_set:N = \l__siunitx_detect_family_bool,
  detect-inline-family .choice:,
  detect-inline-family .value_required:n = true,
  detect-inline-family /
    math               .code:n     =
      { \tl_set:Nn \l__siunitx_detect_inline_family_tl { math } },
  detect-inline-family /
    text               .code:n     =
      { \tl_set:Nn \l__siunitx_detect_inline_family_tl { text } },
  detect-inline-weight .choice:,
  detect-inline-weight .value_required:n = true,
  detect-inline-weight /
    math               .code:n     =
      { \tl_set:Nn \l__siunitx_detect_inline_weight_tl { math } },
  detect-inline-weight /
    text               .code:n     =
      { \tl_set:Nn \l__siunitx_detect_inline_weight_tl { text } },
  detect-italic        .bool_set:N = \l__siunitx_detect_shape_bool,
  detect-mode          .bool_set:N = \l__siunitx_detect_mode_bool,
  detect-none          .choice:,
  detect-none          .default:n = true,
  detect-none / false .meta:n =
    {
      detect-family = true,
      detect-mode   = true,
      detect-shape  = true,
      detect-weight = true
    },
  detect-none / true .meta:n =
    {
      detect-family = false,
      detect-mode   = false,
      detect-shape  = false,
      detect-weight = false
    },
  detect-shape         .bool_set:N = \l__siunitx_detect_shape_bool,
  detect-weight        .bool_set:N = \l__siunitx_detect_weight_bool
}
\keys_set:nn { siunitx } {
  detect-inline-family = text ,
  detect-inline-weight = text ,
}
\bool_new:N \l__siunitx_font_set_bool
\bool_new:N \l__siunitx_font_math_mode_bool
\tl_new:N \l__siunitx_font_family_tl
\cs_new:Npn \__siunitx_font_shape: { }
\cs_new:Npn \__siunitx_font_weight: { }
\cs_new_protected:Npn \__siunitx_detect_font: {
  \bool_if:NF \l__siunitx_font_set_bool
    {
      \__siunitx_detect_font_init:
      \bool_if:NT \l__siunitx_detect_weight_bool
        { \__siunitx_detect_font_weight: }
      \bool_if:NT \l__siunitx_detect_family_bool
        { \__siunitx_detect_font_family: }
      \bool_if:NT \l__siunitx_detect_shape_bool
        { \__siunitx_detect_font_shape: }
      \bool_if:NT \l__siunitx_detect_mode_bool
        { \__siunitx_detect_font_mode: }
    }
}
\cs_new_protected:Npn \__siunitx_detect_font_init: {
  \bool_set_true:N \l__siunitx_font_set_bool
  \cs_set:Npn \__siunitx_font_weight:
    {
      \unboldmath
      \mdseries
    }
  \cs_set:Npn \__siunitx_font_shape: { \upshape }
  \tl_set:Nn \l__siunitx_font_family_tl { rm }
  \bool_set_true:N \l__siunitx_font_math_mode_bool
}
\cs_new_protected:Npn \__siunitx_detect_font_weight: {
  \mode_if_math:TF
    {
      \bool_if:NTF \l__siunitx_display_math_bool
        {
          \bool_if:NTF \l__siunitx_detect_display_math_bool
            { \__siunitx_detect_font_weight_math: }
            { \__siunitx_detect_font_weight_text: }
        }
        {
          \use:c
            {
              __siunitx_detect_font_weight_
              \l__siunitx_detect_inline_weight_tl
              :
            }
        }
    }
    { \__siunitx_detect_font_weight_text: }
}
\cs_new_protected:Npn \__siunitx_detect_font_weight_math: {
  \str_if_eq:VnT \math@version { bold }
    {
      \cs_set:Npn \__siunitx_font_weight:
        {
          \boldmath
          \bfseries
        }
    }
  \str_if_eq:VnT \math@version { light }
    { \cs_set:Npn \__siunitx_font_weight: { \lseries } }
}
\cs_new_protected:Npn \__siunitx_detect_font_weight_text: {
  \tl_set:Nx \l__siunitx_tmpa_tl { \tl_head:N \f@series }
  \str_if_eq:VnT \l__siunitx_tmpa_tl { b }
    {
      \cs_set:Npn \__siunitx_font_weight:
        {
          \boldmath
          \bfseries
        }
    }
  \str_if_eq:VnT \l__siunitx_tmpa_tl { l }
    { \cs_set:Npn \__siunitx_font_weight: { \lseries } }
}
\cs_new_protected:Npn \__siunitx_detect_font_family: {
  \mode_if_math:TF
    {
      \bool_if:NTF \l__siunitx_display_math_bool
        {
          \bool_if:NTF \l__siunitx_detect_display_math_bool
            { \__siunitx_detect_font_family_math: }
            { \__siunitx_detect_font_family_text: }
        }
        {
          \use:c
            {
              __siunitx_detect_font_family_
              \l__siunitx_detect_inline_family_tl
              :
            }
        }
    }
    { \__siunitx_detect_font_family_text: }
}
\cs_new_protected:Npn \__siunitx_detect_font_family_math: {
  \tl_set:Nn \l__siunitx_font_family_tl { rm }
  \int_compare:nNnT { \fam } = { \c__siunitx_mathsf_int }
    { \tl_set:Nn \l__siunitx_font_family_tl { sf } }
  \int_compare:nNnT { \fam } = { \c__siunitx_mathtt_int }
    { \tl_set:Nn \l__siunitx_font_family_tl { tt } }
}
\cs_new_protected:Npn \__siunitx_detect_font_family_text: {
  \tl_if_eq:NNT \f@family \c__siunitx_textsf_tl
    { \tl_set:Nn \l__siunitx_font_family_tl { sf } }
  \tl_if_eq:NNT \f@family \c__siunitx_texttt_tl
    { \tl_set:Nn \l__siunitx_font_family_tl { tt } }
}
\cs_new_protected:Npn \__siunitx_detect_font_shape:
  {
    \cs_if_exist:cT { \f@shape shape }
      {
        \cs_set:Npx \__siunitx_font_shape: { \exp_not:c { \f@shape shape } }
      }
  }
\cs_new_protected:Npn \__siunitx_detect_font_mode: {
  \mode_if_math:F
    {
      \bool_set_false:N \l__siunitx_font_math_mode_bool
      \bool_set_false:N \l__siunitx_number_math_mode_bool
      \bool_set_false:N \l__siunitx_unit_math_mode_bool
    }
}
\bool_new:N \l__siunitx_number_math_mode_bool
\bool_new:N \l__siunitx_unit_math_mode_bool
\cs_new:Npn \__siunitx_number_mathrm:n #1 { }
\cs_new:Npn \__siunitx_number_mathsf:n #1 { }
\cs_new:Npn \__siunitx_number_mathtt:n #1 { }
\cs_new:Npn \__siunitx_number_textrm: { }
\cs_new:Npn \__siunitx_number_textsf: { }
\cs_new:Npn \__siunitx_number_texttt: { }
\keys_define:nn { siunitx } {
  number-color  .tl_set:N    = \l__siunitx_number_color_tl,
  number-math-rm .code:n  =
    { \cs_set:Npn \__siunitx_number_mathrm:n ##1 { #1 {##1} } },
  number-math-sf .code:n  =
    { \cs_set:Npn \__siunitx_number_mathsf:n ##1 { #1 {##1} } },
  number-math-tt .code:n  =
    { \cs_set:Npn \__siunitx_number_mathtt:n ##1 { #1 {##1} } },
  number-mode .choice:,
  number-mode / math .code:n =
    { \bool_set_true:N \l__siunitx_number_math_mode_bool },
  number-mode / text .code:n =
    { \bool_set_false:N \l__siunitx_number_math_mode_bool },
  number-text-rm .code:n  =
    { \cs_set:Npn \__siunitx_number_textrm: {#1} },
  number-text-sf .code:n  =
    { \cs_set:Npn \__siunitx_number_textsf: {#1} },
  number-text-tt .code:n  =
    { \cs_set:Npn \__siunitx_number_texttt: {#1} }
}
\cs_new:Npn \__siunitx_unit_mathrm: { }
\cs_new:Npn \__siunitx_unit_mathsf: { }
\cs_new:Npn \__siunitx_unit_mathtt: { }
\cs_new:Npn \__siunitx_unit_textrm: { }
\cs_new:Npn \__siunitx_unit_textsf: { }
\cs_new:Npn \__siunitx_unit_texttt: { }
\keys_define:nn { siunitx } {
  unit-color  .tl_set:N  = \l__siunitx_unit_color_tl,
  unit-math-rm .code:n =
    { \cs_set:Npn \__siunitx_unit_mathrm:n ##1 { #1 {##1} } },
  unit-math-sf .code:n =
    { \cs_set:Npn \__siunitx_unit_mathsf:n ##1 { #1 {##1} } },
  unit-math-tt .code:n =
    { \cs_set:Npn \__siunitx_unit_mathtt:n ##1 { #1 {##1} } },
  unit-mode .choice:,
  unit-mode / math .code:n =
    { \bool_set_true:N \l__siunitx_unit_math_mode_bool },
  unit-mode / text .code:n =
    { \bool_set_false:N \l__siunitx_unit_math_mode_bool },
  unit-text-rm .code:n =
    { \cs_set:Npn \__siunitx_unit_textrm: {#1} },
  unit-text-sf .code:n =
    { \cs_set:Npn \__siunitx_unit_textsf: {#1} },
  unit-text-tt .code:n =
    { \cs_set:Npn \__siunitx_unit_texttt: {#1} }
}
\keys_define:nn { siunitx } {
  color .meta:n =
    {
      number-color = #1,
      unit-color   = #1
    },
  math-rm .meta:n =
    {
      number-math-rm = #1,
      unit-math-rm   = #1
    },
  math-sf .meta:n =
    {
      number-math-sf = #1,
      unit-math-sf   = #1
    },
  math-tt .meta:n =
    {
      number-math-tt = #1,
      unit-math-tt   = #1
    },
  mode .choice:,
  mode / math .meta:n =
    {
      number-mode = math,
      unit-mode   = math
    },
  mode / text .meta:n =
    {
      number-mode = text,
      unit-mode   = text
    },
  text-rm .meta:n =
    {
      number-text-rm = #1,
      unit-text-rm   = #1
    },
  text-sf .meta:n =
    {
      number-text-sf = #1,
      unit-text-sf   = #1
    },
  text-tt .meta:n =
    {
      number-text-tt = #1,
      unit-text-tt   = #1
    }
}
\keys_set:nn { siunitx } {
  math-rm = \mathrm,
  math-sf = \mathsf,
  math-tt = \mathtt,
  mode    = math,
  text-rm = \rmfamily,
  text-sf = \sffamily,
  text-tt = \ttfamily,
}
\AtBeginDocument {
  \tl_set:Nx \l__siunitx_tmpa_tl { \familydefault }
  \@ifpackageloaded { eulervm }
    {
      \cs_set:Npn \__siunitx_tmp:w #1 { \mathrm {#1} }
      \cs_if_eq:NNT \__siunitx_number_mathrm:n \__siunitx_tmp:w
         { \keys_set:nn { siunitx } { number-math-rm = \mathnormal } }
      \cs_if_eq:NNT \__siunitx_unit_mathrm:n \__siunitx_tmp:w
        { \keys_set:nn { siunitx } { unit-math-rm = \mathnormal } }
    }
    { }
  \tl_if_eq:NNT \l__siunitx_tmpa_tl \c__siunitx_textsf_tl
    {
      \@ifpackageloaded { arev }
        { }
        {
          \@ifpackageloaded { cmbright }
            { }
            {
              \cs_set:Npn \__siunitx_tmp:w #1 { \mathrm {#1} }
              \cs_if_eq:NNT \__siunitx_number_mathrm:n \__siunitx_tmp:w
                { \keys_set:nn { siunitx } { number-math-rm = \mathsf } }
              \cs_if_eq:NNT \__siunitx_unit_mathrm:n \__siunitx_tmp:w
                { \keys_set:nn { siunitx } { unit-math-rm = \mathsf } }
            }
        }
      \cs_set:Npn \__siunitx_tmp:w { \rmfamily }
      \cs_if_eq:NNT \__siunitx_number_textrm: \__siunitx_tmp:w
        { \keys_set:nn { siunitx } { number-text-rm = \sffamily } }
      \cs_if_eq:NNT \__siunitx_unit_textrm: \__siunitx_tmp:w
        { \keys_set:nn { siunitx } { unit-text-rm = \sffamily } }
    }
  \tl_if_eq:NNT \l__siunitx_tmpa_tl \c__siunitx_texttt_tl
    {
      \cs_set:Npn \__siunitx_tmp:w #1 { \mathrm {#1} }
      \cs_if_eq:NNT \__siunitx_number_mathrm:n \__siunitx_tmp:w
        { \keys_set:nn { siunitx } { number-math-rm = \mathtt } }
      \cs_if_eq:NNT \__siunitx_unit_mathrm:n \__siunitx_tmp:w
        { \keys_set:nn { siunitx } { unit-math-rm = \mathtt } }
      \cs_set:Npn \__siunitx_tmp:w { \rmfamily }
      \cs_if_eq:NNT \__siunitx_number_textrm: \__siunitx_tmp:w
        { \keys_set:nn { siunitx } { number-text-rm = \ttfamily } }
      \cs_if_eq:NNT \__siunitx_unit_textrm: \__siunitx_tmp:w
        { \keys_set:nn { siunitx } { unit-text-rm = \ttfamily } }
    }
}
\tl_new:N \l__siunitx_print_arg_tl
\tl_new:N \l__siunitx_print_type_tl
\cs_new_protected:Npn \__siunitx_print:nn #1#2 {
  \group_begin:
    \tl_set:Nn \l__siunitx_print_type_tl {#1}
    \tl_set:Nn \l__siunitx_print_arg_tl {#2}
    \__siunitx_detect_font:
    \bool_if:NF \l__siunitx_detect_mode_bool
      {
        \bool_if:cTF { l__siunitx_ #1 _math_mode_bool }
          { \bool_set_true:N \l__siunitx_font_math_mode_bool }
          { \bool_set_false:N \l__siunitx_font_math_mode_bool }
      }
    \__siunitx_print_aux:
  \group_end:
}
\cs_generate_variant:Nn \__siunitx_print:nn { nV }
\cs_new_protected:Npn \__siunitx_print_aux:
  {
    \text
      {
        \__siunitx_ensure_ltr:n
          {
            \color@begingroup
            \__siunitx_print_color:
            \__siunitx_font_shape:
            \__siunitx_font_weight:
            \use:c
              {
                __siunitx_ \l__siunitx_print_type_tl _
                text \l__siunitx_font_family_tl :
              }
            \bool_if:NTF \l__siunitx_font_math_mode_bool
              { \__siunitx_print_math: }
              { \__siunitx_print_text: }
            \color@endgroup
          }
      }
  }
\cs_new_protected:Npn \__siunitx_print_color: {
  \tl_if_empty:cF { l__siunitx_ \l__siunitx_print_type_tl _color_tl }
    {
      \color
        {
          \tl_use:c { l__siunitx_ \l__siunitx_print_type_tl _color_tl }
        }
    }
}
\AtBeginDocument {
  \@ifpackageloaded { color }
    { \cs_new_eq:NN \__siunitx_textcolor:n \textcolor }
    {
      \cs_set_protected:Npn \__siunitx_print_color:
        {
          \tl_if_empty:cF { l__siunitx_ \l__siunitx_print_type_tl _color_tl }
            {
              \cs_gset_eq:NN \__siunitx_print_color: \scan_stop:
              \msg_warning:nn { siunitx } { color-not-loaded }
            }
        }
      \cs_new_protected:Npn \__siunitx_textcolor:n #1
        {
          \cs_gset_eq:NN \__siunitx_textcolor:n \use_none:n
          \msg_warning:nn { siunitx } { color-not-loaded }
        }
    }
}
\cs_new_protected:Npn \__siunitx_print_math:
  {
    \cs_set_eq:NN \PrintSubscript   \sb
    \cs_set_eq:NN \PrintSuperscript \sp
    \ensuremath
      {
        \use:c
          {
            __siunitx_ \l__siunitx_print_type_tl _
            math \l__siunitx_font_family_tl :n
          }
            { \l__siunitx_print_arg_tl }
      }
  }
\cs_new_protected:Npn \__siunitx_print_text:
  {
    \tl_replace_all:Nnn \l__siunitx_print_arg_tl { - }
      { \textminus }
    \__siunitx_print_text_aux:
    \tl_replace_all:Nnn \l__siunitx_print_arg_tl { \mp }
      { \ensuremath { \mp } }
    \tl_remove_all:Nn \l__siunitx_print_arg_tl { \mathord }
    \cs_set_eq:NN \PrintSubscript   \__siunitx_print_text_sub:n
    \cs_set_eq:NN \PrintSuperscript \__siunitx_print_text_super:n
    \__siunitx_print_text_aux:NnN
      _ { math_subscript }   \__siunitx_print_text_sub:n
      _ { active }           \__siunitx_print_text_sub:n
      ^ { math_superscript } \__siunitx_print_text_super:n
      ^ { active }           \__siunitx_print_text_super:n
      \q_recursion_tail ?  ?
      \q_recursion_stop
    \l__siunitx_print_arg_tl
  }
\cs_new_protected:Npn \__siunitx_print_text_aux:
  {
    \tl_replace_all:Nnn \l__siunitx_print_arg_tl { \pm }
      { \ensuremath { \pm } }
  }
\cs_new_protected:Npn \__siunitx_print_text_aux:NnN #1#2#3
  {
    \quark_if_recursion_tail_stop:N #1
    \tl_set_rescan:Nnn \l__siunitx_tmpa_tl
       { \use:c { char_set_catcode_ #2 :N } #1 }
       {#1}
    \tl_replace_all:NVn \l__siunitx_print_arg_tl \l__siunitx_tmpa_tl {#3}
    \__siunitx_print_text_aux:NnN
  }
\AtBeginDocument
  {
    \@ifpackageloaded { textcomp }
      {
        \cs_set_protected:Npn \__siunitx_print_text_aux:
          {
            \tl_replace_all:Nnn \l__siunitx_print_arg_tl { \pm }
              { \textpm }
          }
      }
      { }
  }
\cs_new_protected:Npn \__siunitx_print_text_sub:n #1
  {
    \cs_set:Npn \__siunitx_print_text_sub_super:n ##1
      {
        \ensuremath
          {
            \sb { \text {#1} }
            \sp { \text {##1} }
          }
      }
    \cs_set_protected:Npn \__siunitx_peek_true:
      {
        \tex_afterassignment:D \__siunitx_print_text_sub_super:n
        \cs_set_eq:NN \__siunitx_tmp:w
      }
    \cs_set_protected:Npn \__siunitx_peek_false:
      { \ensuremath { \sb { \text {#1} } } }
    \peek_after:Nw \__siunitx_print_text_sub_peek:
  }
\cs_new_protected:Npn \__siunitx_print_text_sub_peek:
  {
    \if_meaning:w \l_peek_token \__siunitx_print_text_super:n
      \exp_after:wN \__siunitx_peek_true:
    \else:
      \exp_after:wN \__siunitx_peek_false:
    \fi:
  }
\cs_new_protected:Npn \__siunitx_peek_true: { }
\cs_new_protected:Npn \__siunitx_peek_false: { }
\cs_new_protected:Npn \__siunitx_print_text_sub_super:n { }
\cs_new_protected:Npn \__siunitx_print_text_super:n #1 {
  \tl_set:Nn \l__siunitx_tmpa_tl {#1}
  \tl_replace_all:Nnn \l__siunitx_tmpa_tl { - }
    { \textminus }
  \tl_set:Nx \l__siunitx_tmpa_tl
    {
      \exp_not:N \ensuremath
        { \sp { \exp_not:N \text { \exp_not:V \l__siunitx_tmpa_tl } } }
    }
  \l__siunitx_tmpa_tl
}
\keys_define:nn { siunitx } {
  input-product  .tl_set:N = \l__siunitx_input_product_tl,
  input-quotient .tl_set:N = \l__siunitx_input_quotient_tl,
}
\keys_set:nn { siunitx } {
  input-product  = x,
  input-quotient = /
}
\tl_new:N \l__siunitx_number_arg_tl
\tl_new:N \l__siunitx_number_next_tl
\tl_new:N \l__siunitx_number_multi_tl
\tl_new:N \l__siunitx_number_denominator_tl
\tl_new:N \l__siunitx_number_numerator_tl
\cs_new_protected:Npn \__siunitx_number_preprocess:n #1 {
  \__siunitx_number_preprocess_init:
  \tl_set:Nn \l__siunitx_number_arg_tl {#1}
  \__siunitx_number_preprocess_product:
  \tl_if_empty:NT \l__siunitx_number_multi_tl
    { \__siunitx_number_preprocess_quotient: }
}
\cs_generate_variant:Nn \__siunitx_number_preprocess:n { V }
\cs_new_protected:Npn \__siunitx_number_preprocess_init: {
  \bool_set_false:N \l__siunitx_error_bool
  \tl_clear:N \l__siunitx_number_multi_tl
}
\cs_new_protected:Npn \__siunitx_number_preprocess_product: {
  \tl_map_function:NN \l__siunitx_input_product_tl
    \__siunitx_number_preprocess_product_aux:N
}
\cs_new_protected:Npn \__siunitx_number_preprocess_product_aux:N #1 {
  \tl_if_in:NnT \l__siunitx_number_arg_tl {#1}
    {
      \cs_set:Npn \__siunitx_tmp:w ##1 #1 ##2 \q_stop
        {
          \tl_set:Nn \l__siunitx_number_arg_tl {##1}
          \tl_set:Nn \l__siunitx_number_next_tl {##2}
          \tl_set:Nn \l__siunitx_number_multi_tl { product }
        }
      \exp_after:wN \__siunitx_tmp:w \l__siunitx_number_arg_tl \q_stop
      \tl_if_empty:NT \l__siunitx_number_arg_tl
        { \__siunitx_error:n { starting-product-token } }
      \tl_if_empty:NT \l__siunitx_number_next_tl
        { \__siunitx_error:n { ending-product-token } }
      \tl_map_break:
    }
}
\cs_new_protected:Npn \__siunitx_number_preprocess_quotient: {
  \tl_map_function:NN \l__siunitx_input_quotient_tl
    \__siunitx_number_preprocess_quotient_aux:N
}
\cs_new_protected:Npn \__siunitx_number_preprocess_quotient_aux:N #1 {
  \tl_if_in:NnT \l__siunitx_number_arg_tl {#1}
    {
      \cs_set:Npn \__siunitx_tmp:w ##1 #1 ##2 \q_stop
        {
          \tl_set:Nn \l__siunitx_number_numerator_tl {##1}
          \tl_set:Nn \l__siunitx_number_denominator_tl {##2}
          \tl_set:Nn \l__siunitx_number_multi_tl { quotient }
        }
      \exp_after:wN \__siunitx_tmp:w \l__siunitx_number_arg_tl \q_stop
      \tl_if_empty:NT \l__siunitx_number_numerator_tl
        { \__siunitx_error:n { starting-quotient-token } }
      \tl_if_empty:NT \l__siunitx_number_denominator_tl
        { \__siunitx_error:n { ending-quotient-token } }
      \tl_if_in:NnT \l__siunitx_number_denominator_tl {#1}
        { \__siunitx_error:n { duplicate-quotient-token } }
      \tl_map_break:
    }
}
\tl_const:Nn \c__siunitx_number_part_complex_tl { complex }
\bool_new:N \l__siunitx_number_in_complex_bool
\bool_new:N \l__siunitx_number_in_complex_root_bool
\bool_new:N \l__siunitx_number_in_decimal_bool
\bool_new:N \l__siunitx_number_in_exponent_bool
\bool_new:N \l__siunitx_number_in_first_bool
\bool_new:N \l__siunitx_number_in_sign_bool
\bool_new:N \l__siunitx_number_in_uncert_bool
\bool_new:N \l__siunitx_number_in_value_bool
\prop_new:N \l__siunitx_number_in_prop
\tl_new:N \l__siunitx_number_parsed_tl
\tl_new:N \l__siunitx_number_part_tl
\tl_new:N \l__siunitx_number_part_decimal_tl
\tl_new:N \l__siunitx_number_part_decimal_marker_tl
\tl_new:N \l__siunitx_number_part_integer_tl
\tl_new:N \l__siunitx_number_part_sign_tl
\tl_new:N \l__siunitx_number_part_uncert_tl
\int_new:N \l__siunitx_number_mantissa_length_int
\tl_new:N \l__siunitx_number_uncert_tl
\int_new:N \l__siunitx_number_uncert_length_int
\tl_new:N \l__siunitx_input_uncert_sign_tl
\keys_define:nn { siunitx } {
  input-close-uncertainty .tl_set:N = \l__siunitx_input_uncert_close_tl ,
  input-complex-roots     .tl_set:N = \l__siunitx_input_complex_tl      ,
  input-comparators       .tl_set:N = \l__siunitx_input_comparator_tl   ,
  input-decimal-markers   .tl_set:N = \l__siunitx_input_decimal_tl      ,
  input-digits            .tl_set:N = \l__siunitx_input_digit_tl        ,
  input-exponent-markers  .tl_set:N = \l__siunitx_input_exponent_tl     ,
  input-ignore            .tl_set:N = \l__siunitx_input_ignore_tl       ,
  input-open-uncertainty  .tl_set:N = \l__siunitx_input_uncert_open_tl  ,
  input-protect-tokens    .tl_set:N = \l__siunitx_input_protect_tl      ,
  input-signs             .tl_set:N = \l__siunitx_input_sign_tl         ,
  input-symbols           .tl_set:N = \l__siunitx_input_symbol_tl       ,
  input-uncertainty-signs .code:n   =
    {
      \tl_set:Nn \l__siunitx_input_uncert_sign_tl {#1}
      \tl_map_inline:nn {#1}
        {
          \tl_if_in:NnF \l__siunitx_input_sign_tl {##1}
            { \tl_put_right:Nn \l__siunitx_input_sign_tl {##1} }
        }
    } ,
}
\keys_set:nn { siunitx } { % (
  input-close-uncertainty = ),
  input-complex-roots     = ij,
  input-comparators       = {<=>\approx\ge\geq\gg\le\leq\ll\sim},
  input-decimal-markers   = {.,},
  input-digits            = 0123456789,
  input-exponent-markers  = dDeE,
  input-open-uncertainty  = (, % )
  input-protect-tokens    = \approx\dots\ge\geq\gg\le\leq\ll\mp\pi\pm\sim,
  input-signs             = +-\mp\pm,
  input-symbols           = \dots\pi,
  input-uncertainty-signs = \pm,
}
\cs_new_protected:Npn \__siunitx_number_in_parse:n #1 {
  \tl_if_empty:nF {#1}
    {
      \__siunitx_number_in_init:
      \cs_set_eq:NN \__siunitx_number_in_parse_more:N
        \__siunitx_number_in_parse_mantissa_aux:N
      \__siunitx_number_in_parse_aux:n {#1}
    }
}
\cs_generate_variant:Nn \__siunitx_number_in_parse:n { V }
\group_begin:
  \char_set_catcode_active:N \~
  \char_set_catcode_space:N \ %
  \cs_new_protected:Npn \__siunitx_number_in_parse_aux:n#1%
    {%
      \group_begin:
        \__siunitx_number_in_protect:
        \cs_set_eq:NN\,\prg_do_nothing:
        \cs_set_eq:NN~\prg_do_nothing:
        \tl_set_rescan:Nnx\l__siunitx_number_arg_tl
          {%
            \char_set_catcode_ignore:N\ %
            \char_set_catcode_other:N\,%
            \char_set_catcode_other:N\.%
          }%
          {#1}%
      \exp_args:NNNV\group_end:
      \tl_set:Nn\l__siunitx_number_arg_tl\l__siunitx_number_arg_tl
      \__siunitx_number_in_sign_replace:N\l__siunitx_number_arg_tl
      \__siunitx_number_in_parse_relation:N\l__siunitx_number_arg_tl
      \tl_map_function:NN\l__siunitx_number_arg_tl
        \__siunitx_number_in_parse_loop:N
      \tl_if_empty:NF\l__siunitx_number_parsed_tl
        {%
          \bool_if:NTF\l__siunitx_number_in_uncert_bool
            {\__siunitx_error:nx{invalid-number}{#1}}%
            {%
              \prop_put:NVn \l__siunitx_number_in_prop
                \l__siunitx_number_part_tl {true}%
              \bool_if:NTF\l__siunitx_number_in_decimal_bool
                {%
                  \prop_put:NVV\l__siunitx_number_in_prop
                    \l__siunitx_number_part_decimal_tl
                    \l__siunitx_number_parsed_tl
                }%
                {%
                  \prop_put:NVV\l__siunitx_number_in_prop
                    \l__siunitx_number_part_integer_tl
                    \l__siunitx_number_parsed_tl
                }%
           }%
        }%
      \__siunitx_number_in_check:n {#1}%
    }
\group_end:
\cs_new_protected:Npn \__siunitx_number_in_init: {
  \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
    \__siunitx_number_in_parse_mantissa:N
  \cs_set_eq:NN \__siunitx_number_in_check:n
    \__siunitx_number_in_check_short:n
  \tl_clear:N \l__siunitx_number_parsed_tl
  \prop_clear:N \l__siunitx_number_in_prop
  \bool_set_false:N \l__siunitx_error_bool
  \bool_set_false:N \l__siunitx_number_in_complex_bool
  \bool_set_false:N \l__siunitx_number_in_complex_root_bool
  \bool_set_false:N \l__siunitx_number_in_exponent_bool
  \bool_set_false:N \l__siunitx_number_in_uncert_bool
  \__siunitx_number_in_init_part:n { mantissa }
}
\cs_new_protected:Npn \__siunitx_number_in_init_part:n #1 {
  \bool_set_false:N \l__siunitx_number_in_decimal_bool
  \bool_set_true:N \l__siunitx_number_in_first_bool
  \bool_set_false:N \l__siunitx_number_in_sign_bool
  \bool_set_false:N \l__siunitx_number_in_value_bool
  \tl_set:Nn \l__siunitx_number_part_tl {#1}
  \tl_set:Nn \l__siunitx_number_part_decimal_tl { #1 -decimal }
  \tl_set:Nn \l__siunitx_number_part_decimal_marker_tl
    { #1 -decimal-marker }
  \tl_set:Nn \l__siunitx_number_part_integer_tl { #1 -integer }
  \tl_set:Nn \l__siunitx_number_part_sign_tl { #1 -sign }
  \tl_set:Nn \l__siunitx_number_part_uncert_tl { #1 -uncertainty }
}
\cs_new_protected:Npn \__siunitx_number_in_protect: {
  \tl_map_function:NN \l__siunitx_input_protect_tl
    \__siunitx_number_in_protect_aux:N
}
\cs_new_protected:Npn \__siunitx_number_in_protect_aux:N #1 {
  \cs_set_eq:NN #1 \scan_stop:
}
\cs_new_protected:Npn \__siunitx_number_in_sign_replace:N #1
  {
    \__siunitx_number_in_sign_replace_aux:N #1
    \__siunitx_number_in_sign_replace_aux:NnN #1
      { -+ } \mp
      { +- } \pm
      { << } \ll
      { <= } \le
      { >> } \gg
      { >= } \ge
      { ?? } \q_recursion_tail
      \q_recursion_stop
  }
\group_begin:
  \char_set_catcode_active:N -
  \cs_new_protected:Npx \__siunitx_number_in_sign_replace_aux:N #1
    { \tl_replace_all:Nnn #1 { \exp_not:N - } { \token_to_str:N - } }
\group_end:
\cs_new_protected:Npn \__siunitx_number_in_sign_replace_aux:NnN #1#2#3
  {
    \quark_if_recursion_tail_stop:N #3
    \tl_replace_all:Nnn #1 {#2} {#3}
    \__siunitx_number_in_sign_replace_aux:NnN #1
  }
\cs_new_protected:Npn \__siunitx_number_in_parse_error:nn #1#2 {
  \__siunitx_error:nx {#1} { \exp_not:n {#2} }
  \tl_map_break:
}
\cs_generate_variant:Nn \__siunitx_number_in_parse_error:nn { nV }
\cs_new_protected:Npn \__siunitx_number_in_parse_loop:N #1 { }
\cs_new_protected:Npn \__siunitx_number_in_parse_more:N #1 { }
\cs_new_protected:Npn \__siunitx_number_in_parse_relation:N #1 {
  \exp_after:wN \__siunitx_number_in_parse_relation:w #1 \q_stop #1
}
\cs_new_protected:Npn \__siunitx_number_in_parse_relation:w
  #1#2 \q_stop #3 {
  \tl_if_in:NnT \l__siunitx_input_comparator_tl {#1}
    {
      \prop_put:Nnn \l__siunitx_number_in_prop { comparator } {#1}
      \tl_set:Nn #3 {#2}
    }
}
\cs_new_protected:Npn \__siunitx_number_in_parse_restricted:N #1 {
  \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
    {
      \__siunitx_number_in_parse_error:nn
        { restricted-number } {#1}
    }
    {
      \tl_if_in:NnTF \l__siunitx_input_uncert_open_tl {#1}
        {
          \__siunitx_number_in_parse_error:nV
            { restricted-number } \l__siunitx_number_arg_tl
        }
        {
          \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl {#1}
            {
              \__siunitx_number_in_parse_error:nV
                { restricted-number } \l__siunitx_number_arg_tl
            }
            {
              \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
                {
                  \__siunitx_number_in_parse_error:nV
                    { restricted-number } \l__siunitx_number_arg_tl
                }
                {
                  \__siunitx_number_in_parse_error:nn
                    { restricted-number } {#1}
                }
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_parse_complex:N #1 {
  \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
    {
      \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
        \__siunitx_number_in_parse_mantissa:N
      \__siunitx_number_in_exponent:N #1
    }
    {
      \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
        {
          \__siunitx_number_in_parse_error:nV
            { misplaced-complex-root-token }
            \l__siunitx_number_arg_tl
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_parse_exponent:N #1 {
  \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
    {
      \__siunitx_number_in_parse_error:nn
        { duplicate-exponent-token } { \token_to_str:N #1 }
    }
    {
      \tl_if_in:NnTF \l__siunitx_input_uncert_open_tl {#1}
        {
          \__siunitx_number_in_parse_error:nV
            { invalid-token-in-exponent } \l__siunitx_number_arg_tl
        }
        {
          \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl {#1}
            {
              \__siunitx_number_in_parse_error:nV
                { invalid-token-in-exponent } \l__siunitx_number_arg_tl
            }
            {
              \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
                {
                  \__siunitx_number_in_parse_error:nV
                    { invalid-token-in-exponent }
                    \l__siunitx_number_arg_tl
                }
                {
                  \__siunitx_number_in_parse_error:nn
                    { invalid-token-in-number } {#1}
                }
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_parse_mantissa:N #1 {
  \tl_if_in:NnTF \l__siunitx_input_digit_tl {#1}
    { \__siunitx_number_in_digit:n {#1} }
    {
      \tl_if_in:NnTF \l__siunitx_input_decimal_tl {#1}
        { \__siunitx_number_in_decimal:N #1 }
        {
          \tl_if_in:NnTF \l__siunitx_input_sign_tl {#1}
            { \__siunitx_number_in_sign:N #1 }
            {
              \tl_if_in:NnTF \l__siunitx_input_symbol_tl {#1}
                {
                  \prop_put:Nnn \l__siunitx_number_in_prop { symbolic }
                    { true }
                  \__siunitx_number_in_digit:n {#1}
                }
                {
                  \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
                    { \__siunitx_number_in_parse_more:N #1 }
                }
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_parse_mantissa_aux:N #1 {
  \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
    { \__siunitx_number_in_exponent:N #1 }
    {
      \tl_if_in:NnTF \l__siunitx_input_uncert_open_tl {#1}
        { \__siunitx_number_in_uncert_open:N #1 }
        {
          \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl {#1}
            {
              \__siunitx_number_in_parse_error:nn
                { misplaced-uncertainty-token } {#1}
            }
            {
              \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
                { \__siunitx_number_in_complex:N #1 }
                {
                  \__siunitx_number_in_parse_error:nn
                    { invalid-token-in-number } {#1}
                }
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_parse_uncert:N #1 {
  \tl_if_in:NnTF \l__siunitx_input_digit_tl {#1}
    { \__siunitx_number_in_digit:n {#1} }
    {
      \tl_if_in:NnTF \l__siunitx_input_decimal_tl {#1}
        {
          \__siunitx_number_in_parse_error:nV
            { invalid-token-in-uncertainty }
            \l__siunitx_number_arg_tl
        }
        {
          \tl_if_in:NnTF \l__siunitx_input_sign_tl {#1}
            {
              \__siunitx_number_in_parse_error:nV
                { invalid-token-in-uncertainty }
                \l__siunitx_number_arg_tl
            }
            {
              \tl_if_in:NnTF \l__siunitx_input_symbol_tl {#1}
                {
                  \prop_put:Nnn \l__siunitx_number_in_prop { symbolic }
                    { true }
                  \__siunitx_number_in_digit:n {#1}
                }
                {
                  \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
                    {
                      \tl_if_in:NnTF \l__siunitx_input_uncert_close_tl
                        {#1}
                        { \__siunitx_number_in_uncert_close:N #1 }
                        {
                          \__siunitx_number_in_parse_error:nV
                            { invalid-token-in-uncertainty }
                            \l__siunitx_number_arg_tl
                        }
                    }
                }
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_parse_uncert_after:N #1 {
  \tl_if_in:NnTF \l__siunitx_input_exponent_tl {#1}
    {
      \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
        \__siunitx_number_in_parse_mantissa:N
      \__siunitx_number_in_exponent:N #1
    }
    {
      \tl_if_in:NnTF \l__siunitx_input_sign_tl {#1}
        {
          \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
            \__siunitx_number_in_parse_mantissa:N
          \__siunitx_number_in_sign:N #1
        }
        {
          \tl_if_in:NnF \l__siunitx_input_ignore_tl {#1}
            {
              \tl_if_in:NnTF \l__siunitx_input_complex_tl {#1}
                {
                  \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
                    \__siunitx_number_in_parse_mantissa:N
                  \__siunitx_number_in_complex:N #1
                }
                {
                  \__siunitx_number_in_parse_error:nV { invalid-number }
                    \l__siunitx_number_arg_tl
                }
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_complex:N #1 {
  \bool_set_false:N \l__siunitx_number_in_first_bool
  \bool_if:NTF \l__siunitx_number_in_complex_root_bool
    {
      \__siunitx_number_in_parse_error:nn
        { duplicate-complex-root-token } { \token_to_str:N #1 }
    }
    {
      \cs_set_eq:NN \__siunitx_number_in_check:n
        \__siunitx_number_in_check_full:n
      \bool_set_true:N \l__siunitx_number_in_complex_root_bool
      \prop_put:Nnn \l__siunitx_number_in_prop { complex-root } {#1}
      \tl_if_empty:NF \l__siunitx_number_parsed_tl
        {
          \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
            \__siunitx_number_in_parse_complex:N
        }
      \bool_if:NT \l__siunitx_number_in_decimal_bool
        {
          \bool_if:NF \l__siunitx_number_in_complex_bool
            {
              \prop_if_in:NnT \l__siunitx_number_in_prop
                { mantissa-uncertainty }
                {
                  \__siunitx_number_in_complex_aux:nn
                    { mantissa-decimal } { complex-decimal }
                  \__siunitx_number_in_complex_aux:nn
                    { mantissa-uncertainty } { complex-uncertainty }
                }
              \__siunitx_number_in_complex_aux:nn { mantissa-integer }
                { complex-integer }
              \__siunitx_number_in_complex_aux:nn
                { mantissa-decimal-marker } { complex-decimal-marker }
              \prop_remove:Nn \l__siunitx_number_in_prop { mantissa }
              \prop_put:Nnn \l__siunitx_number_in_prop { complex }
                { true }
            }
        }
      \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
        {
          \prop_if_in:NnT \l__siunitx_number_in_prop { mantissa-sign }
            {
              \__siunitx_number_in_complex_aux:nn { mantissa-sign }
                { complex-sign }
            }
        }
      \bool_set_true:N \l__siunitx_number_in_complex_bool
      \bool_set_false:N \l__siunitx_number_in_first_bool
      \__siunitx_number_in_init_part:n { complex }
      \prop_if_in:NnT \l__siunitx_number_in_prop
        { complex-decimal-marker }
        { \bool_set_true:N \l__siunitx_number_in_decimal_bool }
      \prop_if_in:NnTF \l__siunitx_number_in_prop
        { complex-sign }
        { \bool_set_true:N \l__siunitx_number_in_sign_bool }
        { \prop_remove:Nn \l__siunitx_number_in_prop { mantissa } }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_complex_aux:nn #1#2 {
  \prop_get:NnNT \l__siunitx_number_in_prop {#1} \l__siunitx_tmpa_tl
    {
      \prop_remove:Nn  \l__siunitx_number_in_prop {#1}
      \prop_put:NnV \l__siunitx_number_in_prop {#2} \l__siunitx_tmpa_tl
   }
}
\cs_new_protected:Npn \__siunitx_number_in_decimal:N #1 {
  \bool_set_false:N \l__siunitx_number_in_first_bool
  \bool_if:NTF \l__siunitx_number_in_decimal_bool
    {
      \__siunitx_number_in_parse_error:nn { duplicate-decimal-token }
        {#1}
    }
    {
      \bool_set_true:N \l__siunitx_number_in_decimal_bool
      \tl_if_empty:NF \l__siunitx_number_parsed_tl
        {
          \prop_put:NVn \l__siunitx_number_in_prop
            \l__siunitx_number_part_tl { true }
          \prop_put:NVV \l__siunitx_number_in_prop
            \l__siunitx_number_part_integer_tl
            \l__siunitx_number_parsed_tl
          \tl_clear:N \l__siunitx_number_parsed_tl
        }
      \prop_put:NVn \l__siunitx_number_in_prop
        \l__siunitx_number_part_decimal_marker_tl {#1}
    }
}
\cs_new_protected:Npn \__siunitx_number_in_digit:n #1 {
  \bool_set_false:N \l__siunitx_number_in_first_bool
  \bool_if:NTF \l__siunitx_number_in_uncert_bool
    { \tl_put_right:Nn \l__siunitx_number_parsed_tl {#1} }
    {
      \bool_if:NTF \l__siunitx_number_in_decimal_bool
        {
          \tl_put_right:Nn \l__siunitx_number_parsed_tl {#1}
          \str_if_eq:nnF {#1} { 0 }
            { \bool_set_true:N \l__siunitx_number_in_value_bool }
        }
        {
          \str_if_eq:nnTF {#1} { 0 }
            {
              \prop_put:NVn \l__siunitx_number_in_prop
                \l__siunitx_number_part_tl { true }
              \prop_put:NVn \l__siunitx_number_in_prop
                \l__siunitx_number_part_integer_tl { 0 }
            }
            { \bool_set_true:N \l__siunitx_number_in_value_bool }
          \bool_if:NT \l__siunitx_number_in_value_bool
            { \tl_put_right:Nn \l__siunitx_number_parsed_tl {#1} }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_exponent:N #1 {
  \bool_if:NTF \l__siunitx_number_in_exponent_bool
    {
      \__siunitx_number_in_parse_error:nn { duplicate-exponent-token }
        { \token_to_str:N #1 }
    }
    {
      \cs_set_eq:NN \__siunitx_number_in_parse_more:N
        \__siunitx_number_in_parse_exponent:N
      \tl_if_empty:NF \l__siunitx_number_parsed_tl
        { \__siunitx_number_in_store: }
      \bool_set_true:N \l__siunitx_number_in_exponent_bool
      \__siunitx_number_in_init_part:n { exponent }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_sign:N #1 {
  \bool_if:NTF \l__siunitx_number_in_first_bool
    {
      \bool_set_false:N \l__siunitx_number_in_first_bool
      \bool_set_true:N \l__siunitx_number_in_sign_bool
      \prop_put:NVn \l__siunitx_number_in_prop
        \l__siunitx_number_part_sign_tl {#1}
    }
    {
      \bool_if:NTF \l__siunitx_number_in_exponent_bool
        {
          \__siunitx_number_in_parse_error:nn { misplaced-sign-token }
            {#1}
        }
        {
          \bool_if:NTF \l__siunitx_number_in_complex_bool
            {
              \__siunitx_number_in_parse_error:nn
                { misplaced-sign-token } {#1}
            }
            {
              \tl_if_empty:NF \l__siunitx_number_parsed_tl
                { \__siunitx_number_in_store: }
              \cs_set_eq:NN \__siunitx_number_in_check:n
                \__siunitx_number_in_check_full:n
              \__siunitx_number_in_init_part:n { complex }
              \prop_put:Nnn \l__siunitx_number_in_prop
                { complex-sign } {#1}
              \bool_set_true:N \l__siunitx_number_in_complex_bool
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_uncert_open:N #1 {
  \bool_set_false:N \l__siunitx_number_in_first_bool
  \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
    \__siunitx_number_in_parse_uncert:N
  \bool_set_true:N \l__siunitx_number_in_uncert_bool
  \tl_if_empty:NTF \l__siunitx_number_parsed_tl
    {
      \prop_if_in:NVF \l__siunitx_number_in_prop
        \l__siunitx_number_part_integer_tl
        {
          \__siunitx_number_in_parse_error:nV { invalid-number }
            \l__siunitx_number_arg_tl
        }
    }
    { \__siunitx_number_in_store: }
}
\cs_new_protected:Npn \__siunitx_number_in_uncert_close:N #1 {
  \bool_set_false:N \l__siunitx_number_in_uncert_bool
  \tl_if_empty:NTF \l__siunitx_number_parsed_tl
    {
      \__siunitx_number_in_parse_error:nV { empty-uncertainty }
        \l__siunitx_number_arg_tl
    }
    {
      \prop_put:NVV \l__siunitx_number_in_prop
        \l__siunitx_number_part_uncert_tl \l__siunitx_number_parsed_tl
      \prop_put:Nnn \l__siunitx_number_in_prop
        { uncertainty } { true }
      \tl_clear:N \l__siunitx_number_parsed_tl
      \cs_set_eq:NN \__siunitx_number_in_parse_loop:N
        \__siunitx_number_in_parse_uncert_after:N
    }
}
\cs_new_protected:Npn \__siunitx_number_in_store: {
  \prop_put:NVn \l__siunitx_number_in_prop \l__siunitx_number_part_tl
    { true }
  \bool_if:NTF \l__siunitx_number_in_decimal_bool
    {
      \prop_put:NVV \l__siunitx_number_in_prop
        \l__siunitx_number_part_decimal_tl \l__siunitx_number_parsed_tl
    }
    {
      \prop_put:NVV \l__siunitx_number_in_prop
        \l__siunitx_number_part_integer_tl \l__siunitx_number_parsed_tl
    }
  \tl_clear:N \l__siunitx_number_parsed_tl
}
\cs_new_protected:Npn \__siunitx_number_in_check:n #1 { }
\cs_new_protected:Npn \__siunitx_number_in_check_short:n #1 {
  \prop_if_in:NVF \l__siunitx_number_in_prop
    \l__siunitx_number_part_integer_tl
    {
      \prop_if_in:NVF \l__siunitx_number_in_prop
        \l__siunitx_number_part_decimal_tl
        { \__siunitx_error:nx { invalid-number } {#1} }
    }
  \bool_if:NF \l__siunitx_number_in_value_bool
    {
      \tl_if_eq:NNF \l__siunitx_number_part_tl
        \c__siunitx_number_part_complex_tl
        {
          \prop_get:NVNT \l__siunitx_number_in_prop
            \l__siunitx_number_part_sign_tl  \l__siunitx_tmpa_tl
            {
              \tl_set:Nx \l__siunitx_tmpb_tl
                { \l__siunitx_number_part_sign_tl -deleted }
              \prop_put:NVV \l__siunitx_number_in_prop
                \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
            }
          \prop_remove:NV \l__siunitx_number_in_prop
            \l__siunitx_number_part_sign_tl
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_check_full:n #1 {
  \tl_if_eq:NNF \l__siunitx_number_part_tl
    \c__siunitx_number_part_complex_tl
    { \__siunitx_number_in_check_short:n {#1} }
  \bool_if:NF \l__siunitx_number_in_complex_root_bool
    {
      \prop_get:NnN \l__siunitx_number_in_prop { complex-sign }
        \l__siunitx_tmpa_tl
      \tl_if_in:NVTF \l__siunitx_input_uncert_sign_tl \l__siunitx_tmpa_tl
        {
          \prop_if_in:NnTF \l__siunitx_number_in_prop { uncertainty }
            {
              \__siunitx_error:nx { misplaced-sign-token }
                { \exp_not:n {#1} }
            }
            { \__siunitx_number_in_complex_to_uncert:n {#1} }
        }
        {
          \__siunitx_error:nx { misplaced-sign-token }
            { \exp_not:n {#1} }
        }
    }
  \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-sign }
    \l__siunitx_tmpa_tl
    {
      \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
        {
          \prop_remove:Nn \l__siunitx_number_in_prop { mantissa-sign }
          \prop_put:NnV \l__siunitx_number_in_prop { complex-sign }
            \l__siunitx_tmpa_tl
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert:n #1 {
  \prop_remove:Nn \l__siunitx_number_in_prop { complex }
  \prop_remove:Nn \l__siunitx_number_in_prop { complex-decimal-marker }
  \prop_remove:Nn \l__siunitx_number_in_prop { complex-sign }
  \prop_put:Nnn \l__siunitx_number_in_prop { uncertainty } { true }
  \prop_get:NnNTF \l__siunitx_number_in_prop { complex-integer }
    \l__siunitx_number_uncert_tl
    {
      \tl_if_single:NTF \l__siunitx_number_uncert_tl
        {
          \int_compare:nNnTF  \l__siunitx_number_uncert_tl = 0
            { \__siunitx_number_in_complex_to_uncert_dec:n {#1} }
            { \__siunitx_number_in_complex_to_uncert_int: }
        }
        { \__siunitx_number_in_complex_to_uncert_int: }
    }
    { \__siunitx_number_in_complex_to_uncert_dec:n {#1} }
  \prop_remove:Nn \l__siunitx_number_in_prop { complex-integer }
  \prop_remove:Nn \l__siunitx_number_in_prop { complex-decimal }
}
\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert_int: {
  \prop_get:NnNF \l__siunitx_number_in_prop { complex-decimal }
    \l__siunitx_tmpa_tl
    { \tl_clear:N \l__siunitx_tmpa_tl }
  \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
    \l__siunitx_tmpb_tl
    { \tl_clear:N \l__siunitx_tmpb_tl }
  \__siunitx_number_in_complex_to_uncert_pad:
}
\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert_dec:n
  #1
  {
    \tl_clear:N \l__siunitx_number_uncert_tl
    \prop_get:NnNTF \l__siunitx_number_in_prop { complex-decimal }
      \l__siunitx_tmpa_tl
      {
        \prop_get:NnN \l__siunitx_number_in_prop { mantissa-decimal }
          \l__siunitx_tmpb_tl
        \quark_if_no_value:NT \l__siunitx_tmpb_tl
          { \tl_clear:N \l__siunitx_tmpb_tl }
        \tl_map_function:NN
          \l__siunitx_tmpa_tl
          \__siunitx_number_in_complex_to_uncert_dec_loop:N
        \__siunitx_number_in_complex_to_uncert_pad:
      }
      { \__siunitx_error:nx { misplaced-sign-token } { \exp_not:n {#1} } }
  }
\cs_new_protected:Npn
  \__siunitx_number_in_complex_to_uncert_dec_loop:N #1
  {
    \str_if_eq:nnTF {#1} { 0 }
      {
        \tl_set:Nx \l__siunitx_tmpa_tl
          { \tl_tail:N \l__siunitx_tmpa_tl }
        \tl_if_empty:NF \l__siunitx_tmpb_tl
          {
            \tl_set:Nx \l__siunitx_tmpb_tl
              { \tl_tail:N \l__siunitx_tmpb_tl }
          }
      }
      { \tl_map_break: }
  }
\cs_new_protected:Npn \__siunitx_number_in_complex_to_uncert_pad:
  {
    \int_set:Nn \l__siunitx_number_uncert_length_int
      { \tl_count:N \l__siunitx_tmpa_tl }
    \int_set:Nn \l__siunitx_number_mantissa_length_int
      { \tl_count:N \l__siunitx_tmpb_tl }
    \int_compare:nNnTF
      { \l__siunitx_number_mantissa_length_int }
        > { \l__siunitx_number_uncert_length_int }
      {
        \tl_set:Nx \l__siunitx_tmpa_tl
          {
            \exp_not:V \l__siunitx_tmpa_tl
            \prg_replicate:nn
              {
                  \l__siunitx_number_mantissa_length_int
                - \l__siunitx_number_uncert_length_int
              }
              { 0 }
          }
      }
      {
        \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
          \l__siunitx_tmpb_tl
          { \tl_clear:N \l__siunitx_tmpb_tl }
        \tl_set:Nx \l__siunitx_tmpb_tl
          {
            \exp_not:V \l__siunitx_tmpb_tl
            \prg_replicate:nn
              {
                  \l__siunitx_number_uncert_length_int
                - \l__siunitx_number_mantissa_length_int
              }
              { 0 }
          }
        \tl_if_empty:NF \l__siunitx_tmpb_tl
          {
            \prop_put:NnV \l__siunitx_number_in_prop { mantissa-decimal }
              \l__siunitx_tmpb_tl
            \prop_if_in:NnF \l__siunitx_number_in_prop
              { mantissa-decimal-marker }
              {
                \prop_put:Nnn \l__siunitx_number_in_prop
                  { mantissa-decimal-marker } { . }
              }
          }
      }
    \tl_put_right:NV \l__siunitx_number_uncert_tl \l__siunitx_tmpa_tl
    \prop_put:NnV \l__siunitx_number_in_prop { mantissa-uncertainty }
      \l__siunitx_number_uncert_tl
  }
\int_new:N \l__siunitx_round_int
\tl_new:N \l__siunitx_round_tl
\bool_new:N \l__siunitx_round_bool
\tl_new:N \l__siunitx_round_decimal_in_tl
\tl_new:N \l__siunitx_round_decimal_out_tl
\tl_new:N \l__siunitx_round_discard_tl
\tl_new:N \l__siunitx_round_even_bool
\tl_new:N \l__siunitx_round_integer_in_tl
\tl_new:N \l__siunitx_round_integer_out_tl
\bool_new:N \l__siunitx_round_half_up_bool
\int_new:N \l__siunitx_process_decimal_int
\int_new:N \l__siunitx_process_uncertainty_int
\tl_new:N \l__siunitx_uncertainty_decimal_tl
\tl_new:N \l__siunitx_uncertainty_integer_tl
\bool_new:N \l__siunitx_process_fixed_bool
\bool_new:N \l__siunitx_process_engineering_bool
\bool_new:N \l__siunitx_process_scientific_bool
\bool_new:N \l__siunitx_process_drop_exponent_bool
\keys_define:nn { siunitx }
  {
    add-decimal-zero  .bool_set:N = \l__siunitx_process_decimal_zero_bool,
    add-integer-zero  .bool_set:N = \l__siunitx_process_integer_zero_bool,
    explicit-sign     .tl_set:N   = \l__siunitx_process_sign_tl,
    fixed-exponent    .int_set:N  = \l__siunitx_process_fixed_int,
    minimum-integer-digits .int_set:N =
      \l__siunitx_process_integer_min_int,
    retain-explicit-plus  .bool_set:N = \l__siunitx_process_plus_bool,
    omit-uncertainty      .bool_set:N = \l__siunitx_omit_uncert_bool,
    retain-unity-mantissa .bool_set:N =
      \l__siunitx_process_unity_mantissa_bool,
    retain-zero-exponent .bool_set:N =
      \l__siunitx_process_zero_exponent_bool,
    round-half        .choice:,
    round-half / even .code:n   =
      { \bool_set_false:N \l__siunitx_round_half_up_bool },
    round-half / up   .code:n   =
      { \bool_set_true:N \l__siunitx_round_half_up_bool },
    round-integer-to-decimal .bool_set:N =
      \l__siunitx_process_int_to_dec_bool,
    round-minimum     .tl_set:N  = \l__siunitx_process_round_min_tl,
    round-mode        .choice: ,
    round-mode / figures .code:n =
      { \tl_set:Nn \l__siunitx_round_tl { figures } },
    round-mode / off     .code:n = { \tl_clear:N \l__siunitx_round_tl },
    round-mode / places  .code:n =
      { \tl_set:Nn \l__siunitx_round_tl { places } },
    round-precision      .int_set:N = \l__siunitx_process_precision_int,
    scientific-notation .choice: ,
    scientific-notation
      / false           .code:n =
      {
        \bool_set_false:N \l__siunitx_process_fixed_bool
        \bool_set_false:N \l__siunitx_process_engineering_bool
        \bool_set_false:N \l__siunitx_process_scientific_bool
      },
    scientific-notation
      / engineering     .code:n =
      {
        \bool_set_false:N \l__siunitx_process_fixed_bool
        \bool_set_true:N  \l__siunitx_process_engineering_bool
        \bool_set_true:N  \l__siunitx_process_scientific_bool
      },
    scientific-notation
      / fixed           .code:n =
      {
        \bool_set_true:N  \l__siunitx_process_fixed_bool
        \bool_set_false:N \l__siunitx_process_engineering_bool
        \bool_set_false:N \l__siunitx_process_scientific_bool
      },
    scientific-notation
      / true           .code:n =
      {
        \bool_set_false:N \l__siunitx_process_fixed_bool
        \bool_set_false:N \l__siunitx_process_engineering_bool
        \bool_set_true:N  \l__siunitx_process_scientific_bool
      },
    zero-decimal-to-integer .bool_set:N =
      \l__siunitx_zero_decimal_to_integer_bool
  }
\keys_set:nn { siunitx }
  {
    add-decimal-zero      = true,
    add-integer-zero      = true,
    retain-unity-mantissa = true,
    round-half            = up,
    round-minimum         = 0,
    round-precision       = 2
  }
\cs_new_protected:Npn \__siunitx_number_process:
  {
    \__siunitx_number_process_sign:
    \__siunitx_number_process_zero_fill:
    \__siunitx_number_process_mantissa:
    \prop_if_in:NnF \l__siunitx_number_in_prop { symbolic }
      {
        \bool_if:NTF \l__siunitx_process_fixed_bool
          { \__siunitx_number_process_fixed: }
          {
            \bool_if:NT \l__siunitx_process_scientific_bool
              { \__siunitx_number_process_scientific: }
          }
        \__siunitx_number_process_exponent:
        \__siunitx_number_process_uncertainty:
        \bool_if:NT \l__siunitx_exp_to_prefix_bool
          {
            \tl_if_empty:NF \l__siunitx_unit_tl
              { \__siunitx_number_exp_to_prefix: }
          }
        \prop_if_in:NnTF \l__siunitx_number_in_prop { uncertainty }
          {
            \bool_if:NT \l__siunitx_omit_uncert_bool
              {
                \prop_remove:Nn \l__siunitx_number_in_prop { uncertainty }
                \prop_remove:Nn \l__siunitx_number_in_prop { mantissa-uncertainty }
              }
          }
          { \__siunitx_number_process_round: }
      }
    \__siunitx_number_process_zero_to_integer:
    \__siunitx_number_process_integer_digits:
    \bool_if:NT \l__siunitx_process_drop_exponent_bool
      {
        \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
        \prop_remove:Nn \l__siunitx_number_in_prop { exponent-integer }
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_exponent: {
  \bool_if:NF \l__siunitx_process_zero_exponent_bool
    {
      \prop_if_in:NnT \l__siunitx_number_in_prop { exponent }
        {
          \bool_set_false:N \l__siunitx_tmp_bool
          \__siunitx_number_process_exponent_aux:n { integer }
          \bool_if:NF \l__siunitx_tmp_bool
            { \__siunitx_number_process_exponent_aux:n { decimal } }
          \bool_if:NF \l__siunitx_tmp_bool
            {
              \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
              \prop_remove:Nn \l__siunitx_number_in_prop
                { exponent-integer }
              \prop_remove:Nn \l__siunitx_number_in_prop
                { exponent-decimal }
              \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
                {
                  \prop_put:Nnn \l__siunitx_number_in_prop { mantissa } { true }
                  \prop_put:Nnn \l__siunitx_number_in_prop { mantissa-integer } { 1 }
                }
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_process_exponent_aux:n #1 {
  \prop_get:NnNT \l__siunitx_number_in_prop { exponent- #1 }
    \l__siunitx_tmpa_tl
    {
      \int_compare:nNnF { \l__siunitx_tmpa_tl } = { 0 }
        { \bool_set_true:N \l__siunitx_tmp_bool }
    }
}
\cs_new_protected:Npn \__siunitx_number_process_figures:n #1
  {
    \int_compare:nNnTF \l__siunitx_process_precision_int > 0
      {
        \prop_if_in:NnT \l__siunitx_number_in_prop {#1}
          { \__siunitx_number_process_figures_aux:n {#1} }
      }
      {
        \prop_remove:Nn \l__siunitx_number_in_prop { #1 -sign }
        \prop_put:Nnn \l__siunitx_number_in_prop { #1 -integer } { 0 }
        \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
        \bool_if:NF \l__siunitx_process_int_to_dec_bool
          { \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker } }
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_figures_aux:n #1
  {
    \__siunitx_number_process_figures_init:n {#1}
    \__siunitx_number_process_figures_count:n { integer }
    \__siunitx_number_process_figures_count:n { decimal }
    \bool_if:NTF \l__siunitx_round_bool
      {
        \bool_set_false:N \l__siunitx_round_bool
        \int_compare:nNnTF
          \l__siunitx_round_int > \l__siunitx_process_precision_int
          {
            \__siunitx_number_process_figures_round:
            \__siunitx_number_process_round_tidy:n {#1}
          }
          { \__siunitx_number_process_figures_pad:n {#1} }
      }
      {
        \prop_put:Nnn \l__siunitx_number_in_prop { #1 -integer } { 0 }
        \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_figures_init:n #1
  {
    \int_zero:N \l__siunitx_round_int
    \bool_set_false:N \l__siunitx_round_bool
    \bool_set_false:N \l__siunitx_round_even_bool
    \prop_get:NnNF \l__siunitx_number_in_prop { #1 -decimal }
      \l__siunitx_round_decimal_in_tl
      { \tl_clear:N \l__siunitx_round_decimal_in_tl }
    \prop_get:NnNF \l__siunitx_number_in_prop { #1 -integer }
      \l__siunitx_round_integer_in_tl
      { \tl_clear:N \l__siunitx_round_integer_in_tl }
    \tl_clear:N \l__siunitx_round_decimal_out_tl
    \tl_clear:N \l__siunitx_round_integer_out_tl
    \tl_clear:N \l__siunitx_round_discard_tl
  }
\cs_new_protected:Npn \__siunitx_number_process_figures_count:n #1
  {
    \tl_if_empty:cF { l__siunitx_round_ #1 _in_tl }
      {
        \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -uncertainty }
          { \__siunitx_number_process_figures_count_aux:n {#1} }
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_figures_count_aux:n #1
  {
    \int_set:Nn \l__siunitx_tmp_int
      { \tl_head:v { l__siunitx_round_ #1 _in_tl } }
    \tl_set:cx { l__siunitx_round_ #1 _in_tl }
      { \tl_tail:v { l__siunitx_round_ #1 _in_tl } }
    \tl_put_left:cV { l__siunitx_round_ #1 _out_tl } \l__siunitx_tmp_int
    \bool_if:NF \l__siunitx_round_bool
      {
        \int_compare:nNnF \l__siunitx_tmp_int = 0
          { \bool_set_true:N \l__siunitx_round_bool }
      }
    \bool_if:NT \l__siunitx_round_bool
      { \int_incr:N \l__siunitx_round_int }
    \tl_if_empty:cTF { l__siunitx_round_ #1 _in_tl }
      {
        \tl_set_eq:cc { l__siunitx_round_ #1 _in_tl }
          { l__siunitx_round_ #1 _out_tl }
        \tl_clear:c { l__siunitx_round_ #1 _out_tl }
      }
      { \__siunitx_number_process_figures_count_aux:n {#1} }
  }
\cs_new_protected:Npn \__siunitx_number_process_figures_round:
  {
    \int_set:Nn \l__siunitx_round_int
      { \l__siunitx_round_int - \l__siunitx_process_precision_int }
    \tl_if_empty:NF \l__siunitx_round_decimal_in_tl
      { \__siunitx_number_process_figures_round_loop: }
    \tl_if_empty:NF \l__siunitx_round_integer_in_tl
      { \__siunitx_number_process_figures_integer: }
    \bool_if:NT \l__siunitx_round_bool
      { \tl_put_left:Nn \l__siunitx_round_integer_out_tl { 1 } }
  }
\cs_new_protected:Npn \__siunitx_number_process_figures_round_loop:
  {
    \__siunitx_number_process_round_decimal:
    \tl_if_empty:NF \l__siunitx_round_decimal_in_tl
      { \__siunitx_number_process_figures_round_loop: }
  }
\cs_new_protected:Npn \__siunitx_number_process_figures_integer:
  {
    \int_compare:nNnT \l__siunitx_round_int > 0
      { \tl_put_left:Nn \l__siunitx_round_integer_out_tl { 0 } }
    \int_compare:nNnF \l__siunitx_round_int > 1
      {
        \int_set:Nn \l__siunitx_tmp_int
          { \tl_head:N \l__siunitx_round_integer_in_tl }
        \__siunitx_number_process_round_up:
        \int_compare:nNnTF \l__siunitx_round_int = 1
          {
            \int_compare:nNnT \l__siunitx_tmp_int > 4
              { \bool_set_true:N \l__siunitx_round_bool }
          }
          {
            \int_compare:nNnT \l__siunitx_tmp_int = { 10 }
              {
                \bool_set_true:N \l__siunitx_round_bool
                \int_zero:N \l__siunitx_tmp_int
              }
            \tl_put_left:NV \l__siunitx_round_integer_out_tl
              \l__siunitx_tmp_int
          }
      }
    \int_decr:N \l__siunitx_round_int
    \tl_set:Nx \l__siunitx_round_integer_in_tl
      { \tl_tail:N \l__siunitx_round_integer_in_tl }
    \tl_if_empty:NF \l__siunitx_round_integer_in_tl
      { \__siunitx_number_process_figures_integer: }
  }
\cs_new_protected:Npn \__siunitx_number_process_figures_pad:n #1 {
  \prop_get:NnN \l__siunitx_number_in_prop { #1 -integer }
    \l__siunitx_round_integer_in_tl
  \prop_get:NnN \l__siunitx_number_in_prop { #1 -decimal }
    \l__siunitx_round_decimal_in_tl
  \int_set:Nn \l__siunitx_round_int
    { \l__siunitx_process_precision_int - \l__siunitx_round_int }
  \__siunitx_number_process_pad:n {#1}
}
\cs_new_protected:Npn \__siunitx_number_process_fixed: {
  \prop_if_in:NnF \l__siunitx_number_in_prop { complex }
    {
      \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-integer }
        \l__siunitx_tmpa_tl
        { \tl_set:Nn \l__siunitx_tmpa_tl { 0 } }
      \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
        \l__siunitx_tmpb_tl
        { \tl_clear:N \l__siunitx_tmpb_tl }
      \tl_set:Nx \l__siunitx_tmpa_tl
        { { \l__siunitx_tmpa_tl } { \l__siunitx_tmpb_tl } }
      \prop_get:NnNF \l__siunitx_number_in_prop { exponent-integer }
        \l__siunitx_tmpb_tl
        { \tl_set:Nn \l__siunitx_tmpb_tl { 0 } }
      \group_begin:
        \prop_get:NnNT \l__siunitx_number_in_prop { exponent-sign }
          \l__siunitx_tmpa_tl
          {
            \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
          }
      \exp_args:NNNV \group_end:
      \tl_set:Nn \l__siunitx_tmpb_tl \l__siunitx_tmpb_tl
      \tl_set:Nx \l__siunitx_tmpa_tl
        { \l__siunitx_tmpa_tl { \l__siunitx_tmpb_tl } }
      \exp_after:wN \__siunitx_number_process_fixed_aux_i:nnn
        \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn \__siunitx_number_process_fixed_aux_i:nnn #1#2#3
  {
    \prop_put:Nnn \l__siunitx_number_in_prop { exponent } { true }
    \int_compare:nNnTF \l__siunitx_process_fixed_int > 0
      {
        \prop_put:NnV \l__siunitx_number_in_prop { exponent-integer }
          \l__siunitx_process_fixed_int
        \prop_remove:Nn \l__siunitx_number_in_prop { exponent-sign }
      }
      {
        \prop_put:Nnx \l__siunitx_number_in_prop { exponent-integer }
          { \int_eval:n { - \l__siunitx_process_fixed_int } }
        \prop_put:Nnn \l__siunitx_number_in_prop { exponent-sign } { - }
      }
    \__siunitx_number_process_fixed_aux_ii:nnn {#1} {#2} {#3}
  }
\cs_new_protected:Npn \__siunitx_number_process_fixed_aux_ii:nnn #1#2#3
  {
    \bool_set_true:N \l__siunitx_tmp_bool
    \tl_map_inline:nn {#1#2}
      {
        \str_if_eq:nnF {##1} { 0 }
          {
            \bool_set_false:N \l__siunitx_tmp_bool
            \tl_map_break:
          }
                }
    \bool_if:NF \l__siunitx_tmp_bool
      { \__siunitx_number_process_fixed_aux_iii:nnn {#1} {#2} {#3} }
  }
\cs_new_protected:Npn
  \__siunitx_number_process_fixed_aux_iii:nnn #1#2#3 {
  \int_compare:nNnTF {#3} > { \l__siunitx_process_fixed_int }
    { \__siunitx_number_process_fixed_large:nnn {#1} {#2} {#3} }
    {
      \int_compare:nNnTF {#3} < { \l__siunitx_process_fixed_int }
        { \__siunitx_number_process_fixed_small:nnn {#1} {#2} {#3} }
        {
          \prop_put:Nnn \l__siunitx_number_in_prop
            { mantissa-integer } {#1}
          \tl_if_empty:nTF {#2}
            {
              \prop_remove:Nn \l__siunitx_number_in_prop
                { mantissa-decimal }
              \prop_remove:Nn \l__siunitx_number_in_prop
                { mantissa-decimal-marker }
            }
            {
              \prop_put:Nnn \l__siunitx_number_in_prop
                { mantissa-decimal } {#2}
              \prop_if_in:NnF \l__siunitx_number_in_prop
                { mantissa-decimal-marker }
                {
                  \prop_put:Nnn \l__siunitx_number_in_prop
                    { mantissa-decimal-marker } { . }
                }
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_process_fixed_large:nnn #1
  {
    \__siunitx_number_if_zero:nTF {#1}
      { \__siunitx_number_process_fixed_large_aux:nnn { } }
      { \__siunitx_number_process_fixed_large_aux:nnn {#1} }
  }
\cs_new_protected:Npn \__siunitx_number_process_fixed_large_aux:nnn #1#2#3
  {
  \cs_set_protected:Npn
    \__siunitx_number_process_fixed_large_aux:w ##1##2 \q_stop
      {
        \tl_if_empty:nTF {##2}
          {
            \int_compare:nNnTF
              { #3 - 1 } = { \l__siunitx_process_fixed_int }
              {
                \__siunitx_number_process_fixed_aux_ii:nnn { #1 ##1 }
                  { } { #3 - 1 }
              }
              {
                \__siunitx_number_process_fixed_aux_ii:nnn { #1 ##1 }
                  { 0 } { #3 - 1 }
              }
          }
          {
            \__siunitx_number_if_zero:nTF {#1}
              {
                \__siunitx_number_process_fixed_aux_ii:nnn {##1} {##2}
                  { #3 - 1 }
              }
              {
                \__siunitx_number_process_fixed_aux_ii:nnn { #1 ##1 }
                  {##2} { #3 - 1 }
              }
          }
      }
  \tl_if_empty:nTF {#2}
    { \__siunitx_number_process_fixed_aux_ii:nnn { #1 0 } { } { #3 - 1 } }
    { \__siunitx_number_process_fixed_large_aux:w #2 \q_stop }
}
\cs_new_protected:Npn \__siunitx_number_process_fixed_large_aux:w
  { }
\cs_new_protected:Npn
  \__siunitx_number_process_fixed_small:nnn #1#2#3 {
  \cs_set_protected:Npn
    \__siunitx_number_process_fixed_small_aux:w ##1##2 \q_stop ##3
      {
        \tl_if_empty:nTF {##2}
          {
            \tl_if_empty:nTF {##3}
              {
                \__siunitx_number_process_fixed_aux_ii:nnn { 0 }
                  { ##1 #2 } { #3 + 1 }
              }
              {
                \__siunitx_number_process_fixed_aux_ii:nnn {##3}
                  { ##1 #2 } { #3 + 1 }
              }
          }
          {
            \__siunitx_number_process_fixed_small_aux:w ##2 \q_stop
              { ##3 ##1 }
          }
      }
  \__siunitx_number_process_fixed_small_aux:w #1 \q_stop { }
}
\cs_new_protected:Npn \__siunitx_number_process_fixed_small_aux:w
  { }
\cs_new_protected:Npn \__siunitx_number_process_integer_digits: {
  \int_compare:nNnT \l__siunitx_process_integer_min_int > 0
    {
      \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-integer }
        \l__siunitx_tmpa_tl
        {
          \int_set:Nn \l__siunitx_tmp_int
            {
                 \l__siunitx_process_integer_min_int
              - \tl_count:N \l__siunitx_tmpa_tl
            }
          \int_compare:nNnT \l__siunitx_tmp_int > 0
            {
              \tl_set:Nx \l__siunitx_tmpa_tl
                {
                  \prg_replicate:nn { \l__siunitx_tmp_int } { 0 }
                  \exp_not:V \l__siunitx_tmpa_tl
                }
              \prop_put:NnV \l__siunitx_number_in_prop
                { mantissa-integer } \l__siunitx_tmpa_tl
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_process_mantissa: {
  \bool_if:NF \l__siunitx_process_unity_mantissa_bool
    {
      \prop_if_in:NnT \l__siunitx_number_in_prop { exponent }
        {
          \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-integer }
            \l__siunitx_tmpa_tl
            {
              \tl_if_eq:NNT \c__siunitx_unity_tl \l__siunitx_tmpa_tl
                {
                  \prop_if_in:NnF \l__siunitx_number_in_prop
                    { mantissa-decimal-marker }
                    {
                      \prop_remove:Nn \l__siunitx_number_in_prop
                        { mantissa }
                      \prop_remove:Nn \l__siunitx_number_in_prop
                        { mantissa-integer }
                    }
                }
            }
        }
    }
}
\tl_const:Nn \c__siunitx_unity_tl { 1 }
\cs_new_protected:Npn \__siunitx_number_process_pad:n #1 {
  \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal }
    \l__siunitx_tmpa_tl
    {
      \int_while_do:nNnn { \l__siunitx_round_int } > { 0 }
        {
          \tl_put_right:Nn \l__siunitx_tmpa_tl { 0 }
          \int_decr:N \l__siunitx_round_int
        }
      \prop_put:NnV \l__siunitx_number_in_prop { #1 -decimal }
        \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn \__siunitx_number_process_places:n #1
  {
    \prop_if_in:NnT \l__siunitx_number_in_prop {#1}
      {
        \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -uncertainty }
          { \__siunitx_number_process_places_aux_i:n {#1} }
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_places_aux_i:n #1
  {
    \int_compare:nNnTF \l__siunitx_process_precision_int = 0
      { \__siunitx_number_process_places_none:n {#1} }
      {
        \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal }
          \l__siunitx_tmpa_tl
          {
            \tl_if_empty:NT \l__siunitx_tmpa_tl
              { \tl_set:Nn \l__siunitx_tmpa_tl { 0 } }
            \__siunitx_number_process_places_aux_i:TF
              {
                \prop_put:Nnn \l__siunitx_number_in_prop { #1 -decimal } { }
                \int_set:Nn \l__siunitx_round_int
                  { \l__siunitx_process_precision_int }
                \__siunitx_number_process_pad:n {#1}
              }
              {
                \int_set:Nn \l__siunitx_round_int
                  { \tl_count:N \l__siunitx_tmpa_tl }
                \__siunitx_number_process_places_aux_ii:n {#1}
              }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_places_aux_i:TF
  {
    \bool_set_true:N \l__siunitx_tmp_bool
    \tl_map_inline:Nn \l__siunitx_tmpa_tl
      {
        \int_compare:nNnF {##1} = 0
          {
            \bool_set_false:N \l__siunitx_tmp_bool
            \tl_map_break:
          }
      }
    \bool_if:NTF \l__siunitx_tmp_bool
  }
\cs_new_protected:Npn \__siunitx_number_process_places_none:n #1
  {
    \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal } \l__siunitx_tmpa_tl
      {
        \int_compare:nNnTF { \tl_head:N \l__siunitx_tmpa_tl } > 4
          {
            \prop_get:NnNTF \l__siunitx_number_in_prop { #1 -integer }
              \l__siunitx_tmpb_tl
              {
                \tl_set:Nx \l__siunitx_tmpb_tl
                  { \int_eval:n { \l__siunitx_tmpb_tl + 1 } }
                \bool_if:NF \l__siunitx_round_half_up_bool
                  {
                    \bool_lazy_and:nnT
                      {
                        \int_compare_p:nNn
                          { 0 \tl_head:N \l__siunitx_tmpa_tl } = 5
                      }
                      {
                        \int_compare_p:nNn
                          { 0 \tl_tail:N \l__siunitx_tmpa_tl } = 0
                      }
                      {
                        \int_if_odd:nT \l__siunitx_tmpb_tl
                          {
                            \tl_set:Nx \l__siunitx_tmpb_tl
                              { \int_eval:n { \l__siunitx_tmpb_tl - 1 } }
                          }
                      }
                  }
              }
              { \tl_set:Nn \l__siunitx_tmpb_tl { 1 } }
            \prop_put:NnV \l__siunitx_number_in_prop
              { #1 -integer } \l__siunitx_tmpb_tl
          }
          {
            \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -integer }
              {
                \prop_put:Nnn \l__siunitx_number_in_prop
                  { #1 -integer } { 0 }
              }
          }
      }
    \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
    \bool_if:NF \l__siunitx_process_int_to_dec_bool
      { \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker } }
  }
\cs_new_protected:Npn \__siunitx_number_process_places_aux_ii:n #1
  {
    \int_sub:Nn \l__siunitx_round_int
      { \l__siunitx_process_precision_int }
    \int_compare:nNnTF \l__siunitx_round_int < 0
      {
        \int_set:Nn \l__siunitx_round_int { - \l__siunitx_round_int }
        \__siunitx_number_process_pad:n {#1}
      }
      {
        \__siunitx_number_process_places_init:n {#1}
        \__siunitx_number_process_places_loop:n {#1}
        \__siunitx_number_process_round_tidy:n {#1}
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_places_init:n #1
  {
    \prop_get:NnNF \l__siunitx_number_in_prop { #1 -integer }
      \l__siunitx_round_integer_in_tl
      { \tl_clear:N \l__siunitx_round_integer_in_tl }
    \prop_get:NnN \l__siunitx_number_in_prop { #1 -decimal }
      \l__siunitx_round_decimal_in_tl
    \tl_reverse:N \l__siunitx_round_integer_in_tl
    \tl_reverse:N \l__siunitx_round_decimal_in_tl
    \tl_clear:N \l__siunitx_round_integer_out_tl
    \tl_clear:N \l__siunitx_round_decimal_out_tl
    \tl_clear:N \l__siunitx_round_discard_tl
    \bool_set_false:N \l__siunitx_round_bool
    \bool_set_false:N \l__siunitx_round_even_bool
  }
\cs_new_protected:Npn \__siunitx_number_process_places_loop:n #1
  {
    \tl_if_empty:NTF \l__siunitx_round_decimal_in_tl
      {
        \tl_if_empty:NF \l__siunitx_round_integer_in_tl
          {
            \__siunitx_number_process_places_integer:n {#1}
            \__siunitx_number_process_places_loop:n {#1}
          }
        \bool_if:NT \l__siunitx_round_bool
          {
            \tl_put_left:Nn \l__siunitx_round_integer_out_tl { 1 }
            \bool_set_false:N \l__siunitx_round_bool
          }
      }
      {
        \__siunitx_number_process_round_decimal:
        \__siunitx_number_process_places_loop:n {#1}
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_places_integer:n #1
  {
    \int_set:Nn \l__siunitx_tmp_int
      { \tl_head:N \l__siunitx_round_integer_in_tl }
    \tl_set:Nx \l__siunitx_round_integer_in_tl
      { \tl_tail:N \l__siunitx_round_integer_in_tl }
    \__siunitx_number_process_round_up:
    \bool_set_false:N \l__siunitx_round_bool
    \int_compare:nNnT \l__siunitx_tmp_int = { 10 }
      {
        \int_zero:N \l__siunitx_tmp_int
        \bool_set_true:N \l__siunitx_round_bool
      }
    \tl_put_left:NV \l__siunitx_round_integer_out_tl \l__siunitx_tmp_int
  }
\cs_new_protected:Npn \__siunitx_number_process_round:
  {
    \tl_if_empty:NF \l__siunitx_round_tl
      {
        \bool_if:NT \l__siunitx_process_int_to_dec_bool
          {
            \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa-decimal }
              {
                \prop_put:Nnn \l__siunitx_number_in_prop { mantissa-decimal }
                  { 0 }
              }
            \prop_if_in:NnF \l__siunitx_number_in_prop
              { mantissa-decimal-marker }
              {
                \prop_put:Nnn \l__siunitx_number_in_prop
                  { mantissa-decimal-marker } { . }
              }
          }
        \clist_map_function:nc { mantissa , complex }
         { __siunitx_number_process_ \l__siunitx_round_tl :n }
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_round_decimal:
  {
    \int_compare:nNnF \l__siunitx_round_int > 1
      { \__siunitx_number_process_round_decimal_aux: }
    \tl_put_right:Nx \l__siunitx_round_discard_tl
      { \tl_head:N \l__siunitx_round_decimal_in_tl }
    \tl_set:Nx \l__siunitx_round_decimal_in_tl
      { \tl_tail:N \l__siunitx_round_decimal_in_tl }
    \int_decr:N \l__siunitx_round_int
  }
\cs_new_protected:Npn \__siunitx_number_process_round_decimal_aux:
  {
    \int_set:Nn \l__siunitx_tmp_int
      { \tl_head:N \l__siunitx_round_decimal_in_tl }
    \__siunitx_number_process_round_up:
    \int_compare:nNnTF \l__siunitx_round_int = 1
      {
        \int_compare:nNnT \l__siunitx_tmp_int > 4
          {
            \bool_set_true:N \l__siunitx_round_bool
            \bool_if:NF \l__siunitx_round_half_up_bool
              {
                \int_compare:nNnT
                  { \l__siunitx_round_discard_tl \int_use:N \l__siunitx_tmp_int } = 5
                  { \bool_set_true:N \l__siunitx_round_even_bool }
              }
          }
      }
      {
        \int_compare:nNnT \l__siunitx_tmp_int = { 10 }
          {
            \bool_set_true:N \l__siunitx_round_bool
            \int_zero:N \l__siunitx_tmp_int
          }
        \tl_put_left:NV \l__siunitx_round_decimal_out_tl
          \l__siunitx_tmp_int
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_round_up:
  {
    \bool_if:NT \l__siunitx_round_bool
      {
        \bool_if:NTF \l__siunitx_round_even_bool
          {
            \bool_set_false:N \l__siunitx_round_even_bool
            \int_if_even:nF \l__siunitx_tmp_int
              { \int_incr:N \l__siunitx_tmp_int }
          }
          { \int_incr:N \l__siunitx_tmp_int }
      }
    \bool_set_false:N \l__siunitx_round_bool
  }
\cs_new_protected:Npn \__siunitx_number_process_round_tidy:n #1
  {
    \bool_lazy_and:nnTF
      { \__siunitx_number_if_zero_p:V \l__siunitx_round_integer_out_tl }
      { \__siunitx_number_if_zero_p:V \l__siunitx_round_decimal_out_tl }
      {
        \str_if_eq:VnTF \l__siunitx_process_round_min_tl { 0 }
          {
            \prop_put:Nnn \l__siunitx_number_in_prop { #1 -integer } { 0 }
            \prop_put:NnV \l__siunitx_number_in_prop { #1 -decimal }
              \l__siunitx_round_decimal_out_tl
          }
          {
            \exp_after:wN \__siunitx_number_process_round_tidy_aux:w
              \l__siunitx_process_round_min_tl . . \q_stop {#1}
          }
      }
      {
        \prop_put:NnV \l__siunitx_number_in_prop { #1 -integer }
          \l__siunitx_round_integer_out_tl
        \tl_if_empty:NTF \l__siunitx_round_decimal_out_tl
          {
            \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
            \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker }
          }
          {
            \prop_put:NnV \l__siunitx_number_in_prop { #1 -decimal }
              \l__siunitx_round_decimal_out_tl
          }
       }
  }
\cs_new_protected:Npn \__siunitx_number_process_round_tidy_aux:w
  #1 . #2 . #3 \q_stop #4
  {
    \prop_put:Nnn \l__siunitx_number_in_prop { comparator } { < }
    \prop_put:Nnn \l__siunitx_number_in_prop { #4 -integer } {#1}
    \tl_if_empty:nTF {#2}
      { \prop_remove:Nn \l__siunitx_number_in_prop { #4 -decimal } }
      { \prop_put:Nnn \l__siunitx_number_in_prop { #4 -decimal } {#2} }
  }
\cs_new_protected:Npn \__siunitx_number_process_scientific: {
  \prop_if_in:NnF \l__siunitx_number_in_prop { complex }
    {
      \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-integer }
        \l__siunitx_tmpa_tl
        { \tl_set:Nn \l__siunitx_tmpa_tl { 0 } }
      \prop_get:NnNF \l__siunitx_number_in_prop { mantissa-decimal }
        \l__siunitx_tmpb_tl
        { \tl_clear:N \l__siunitx_tmpb_tl }
      \tl_set:Nx \l__siunitx_tmpa_tl
        { { \l__siunitx_tmpa_tl } { \l__siunitx_tmpb_tl } }
      \prop_get:NnNF \l__siunitx_number_in_prop { exponent-integer }
        \l__siunitx_tmpb_tl
        { \tl_set:Nn \l__siunitx_tmpb_tl { 0 } }
     \group_begin:
       \prop_get:NnNT \l__siunitx_number_in_prop { exponent-sign }
         \l__siunitx_tmpa_tl
         { \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl }
     \exp_args:NNNV \group_end:
     \tl_set:Nn \l__siunitx_tmpb_tl \l__siunitx_tmpb_tl
      \tl_set:Nx \l__siunitx_tmpa_tl
        { \l__siunitx_tmpa_tl { \l__siunitx_tmpb_tl } }
      \exp_after:wN \__siunitx_number_process_scientific_aux_i:nnn
        \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn \__siunitx_number_process_scientific_aux_i:nnn #1#2#3
  {
    \bool_set_true:N \l__siunitx_tmp_bool
    \tl_map_inline:nn {#1#2}
      {
        \str_if_eq:nnF {##1} { 0 }
          {
            \bool_set_false:N \l__siunitx_tmp_bool
            \tl_map_break:
          }
                }
    \bool_if:NF \l__siunitx_tmp_bool
      { \__siunitx_number_process_scientific_aux_ii:nnn {#1} {#2} {#3} }
  }
\cs_new_protected:Npn
  \__siunitx_number_process_scientific_aux_ii:nnn #1#2#3 {
  \int_compare:nNnTF { \tl_count:n {#1} } > 1
    { \__siunitx_number_process_scientific_large:nnn {#1} {#2} {#3} }
    {
      \__siunitx_number_if_zero:nTF {#1}
        {
          \__siunitx_number_process_scientific_small:wn
            #2 \q_stop {#3}
        }
        {
          \bool_if:NTF \l__siunitx_process_engineering_bool
            { \__siunitx_number_process_scientific_engineering:nnn }
            { \__siunitx_number_process_scientific_store:nnn }
               {#1} {#2} {#3}
        }

    }
}
\cs_new_protected:Npn \__siunitx_number_process_scientific_large:nnn #1#2#3
  {
    \cs_set_protected:Npn \__siunitx_number_process_scientific_large_loop:nNN
      ##1##2##3
      {
        \quark_if_recursion_tail_stop_do:Nn ##3
          {
            \__siunitx_number_process_scientific_aux_ii:nnn {##1} { ##2 #2 }
              { #3 + 1 }
          }
        \__siunitx_number_process_scientific_large_loop:nNN { ##1 ##2 } ##3
      }
    \__siunitx_number_process_scientific_large_loop:nNN { } #1
      \q_recursion_tail \q_recursion_stop
  }
\cs_new_protected:Npn
  \__siunitx_number_process_scientific_small:wn #1#2 \q_stop #3
  { \__siunitx_number_process_scientific_aux_ii:nnn {#1} {#2} { #3 - 1 } }
\cs_new_protected:Npn
  \__siunitx_number_process_scientific_store:nnn #1#2#3
  {
    \prop_put:Nnn \l__siunitx_number_in_prop { mantissa-integer } {#1}
    \tl_if_empty:nTF {#2}
      {
        \prop_remove:Nn \l__siunitx_number_in_prop { mantissa-decimal }
        \prop_remove:Nn \l__siunitx_number_in_prop
          { mantissa-decimal-marker }
      }
      {
        \prop_put:Nnn \l__siunitx_number_in_prop
          { mantissa-decimal } {#2}
        \prop_if_in:NnF \l__siunitx_number_in_prop
          { mantissa-decimal-marker }
          {
            \prop_put:Nnn \l__siunitx_number_in_prop
              { mantissa-decimal-marker } { . }
          }
      }
    \int_compare:nNnTF {#3} = { 0 }
      {
        \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
        \prop_remove:Nn \l__siunitx_number_in_prop { exponent-sign }
        \prop_remove:Nn \l__siunitx_number_in_prop { exponent-integer }
      }
      {
        \prop_put:Nnn \l__siunitx_number_in_prop { exponent } { true }
        \int_compare:nNnTF {#3} > { 0 }
          {
            \int_set:Nn \l__siunitx_tmp_int {#3}
            \prop_put:NnV \l__siunitx_number_in_prop
              { exponent-integer } \l__siunitx_tmp_int
            \prop_remove:Nn \l__siunitx_number_in_prop { exponent-sign }
          }
          {
            \int_set:Nn \l__siunitx_tmp_int { 0 - (#3) }
            \prop_put:NnV \l__siunitx_number_in_prop
              { exponent-integer } \l__siunitx_tmp_int
            \prop_put:Nnn \l__siunitx_number_in_prop { exponent-sign }
              { - }
          }
      }
  }
\cs_new_protected:Npn
  \__siunitx_number_process_scientific_engineering:nnn #1#2#3
  {
    \use:c
      {
        __siunitx_number_process_scientific_engineering_
    \int_compare:nNnTF {#3} < { 0 }
      {
        \int_case:nnF { \int_mod:nn { 0 - (#3) } { 3 } }
          {
            { 1 } { 2 }
            { 2 } { 1 }
          }
          { 0 }
      }
      { \int_mod:nn {#3} { 3 } }
        :nnn
      }
      {#1} {#2} {#3}
  }
\cs_new_eq:cN
  { __siunitx_number_process_scientific_engineering_0:nnn }
  \__siunitx_number_process_scientific_store:nnn
\cs_new_protected:cpn
  { __siunitx_number_process_scientific_engineering_1:nnn } #1#2#3
  {
    \tl_if_empty:nTF {#2}
      {
        \__siunitx_number_process_scientific_store:nnn { #1 0 } { }
          { #3 - 1 }
      }
      {
        \use:c
          { __siunitx_number_process_scientific_engineering_1:nw }
          {#1} #2 \q_stop {#3}
      }
  }
\cs_new_protected:cpn
  { __siunitx_number_process_scientific_engineering_1:nw }
  #1#2#3 \q_stop #4
  {
    \__siunitx_number_process_scientific_store:nnn
      {#1#2} {#3} { #4 - 1 }
  }
\cs_new_protected:cpn
  { __siunitx_number_process_scientific_engineering_2:nnn } #1#2#3
  {
    \tl_if_empty:nTF {#2}
      {
        \__siunitx_number_process_scientific_store:nnn { #1 00 } { }
          { #3 - 2 }
      }
      {
        \use:c
          { __siunitx_number_process_scientific_engineering_2_i:nw }
          {#1} #2 \q_stop {#3}
      }
  }
\cs_new_protected:cpn
  { __siunitx_number_process_scientific_engineering_2_i:nw }
  #1#2#3 \q_stop #4
  {
     \tl_if_empty:nTF {#3}
       {
        \__siunitx_number_process_scientific_store:nnn { #1#2 0 } { }
          { #4 - 2 }
       }
       {
        \use:c
          { __siunitx_number_process_scientific_engineering_2_ii:nw }
          {#1#2} #3 \q_stop {#4}
       }
  }
\cs_new_protected:cpn
  { __siunitx_number_process_scientific_engineering_2_ii:nw }
  #1#2#3 \q_stop #4
  {
    \__siunitx_number_process_scientific_store:nnn { #1#2 } {#3}
      { #4 - 2 }
  }
\cs_new_protected:Npn \__siunitx_number_process_sign: {
  \bool_if:NF \l__siunitx_process_plus_bool
    {
      \prop_if_in:NnTF \l__siunitx_number_in_prop { mantissa-sign }
        { \__siunitx_number_process_sign_plus:n { mantissa } }
        {
          \prop_if_in:NnT \l__siunitx_number_in_prop { complex-sign }
            {
              \prop_if_in:NnF \l__siunitx_number_in_prop { mantissa }
                { \__siunitx_number_process_sign_plus:n { complex } }
            }
        }
      \prop_if_in:NnT \l__siunitx_number_in_prop { exponent-sign }
        { \__siunitx_number_process_sign_plus:n { exponent } }
    }
  \tl_if_empty:NF \l__siunitx_process_sign_tl
    {
      \__siunitx_number_process_sign_add:n { mantissa }
      \prop_if_in:NnTF \l__siunitx_number_in_prop { complex }
        { \__siunitx_number_process_sign_add:n { complex } }
    }
}
\cs_new_protected:Npn \__siunitx_number_process_sign_add:n #1 {
  \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -sign }
    {
      \prop_if_in:NnF \l__siunitx_number_in_prop { #1 -had-sign }
        {
          \prop_get:NnN \l__siunitx_number_in_prop {#1}
            \l__siunitx_tmpa_tl
          \tl_if_empty:NTF \l__siunitx_tmpa_tl
            {
              \prop_put:NnV \l__siunitx_number_in_prop { sign }
                \l__siunitx_process_sign_tl
            }
            {
              \prop_put:NnV \l__siunitx_number_in_prop { #1 -sign }
                \l__siunitx_process_sign_tl
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_process_sign_plus:n #1 {
  \prop_get:NnN \l__siunitx_number_in_prop { #1 -sign }
    \l__siunitx_tmpa_tl
  \tl_if_eq:NNT \c__siunitx_plus_tl \l__siunitx_tmpa_tl
    {
      \prop_remove:Nn \l__siunitx_number_in_prop { #1 -sign }
      \prop_put:Nnn \l__siunitx_number_in_prop { #1 -had-sign } { true }
    }
}
\tl_const:Nn \c__siunitx_plus_tl { + }
\cs_new_protected:Npn \__siunitx_number_process_uncertainty: {
  \clist_map_function:nN { mantissa , complex }
    \__siunitx_number_process_uncertainty_aux:n
}
\cs_new_protected:Npn
  \__siunitx_number_process_uncertainty_aux:n #1 {
  \prop_if_in:NnT \l__siunitx_number_in_prop { #1 -uncertainty }
    {
      \prop_if_in:NnTF \l__siunitx_number_in_prop { #1 -decimal-marker }
        { \__siunitx_number_process_uncertainty_decimal:n {#1} }
        { \__siunitx_number_process_uncertainty_integer:n {#1} }
    }
}
\cs_new_protected:Npn
  \__siunitx_number_process_uncertainty_decimal:n #1 {
  \__siunitx_number_process_uncertainty_count:nn {#1} { decimal }
  \__siunitx_number_process_uncertainty_count:nn {#1} { uncertainty }
  \tl_clear:N \l__siunitx_uncertainty_decimal_tl
  \tl_clear:N \l__siunitx_uncertainty_integer_tl
  \int_compare:nNnTF
    { \l__siunitx_process_uncertainty_int } >
      { \l__siunitx_process_decimal_int }
    { \__siunitx_number_process_uncertainty_separate: }
    { \__siunitx_number_process_uncertainty_pad: }
  \tl_if_empty:NF \l__siunitx_uncertainty_integer_tl
    {
      \prop_put:NnV \l__siunitx_number_in_prop
        { #1 -uncertainty-integer }
        \l__siunitx_uncertainty_integer_tl
    }
  \prop_put:NnV \l__siunitx_number_in_prop { #1 -uncertainty-decimal }
    \l__siunitx_uncertainty_decimal_tl
  \prop_get:NnN \l__siunitx_number_in_prop { #1 -decimal-marker }
    \l__siunitx_tmpa_tl
  \prop_put:NnV \l__siunitx_number_in_prop
    { #1 -uncertainty-decimal-marker } \l__siunitx_tmpa_tl
}
\cs_new_protected:Npn
  \__siunitx_number_process_uncertainty_count:nn #1#2 {
  \prop_get:NnN \l__siunitx_number_in_prop { #1 - #2 }
    \l__siunitx_tmpa_tl
  \int_set:cn { l__siunitx_process_ #2 _int }
    { \tl_count:N \l__siunitx_tmpa_tl }
}
\cs_new_protected:Npn \__siunitx_number_process_uncertainty_pad: {
  \int_while_do:nNnn
    { \l__siunitx_process_uncertainty_int } <
      { \l__siunitx_process_decimal_int }
    {
      \tl_put_right:Nn \l__siunitx_uncertainty_decimal_tl {0}
      \int_incr:N \l__siunitx_process_uncertainty_int
    }
  \tl_put_right:NV \l__siunitx_uncertainty_decimal_tl
    \l__siunitx_tmpa_tl
}
\cs_new_protected:Npn
  \__siunitx_number_process_uncertainty_separate: {
  \tl_map_function:NN \l__siunitx_tmpa_tl
    \__siunitx_number_process_uncertainty_separate_aux:N
}
\cs_new_protected:Npn
  \__siunitx_number_process_uncertainty_separate_aux:N #1 {
  \int_compare:nNnTF
    { \l__siunitx_process_uncertainty_int } >
      { \l__siunitx_process_decimal_int }
    { \tl_put_right:Nn \l__siunitx_uncertainty_integer_tl {#1} }
    { \tl_put_right:Nn \l__siunitx_uncertainty_decimal_tl {#1} }
  \int_decr:N \l__siunitx_process_uncertainty_int
}
\cs_new_protected:Npn
  \__siunitx_number_process_uncertainty_integer:n #1 {
  \prop_get:NnN \l__siunitx_number_in_prop { #1 -uncertainty }
    \l__siunitx_tmpa_tl
  \prop_put:NnV \l__siunitx_number_in_prop { #1 -uncertainty-integer }
    \l__siunitx_tmpa_tl
}
\cs_new_protected:Npn \__siunitx_number_process_zero_fill: {
  \__siunitx_number_process_zero_fill_aux:n { integer }
  \__siunitx_number_process_zero_fill_aux:n { decimal }
}
\cs_new:Npn \__siunitx_number_process_zero_fill_aux:n #1 {
  \bool_if:cT { l__siunitx_process_ #1 _zero_bool }
    {
      \__siunitx_number_process_zero_fill_aux:nn { mantissa } {#1}
      \__siunitx_number_process_zero_fill_aux:nn { complex }  {#1}
      \__siunitx_number_process_zero_fill_aux:nn { exponent } {#1}
    }
}
\cs_new_protected:Npn
  \__siunitx_number_process_zero_fill_aux:nn #1#2 {
  \prop_if_in:NnT \l__siunitx_number_in_prop { #1 -decimal-marker }
    {
      \prop_if_in:NnF \l__siunitx_number_in_prop { #1 - #2 }
        { \prop_put:Nnn \l__siunitx_number_in_prop { #1 - #2 } { 0 } }
    }
}
\cs_new_protected:Npn \__siunitx_number_process_zero_to_integer:
  {
    \bool_if:NT \l__siunitx_zero_decimal_to_integer_bool
      {
        \__siunitx_number_process_zero_to_integer_aux:n { mantissa }
        \__siunitx_number_process_zero_to_integer_aux:n { complex }
      }
  }
\cs_new_protected:Npn \__siunitx_number_process_zero_to_integer_aux:n #1
  {
    \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal } \l__siunitx_tmpa_tl
      {
        \bool_set_true:N \l__siunitx_tmp_bool
        \tl_map_inline:Nn \l__siunitx_tmpa_tl
          {
            \str_if_eq:nnF {##1} { 0 }
              {
                \bool_set_false:N \l__siunitx_tmp_bool
                \tl_map_break:
              }
          }
        \bool_if:NT \l__siunitx_tmp_bool
          {
            \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal }
            \prop_remove:Nn \l__siunitx_number_in_prop { #1 -decimal-marker }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_number_exp_to_prefix:
  {
    \prop_set_eq:NN \l__siunitx_unit_prop \l__siunitx_unit_saved_prop
    \prop_get:NnNT \l__siunitx_number_in_prop { exponent-integer }
      \l__siunitx_tmpa_tl
      {
        \prop_get:NnNT \l__siunitx_number_in_prop { exponent-sign }
          \l__siunitx_tmpb_tl
          { \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
        \prop_if_in:NnT \l__siunitx_unit_prop { per-1 }
          {
            \tl_set:Nx \l__siunitx_tmpa_tl
              { \int_eval:n { - \l__siunitx_tmpa_tl } }
          }
        \prop_get:NnNT \l__siunitx_unit_prop { prefix-1 } \l__siunitx_tmpb_tl
          {
            \prop_remove:Nn \l__siunitx_unit_prop { prefix-1 }
            \prop_remove:Nn \l__siunitx_unit_prop { prefix-symbol-1 }
            \prop_get:NVN \l__siunitx_prefix_forward_prop \l__siunitx_tmpb_tl
              \l__siunitx_tmpb_tl
            \tl_set:Nx \l__siunitx_tmpa_tl
              { \int_eval:n { \l__siunitx_tmpa_tl + \l__siunitx_tmpb_tl } }
          }
        \prop_get:NnNT \l__siunitx_unit_prop { power-1 } \l__siunitx_tmpb_tl
          {
            \tl_set:Nx \l__siunitx_tmpa_tl
              { \int_eval:n { \l__siunitx_tmpa_tl / \l__siunitx_tmpb_tl } }
          }
        \prop_get:NVNTF \l__siunitx_prefix_reverse_prop \l__siunitx_tmpa_tl
          \l__siunitx_tmpb_tl
          {
            \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
            \use:c
              {
                __siunitx_ \exp_after:wN \token_to_str:N \l__siunitx_tmpb_tl
                _function:w
              }
            \prop_get:NnN \l__siunitx_unit_prop { total-units } \l__siunitx_tmpa_tl
            \int_set:Nn \l__siunitx_unit_int \l__siunitx_tmpa_tl
            \cs_set_eq:NN \__siunitx_pm: \pm
            \__siunitx_unit_format:
            \cs_set_eq:NN \pm \__siunitx_pm:
          }
          {
            \msg_error:nnx { siunitx } { non-convertible-exponent }
              { \l__siunitx_tmpa_tl }
          }
      }
  }
\prop_new:N \l__siunitx_number_out_prop
\tl_new:N \l__siunitx_group_sep_tl
\tl_new:N \l__siunitx_output_decimal_tl
\bool_new:N \l__siunitx_complex_after_bool
\bool_new:N \l__siunitx_group_decimal_bool
\bool_new:N \l__siunitx_group_integer_bool
\keys_define:nn { siunitx } {
  bracket-negative-numbers  .bool_set:N =
    \l__siunitx_negative_bracket_bool ,
  bracket-numbers           .bool_set:N = \l__siunitx_brackets_bool,
  close-bracket             .tl_set:N   = \l__siunitx_bracket_close_tl,
  complex-root-position     .choice:,
  complex-root-position
    / after-number          .code:n     =
      { \bool_set_true:N \l__siunitx_complex_after_bool } ,
  complex-root-position
    / before-number          .code:n     =
      { \bool_set_false:N \l__siunitx_complex_after_bool } ,
  copy-complex-root         .bool_set:N =
    \l__siunitx_output_complex_copy_bool,
  copy-decimal-marker       .bool_set:N =
    \l__siunitx_output_decimal_copy_bool,
  exponent-base             .tl_set:N   = \l__siunitx_exponent_base_tl,
  exponent-product          .tl_set:N   =
    \l__siunitx_exponent_product_tl,
  group-decimal-digits      .meta:n     = { group-digits = decimal },
  group-digits              .choice: ,
  group-digits /
    decimal                 .code:n     =
      {
        \bool_set_true:N  \l__siunitx_group_decimal_bool
        \bool_set_false:N \l__siunitx_group_integer_bool
      },
  group-digits /
    false                   .code:n     =
      {
        \bool_set_false:N \l__siunitx_group_decimal_bool
        \bool_set_false:N \l__siunitx_group_integer_bool
      },
  group-digits /
    integer                  .code:n     =
      {
        \bool_set_false:N \l__siunitx_group_decimal_bool
        \bool_set_true:N  \l__siunitx_group_integer_bool
      },
  group-digits /
    true                    .code:n     =
      {
        \bool_set_true:N \l__siunitx_group_decimal_bool
        \bool_set_true:N \l__siunitx_group_integer_bool
      },
  group-digits              .default:n  = true                      ,
  group-four-digits         .choice:,
  group-four-digits /
    false                   .meta:n     = { group-minimum-digits = 5 },
  group-four-digits /
    true                    .meta:n     = { group-minimum-digits = 4 },
  group-four-digits         .default:n  = true,
  group-integer-digits      .meta:n     = { group-digits = integer },
  group-minimum-digits      .int_set:N  = \l__siunitx_group_min_int,
  group-separator           .code:n     =
    { \tl_set:Nn \l__siunitx_group_sep_tl { {#1} } },
  negative-color            .tl_set:N   = \l__siunitx_negative_color_tl,
  open-bracket              .tl_set:N   = \l__siunitx_bracket_open_tl,
  output-close-uncertainty  .tl_set:N   =
    \l__siunitx_output_uncert_close_tl,
  output-complex-root       .tl_set:N   = \l__siunitx_output_complex_tl ,
  output-decimal-marker     .code:n     =
    { \tl_set:Nn \l__siunitx_output_decimal_tl { {#1} } },
  output-exponent-marker    .tl_set:N   = \l__siunitx_output_exponent_tl,
  output-open-uncertainty   .tl_set:N   =
    \l__siunitx_output_uncert_open_tl,
  separate-uncertainty      .bool_set:N = \l__siunitx_uncert_sep_bool,
  tight-spacing             .bool_set:N = \l__siunitx_tight_bool,
  uncertainty-separator     .tl_set:N   = \l__siunitx_uncert_sep_tl,
}
\keys_set:nn { siunitx }
  {
    bracket-numbers           = true                          , % (
    close-bracket             = )                             ,
    complex-root-position     = after-number                  ,
    copy-decimal-marker       = false                         ,
    exponent-base             = 10                            ,
    exponent-product          = \times                        ,
    group-digits              = true                          ,
    group-minimum-digits      = 5                             ,
    group-separator           = \,                            ,
    open-bracket              = (                             , % ) (
    output-close-uncertainty  = )                             ,
    output-complex-root       = \ensuremath { \mathrm { i } } ,
    output-decimal-marker     = .                             ,
    output-open-uncertainty   = ( % )
  }
\cs_new_protected:Npn \__siunitx_number_format: {
  \prop_if_empty:NF \l__siunitx_number_in_prop
    {
      \prop_clear:N \l__siunitx_number_out_prop
      \__siunitx_number_format_reassemble:
      \__siunitx_number_format_complex:
      \__siunitx_number_format_sign:n { mantissa }
      \__siunitx_number_format_sign:n { exponent }
      \__siunitx_number_format_relation:
      \__siunitx_number_format_color:
      \__siunitx_number_format_final:
    }
}
\cs_new_protected:Npn \__siunitx_number_format_brackets:n #1 {
  \bool_if:NT \l__siunitx_brackets_bool
    {
      \prop_if_in:NnT \l__siunitx_number_out_prop { #1 -bracket }
        {
          \__siunitx_number_format_brackets_aux:n {#1}
          \prop_remove:Nn \l__siunitx_number_out_prop { #1 -bracket }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_brackets_aux:n #1 {
  \prop_get:NnNF \l__siunitx_number_out_prop { #1 -result }
    \l__siunitx_tmpa_tl
    {
      \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
    }
  \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_open_tl
  \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_close_tl
  \str_if_eq:nnTF {#1} { result }
    { \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl }
    {
      \prop_put:NnV \l__siunitx_number_out_prop { #1 -result }
        \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn \__siunitx_number_format_color: {
  \tl_if_empty:NF \l__siunitx_negative_color_tl
    {
      \__siunitx_number_format_color_aux:n { mantissa-sign }
      \__siunitx_number_format_color_aux:n { sign }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_color_aux:n #1 {
  \prop_get:NnNT \l__siunitx_number_in_prop {#1} \l__siunitx_tmpa_tl
    {
      \str_if_eq:VnT \l__siunitx_tmpa_tl { - }
        {
           \prop_put:NnV \l__siunitx_number_out_prop { color }
             \l__siunitx_negative_color_tl
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_complex: {
  \prop_if_in:NnT \l__siunitx_number_in_prop { complex-root }
    {
      \prop_if_in:NnTF \l__siunitx_number_out_prop { complex }
        {
          \__siunitx_number_format_brackets:n { complex }
          \__siunitx_number_format_complex_aux:n { complex }
          \__siunitx_number_format_complex_aux:n { complex-result }
          \prop_if_in:NnT \l__siunitx_number_out_prop
            { complex-uncertainty }
            {
              \__siunitx_number_format_complex_aux:n
                { complex-uncertainty }
            }
        }
        {
          \prop_put:NnV \l__siunitx_number_out_prop { complex }
            \l__siunitx_output_complex_tl
        }
        \__siunitx_number_format_join_complex:
    }
}
\cs_new_protected:Npn \__siunitx_number_format_complex_aux:n #1 {
  \bool_if:NTF \l__siunitx_output_complex_copy_bool
    {
      \prop_get:NnN \l__siunitx_number_in_prop { complex-root }
        \l__siunitx_tmpa_tl
    }
    { \tl_set_eq:NN \l__siunitx_tmpa_tl \l__siunitx_output_complex_tl }
  \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
  \bool_if:NTF \l__siunitx_complex_after_bool
    { \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl }
    { \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl }
  \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
}
\cs_new_protected:Npn \__siunitx_number_format_copy:n #1 {
  \prop_get:NnN \l__siunitx_number_in_prop  {#1} \l__siunitx_tmpa_tl
  \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
}
\cs_new_protected:Npn \__siunitx_number_format_copy:nn #1#2 {
  \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
  \prop_put:NnV \l__siunitx_number_out_prop {#2} \l__siunitx_tmpa_tl
}
\cs_new_protected:Npn \__siunitx_number_format_final: {
  \prop_if_in:NnT \l__siunitx_number_out_prop { complex }
    {
      \prop_if_in:NnF \l__siunitx_number_out_prop { mantissa-result }
        {
          \__siunitx_number_format_copy:nn { complex }
            { mantissa-result }
        }
    }
  \prop_if_in:NnTF \l__siunitx_number_out_prop { exponent }
    {
      \__siunitx_number_format_final_exponent:
      \prop_if_in:NnTF \l__siunitx_number_out_prop { mantissa-result }
        { \__siunitx_number_format_final_combined: }
        { \__siunitx_number_format_final_exponent_only: }
    }
    { \__siunitx_number_format_copy:nn { mantissa-result } { result } }
  \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa-bracket }
    {
      \prop_put:Nnn \l__siunitx_number_out_prop { result-bracket }
        { true }
      \prop_remove:Nn \l__siunitx_number_out_prop { mantissa-bracket }
    }
  \prop_if_in:NnT \l__siunitx_number_out_prop { comparator }
    {
      \__siunitx_number_format_brackets:n { result }
      \prop_get:NnN \l__siunitx_number_out_prop { comparator }
        \l__siunitx_tmpa_tl
      \prop_get:NnN \l__siunitx_number_out_prop { result }
        \l__siunitx_tmpb_tl
      \tl_set:Nx \l__siunitx_tmpa_tl
        {
          \exp_not:N \mathord
          \exp_not:V \l__siunitx_tmpa_tl
          \exp_not:V \l__siunitx_tmpb_tl
        }
      \prop_put:NnV \l__siunitx_number_out_prop { result }
        \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn \__siunitx_number_format_final_combined: {
  \__siunitx_number_format_brackets:n { mantissa }
  \prop_get:NnN \l__siunitx_number_out_prop { mantissa-result }
    \l__siunitx_tmpa_tl
  \tl_if_empty:NT \l__siunitx_output_exponent_tl
    {
      \tl_put_right:Nx \l__siunitx_tmpa_tl
        {
          \exp_not:N \ensuremath
            {
              \bool_if:NTF \l__siunitx_tight_bool
                { {  \exp_not:V \l__siunitx_exponent_product_tl } }
                { { } \exp_not:V \l__siunitx_exponent_product_tl { } }
            }
        }
    }
  \prop_get:NnN \l__siunitx_number_out_prop { exponent-result }
    \l__siunitx_tmpb_tl
  \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
  \prop_put:NnV \l__siunitx_number_out_prop { result }
    \l__siunitx_tmpa_tl
  \prop_put:Nnn \l__siunitx_number_out_prop
    { result-bracket-exponent } { true }
}
\cs_new_protected:Npn \__siunitx_number_format_final_exponent: {
  \prop_get:NnN \l__siunitx_number_out_prop { exponent }
    \l__siunitx_tmpa_tl
  \tl_if_empty:NTF \l__siunitx_output_exponent_tl
    {
      \tl_set:Nx \l__siunitx_tmpa_tl
       { ^ { \exp_not:V \l__siunitx_tmpa_tl } }
      \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_exponent_base_tl
    }
    {
      \tl_set:Nx  \l__siunitx_tmpa_tl
        {
          \exp_not:V \l__siunitx_output_exponent_tl
          \exp_not:N \mathord
          \exp_not:V  \l__siunitx_tmpa_tl
        }
    }
  \prop_put:NnV \l__siunitx_number_out_prop { exponent-result }
    \l__siunitx_tmpa_tl
}
\cs_new_protected:Npn
  \__siunitx_number_format_final_exponent_only: {
  \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-sign }
    \l__siunitx_tmpa_tl
    {
      \prop_get:NnN \l__siunitx_number_out_prop { exponent-result }
        \l__siunitx_tmpb_tl
      \__siunitx_tl_put_left_math:NV \l__siunitx_tmpb_tl
        \l__siunitx_tmpa_tl
      \prop_put:NnV \l__siunitx_number_out_prop { exponent-result }
        \l__siunitx_tmpb_tl
    }
  \__siunitx_number_format_copy:nn { exponent-result } { result }
}
\cs_new_protected:Npn \__siunitx_number_format_group:n #1 {
  \__siunitx_number_format_group_aux:nn {#1} { integer }
  \__siunitx_number_format_group_aux:nn {#1} { decimal }
  \prop_if_in:NnTF \l__siunitx_number_out_prop { #1 -integer }
    { \__siunitx_number_format_copy:nn { #1 -integer } {#1} }
    { \tl_clear:N \l__siunitx_tmpa_tl }
  \prop_get:NnNT \l__siunitx_number_in_prop { #1 -decimal-marker }
    \l__siunitx_tmpb_tl
    {
      \bool_if:NTF \l__siunitx_output_decimal_copy_bool
        { \tl_set:Nx \l__siunitx_tmpb_tl { { \l__siunitx_tmpb_tl } } }
        {
          \tl_set_eq:NN \l__siunitx_tmpb_tl
            \l__siunitx_output_decimal_tl
        }
      \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
      \prop_put:NnV \l__siunitx_number_out_prop { #1 -decimal-marker }
        \l__siunitx_tmpb_tl
      \prop_get:NnNF \l__siunitx_number_out_prop { #1 -decimal }
        \l__siunitx_tmpb_tl
        { \tl_clear:N \l__siunitx_tmpb_tl }
      \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
      \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn \__siunitx_number_format_group_aux:nn #1#2 {
  \prop_if_in:NnT \l__siunitx_number_in_prop { #1 - #2 }
    {
      \bool_if:cTF { l__siunitx_group_ #2 _bool }
        { \__siunitx_number_format_group:nn {#1} {#2} }
        { \__siunitx_number_format_copy:n { #1 - #2 } }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_group:nn #1#2
  {
    \prop_get:NnN \l__siunitx_number_in_prop { #1 - #2 } \l__siunitx_tmpa_tl
    \int_compare:nNnTF
      { \tl_count:N \l__siunitx_tmpa_tl } < \l__siunitx_group_min_int
      { \__siunitx_number_format_copy:n { #1 - #2 } }
      {
        \tl_clear:N \l__siunitx_tmpb_tl
        \use:c { __siunitx_number_format_group_ #2 : }
        \prop_put:NnV \l__siunitx_number_out_prop { #1 - #2 } \l__siunitx_tmpb_tl
      }
  }
\cs_new_protected:Npn \__siunitx_number_format_group_decimal: {
  \tl_if_empty:NF \l__siunitx_tmpa_tl
    {
      \exp_after:wN \__siunitx_number_format_group_decimal_aux:NNNN
        \l__siunitx_tmpa_tl { } { } { }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_group_decimal_aux:NNNN
  #1#2#3#4 {
  \tl_if_empty:nTF {#2}
    { \tl_put_right:Nn \l__siunitx_tmpb_tl {#1} }
    {
      \tl_if_empty:nTF {#3}
        { \tl_put_right:Nn \l__siunitx_tmpb_tl { #1 #2 } }
        {
          \tl_put_right:Nn \l__siunitx_tmpb_tl { #1 #2 #3 }
          \tl_if_empty:nF {#4}
            {
              \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_group_sep_tl
              \__siunitx_number_format_group_decimal_aux:NNNN #4
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_group_integer: {
  \tl_if_empty:NF \l__siunitx_tmpa_tl
    {
      \__siunitx_number_format_group_integer_setup:V \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn \__siunitx_number_format_group_integer_setup:n #1 {
  \__siunitx_number_format_group_integer_setup_aux:NNNN
    { } #1 { } { } { }
}
\cs_generate_variant:Nn \__siunitx_number_format_group_integer_setup:n
  { V }
\cs_new_protected:Npn
  \__siunitx_number_format_group_integer_setup_aux:NNNN #1#2#3#4 {
  \tl_if_empty:nTF {#2}
    { \__siunitx_number_format_group_integer_aux:NNNN #1 \q_nil }
    {
      \tl_if_empty:nTF {#3}
        {
          \__siunitx_number_format_group_integer_aux:NNNN { } { } #1#2
            \q_nil
        }
        {
          \tl_if_empty:nTF {#4}
            {
              \__siunitx_number_format_group_integer_aux:NNNN { } #1#2#3
                \q_nil
            }
            {
              \__siunitx_number_format_group_integer_setup_aux:NNNN
                {#1#2#3#4}
            }
        }
    }
}
\cs_new_protected:Npn
  \__siunitx_number_format_group_integer_aux:NNNN #1#2#3#4 {
  \tl_put_right:Nn \l__siunitx_tmpb_tl {#1#2#3}
  \quark_if_nil:nF {#4}
    {
      \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_group_sep_tl
      \__siunitx_number_format_group_integer_aux:NNNN #4
    }
}
\cs_new_protected:Npn \__siunitx_number_format_join_complex: {
  \__siunitx_number_format_sign_complex:
  \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
    {
      \__siunitx_number_format_brackets:n { mantissa }
      \prop_get:NnN \l__siunitx_number_out_prop { mantissa-result }
        \l__siunitx_tmpa_tl
      \prop_get:NnNF \l__siunitx_number_out_prop { complex-result }
        \l__siunitx_tmpb_tl
        {
          \prop_get:NnN \l__siunitx_number_out_prop { complex }
            \l__siunitx_tmpb_tl
        }
      \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
      \prop_put:NnV \l__siunitx_number_out_prop { mantissa-result }
        \l__siunitx_tmpa_tl
      \prop_put:Nnn \l__siunitx_number_out_prop { mantissa-bracket }
        { true }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_join_uncert: {
  \__siunitx_number_format_join_uncert:n { mantissa }
  \__siunitx_number_format_join_uncert:n { complex }
}
\cs_new_protected:Npn \__siunitx_number_format_join_uncert:n #1 {
  \prop_get:NnNT \l__siunitx_number_out_prop {#1}
    \l__siunitx_tmpa_tl
    {
      \prop_get:NnNTF \l__siunitx_number_out_prop { #1 -uncertainty }
        \l__siunitx_tmpb_tl
        {
          \bool_if:NT \l__siunitx_uncert_sep_bool
            { \__siunitx_number_format_join_uncert_pm:N \l__siunitx_tmpb_tl }
          \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
          \prop_put:NnV \l__siunitx_number_out_prop { #1 -result }
            \l__siunitx_tmpa_tl
          \prop_put:Nnn \l__siunitx_number_out_prop { #1 -bracket }
            { true }
        }
        { \__siunitx_number_format_copy:nn {#1} { #1 -result } }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_join_uncert_pm:N #1
  {
    \bool_if:NTF \l__siunitx_tight_bool
      { \tl_put_left:Nn #1 { \ensuremath { { \pm } } } }
      { \tl_put_left:Nn #1 { \ensuremath { { } \pm { } } } }
  }
\cs_new_protected:Npn \__siunitx_number_format_reassemble: {
  \prop_if_in:NnT \l__siunitx_number_in_prop { mantissa }
    {
      \__siunitx_number_format_group:n { mantissa }
      \__siunitx_number_format_uncertainty:n { mantissa }
    }
  \prop_if_in:NnT \l__siunitx_number_in_prop { complex }
    {
      \__siunitx_number_format_group:n { complex }
      \__siunitx_number_format_uncertainty:n { complex }
    }
  \prop_if_in:NnT \l__siunitx_number_in_prop { exponent }
    { \__siunitx_number_format_group:n { exponent } }
}
\cs_new_protected:Npn \__siunitx_number_format_relation: {
  \prop_get:NnNT \l__siunitx_number_in_prop { comparator }
    \l__siunitx_tmpa_tl
    {
      \tl_set:Nx \l__siunitx_tmpa_tl
        {
          \exp_not:N \ensuremath
            { \exp_not:V \l__siunitx_tmpa_tl }
        }
      \prop_put:NnV \l__siunitx_number_out_prop { comparator }
        \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn \__siunitx_number_format_sign:n #1 {
  \prop_if_in:NnT \l__siunitx_number_out_prop {#1}
    {
      \prop_get:NnNT \l__siunitx_number_in_prop { #1 -sign }
        \l__siunitx_tmpa_tl
        {
          \bool_if:NTF \l__siunitx_negative_bracket_bool
            {
              \str_if_eq:VnTF \l__siunitx_tmpa_tl { - }
                { \__siunitx_number_format_sign_negative_brackets:n {#1} }
                { \__siunitx_number_format_sign_aux:n {#1} }
            }
            { \__siunitx_number_format_sign_aux:n {#1} }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_sign_aux:n #1 {
  \tl_clear:N \l__siunitx_tmpb_tl
  \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
  \prop_put:NnV \l__siunitx_number_out_prop { #1 -sign }
    \l__siunitx_tmpb_tl
  \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
  \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
  \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
  \prop_get:NnNT \l__siunitx_number_out_prop { #1 -result }
    \l__siunitx_tmpa_tl
    {
      \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
      \prop_put:NnV \l__siunitx_number_out_prop { #1 -result }
        \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn
  \__siunitx_number_format_sign_negative_brackets:n #1
  {
    \__siunitx_number_format_brackets_aux:n {#1}
    \prop_get:NnNT \l__siunitx_number_out_prop { #1 }
      \l__siunitx_tmpa_tl
      {
        \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_open_tl
        \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_bracket_close_tl
        \prop_put:NnV \l__siunitx_number_out_prop { #1  }
          \l__siunitx_tmpa_tl
      }
  }
\cs_new_protected:Npn \__siunitx_number_format_sign_complex: {
  \__siunitx_number_format_sign_complex:n { complex }
  \__siunitx_number_format_sign_complex:n { complex-result }
}
\cs_new_protected:Npn \__siunitx_number_format_sign_complex:n #1  {
  \prop_if_in:NnT \l__siunitx_number_out_prop {#1}
    {
      \prop_get:NnNT \l__siunitx_number_in_prop { complex-sign }
        \l__siunitx_tmpa_tl
        {
          \bool_if:NTF \l__siunitx_tight_bool
            {
              \tl_set:Nx \l__siunitx_tmpa_tl
                { \exp_not:N \mathord \exp_not:V \l__siunitx_tmpa_tl }
            }
            {
              \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
                {
                  \tl_set:Nx \l__siunitx_tmpa_tl
                    { { } \exp_not:V \l__siunitx_tmpa_tl { } }
                }
            }
          \tl_clear:N \l__siunitx_tmpb_tl
          \tl_put_left:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
          \prop_put:NnV \l__siunitx_number_out_prop { complex-sign }
            \l__siunitx_tmpb_tl
          \prop_get:NnN \l__siunitx_number_out_prop {#1}
            \l__siunitx_tmpa_tl
          \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
          \prop_put:NnV \l__siunitx_number_out_prop {#1}
            \l__siunitx_tmpa_tl
      }
    }
}
\cs_new_protected:Npn \__siunitx_number_format_uncertainty:n #1 {
  \prop_if_in:NnTF \l__siunitx_number_in_prop { #1 -uncertainty }
    {
      \bool_if:NTF \l__siunitx_uncert_sep_bool
        { \__siunitx_number_format_uncertainty_sep:n {#1} }
        { \__siunitx_number_format_uncertainty_joined:n {#1} }
      \__siunitx_number_format_join_uncert:
    }
    { \__siunitx_number_format_copy:nn {#1} { #1 -result } }
}
\cs_new_protected:Npn
  \__siunitx_number_format_uncertainty_joined:n #1 {
  \prop_get:NnN \l__siunitx_number_in_prop { #1 -uncertainty }
    \l__siunitx_tmpa_tl
  \prop_remove:Nn \l__siunitx_number_in_prop { #1 -uncertainty }
  \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_output_uncert_open_tl
  \tl_put_left:NV \l__siunitx_tmpa_tl \l__siunitx_uncert_sep_tl
  \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_output_uncert_close_tl
  \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
  \tl_put_right:NV \l__siunitx_tmpb_tl \l__siunitx_tmpa_tl
  \prop_put:NnV \l__siunitx_number_out_prop {#1} \l__siunitx_tmpb_tl
}
\cs_new_protected:Npn
  \__siunitx_number_format_uncertainty_sep:n #1 {
  \prop_if_in:NnT \l__siunitx_number_out_prop { #1 -integer }
    {
      \prop_if_in:NnF \l__siunitx_number_out_prop
        { #1 -uncertainty-integer }
        {
          \prop_put:Nnn \l__siunitx_number_out_prop
            { #1 -uncertainty-integer } { 0 }
        }
    }
    \__siunitx_number_format_group:n { #1 -uncertainty }
    \prop_put:NnV \l__siunitx_number_out_prop { #1 -uncertainty }
      \l__siunitx_tmpa_tl
}
\tl_new:N \l__siunitx_number_out_tl
\tl_new:N \l__siunitx_number_out_saved_tl
\tl_new:N \l__siunitx_number_fraction_tl
\bool_new:N \l__siunitx_number_compound_bool
\tl_new:N \l__siunitx_quotient_mode_tl
\cs_new_protected:Npn \__siunitx_fraction:nn { }
\keys_define:nn { siunitx } {
  fraction-function  .code:n     =
     { \cs_set_protected:Npn \__siunitx_fraction:nn {#1} },
  output-product     .tl_set:N   = \l__siunitx_output_product_tl,
  output-quotient    .tl_set:N   = \l__siunitx_output_quotient_tl,
  parse-numbers      .bool_set:N = \l__siunitx_number_parse_bool,
  quotient-mode      .choice:,
  quotient-mode / fraction .code:n =
    { \tl_set:Nn \l__siunitx_quotient_mode_tl { fraction } },
  quotient-mode / symbol .code:n =
    { \tl_set:Nn \l__siunitx_quotient_mode_tl { symbol } },
}
\keys_set:nn { siunitx } {
  fraction-function = \frac  ,
  output-product    = \times ,
  output-quotient   = /      ,
  parse-numbers     = true   ,
  quotient-mode     = symbol
}
\cs_new_protected:Npn \__siunitx_number_output:n #1 {
  \tl_clear:N \l__siunitx_unit_tl
  \tl_clear:N \l__siunitx_preunit_tl
  \__siunitx_combined_output:n {#1}
}
\cs_generate_variant:Nn \__siunitx_number_output:n { V }
\cs_new_protected:Npn \__siunitx_number_output_bracket: {
  \bool_if:NF \l__siunitx_error_bool
    {
      \bool_if:NT \l__siunitx_number_compound_bool
        { \__siunitx_number_format_brackets:n { result } }
    }
}
\cs_new_protected:Npn \__siunitx_number_output_color: {
  \prop_if_in:NnT \l__siunitx_number_out_prop { color }
    {
      \prop_get:NnN \l__siunitx_number_out_prop { color }
        \l__siunitx_number_color_tl
    }
}
\cs_new_protected:Npn \__siunitx_number_output_parse:n #1 {
  \__siunitx_number_preprocess:n {#1}
  \bool_if:NF \l__siunitx_error_bool
    {
      \tl_if_empty:NTF \l__siunitx_number_multi_tl
        { \__siunitx_number_output_parse_aux: }
        {
          \use:c
            { __siunitx_number_output_ \l__siunitx_number_multi_tl : }
        }
    }
}
\cs_generate_variant:Nn \__siunitx_number_output_parse:n { V }
\cs_new_protected:Npn \__siunitx_number_output_parse_aux: {
  \__siunitx_number_in_parse:V \l__siunitx_number_arg_tl
  \bool_if:NF \l__siunitx_error_bool
    {
      \__siunitx_number_process:
      \__siunitx_number_format:
      \__siunitx_number_output_color:
      \bool_if:NTF \l__siunitx_brackets_bool
        { \__siunitx_number_output_single: }
        {
          \prop_if_in:NnTF \l__siunitx_number_out_prop
            { result-bracket }
            { \__siunitx_number_output_parts: }
            { \__siunitx_number_output_single: }
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_output_parts: {
  \bool_lazy_and:nnTF
    { \tl_if_empty_p:N \l__siunitx_pre_unit_tl }
    { \tl_if_empty_p:N \l__siunitx_unit_tl }
    { \__siunitx_number_output_single: }
    { \__siunitx_number_output_parts_aux: }
}
\cs_new_protected:Npn \__siunitx_number_output_parts_aux: {
  \bool_if:NTF \l__siunitx_multi_repeat_bool
    {
      \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa-result }
        {
          \__siunitx_number_output_parts_aux:n { mantissa }
          \__siunitx_number_output_parts_aux:n { complex }
        }
      \prop_get:NnNT \l__siunitx_number_out_prop { exponent-result }
        \l__siunitx_tmpa_tl
        {
          \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa-result }
            {
              \tl_put_left:Nx \l__siunitx_tmpa_tl
                {
                  \exp_not:N \ensuremath
                    {
                      \bool_if:NTF \l__siunitx_tight_bool
                        { {  \exp_not:V \l__siunitx_exponent_product_tl } }
                        { { } \exp_not:V \l__siunitx_exponent_product_tl { } }
                    }
                }
              \prop_put:NnV \l__siunitx_number_out_prop { exponent }
                \l__siunitx_tmpa_tl
            }
          \__siunitx_number_output_parts_print:n { exponent }
        }
    }
    { \__siunitx_number_output_single: }
}
\cs_new_protected:Npn \__siunitx_number_output_parts_aux:n #1 {
   \prop_if_in:NnT \l__siunitx_number_out_prop {#1}
     { \__siunitx_number_output_parts_print:n {#1} }
   \prop_if_in:NnT \l__siunitx_number_out_prop { #1 -uncertainty }
     {
        \bool_if:NTF \l__siunitx_tight_bool
          { \__siunitx_print:nn { number } { \ensuremath { { \pm } } } }
          { \__siunitx_print:nn { number } { \ensuremath { { } \pm { } } } }
       \__siunitx_number_output_parts_print:n { #1 -uncertainty }
     }
}
\cs_new_protected:Npn \__siunitx_number_output_parts_print:n #1 {
  \__siunitx_unit_output_pre_print:
  \prop_get:NnN \l__siunitx_number_out_prop {#1} \l__siunitx_tmpa_tl
  \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
  \__siunitx_unit_output_print:
}
\cs_new_protected:Npn \__siunitx_number_output_product: {
  \bool_if:NTF \l__siunitx_product_brackets_bool
    {
      \bool_lazy_and:nnTF
        { \tl_if_empty_p:N \l__siunitx_pre_unit_tl }
        { \tl_if_empty_p:N \l__siunitx_unit_tl }
        { \__siunitx_number_output_product_aux: }
        { \__siunitx_number_output_product_brackets: }
    }
    {
      \bool_if:NTF \l__siunitx_product_repeat_bool
        { \__siunitx_number_output_product_aux: }
        {
          \__siunitx_unit_output_pre_print:
          \tl_set_eq:NN \l__siunitx_unit_saved_tl \l__siunitx_unit_tl
          \tl_clear:N \l__siunitx_pre_unit_tl
          \tl_clear:N \l__siunitx_unit_tl
          \group_begin:
            \__siunitx_number_output_product_aux:
          \group_end:
          \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_saved_tl
          \__siunitx_unit_output_print:
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_output_product_brackets: {
  \__siunitx_unit_output_pre_print:
  \__siunitx_print:nV { number }  \l__siunitx_bracket_open_tl
  \nobreak
  \tl_set_eq:NN \l__siunitx_unit_saved_tl \l__siunitx_unit_tl
  \tl_clear:N \l__siunitx_pre_unit_tl
  \tl_clear:N \l__siunitx_unit_tl
  \__siunitx_number_output_product_aux:
  \nobreak
  \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_saved_tl
  \__siunitx_print:nV { number } \l__siunitx_bracket_close_tl
  \__siunitx_unit_output_print:
}
\cs_new_protected:Npn \__siunitx_number_output_product_aux: {
  \bool_set_true:N \l__siunitx_number_compound_bool
  \__siunitx_number_preprocess:V \l__siunitx_number_arg_tl
  \bool_if:NF \l__siunitx_error_bool
    {
      \tl_if_empty:NTF \l__siunitx_number_multi_tl
        { \__siunitx_number_output_parse_aux: }
        { \__siunitx_number_output_quotient: }
      \tl_if_empty:NF \l__siunitx_number_next_tl
        {
          \bool_if:NTF \l__siunitx_tight_bool
            {
              \__siunitx_print:nn { number }
                { \ensuremath { \l__siunitx_output_product_tl } }
            }
            {
              \__siunitx_print:nn  { number }
                { \ensuremath { { } \l__siunitx_output_product_tl { } } }
            }
          \__siunitx_number_output_parse:V \l__siunitx_number_next_tl
        }
    }
}
\cs_new_protected:Npn \__siunitx_number_output_quotient: {
  \use:c
    { __siunitx_number_output_quotient_ \l__siunitx_quotient_mode_tl : }
}
\cs_new_protected:Npn \__siunitx_number_output_quotient_fraction: {
  \bool_set_false:N \l__siunitx_number_compound_bool
  \__siunitx_number_output_quotient_aux_i:
  \tl_set:Nx \l__siunitx_number_out_tl
    { { \exp_not:V \l__siunitx_number_numerator_tl } }
  \tl_set:Nx \l__siunitx_tmpa_tl
    { { \exp_not:V \l__siunitx_number_denominator_tl } }
  \tl_put_right:NV \l__siunitx_number_out_tl \l__siunitx_tmpa_tl
  \tl_put_left:Nn \l__siunitx_number_out_tl { \__siunitx_fraction:nn }
  \tl_set:Nx \l__siunitx_number_out_tl
    {
      \exp_not:N \ensuremath
        { \exp_not:V \l__siunitx_number_out_tl }
    }
  \__siunitx_number_output_single_aux:
}
\cs_new_protected:Npn \__siunitx_number_output_quotient_symbol: {
  \bool_set_true:N \l__siunitx_number_compound_bool
  \__siunitx_number_output_quotient_aux_i:
  \tl_set_eq:NN \l__siunitx_number_out_tl
    \l__siunitx_number_numerator_tl
  \tl_put_right:NV \l__siunitx_number_out_tl \l__siunitx_output_quotient_tl
  \tl_put_right:NV \l__siunitx_number_out_tl
    \l__siunitx_number_denominator_tl
  \__siunitx_number_output_single_aux:
}
\cs_new_protected:Npn \__siunitx_number_output_quotient_aux_i: {
  \__siunitx_number_in_parse:V \l__siunitx_number_numerator_tl
  \__siunitx_number_output_quotient_aux_ii:
  \__siunitx_number_output_color:
  \prop_if_in:NnT \l__siunitx_number_out_prop { complex }
    {
      \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
        {
          \prop_put:Nnn \l__siunitx_number_out_prop
            { result-bracket } { true }
          \__siunitx_number_format_brackets:n { result }
        }
    }
  \prop_get:NnN \l__siunitx_number_out_prop { result }
    \l__siunitx_number_numerator_tl
  \__siunitx_number_in_parse:V \l__siunitx_number_denominator_tl
  \__siunitx_number_output_quotient_aux_ii:
  \prop_if_in:NnT \l__siunitx_number_out_prop
    { result-bracket-exponent }
    {
      \prop_put:Nnn \l__siunitx_number_out_prop { result-bracket }
        { true }
    }
  \__siunitx_number_output_bracket:
  \prop_get:NnN \l__siunitx_number_out_prop { result }
    \l__siunitx_number_denominator_tl
}
\cs_new_protected:Npn \__siunitx_number_output_quotient_aux_ii: {
  \__siunitx_number_process:
  \__siunitx_number_format:
}
\cs_new_protected:Npn \__siunitx_number_output_single: {
  \bool_lazy_and:nnF
    { \tl_if_empty_p:N \l__siunitx_pre_unit_tl }
    { \tl_if_empty_p:N \l__siunitx_unit_tl }
    {
      \prop_if_in:NnF \l__siunitx_number_out_prop { exponent }
        { \__siunitx_number_format_brackets:n { result } }
    }
  \__siunitx_number_output_bracket:
  \prop_get:NnN \l__siunitx_number_out_prop { result }
    \l__siunitx_number_out_tl
  \__siunitx_number_output_single_aux:
}
\cs_new_protected:Npn \__siunitx_number_output_single_aux: {
  \__siunitx_unit_output_pre_print:
  \quark_if_no_value:NTF \l__siunitx_number_out_tl
    { \tl_clear:N \l__siunitx_number_unit_product_tl }
    { \__siunitx_print:nV { number } \l__siunitx_number_out_tl }
  \__siunitx_unit_output_print:
}
\bool_new:N \l__siunitx_angle_degree_space_bool
\bool_new:N \l__siunitx_angle_minute_space_bool
\box_new:N \l__siunitx_angle_marker_box
\box_new:N \l__siunitx_angle_unit_box
\dim_new:N \l__siunitx_angle_marker_dim
\dim_new:N \l__siunitx_angle_unit_dim
\prop_new:N \l__siunitx_angle_degree_prop
\prop_new:N \l__siunitx_angle_minute_prop
\prop_new:N \l__siunitx_angle_second_prop
\keys_define:nn { siunitx } {
  add-arc-degree-zero       .bool_set:N =
    \l__siunitx_angle_degree_zero_bool  ,
  add-arc-minute-zero       .bool_set:N =
    \l__siunitx_angle_minute_zero_bool  ,
  add-arc-second-zero       .bool_set:N =
    \l__siunitx_angle_second_zero_bool  ,
  angle-symbol-over-decimal .bool_set:N =
    \l__siunitx_angle_astronomy_bool    ,
  arc-separator             .tl_set:N   =
    \l__siunitx_angle_arc_separator_tl  ,
  number-angle-product      .tl_set:N   =
    \l__siunitx_angle_unit_product_tl ,
  number-angle-separator    .tl_set:N   =
    \l__siunitx_angle_unit_product_tl ,
}
\cs_new_protected:Npn \__siunitx_angle_output:nnn #1#2#3 {
  \__siunitx_angle_init:
  \IfNoValueTF {#2}
    {
      \bool_set_false:N \l__siunitx_angle_minute_zero_bool
      \bool_set_false:N \l__siunitx_angle_second_zero_bool
      \__siunitx_angle_output_aux:nnn {#1} { } { }
    }
    {
      \IfNoValueTF {#3}
        { \__siunitx_error:nx { invalid-arc-format } { #1 ; #2 } }
        { \__siunitx_angle_output_aux:nnn {#1} {#2} {#3} }
    }
}
\cs_new_protected:Npn \__siunitx_angle_output_aux:nnn #1#2#3 {
  \tl_if_empty:nTF { #1#2#3 }
    { \__siunitx_error:n { empty-arc } }
    {
      \bool_if:NTF \l__siunitx_number_parse_bool
        { \__siunitx_angle_parse:nnn {#1} {#2} {#3} }
        { \__siunitx_angle_direct:nnn {#1} {#2} {#3} }
    }
}
\cs_new_protected:Npn \__siunitx_angle_init: {
  \bool_set_false:N \l__siunitx_angle_degree_space_bool
  \bool_set_false:N \l__siunitx_angle_minute_space_bool
  \prop_clear:N \l__siunitx_angle_degree_prop
  \prop_clear:N \l__siunitx_angle_minute_prop
  \prop_clear:N \l__siunitx_angle_second_prop
  \tl_clear:N \l__siunitx_preunit_tl
  \tl_set_eq:NN \l__siunitx_number_unit_product_tl
    \l__siunitx_angle_unit_product_tl
  \cs_set_eq:NN \__siunitx_number_in_parse_more:N
    \__siunitx_number_in_parse_restricted:N
}
\cs_new_protected:Npn \__siunitx_angle_direct:nnn #1 {
  \tl_if_empty:nTF {#1}
    {
      \bool_if:NTF \l__siunitx_angle_degree_zero_bool
        { \__siunitx_angle_direct_aux_i:nnn { 0 } }
        { \__siunitx_angle_direct_aux_i:nnn { } }
    }
    { \__siunitx_angle_direct_aux_i:nnn {#1} }
}
\cs_new_protected:Npn \__siunitx_angle_direct_aux_i:nnn #1#2 {
  \tl_if_empty:nTF {#2}
    {
      \bool_if:NTF \l__siunitx_angle_minute_zero_bool
        { \__siunitx_angle_direct_aux_ii:nnn {#1} { 0 } }
        { \__siunitx_angle_direct_aux_ii:nnn {#1} { } }
    }
    { \__siunitx_angle_direct_aux_ii:nnn {#1} {#2} }
}
\cs_new_protected:Npn \__siunitx_angle_direct_aux_ii:nnn #1#2#3 {
  \tl_if_empty:nTF {#3}
    {
      \bool_if:NTF \l__siunitx_angle_second_zero_bool
        { \__siunitx_angle_direct_aux_iii:nnn {#1} {#2} { 0 } }
        { \__siunitx_angle_direct_aux_iii:nnn {#1} {#2} { } }
    }
    { \__siunitx_angle_direct_aux_iii:nnn {#1} {#2} {#3} }
}
\cs_new_protected:Npn \__siunitx_angle_direct_aux_iii:nnn #1#2#3 {
  \tl_if_empty:nF {#1}
    {
      \tl_if_empty:nF {#2#3}
        { \bool_set_true:N \l__siunitx_angle_degree_space_bool }
    }
  \tl_if_empty:nF {#2}
    {
      \tl_if_empty:nF {#3}
        { \bool_set_true:N \l__siunitx_angle_minute_space_bool }
    }
  \__siunitx_angle_print_direct:nnn {#1} {#2} {#3}
}
\cs_new_protected:Npn \__siunitx_angle_parse:nnn #1#2#3 {
  \__siunitx_angle_parse_aux:nn {#1} { degree }
  \__siunitx_angle_parse_aux:nn {#2} { minute }
  \__siunitx_angle_parse_aux:nn {#3} { second }
  \__siunitx_angle_check_sign:
  \__siunitx_angle_zero_fill:
  \prop_if_empty:NF \l__siunitx_angle_degree_prop
    {
      \prop_if_empty:NF \l__siunitx_angle_minute_prop
        { \bool_set_true:N \l__siunitx_angle_degree_space_bool }
      \prop_if_empty:NF \l__siunitx_angle_second_prop
        { \bool_set_true:N \l__siunitx_angle_degree_space_bool }
    }
  \prop_if_empty:NF \l__siunitx_angle_minute_prop
    {
      \prop_if_empty:NF \l__siunitx_angle_second_prop
        { \bool_set_true:N \l__siunitx_angle_minute_space_bool }
    }
  \__siunitx_angle_print:
}
\cs_new_protected:Npn \__siunitx_angle_parse_aux:nn #1#2 {
  \prop_clear:N \l__siunitx_number_in_prop
  \tl_if_empty:nF {#1}
    {
      \__siunitx_number_in_init:
      \__siunitx_number_in_parse_aux:n {#1}
    }
  \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-sign-deleted }
    \l__siunitx_tmpa_tl
    {
      \prop_put:NnV \l__siunitx_number_in_prop { mantissa-sign }
        \l__siunitx_tmpa_tl
    }
  \__siunitx_number_process:
  \prop_set_eq:cN { l__siunitx_angle_ #2 _prop }
    \l__siunitx_number_in_prop
}
\cs_new_protected:Npn \__siunitx_angle_check_sign: {
  \prop_if_empty:NTF \l__siunitx_angle_degree_prop
    {
      \prop_if_empty:NF \l__siunitx_angle_minute_prop
        { \__siunitx_angle_check_sign_aux:n { second } }
    }
    {
      \__siunitx_angle_check_sign_aux:n { minute }
      \__siunitx_angle_check_sign_aux:n { second }
    }
}
\cs_new_protected:Npn \__siunitx_angle_check_sign_aux:n #1 {
  \prop_if_in:cnTF { l__siunitx_angle_ #1 _prop }
    { mantissa-sign }
    { \msg_error:nn { siunitx } { bad-arc-sign } }
    {
      \prop_if_in:cnT { l__siunitx_angle_ #1 _prop }
        { mantissa-sign-deleted }
        { \msg_error:nn { siunitx } { bad-arc-sign } }
    }
}
\cs_new_protected:Npn \__siunitx_angle_zero_fill: {
  \bool_lazy_and:nnT
    { \l__siunitx_angle_second_zero_bool }
    { \prop_if_empty_p:N \l__siunitx_angle_second_prop }
    {
      \prop_put:Nnn \l__siunitx_angle_second_prop { mantissa }
        { true }
      \prop_put:Nnn \l__siunitx_angle_second_prop { mantissa-integer }
        { 0 }
    }
  \bool_lazy_and:nnT
    { \l__siunitx_angle_minute_zero_bool }
    { \prop_if_empty_p:N \l__siunitx_angle_minute_prop }
    {
      \prop_put:Nnn \l__siunitx_angle_minute_prop { mantissa }
        { true }
      \prop_put:Nnn \l__siunitx_angle_minute_prop { mantissa-integer }
        { 0 }
      \__siunitx_angle_sign_shuffle:nn { second } { minute }
    }
  \bool_lazy_and:nnT
    { \l__siunitx_angle_degree_zero_bool }
    { \prop_if_empty_p:N \l__siunitx_angle_degree_prop }
    {
      \prop_put:Nnn \l__siunitx_angle_degree_prop { mantissa }
        { true }
      \prop_put:Nnn \l__siunitx_angle_degree_prop { mantissa-integer }
        { 0 }
      \__siunitx_angle_sign_shuffle:nn { second } { degree }
      \__siunitx_angle_sign_shuffle:nn { minute } { degree }
    }
}
\cs_new_protected:Npn \__siunitx_angle_sign_shuffle:nn #1#2 {
  \__siunitx_angle_sign_shuffle_aux:nnn {#1} {#2} { }
  \__siunitx_angle_sign_shuffle_aux:nnn {#1} {#2} { -deleted }
}
\cs_new_protected:Npn \__siunitx_angle_sign_shuffle_aux:nnn
  #1#2#3 {
  \prop_get:cnN { l__siunitx_angle_ #1 _prop } { mantissa-sign #3 }
    \l__siunitx_tmpa_tl
  \prop_remove:cn { l__siunitx_angle_ #1 _prop } { mantissa-sign #3 }
  \quark_if_no_value:NF \l__siunitx_tmpa_tl
    {
      \prop_put:cnV { l__siunitx_angle_ #2 _prop } { mantissa-sign #3 }
        \l__siunitx_tmpa_tl
    }
}
\cs_new_protected:Npn \__siunitx_angle_print: {
  \__siunitx_angle_print_aux:nn { degree } { \SIUnitSymbolDegree }
  \bool_if:NT \l__siunitx_angle_degree_space_bool
    {
      \nobreak
      \l__siunitx_angle_arc_separator_tl
    }
  \__siunitx_angle_print_aux:nn { minute } { \SIUnitSymbolArcminute }
  \bool_if:NT \l__siunitx_angle_minute_space_bool
    {
      \nobreak
      \l__siunitx_angle_arc_separator_tl
    }
  \__siunitx_angle_print_aux:nn { second } { \SIUnitSymbolArcsecond }
}
\cs_new_protected:Npn \__siunitx_angle_print_aux:nn #1#2 {
  \prop_if_empty:cF { l__siunitx_angle_ #1 _prop }
    {
      \prop_set_eq:Nc \l__siunitx_number_in_prop
        { l__siunitx_angle_ #1 _prop }
      \tl_set:Nn \l__siunitx_unit_tl {#2}
      \tl_clear:N \l__siunitx_number_out_tl
      \__siunitx_number_format:
      \__siunitx_number_output_color:
      \bool_if:NTF \l__siunitx_angle_astronomy_bool
        { \__siunitx_angle_print_astronomy: }
        { \__siunitx_number_output_single: }
    }
}
\cs_new_protected:Npn \__siunitx_angle_print_astronomy: {
  \prop_if_in:NnTF \l__siunitx_number_in_prop
    { mantissa-decimal-marker }
    { \__siunitx_angle_print_astronomy_aux: }
    { \__siunitx_number_output_single: }
}
\cs_new_protected:Npn \__siunitx_angle_print_astronomy_aux: {
  \prop_get:NnNF \l__siunitx_number_out_prop { mantissa-sign }
    \l__siunitx_tmpa_tl
    { \tl_clear:N \l__siunitx_tmpa_tl }
  \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-integer }
    \l__siunitx_tmpb_tl
    {
      \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
      \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
    }
  \hbox_set:Nn \l__siunitx_angle_marker_box
    {
      \__siunitx_print:nn { number } { { \l__siunitx_output_decimal_tl } }
    }
  \hbox_set:Nn \l__siunitx_angle_unit_box
    {
      \__siunitx_print:nV { unit } \l__siunitx_unit_tl
      \skip_horizontal:n { -\scriptspace }
    }
  \__siunitx_angle_print_astronomy_aux:n { marker }
  \__siunitx_angle_print_astronomy_aux:n { unit }
  \hbox_set:Nn \l__siunitx_angle_marker_box
    {
      \box_use:N \l__siunitx_angle_marker_box
      \box_use:N \l__siunitx_angle_unit_box
    }
  \dim_compare:nNnTF
    { \l__siunitx_angle_marker_dim } > { \l__siunitx_angle_unit_dim }
    { \__siunitx_angle_print_astronomy_marker: }
    { \__siunitx_angle_print_astronomy_unit: }
  \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-decimal }
    \l__siunitx_tmpa_tl
    { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
}
\cs_new_protected:Npn \__siunitx_angle_print_astronomy_aux:n #1 {
  \dim_set:cn { l__siunitx_angle_ #1 _dim  }
    { \box_wd:c { l__siunitx_angle_ #1 _box } }
  \hbox_set_to_wd:cnn { l__siunitx_angle_ #1 _box } { \c_zero_skip }
    {
      \tex_hss:D
      \hbox_unpack:c { l__siunitx_angle_ #1_box }
      \tex_hss:D
    }
}
\cs_new_protected:Npn \__siunitx_angle_print_astronomy_marker: {
  \hbox_set_to_wd:Nnn \l__siunitx_angle_marker_box
    { \l__siunitx_angle_marker_dim }
    {
      \tex_hss:D
      \hbox_unpack:N \l__siunitx_angle_marker_box
      \tex_hss:D
    }
  \box_use:N \l__siunitx_angle_marker_box
}
\cs_new_protected:Npn \__siunitx_angle_print_astronomy_unit: {
  \hbox_set_to_wd:Nnn \l__siunitx_angle_marker_box
    { \l__siunitx_angle_unit_dim }
    {
      \tex_hss:D
      \hbox_unpack:N \l__siunitx_angle_marker_box
      \tex_hss:D
    }
  \box_use:N \l__siunitx_angle_marker_box
  \skip_horizontal:N \scriptspace
}
\cs_new_protected:Npn \__siunitx_angle_print_direct:nnn #1#2#3 {
  \__siunitx_angle_print_direct_aux:nn {#1} { \SIUnitSymbolDegree }
  \bool_if:NT \l__siunitx_angle_degree_space_bool
    {
      \nobreak
      \l__siunitx_angle_arc_separator_tl
    }
  \__siunitx_angle_print_direct_aux:nn {#2} { \SIUnitSymbolArcminute }
  \bool_if:NT \l__siunitx_angle_minute_space_bool
    {
      \nobreak
     \l__siunitx_angle_arc_separator_tl
    }
  \__siunitx_angle_print_direct_aux:nn {#3} { \SIUnitSymbolArcsecond }
}
\cs_new_protected:Npn \__siunitx_angle_print_direct_aux:nn #1#2 {
  \tl_if_empty:nF {#1}
    {
      \tl_set:Nn \l__siunitx_unit_tl {#2}
      \__siunitx_print:nn { number } { \ensuremath {#1} }
      \__siunitx_unit_output_print:
    }
}
\seq_new:N \l_siunitx_unit_symbolic_seq
\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \of }
\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \highlight }
\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \per }
\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \raiseto }
\seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \tothe }
\cs_new_protected:Npn \__siunitx_declare_power_after:Nn #1#2 {
  \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
  \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w }
    { \__siunitx_textsuperscript:n {#2} }
  \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
    { \__siunitx_unit_parse_power_after:n {#2} }
}
\cs_new_protected:Npn \__siunitx_declare_power_before:Nn #1#2 {
  \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
  \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w } ##1
    { ##1 \__siunitx_textsuperscript:n {#2} }
  \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
    { \__siunitx_unit_parse_power_before:n {#2} }
}
\cs_new_protected:Npn \__siunitx_declare_prefix:Nnnn #1#2#3#4
  {
    \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
    \prop_put:Nnn \l__siunitx_prefix_forward_prop {#1} {#4}
    \prop_put:Nnn \l__siunitx_prefix_reverse_prop {#4} {#1}
    \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w } {#2}
    \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
      {
        \bool_if:NTF \l__siunitx_prefix_symbols_bool
          { \__siunitx_unit_parse_prefix:Nn #1 {#2} }
          { \__siunitx_unit_parse_prefix:nn {#3} {#4} }
      }
  }
\prop_new:N \l__siunitx_prefix_forward_prop
\prop_new:N \l__siunitx_prefix_reverse_prop
\cs_new_protected:Npn \__siunitx_declare_qualifier:Nn #1#2 {
  \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
  \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w }
    { \text { ~ } ( #2 ) }
  \cs_set:cpn { __siunitx_ \token_to_str:N #1 _function:w }
    { \__siunitx_unit_parse_qualifier:n {#2} }
}
\cs_new_protected:Npn \__siunitx_declare_unit:Nnn #1#2#3 {
  \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
  \cs_set:cpn { __siunitx_ \token_to_str:N #1 _literal:w } {#2}
  \cs_set_protected:cpn { __siunitx_ \token_to_str:N #1 _function:w }
    {
      \__siunitx_unit_if_literal:nTF {#2}
        { \__siunitx_unit_parse_unit:Nn #1 {#2} }
        {#2}
    }
  \tl_if_empty:nTF {#3}
    { \cs_undefine:c { l__siunitx_ \token_to_str:N #1 _options_tl } }
    {
      \tl_clear_new:c { l__siunitx_ \token_to_str:N #1 _options_tl }
      \tl_set:cn { l__siunitx_ \token_to_str:N #1 _options_tl } {#3}
    }
}
\cs_new_protected:Npn \__siunitx_unit_first_token:n #1 {
  \exp_last_unbraced:No \token_to_str:N { \tl_head:w #1 \q_stop }
}
\cs_new:cpn { __siunitx_ \token_to_str:N \per _literal:w } { / }
\cs_new_protected:cpn { __siunitx_ \token_to_str:N \per _function:w } {
  \bool_set_true:N \l__siunitx_per_bool
  \__siunitx_unit_parse_per:
}
\cs_new:cpn { __siunitx_ \token_to_str:N \raiseto _literal:w } #1#2 {
  #2
  \__siunitx_textsuperscript:n {#1}
}
\cs_new_protected:cpn { __siunitx_ \token_to_str:N \raiseto _function:w }
  #1 {
  \__siunitx_unit_parse_power_before:n {#1}
}
\cs_new:cpn { __siunitx_ \token_to_str:N \tothe _literal:w } #1 {
  \__siunitx_textsuperscript:n {#1}
}
\cs_new_protected:cpn { __siunitx_ \token_to_str:N \tothe _function:w }
  #1 {
  \__siunitx_unit_parse_power_after:n {#1}
}
\cs_new:cpn { __siunitx_ \token_to_str:N \of _literal:w } #1 {
  \text { ~ } ( #1 )
}
\cs_new_protected:cpn { __siunitx_ \token_to_str:N \of _function:w } #1 {
  \__siunitx_unit_parse_qualifier:n {#1}
}
\AtBeginDocument {
  \cs_if_exist:NT \cancel
    {
      \cs_set_protected:Npn \__siunitx_cancel:n #1
        { \__siunitx__real_cancel:n { \__siunitx_print:nn { unit } {#1} } }
      \cs_set_eq:NN \__siunitx__real_cancel:n \cancel
      \seq_put_right:Nn \l_siunitx_unit_symbolic_seq { \cancel }
      \cs_new_protected:cpn
        { __siunitx_ \token_to_str:N \cancel _function:w }
        { \__siunitx_unit_parse_special:n { \__siunitx_cancel:n }  }
    }
}
\cs_new:cpn
  { __siunitx_ \token_to_str:N \highlight _literal:w } #1
  { \__siunitx_textcolor:n {#1} }
\cs_new_protected:cpn
  { __siunitx_ \token_to_str:N \highlight _function:w } #1
  { \__siunitx_unit_parse_special:n { \__siunitx_textcolor:n {#1} } }
\keys_define:nn { siunitx } {
  free-standing-units    .bool_set:N = \l__siunitx_create_free_bool     ,
  overwrite-functions    .bool_set:N = \l__siunitx_create_overwrite_bool,
  space-before-unit      .bool_set:N = \l__siunitx_create_prespace_bool ,
  unit-optional-argument .bool_set:N = \l__siunitx_create_optional_bool ,
  use-xspace             .bool_set:N = \l__siunitx_create_xspace_bool   ,
}
\__siunitx_option_deactivate:n {
  free-standing-units    ,
  overwrite-functions    ,
  space-before-unit      ,
  unit-optional-argument ,
  use-xspace             ,
}
\cs_new_protected:Npn \__siunitx_unit_create_empty_functions:
  {
    \__siunitx_unit_create_functions_aux_i:
    \seq_map_function:NN \l_siunitx_unit_symbolic_seq
      \__siunitx_unit_create_empty_functions_aux:N
    \__siunitx_unit_create_functions_aux_ii:
  }
\cs_new_protected:Npn \__siunitx_unit_create_empty_functions_aux:N #1
  {
    \cs_if_free:NT #1
      { \cs_set_protected:Npn #1 { \ERROR } }
  }
\cs_new_protected:Npn \__siunitx_unit_create_functions:
  {
    \__siunitx_unit_create_functions_aux_i:
    \bool_if:NT \l__siunitx_create_overwrite_bool
      { \seq_map_function:NN \l_siunitx_unit_symbolic_seq \cs_undefine:N }
    \bool_if:NTF \l__siunitx_create_optional_bool
      {
        \seq_map_function:NN \l_siunitx_unit_symbolic_seq
          \__siunitx_unit_create_with_arg:N
      }
      {
        \seq_map_function:NN \l_siunitx_unit_symbolic_seq
          \__siunitx_unit_create:N
      }
    \__siunitx_unit_create_functions_aux_ii:
    \bool_if:NT \l__siunitx_create_xspace_bool
      { \RequirePackage { xspace } }
  }
\cs_new_protected:Npn \__siunitx_unit_create_functions_aux_i:
  {
    \@ifpackageloaded { soulpos }
      {
        \@ifpackageloaded { soul }
          { }
          {
            \cs_set_protected:Npn \__siunitx_unit_create_functions_aux_ii:
              {
                \cs_undefine:N \hl
                \cs_undefine:N \ul
              }
          }
      }
      { }
  }
\cs_new_protected:Npn \__siunitx_unit_create_functions_aux_ii: { }
\cs_new_protected:Npn \__siunitx_unit_create:N #1 {
  \cs_if_free:NT #1
    {
      \cs_set:Npx \__siunitx_tmp:w
        {
          \ProvideDocumentCommand \exp_not:N #1 { }
            {
              \group_begin:
                \exp_not:N \cs_if_free:NF
                  \exp_not:c
                  { l__siunitx_ \token_to_str:N #1 _options_tl }
                  {
                    \keys_set:nV { siunitx }
                      \exp_not:c
                        { l__siunitx_ \token_to_str:N #1 _options_tl }
                  }
                \bool_if:NT \l__siunitx_create_prespace_bool
                  { \exp_not:N \l__siunitx_number_unit_product_tl }
                \exp_not:n { \__siunitx_unit_output:nn {#1} { } }
              \group_end:
              \bool_if:NT \l__siunitx_create_xspace_bool
                { \exp_not:N \xspace }
            }
        }
      \__siunitx_tmp:w
    }
}
\cs_new_protected:Npn \__siunitx_unit_create_with_arg:N #1 {
  \cs_if_free:NT #1
    {
      \cs_set:Npx \__siunitx_tmp:w
        {
          \ProvideDocumentCommand \exp_not:N #1 { o }
            {
              \group_begin:
                \exp_not:N \cs_if_free:NF
                  \exp_not:c
                  { l__siunitx_ \token_to_str:N #1 _options_tl }
                  {
                    \keys_set:nV { siunitx }
                      \exp_not:c
                        {
                          l__siunitx_ \token_to_str:N #1 _options_tl
                        }
                  }
                \exp_not:N \IfNoValueTF {####1}
                  {
                    \bool_if:NT \l__siunitx_create_prespace_bool
                      { \exp_not:N \l__siunitx_number_unit_product_tl }
                    \exp_not:n { \__siunitx_unit_output:nn {#1} { } }
                  }
                  { \SI {####1} { \exp_not:N #1 } }
              \group_end:
              \bool_if:NT \l__siunitx_create_xspace_bool
                { \exp_not:N \xspace }
            }
        }
      \__siunitx_tmp:w
    }
}
\AtBeginDocument {
  \cs_if_eq:NNT \color \use_none:n
    { \cs_set_protected:Npn \color #1 { } }
  \cs_set:Npn \__siunitx_tmp:w #1 { }
  \cs_if_eq:NNT \color \__siunitx_tmp:w
    { \cs_set_protected:Npn \color #1 { } }
  \tl_map_function:nN { \bar \color \ng \pm \array@row@rst }
    \__siunitx_protect_symbols:N
}
\__siunitx_if_hooks:TF
  {
    \AddToHook { begindocument / end } [ siunitx ]
      { \__siunitx_protect_symbols:N \fg }
  }
  {
    \tl_put_right:Nn \document
      {
        \__siunitx_protect_symbols:N \fg
        \ignorespaces
      }
  }
\cs_new_protected:Npn \__siunitx_protect_symbols:N #1 {
  \cs_if_exist:NT #1
    {
      \tl_if_empty:fT { \cs_prefix_spec:N #1 }
        { \cs_set_protected:Npx #1 { \exp_not:V #1 } }
    }
}
\keys_define:nn { siunitx } {
  forbid-literal-units .bool_set:N =
    \l__siunitx_unit_forbid_literal_bool,
  parse-units          .bool_set:N = \l__siunitx_unit_parse_bool
}
\keys_set:nn { siunitx } {
  forbid-literal-units = false,
  parse-units          = true
}
\cs_new_protected:Npn \__siunitx_unit_in:nn #1#2 {
  \bool_if:NTF \l__siunitx_unit_parse_bool
    {
      \tl_if_empty:nF {#1}
        {
          \__siunitx_unit_if_literal:nTF {#1}
            {
              \tl_clear:N \l__siunitx_per_mode_tl
              \bool_if:NTF \l__siunitx_unit_forbid_literal_bool
                {
                  \msg_error:nnx { siunitx } { literal-unit }
                    { \exp_not:n {#1} }
                }
                {
                  \cs_set_eq:NN \__siunitx_pm: \pm
                  \__siunitx_unit_format_literal:n {#1}
                  \cs_set_eq:NN \pm \__siunitx_pm:
                }
            }
            {
              \cs_set_eq:NN \__siunitx_pm: \pm
              \__siunitx_unit_parse:nn {#1} {#2}
              \__siunitx_unit_format:
              \prop_set_eq:NN \l__siunitx_unit_saved_prop \l__siunitx_unit_prop
              \cs_set_eq:NN \pm \__siunitx_pm:
            }
      }
  }
  { \__siunitx_unit_format_literal:n {#1} }
}
\cs_generate_variant:Nn \__siunitx_unit_in:nn { V }
\cs_new:Npn \__siunitx_pm: { }
\cs_new_protected:Npn \__siunitx_unit_if_literal:nTF #1#2#3 {
  \group_begin:
    \seq_map_function:NN \l_siunitx_unit_symbolic_seq
      \__siunitx_unit_if_literal_aux:N
    \cs_set_eq:NN \of \use_none:n
    \cs_set_eq:NN \highlight \use_none:n
    \cs_set_eq:NN \raiseto \use_none:n
    \cs_set_eq:NN \tothe \use_none:n
    \protected@edef \l__siunitx_tmpa_tl {#1}
  \exp_args:NNNV \group_end:
  \tl_set:Nn \l__siunitx_tmpa_tl \l__siunitx_tmpa_tl
  \tl_if_blank:VTF \l__siunitx_tmpa_tl {#3} {#2}
}
\cs_new_protected:Npn \__siunitx_unit_if_literal_aux:N #1 {
  \cs_set_eq:NN #1 \prg_do_nothing:
}
\int_new:N \l__siunitx_unit_int
\prop_new:N \l__siunitx_unit_prop
\prop_new:N \l__siunitx_unit_saved_prop
\bool_new:N \l__siunitx_per_bool
\keys_define:nn { siunitx }
  {
    exponent-to-prefix  .bool_set:N  = \l__siunitx_exp_to_prefix_bool  ,
    prefixes-as-symbols .bool_set:N  = \l__siunitx_prefix_symbols_bool ,
    sticky-per          .bool_set:N  = \l__siunitx_sticky_per_bool
  }
\keys_set:nn { siunitx } { prefixes-as-symbols = true }
\cs_new_protected:Npn \__siunitx_unit_parse:nn #1#2 {
  \__siunitx_unit_parse_init:
  \__siunitx_unit_parse_options:nn {#1} {#2}
  #1
}
\cs_new_protected:Npn \__siunitx_unit_parse_init:
  {
    \prop_clear:N \l__siunitx_unit_prop
    \int_zero:N \l__siunitx_unit_int
    \bool_set_false:N \l__siunitx_per_bool
    \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
      { \cs_set_eq:Nc ##1 { __siunitx_ \token_to_str:N ##1 _function:w } }
  }
\cs_new_protected:Npn \__siunitx_unit_parse_options:nn #1#2 {
  \tl_if_single:nT {#1}
    {
      \cs_if_free:cF
        { l__siunitx_ \__siunitx_unit_first_token:n {#1} _options_tl }
        {
          \keys_set:nv { siunitx }
            { l__siunitx_ \__siunitx_unit_first_token:n {#1} _options_tl }
          \keys_set:nn { siunitx } {#2}
        }
  }
}
\cs_new_protected:Npn \__siunitx_unit_parse_power_before:n #1 {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { power- \int_eval:n { \l__siunitx_unit_int + 1 } }
  \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
}
\cs_new_protected:Npn \__siunitx_unit_parse_power_after:n #1 {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { power- \int_use:N \l__siunitx_unit_int }
  \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
}
\cs_new_protected:Npn \__siunitx_unit_parse_prefix:Nn #1#2
  {
    \int_incr:N \l__siunitx_unit_int
    \tl_set:Nx \l__siunitx_tmpa_tl
      { prefix- \int_use:N \l__siunitx_unit_int }
    \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
    \tl_set:Nx \l__siunitx_tmpa_tl
      { prefix-symbol- \int_use:N \l__siunitx_unit_int }
    \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#2}
  }
\cs_new_protected:Npn \__siunitx_unit_parse_prefix:nn #1#2
  {
    \__siunitx_unit_parse_prefix:Nn \ERROR {#2}
    \tl_set:Nx \l__siunitx_tmpa_tl
      { prefix-base- \int_use:N \l__siunitx_unit_int }
    \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
  }
\cs_new_protected:Npn \__siunitx_unit_parse_per: {
  \tl_set:Nx \l__siunitx_tmpa_tl
    {  per- \int_eval:n { \l__siunitx_unit_int + 1 } }
  \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl { true }
  \bool_if:NT \l__siunitx_sticky_per_bool
    { \cs_set_eq:NN \per \__siunitx_unit_parse_per_error: }
}
\cs_new_protected:Npn \__siunitx_unit_parse_per_error: {
  \msg_error:nn { siunitx } { duplicate-sticky-per }
}
\cs_new_protected:Npn \__siunitx_unit_parse_qualifier:n #1 {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { symbol- \int_use:N \l__siunitx_unit_int }
  \prop_if_in:NVF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
    { \msg_error:nn { siunitx } { qualifier-before-unit } }
  \tl_set:Nx \l__siunitx_tmpa_tl
    { qualifier- \int_use:N \l__siunitx_unit_int }
  \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
}
\cs_new_protected:Npn \__siunitx_unit_parse_special:n #1 {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { special- \int_eval:n { \l__siunitx_unit_int + 1 } }
  \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
}
\cs_new_protected:Npn \__siunitx_unit_parse_unit:Nn #1#2 {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { prefix-symbol- \int_use:N \l__siunitx_unit_int }
  \prop_if_in:NVTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
    {
      \tl_set:Nx \l__siunitx_tmpa_tl
        { symbol- \int_use:N \l__siunitx_unit_int }
      \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
        { \int_incr:N \l__siunitx_unit_int }
    }
    { \int_incr:N \l__siunitx_unit_int }
  \tl_set:Nx \l__siunitx_tmpa_tl
    { unit- \int_use:N \l__siunitx_unit_int }
  \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#1}
  \tl_set:Nx \l__siunitx_tmpa_tl
    { symbol- \int_use:N \l__siunitx_unit_int }
  \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl {#2}
  \__siunitx_unit_parse_unit_per:
}
\cs_new_protected:Npn \__siunitx_unit_parse_unit_per: {
  \bool_if:NT \l__siunitx_sticky_per_bool
    {
      \bool_if:NT \l__siunitx_per_bool
        {
          \tl_set:Nx \l__siunitx_tmpa_tl
            { per- \int_use:N \l__siunitx_unit_int }
          \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl
            { true }
        }
    }
}
\tl_new:N \l__siunitx_preunit_tl
\tl_new:N \l__siunitx_unit_tl
\tl_new:N \l__siunitx_unit_current_tl
\tl_new:N \l__siunitx_unit_denominator_tl
\tl_new:N \l__siunitx_unit_numerator_tl
\tl_new:N \l__siunitx_unit_saved_tl
\int_new:N \l__siunitx_unit_denominator_int
\int_new:N \l__siunitx_unit_numerator_int
\int_new:N \l__siunitx_unit_prefix_int
\int_new:N \l__siunitx_unit_prefix_base_int
\tl_new:N \l__siunitx_unit_prefix_current_tl
\int_new:N \l__siunitx_unit_prefix_gram_int
\bool_new:N \l__siunitx_omit_unit_space_bool
\bool_new:N \l__siunitx_per_auto_bool
\bool_new:N \l__siunitx_per_fraction_bool
\tl_new:N \l__siunitx_per_mode_tl
\bool_new:N \l__siunitx_power_number_bool
\bool_new:N \l__siunitx_per_two_parts_bool
\tl_new:N \l__siunitx_qualifier_mode_tl
\keys_define:nn { siunitx } {
  bracket-unit-denominator .bool_set:N
    = \l__siunitx_unit_denominator_bracket_bool,
  inter-unit-product   .tl_set:N = \l__siunitx_unit_product_tl ,
  inter-unit-separator .tl_set:N = \l__siunitx_unit_product_tl ,
  literal-superscript-as-power
    .bool_set:N = \l__siunitx_literal_power_bool,
  per-mode             .choice:,
  per-mode / fraction .code:n =
    {
      \bool_set_false:N \l__siunitx_per_auto_bool
      \bool_set_true:N \l__siunitx_per_fraction_bool
      \bool_set_true:N \l__siunitx_per_two_parts_bool
      \tl_set:Nn \l__siunitx_per_mode_tl { fraction }
    },
  per-mode / power      .meta:n = { per-mode = reciprocal } ,
  per-mode / power-positive-first .meta:n =
    { per-mode = reciprocal-positive-first } ,
  per-mode / reciprocal .code:n =
    {
      \bool_set_false:N \l__siunitx_per_auto_bool
      \bool_set_false:N \l__siunitx_per_fraction_bool
      \bool_set_false:N \l__siunitx_per_two_parts_bool
      \tl_clear:N \l__siunitx_per_mode_tl
    },
  per-mode / reciprocal-positive-first .code:n =
    {
      \bool_set_false:N \l__siunitx_per_auto_bool
      \bool_set_false:N \l__siunitx_per_fraction_bool
      \bool_set_true:N \l__siunitx_per_two_parts_bool
      \tl_clear:N \l__siunitx_per_mode_tl
    },
  per-mode / repeated-symbol .code:n =
    {
      \bool_set_false:N \l__siunitx_per_auto_bool
      \bool_set_false:N \l__siunitx_per_fraction_bool
      \bool_set_false:N \l__siunitx_per_two_parts_bool
      \tl_set:Nn \l__siunitx_per_mode_tl { repeat }
    },
  per-mode / symbol .code:n =
    {
      \bool_set_false:N \l__siunitx_per_auto_bool
      \bool_set_true:N \l__siunitx_per_fraction_bool
      \bool_set_true:N \l__siunitx_per_two_parts_bool
      \tl_set:Nn \l__siunitx_per_mode_tl { symbol }
    },
  per-mode / symbol-or-fraction .code:n =
    {
      \bool_set_true:N \l__siunitx_per_auto_bool
      \bool_set_true:N \l__siunitx_per_fraction_bool
      \bool_set_true:N \l__siunitx_per_two_parts_bool
      \tl_set:Nn \l__siunitx_per_mode_tl { symbol }
    },
  per-symbol           .tl_set:N  = \l__siunitx_per_symbol_tl,
  power-font           .choice:,
  power-font / number  .code:n    =
    { \bool_set_true:N \l__siunitx_power_number_bool },
  power-font / unit    .code:n    =
    { \bool_set_false:N \l__siunitx_power_number_bool },
  qualifier-mode       .choice:,
  qualifier-mode / brackets .code:n =
    { \tl_set:Nn \l__siunitx_qualifier_mode_tl { brackets } },
  qualifier-mode / phrase   .code:n =
    { \tl_set:Nn \l__siunitx_qualifier_mode_tl { phrase } },
  qualifier-mode / space .code:n =
    { \tl_set:Nn \l__siunitx_qualifier_mode_tl { space } },
  qualifier-mode / subscript .code:n =
    { \tl_set:Nn \l__siunitx_qualifier_mode_tl { subscript } },
  qualifier-mode / text      .code:n =
    { \tl_set:Nn \l__siunitx_qualifier_mode_tl { text } },
  qualifier-phrase     .tl_set:N = \l__siunitx_qualifier_phrase_tl
}
\keys_set:nn { siunitx } {
  bracket-unit-denominator     = true,
  inter-unit-product           = \,,
  literal-superscript-as-power = true,
  per-mode                     = reciprocal,
  per-symbol                   = /,
  power-font                   = number,
  qualifier-mode               = subscript,
  qualifier-phrase             = { ~ of ~ }
}
\cs_new_protected:Npn \__siunitx_unit_format: {
  \prop_put:Nnx \l__siunitx_unit_prop { total-units }
    { \int_use:N \l__siunitx_unit_int }
  \__siunitx_unit_format_init:
  \int_while_do:nNnn { \l__siunitx_unit_int } > { 0 }
    {
      \__siunitx_unit_format_prefix:
      \__siunitx_unit_format_symbol:
      \__siunitx_unit_format_qualifier:
      \__siunitx_unit_format_power:
      \__siunitx_unit_format_add:
      \int_decr:N \l__siunitx_unit_int
    }
  \bool_if:NT \l__siunitx_per_two_parts_bool
    {
      \bool_if:NTF \l__siunitx_per_fraction_bool
        { \__siunitx_unit_format_fraction: }
        { \__siunitx_unit_format_sorted: }
    }
}
\cs_new_protected:Npn \__siunitx_unit_format_add: {
  \bool_if:NTF \l__siunitx_per_two_parts_bool
    {
      \tl_set:Nx \l__siunitx_tmpb_tl
        { per- \int_use:N \l__siunitx_unit_int }
      \prop_if_in:NVTF \l__siunitx_unit_prop \l__siunitx_tmpb_tl
        {
          \__siunitx_unit_format_add_aux:n { _denominator }
          \int_incr:N \l__siunitx_unit_denominator_int
        }
        {
          \__siunitx_unit_format_add_aux:n { _numerator }
          \int_incr:N \l__siunitx_unit_numerator_int
        }
    }
    { \__siunitx_unit_format_add_aux:n { } }
  \tl_clear:N \l__siunitx_unit_current_tl
}
\cs_new_protected:Npn \__siunitx_unit_format_add_aux:n #1 {
  \tl_if_empty:cF { l__siunitx_unit #1 _tl }
    {
      \str_if_eq:VnTF \l__siunitx_per_mode_tl { repeat }
        {
          \tl_set:Nx \l__siunitx_tmpa_tl
            { per- \int_eval:n { \l__siunitx_unit_int + 1 } }
          \prop_if_in:NVF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
            {
              \tl_put_right:NV \l__siunitx_unit_current_tl
                \l__siunitx_unit_product_tl
            }
        }
        {
          \tl_put_right:NV \l__siunitx_unit_current_tl
            \l__siunitx_unit_product_tl
        }
    }
  \tl_set:Nx \l__siunitx_tmpa_tl
    { special- \int_use:N \l__siunitx_unit_int }
  \prop_get:NVNTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
    \l__siunitx_tmpa_tl
  {
    \tl_put_left:cx { l__siunitx_unit #1 _tl }
      {
        \exp_not:V \l__siunitx_tmpa_tl
        { \exp_not:V \l__siunitx_unit_current_tl }
      }
  }
  {
    \tl_put_left:cV { l__siunitx_unit #1 _tl }
      \l__siunitx_unit_current_tl
  }
}
\cs_new_protected:Npn \__siunitx_unit_format_fraction: {
  \int_compare:nNnT { \l__siunitx_unit_numerator_int } = { 0 }
    {
      \str_if_eq:VnT \l__siunitx_per_mode_tl { symbol }
        { \bool_set_true:N \l__siunitx_omit_unit_space_bool }
    }
  \int_compare:nNnTF { \l__siunitx_unit_denominator_int } > { 0 }
    {
      \bool_if:NTF \l__siunitx_per_auto_bool
        { \__siunitx_unit_format_fraction_auto: }
        {
          \use:c
            { __siunitx_unit_format_fraction_ \l__siunitx_per_mode_tl : }
        }
    }
    { \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_numerator_tl }
}
\cs_new_protected:Npn \__siunitx_unit_format_fraction_fraction: {
  \tl_if_empty:NT \l__siunitx_unit_numerator_tl
    { \tl_set:Nn \l__siunitx_unit_numerator_tl { 1 } }
  \tl_set:Nx \l__siunitx_unit_numerator_tl
    { { \exp_not:V \l__siunitx_unit_numerator_tl } }
  \tl_put_left:Nn \l__siunitx_unit_numerator_tl
    { \__siunitx_print:nn { unit } }
  \tl_set:Nx \l__siunitx_unit_numerator_tl
    { { \exp_not:V \l__siunitx_unit_numerator_tl } }
  \tl_set:Nx \l__siunitx_unit_denominator_tl
    { { \exp_not:V \l__siunitx_unit_denominator_tl } }
  \tl_put_left:Nn \l__siunitx_unit_denominator_tl
    { \__siunitx_print:nn { unit } }
  \tl_set:Nx \l__siunitx_unit_denominator_tl
    { { \exp_not:V \l__siunitx_unit_denominator_tl } }
  \tl_set:Nn \l__siunitx_unit_tl { \__siunitx_fraction:nn }
  \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_unit_numerator_tl
  \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_unit_denominator_tl
  \tl_set:Nx \l__siunitx_unit_tl
    { \exp_not:N \ensuremath { \exp_not:V \l__siunitx_unit_tl } }
}
\cs_new_protected:Npn \__siunitx_unit_format_fraction_auto: {
    \mode_if_math:TF
      {
        \group_begin:
          \__siunitx_unit_format_fraction_fraction:
        \exp_args:NNNV \group_end:
        \tl_set:Nn \l__siunitx_tmpa_tl \l__siunitx_unit_tl
        \group_begin:
          \__siunitx_unit_format_fraction_symbol:
        \exp_args:NNNV \group_end:
        \tl_set:Nn \l__siunitx_tmpb_tl \l__siunitx_unit_tl
        \tl_set:Nx \l__siunitx_tmpb_tl
          {
            \__siunitx_print:nn { unit }
              { \exp_not:V \l__siunitx_tmpb_tl }
          }
        \tl_set:Nx \l__siunitx_unit_tl
          {
            \exp_not:N \ensuremath {
              \tex_mathchoice:D
                { \exp_not:V \l__siunitx_tmpa_tl }
                { \exp_not:V \l__siunitx_tmpb_tl }
                { \exp_not:V \l__siunitx_tmpb_tl }
                { \exp_not:V \l__siunitx_tmpb_tl }
              }
          }
      }
      { \__siunitx_unit_format_fraction_symbol: }
}
\cs_new_protected:Npn \__siunitx_unit_format_fraction_symbol: {
  \__siunitx_unit_format_fraction_symbol_aux:
  \int_compare:nNnT { \l__siunitx_unit_denominator_int } > { 1 }
    {
      \bool_if:NT \l__siunitx_unit_denominator_bracket_bool
        {
          \tl_put_left:NV \l__siunitx_unit_denominator_tl \l__siunitx_bracket_open_tl
          \tl_put_right:NV \l__siunitx_unit_denominator_tl \l__siunitx_bracket_close_tl
        }
    }
  \tl_set_eq:NN \l__siunitx_unit_tl \l__siunitx_unit_numerator_tl
  \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_per_symbol_tl
  \tl_put_right:NV \l__siunitx_unit_tl \l__siunitx_unit_denominator_tl
}
\cs_new_protected:Npn
  \__siunitx_unit_format_fraction_symbol_aux: { }
\cs_new_protected:Npn
  \__siunitx_unit_format_fraction_symbol_aux_alt: {
  \tl_if_empty:NT \l__siunitx_unit_numerator_tl
    { \tl_set:Nn \l__siunitx_unit_numerator_tl { 1 } }
}
\cs_new_protected:Npn \__siunitx_unit_format_init: {
  \bool_set_false:N \l__siunitx_omit_unit_space_bool
  \tl_clear:N \l__siunitx_unit_tl
  \tl_clear:N \l__siunitx_unit_current_tl
  \tl_clear:N \l__siunitx_unit_denominator_tl
  \int_zero:N \l__siunitx_unit_prefix_gram_int
  \tl_clear:N \l__siunitx_unit_numerator_tl
  \int_zero:N \l__siunitx_unit_prefix_base_int
  \int_zero:N \l__siunitx_unit_prefix_int
  \int_zero:N \l__siunitx_unit_denominator_int
  \int_zero:N \l__siunitx_unit_numerator_int
  \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
    { \__siunitx_unit_print_literal_aux:N ##1 }
}
\group_begin:
  \char_set_catcode_active:N \~
  \cs_new_protected:Npn \__siunitx_unit_format_literal:n #1
    {
      \int_zero:N \l__siunitx_unit_prefix_int
      \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
        { \__siunitx_unit_print_literal_aux:N ##1 }
      \tl_set:Nn \l__siunitx_unit_tl {#1}
      \tl_replace_all:NnV \l__siunitx_unit_tl { . }
        \l__siunitx_unit_product_tl
      \tl_replace_all:NnV \l__siunitx_unit_tl { ~ }
        \l__siunitx_unit_product_tl
      \bool_if:NT \l__siunitx_literal_power_bool
        {
          \tl_replace_all:Nnn \l__siunitx_unit_tl { ^ }
            { \__siunitx_unit_format_literal_power:n }
          \tl_replace_all:Non \l__siunitx_unit_tl { \token_to_str:N ^ }
            { \__siunitx_unit_format_literal_power:n }
        }
      \__siunitx_unit_format_literal_extras:
    }
\group_end:
\cs_new_protected:Npn \__siunitx_unit_print_literal_aux:N #1
  { \cs_set_eq:Nc #1 { __siunitx_ \token_to_str:N #1 _literal:w } }
\cs_new_protected:Npn \__siunitx_unit_format_literal_power:n #1
  { \PrintSuperscript { \__siunitx_unit_format_power_aux:n {#1} } }
 %\end{macro}
\cs_new_protected:Npn \__siunitx_unit_format_literal_extras:
  {
    \__siunitx_unit_format_literal_extras_aux:nN { 176 }
      \SIUnitSymbolDegree
    \__siunitx_unit_format_literal_extras_aux:nN { 181 }
      \SIUnitSymbolMicro
    \__siunitx_unit_format_literal_extras_aux:nN { 197 }
      \SIUnitSymbolAngstrom
  }
\cs_new_protected:Npn \__siunitx_unit_format_literal_extras_aux:nN #1#2
  {
    \tl_replace_all:Nxn \l__siunitx_unit_tl
      { \char_generate:nn { #1 } { 12 } }
      {#2}
  }
\bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: }
  {
    \AtBeginDocument
      {
        \cs_if_exist:NTF \inputencodingname
          {
            \tl_set:Nn \l__siunitx_tmpa_tl { latin1 , latin5 , latin9 }
            \clist_if_in:NVF \l__siunitx_tmpa_tl \inputencodingname
              {
                \cs_set_eq:NN \__siunitx_unit_format_literal_extras:
                  \scan_stop:
              }
          }
          {
            \cs_set_eq:NN \__siunitx_unit_format_literal_extras:
              \scan_stop:
          }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_power: {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { power- \int_use:N \l__siunitx_unit_int }
  \prop_get:NVNTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
    \l__siunitx_tmpa_tl
    { \__siunitx_unit_format_power_aux: }
    {
      \tl_set:Nx \l__siunitx_tmpa_tl
        { per- \int_use:N \l__siunitx_unit_int }
      \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
        {
          \tl_set:Nn \l__siunitx_tmpa_tl { 1 }
          \__siunitx_unit_format_power_aux:
        }
    }
}
\cs_new_protected:Npn \__siunitx_unit_format_power_aux: {
  \str_if_eq:VnTF \l__siunitx_per_mode_tl { repeat }
    { \__siunitx_unit_format_power_repeat: }
    { \__siunitx_unit_format_power_per: }
  \str_if_eq:VnF \l__siunitx_tmpa_tl { 1 }
    {
      \__siunitx_unit_format_power_brackets:
      \tl_put_right:Nx \l__siunitx_unit_current_tl
        {
          \exp_not:N \PrintSuperscript
            {
              \__siunitx_unit_format_power_aux:n
                {
                  \exp_after:wN \__siunitx_unit_format_power:w
                    \l__siunitx_tmpa_tl . . \q_stop
                }
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_unit_format_power_aux:n #1 {
  \bool_if:NTF \l__siunitx_power_number_bool
    { \__siunitx_unit_format_power_aux:nn { number } {#1} }
    { \__siunitx_unit_format_power_aux:nn { unit } {#1} }
}
\cs_new_protected:Npn \__siunitx_unit_format_power_aux:nn #1#2 {
  \bool_if:cTF { l__siunitx_ #1 _math_mode_bool }
    { \__siunitx_print:nn {#1} {#2} }
    {
      \tl_set:Nn \l__siunitx_tmpa_tl {#2}
      \tl_replace_all:Nnn \l__siunitx_tmpa_tl { - }
        { \text { \textminus } }
      \__siunitx_print:nV {#1} \l__siunitx_tmpa_tl
   }
}
\cs_new:Npn \__siunitx_unit_format_power:w  #1 . #2 . #3 \q_stop
  {
    \exp_not:n {#1}
    \tl_if_blank:nF {#2}
      {
        \exp_not:V \l__siunitx_output_decimal_tl
        \exp_not:n {#2}
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_power_brackets: {
  \tl_set:Nx \l__siunitx_tmpb_tl
    { bracket- \int_use:N \l__siunitx_unit_int }
  \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpb_tl
    {
      \tl_put_left:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_open_tl
      \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_close_tl
    }
}
\cs_new_protected:Npn \__siunitx_unit_format_power_per: {
  \tl_set:Nx \l__siunitx_tmpb_tl
    { per- \int_use:N \l__siunitx_unit_int }
  \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpb_tl
    {
      \bool_if:NF \l__siunitx_per_fraction_bool
        {
          \tl_if_in:NnTF \l__siunitx_tmpa_tl { - }
            {
              \cs_set:Npn \__siunitx_tmp:w ##1 - ##2 \q_stop
                { \tl_set:Nn \l__siunitx_tmpa_tl {##2} }
              \exp_after:wN \__siunitx_tmp:w \l__siunitx_tmpa_tl \q_stop
            }
            { \tl_put_left:Nn \l__siunitx_tmpa_tl { - } }
        }
    }
}
\cs_new_protected:Npn \__siunitx_unit_format_power_repeat: {
  \tl_set:Nx \l__siunitx_tmpb_tl
    { per- \int_use:N \l__siunitx_unit_int }
  \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpb_tl
    {
      \tl_put_left:NV \l__siunitx_unit_current_tl \l__siunitx_per_symbol_tl
    }
}
\cs_new_protected:Npn \__siunitx_unit_format_prefix: {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { prefix-symbol- \int_use:N \l__siunitx_unit_int }
  \prop_if_in:NVT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
    {
      \prop_get:NVN \l__siunitx_unit_prop \l__siunitx_tmpa_tl
        \l__siunitx_unit_prefix_current_tl
      \bool_if:NTF \l__siunitx_prefix_symbols_bool
        { \__siunitx_unit_format_prefix_symbol: }
        { \__siunitx_unit_format_prefix_number: }
    }
}
\cs_new_protected:Npn \__siunitx_unit_format_prefix_number: {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { prefix-base- \int_use:N \l__siunitx_unit_int }
 \prop_get:NVN \l__siunitx_unit_prop \l__siunitx_tmpa_tl
   \l__siunitx_tmpa_tl
  \int_compare:nNnT { \l__siunitx_unit_prefix_base_int } = { 0 }
    {
      \int_set:Nn \l__siunitx_unit_prefix_base_int
        { \l__siunitx_tmpa_tl }
    }
  \int_compare:nNnTF
    { \l__siunitx_unit_prefix_base_int } = { \l__siunitx_tmpa_tl }
    { \__siunitx_unit_format_prefix_number_calc: }
    { \msg_error:nn { siunitx } { prefix-base-mismatch } }
}
\cs_new_protected:Npn \__siunitx_unit_format_prefix_number_calc: {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { power- \int_use:N \l__siunitx_unit_int }
  \prop_get:NVNF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
    \l__siunitx_tmpa_tl
    { \tl_set:Nn \l__siunitx_tmpa_tl { 1 } }
  \tl_set:Nx \l__siunitx_tmpb_tl
    { unit- \int_use:N \l__siunitx_unit_int }
  \prop_get:NVN \l__siunitx_unit_prop \l__siunitx_tmpb_tl
    \l__siunitx_tmpb_tl
  \str_if_eq:VnT \l__siunitx_tmpb_tl { \gram }
    {
      \tl_set:Nx \l__siunitx_unit_prefix_current_tl
        { \int_eval:n { \l__siunitx_unit_prefix_current_tl  - 3 } }
      \tl_set:Nx \l__siunitx_tmpb_tl
        { symbol- \int_use:N \l__siunitx_unit_int }
      \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpb_tl { kg }
    }
  \tl_set:Nx \l__siunitx_unit_prefix_current_tl
    {
       \int_eval:n
         { \l__siunitx_unit_prefix_current_tl * \l__siunitx_tmpa_tl }
    }
  \tl_set:Nx \l__siunitx_tmpa_tl
    { per- \int_use:N \l__siunitx_unit_int }
  \prop_if_in:NVTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
    {
      \int_set:Nn \l__siunitx_unit_prefix_int
        {
              \l__siunitx_unit_prefix_int
            - \l__siunitx_unit_prefix_current_tl
        }
    }
    {
      \int_set:Nn \l__siunitx_unit_prefix_int
        {
              \l__siunitx_unit_prefix_int
            + \l__siunitx_unit_prefix_current_tl
        }
    }
}
\cs_new_protected:Npn \__siunitx_unit_format_prefix_symbol: {
  \tl_set_eq:NN \l__siunitx_unit_current_tl
    \l__siunitx_unit_prefix_current_tl
}
\cs_new_protected:Npn \__siunitx_unit_format_qualifier: {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { qualifier- \int_use:N \l__siunitx_unit_int }
  \prop_get:NVNT \l__siunitx_unit_prop \l__siunitx_tmpa_tl
    \l__siunitx_tmpa_tl
    {
      \use:c
        {
          __siunitx_unit_format_qualifier_
          \l__siunitx_qualifier_mode_tl :
        }
    }
}
\cs_new_protected:Npn \__siunitx_unit_format_qualifier_brackets: {
  \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_open_tl
  \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
  \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_bracket_close_tl
}
\cs_new_protected:Npn \__siunitx_unit_format_qualifier_phrase:
  {
    \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_qualifier_phrase_tl
    \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
    \tl_set:Nx \l__siunitx_tmpa_tl
      { bracket- \int_use:N \l__siunitx_unit_int }
    \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl { true }
  }
\char_set_catcode_active:N \~
\cs_new_protected:Npn \__siunitx_unit_format_qualifier_space: {
  \tl_put_right:Nn \l__siunitx_unit_current_tl { \text { ~ } }
  \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
  \tl_set:Nx \l__siunitx_tmpa_tl
    { bracket- \int_use:N \l__siunitx_unit_int }
  \prop_put:NVn \l__siunitx_unit_prop \l__siunitx_tmpa_tl { true }
}
\char_set_catcode_space:N \~
\cs_new_protected:Npn \__siunitx_unit_format_qualifier_subscript: {
  \tl_put_right:Nx \l__siunitx_unit_current_tl
    { \exp_not:N \PrintSubscript { \exp_not:V \l__siunitx_tmpa_tl } }
}
\cs_new_protected:Npn \__siunitx_unit_format_qualifier_text: {
  \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
}
\cs_new_protected:Npn \__siunitx_unit_format_sorted:
  {
    \tl_set:Nx \l__siunitx_unit_tl
      {
        \exp_not:V \l__siunitx_unit_numerator_tl
        \bool_lazy_or:nnF
          { \tl_if_empty_p:N \l__siunitx_unit_numerator_tl }
          { \tl_if_empty_p:N \l__siunitx_unit_denominator_tl }
          {
            \exp_not:N \l__siunitx_unit_product_tl
          }
        \exp_not:V \l__siunitx_unit_denominator_tl
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_symbol: {
  \tl_set:Nx \l__siunitx_tmpa_tl
    { symbol- \int_use:N \l__siunitx_unit_int }
  \prop_get:NVNTF \l__siunitx_unit_prop \l__siunitx_tmpa_tl
    \l__siunitx_tmpa_tl
    {
      \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_tmpa_tl
    }
    { \__siunitx_unit_format_symbol_aux: }
}
\cs_new_protected:Npn \__siunitx_unit_format_symbol_aux: {
  \msg_error:nn { siunitx } { prefix-only }
}
\cs_new_protected:Npn \__siunitx_unit_format_symbol_aux_alt: {
  \int_compare:nNnTF { \l__siunitx_unit_int } = { 1 }
    {
      \prop_remove:Nn \l__siunitx_unit_prop { prefix-1 }
      \prop_remove:Nn \l__siunitx_unit_prop { prefix-symbol-1 }
      \prop_remove:Nn \l__siunitx_unit_prop { prefix-base-1 }
      \prop_remove:Nn \l__siunitx_unit_prop { total-units }
      \prop_if_empty:NF \l__siunitx_unit_prop
        { \msg_error:nn { siunitx } { prefix-only } }
    }
    { \msg_error:nn { siunitx } { prefix-only } }
}
\bool_new:N \l__siunitx_multi_brackets_bool
\bool_new:N \l__siunitx_multi_repeat_bool
\bool_new:N \l__siunitx_product_brackets_bool
\bool_new:N \l__siunitx_product_power_bool
\bool_new:N \l__siunitx_product_repeat_bool
\bool_new:N \l__siunitx_number_unit_repeat_bool
\keys_define:nn { siunitx } {
  allow-number-unit-breaks .bool_set:N =
    \l__siunitx_number_unit_breaks_bool,
  multi-part-units          .choice:,
  multi-part-units
    / brackets       .code:n =
      {
        \bool_set_true:N  \l__siunitx_multi_brackets_bool
        \bool_set_false:N \l__siunitx_multi_repeat_bool
      },
  multi-part-units
    / repeat         .code:n =
      {
        \bool_set_false:N \l__siunitx_multi_brackets_bool
        \bool_set_true:N  \l__siunitx_multi_repeat_bool
      },
  multi-part-units
    / single         .code:n =
      {
        \bool_set_false:N \l__siunitx_multi_brackets_bool
        \bool_set_false:N \l__siunitx_multi_repeat_bool
      },
  number-unit-product      .tl_set:N   =
    \l__siunitx_number_unit_product_tl,
  number-unit-separator    .tl_set:N   =
    \l__siunitx_number_unit_product_tl,
  product-units            .choice:,
  product-units
    / brackets       .code:n =
      {
        \bool_set_true:N  \l__siunitx_product_brackets_bool
        \bool_set_false:N \l__siunitx_product_power_bool
        \bool_set_false:N \l__siunitx_product_repeat_bool
      },
  product-units
    / brackets-power .code:n =
      {
        \bool_set_true:N  \l__siunitx_product_brackets_bool
        \bool_set_true:N  \l__siunitx_product_power_bool
        \bool_set_false:N \l__siunitx_product_repeat_bool
      },
  product-units
    / power          .code:n =
      {
        \bool_set_false:N \l__siunitx_product_brackets_bool
        \bool_set_true:N  \l__siunitx_product_power_bool
        \bool_set_false:N \l__siunitx_product_repeat_bool
      },
  product-units
    / repeat         .code:n =
      {
        \bool_set_false:N \l__siunitx_product_brackets_bool
        \bool_set_false:N \l__siunitx_product_power_bool
        \bool_set_true:N  \l__siunitx_product_repeat_bool
      },
  product-units
    / single         .code:n =
      {
        \bool_set_false:N \l__siunitx_product_brackets_bool
        \bool_set_false:N \l__siunitx_product_power_bool
        \bool_set_false:N \l__siunitx_product_repeat_bool
      },
}
\keys_set:nn { siunitx } {
  multi-part-units    = brackets,
  number-unit-product = \,      ,
  product-units       = repeat
}
\cs_new_protected:Npn \__siunitx_unit_output:nn #1#2 {
  \cs_set_eq:NN \__siunitx_unit_format_symbol_aux:
    \__siunitx_unit_format_symbol_aux_alt:
  \cs_set_eq:NN \__siunitx_unit_format_fraction_symbol_aux_ii:
    \__siunitx_unit_format_fraction_symbol_aux_alt:
  \__siunitx_unit_in:nn {#1} {#2}
  \int_compare:nNnTF { \l__siunitx_unit_prefix_int } = { 0 }
    {
      \str_if_eq:VnT \l__siunitx_per_mode_tl { symbol }
        {
          \int_compare:nNnT { \l__siunitx_unit_numerator_int } = { 0 }
            {
              \bool_if:NT \l__siunitx_unit_parse_bool
                { \__siunitx_print:nn { unit } { 1 } }
            }
        }
    }
    {
      \tl_set:Nx \l__siunitx_tmpa_tl
        {
          \int_use:N \l__siunitx_unit_prefix_base_int
          \exp_not:N \PrintSuperscript
            { \int_use:N \l__siunitx_unit_prefix_int }
        }
      \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
      \__siunitx_unit_output_number_sep:
    }
  \__siunitx_print:nV { unit } \l__siunitx_unit_tl
}
\cs_generate_variant:Nn \__siunitx_unit_output:nn { V }
\cs_new_protected:Npn \__siunitx_unit_output_number_sep: {
  \bool_if:NTF \l__siunitx_number_unit_breaks_bool
    { \penalty \binoppenalty } { \nobreak }
  \bool_if:NTF \l__siunitx_per_auto_bool
    {
      \mode_if_math:TF
        {
          \tex_mathchoice:D
            { \l__siunitx_number_unit_product_tl }
            { \__siunitx_unit_output_number_sep_aux: }
            { \__siunitx_unit_output_number_sep_aux: }
            { \__siunitx_unit_output_number_sep_aux: }
        }
        { \__siunitx_unit_output_number_sep_aux: }
    }
    { \__siunitx_unit_output_number_sep_aux: }
}
\cs_new_protected:Npn \__siunitx_unit_output_number_sep_aux: {
  \bool_if:NF \l__siunitx_omit_unit_space_bool
    { \l__siunitx_number_unit_product_tl }
}
\cs_new_protected:Npn \__siunitx_unit_output_pre_print: {
  \tl_if_empty:NF \l__siunitx_pre_unit_tl
    {
      \nobreak
      \__siunitx_print:nV { unit } \l__siunitx_pre_unit_tl
    }
}
\cs_new_protected:Npn \__siunitx_unit_output_print: {
  \int_compare:nNnF { \l__siunitx_unit_prefix_int } = { 0 }
    {
      \tl_set:Nx \l__siunitx_tmpa_tl
        {
          \bool_if:NTF \l__siunitx_tight_bool
            {
              \exp_not:N \ensuremath
                { { \exp_not:V \l__siunitx_exponent_product_tl } }
            }
            {
              \exp_not:N \ensuremath
                { { } \exp_not:V \l__siunitx_exponent_product_tl { } }
            }
          \int_use:N \l__siunitx_unit_prefix_base_int
          ^ { \int_use:N \l__siunitx_unit_prefix_int }
        }
      \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
    }
  \tl_if_empty:NF \l__siunitx_unit_tl
    {
      \__siunitx_unit_output_number_sep:
      \__siunitx_print:nV { unit } \l__siunitx_unit_tl
    }
}
\keys_define:nn { siunitx } {
  preunit .tl_set:N = \l__siunitx_preunit_tl ,
}
\tl_new:N \l__siunitx_pre_unit_tl
\int_new:N \l__siunitx_number_product_int
\cs_new_protected:Npn \__siunitx_combined:nnnn #1#2#3#4 {
  \IfNoValueTF {#3}
    { \tl_clear:N \l__siunitx_pre_unit_tl }
    {
      \group_begin:
        \__siunitx_unit_in:nn {#3} {#1}
        \cs_set_eq:NN \l__siunitx_pre_unit_tl \l__siunitx_unit_tl
      \exp_args:NNNo \group_end:
      \tl_set:Nn \l__siunitx_pre_unit_tl { \l__siunitx_unit_tl }
    }
  \cs_set_eq:NN \l__siunitx_brackets_bool
    \l__siunitx_multi_brackets_bool
  \__siunitx_combined_unit:nnn {#2} {#4} {#1}
  \__siunitx_combined_output:n {#2}
}
\cs_new_protected:Npn \__siunitx_combined_output:n #1 {
  \bool_if:NTF \l__siunitx_number_parse_bool
    {
      \tl_clear:N \l__siunitx_number_out_tl
      \bool_set_false:N \l__siunitx_number_compound_bool
      \__siunitx_number_output_parse:n {#1}
    }
    {
      \__siunitx_unit_output_pre_print:
      \__siunitx_print:nn { number } { \ensuremath {#1} }
      \__siunitx_unit_output_print:
    }
}
\cs_new_protected:Npn \__siunitx_combined_unit:nnn #1#2#3 {
  \bool_if:NTF \l__siunitx_product_power_bool
    {
      \__siunitx_combined_product_count:n {#1}
      \int_compare:nNnTF { \l__siunitx_number_product_int } > { 0 }
        {
          \int_incr:N \l__siunitx_number_product_int
          \tl_set:Nn \l__siunitx_tmpa_tl {#2}
          \tl_set:Nx \l__siunitx_tmpb_tl
            { \tothe { \exp_not:V \l__siunitx_number_product_int } }
          \tl_put_right:NV \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl
          \__siunitx_unit_in:Vn \l__siunitx_tmpa_tl {#3}
        }
        { \__siunitx_unit_in:nn {#2} {#3} }
    }
    { \__siunitx_unit_in:nn {#2} {#3} }
}
\cs_new_protected:Npn \__siunitx_combined_product_count:n #1 {
  \int_zero:N \l__siunitx_number_product_int
  \tl_set:Nn \l__siunitx_tmpa_tl {#1}
  \tl_map_function:NN \l__siunitx_input_product_tl
    \__siunitx_combined_product_count_aux:N
}
\cs_new_protected:Npn \__siunitx_combined_product_count_aux:N #1 {
  \tl_if_in:NnT \l__siunitx_tmpa_tl {#1}
    {
      \int_incr:N \l__siunitx_number_product_int
      \tl_remove_once:Nn \l__siunitx_tmpa_tl {#1}
      \__siunitx_combined_product_count_aux:N #1
    }
}
\bool_new:N \l__siunitx_list_brackets_bool
\bool_new:N \l__siunitx_list_repeat_bool
\tl_new:N \l__siunitx_list_current_tl
\tl_new:N \l__siunitx_list_tl
\keys_define:nn { siunitx }
  {
    list-final-separator .tl_set:N = \l__siunitx_list_separator_final_tl ,
    list-pair-separator  .tl_set:N = \l__siunitx_list_separator_pair_tl  ,
    list-separator       .tl_set:N = \l__siunitx_list_separator_tl       ,
    list-units           .choice:,
    list-units
      / brackets .code:n =
        {
          \bool_set_true:N  \l__siunitx_list_brackets_bool
          \bool_set_false:N \l__siunitx_list_repeat_bool
        },
    list-units
      / repeat .code:n   =
        {
          \bool_set_false:N \l__siunitx_list_brackets_bool
          \bool_set_true:N  \l__siunitx_list_repeat_bool
        },
    list-units
      / single .code:n   =
        {
          \bool_set_false:N \l__siunitx_list_brackets_bool
          \bool_set_false:N \l__siunitx_list_repeat_bool
        }
  }
\keys_set:nn { siunitx }
  {
    list-final-separator = { ~ and ~ } ,
    list-pair-separator  = { ~ and ~ } ,
    list-separator       = { , ~ }     ,
    list-units           = repeat
}
\cs_new_protected:Npn \__siunitx_list_numbers:n #1
  {
    \tl_clear:N \l__siunitx_unit_tl
    \tl_clear:N \l__siunitx_preunit_tl
    \__siunitx_list_numbers_aux_i:n {#1}
  }
\cs_new_protected:Npn \__siunitx_list_numbers_aux_i:n #1
  {
    \bool_set_true:N \l__siunitx_list_first_bool
    \tl_clear:N \l__siunitx_list_current_tl
    \int_compare:nNnTF { \tl_count:n {#1} } > 2
      {
        \tl_map_function:nN {#1} \__siunitx_list_numbers_aux_ii:n
        \l__siunitx_list_tl
        \l__siunitx_list_separator_final_tl
        \l__siunitx_list_current_tl
      }
      {
        \int_compare:nNnTF { \tl_count:n {#1} } = 2
          { \__siunitx_list_numbers_aux:nn #1 }
          { \__siunitx_combined_output:n #1 }
      }
  }
\cs_new_protected:Npn \__siunitx_list_numbers_aux_ii:n #1
  {
    \tl_if_empty:NTF \l__siunitx_list_tl
      { \tl_set_eq:NN \l__siunitx_list_tl \l__siunitx_list_current_tl }
      {
        \tl_put_right:NV \l__siunitx_list_tl \l__siunitx_list_separator_tl
        \tl_put_right:NV \l__siunitx_list_tl \l__siunitx_list_current_tl
      }
    \tl_set:Nn \l__siunitx_list_current_tl { \__siunitx_combined_output:n {#1} }
  }
\cs_new_protected:Npn \__siunitx_list_numbers_aux:nn #1#2
  {
    \__siunitx_combined_output:n {#1}
    \l__siunitx_list_separator_pair_tl
    \__siunitx_combined_output:n {#2}
  }
\cs_new_protected:Npn \__siunitx_list_units:nnn #1#2#3
  {
    \__siunitx_unit_parse_options:nn {#2} {#3}
    \bool_if:NTF \l__siunitx_list_repeat_bool
      {
        \__siunitx_unit_in:nn {#2} {#3}
        \__siunitx_list_numbers_aux_i:n {#1}
      }
      {
        \bool_if:NT \l__siunitx_process_fixed_bool
          { \bool_set_true:N \l__siunitx_process_drop_exponent_bool }
        \bool_if:NT \l__siunitx_list_brackets_bool
          { \__siunitx_print:nV { number } \l__siunitx_bracket_open_tl }
        \__siunitx_list_numbers:n {#1}
        \bool_if:NT \l__siunitx_list_brackets_bool
          { \__siunitx_print:nV { number } \l__siunitx_bracket_close_tl }
        \__siunitx_range_exponent:
        \__siunitx_unit_output_number_sep:
        \__siunitx_unit_output:nn {#2} {#3}
      }
  }
\bool_new:N \l__siunitx_range_brackets_bool
\bool_new:N \l__siunitx_range_repeat_bool
\keys_define:nn { siunitx } {
  range-phrase .tl_set:N = \l__siunitx_range_phrase_tl,
  range-units  .choice:,
  range-units
    / brackets .code:n   =
      {
        \bool_set_true:N  \l__siunitx_range_brackets_bool
        \bool_set_false:N \l__siunitx_range_repeat_bool
      },
  range-units
    / repeat .code:n   =
      {
        \bool_set_false:N \l__siunitx_range_brackets_bool
        \bool_set_true:N  \l__siunitx_range_repeat_bool
      },
  range-units
    / single .code:n   =
      {
        \bool_set_false:N \l__siunitx_range_brackets_bool
        \bool_set_false:N \l__siunitx_range_repeat_bool
      },
}
\keys_set:nn { siunitx } {
  range-phrase = { ~ to ~ },
  range-units  = repeat,
}
\cs_new_protected:Npn \__siunitx_range_numbers:nn #1#2
  {
    \__siunitx_range_numbers_aux:n {#1}
    \l__siunitx_range_phrase_tl
    \__siunitx_range_numbers_aux:n {#2}
  }
\cs_new_protected:Npn \__siunitx_range_numbers_aux:n #1
  {
    \bool_if:NTF \l__siunitx_number_parse_bool
      {
        \tl_clear:N \l__siunitx_number_out_tl
        \tl_clear:N \l__siunitx_number_out_saved_tl
        \bool_set_false:N \l__siunitx_number_compound_bool
        \__siunitx_number_output_parse:n {#1}
        \bool_if:NT \l__siunitx_number_compound_bool
          { \msg_error:nnx { siunitx } { multi-part-range } {#1} }
      }
      {
        \__siunitx_unit_output_pre_print:
        \__siunitx_print:nn { number } {#1}
        \__siunitx_unit_output_print:
      }
  }
\cs_new_protected:Npn \__siunitx_range_unit:nnnn #1#2#3#4 {
  \__siunitx_unit_parse_options:nn {#1} {#2}
  \bool_if:NTF \l__siunitx_range_repeat_bool
    {
      \__siunitx_unit_in:nn {#1} {#2}
      \__siunitx_range_numbers_aux:n {#3}
      \l__siunitx_range_phrase_tl
      \__siunitx_range_numbers_aux:n {#4}
    }
    {
      \bool_if:NT \l__siunitx_process_fixed_bool
        { \bool_set_true:N \l__siunitx_process_drop_exponent_bool }
      \bool_if:NT \l__siunitx_range_brackets_bool
        { \__siunitx_print:nV { number } \l__siunitx_bracket_open_tl }
      \__siunitx_range_numbers:nn {#3} {#4}
      \bool_if:NT \l__siunitx_range_brackets_bool
        { \__siunitx_print:nV { number } \l__siunitx_bracket_close_tl }
      \__siunitx_range_exponent:
      \__siunitx_unit_output_number_sep:
      \__siunitx_unit_output:nn {#1} {#2}
    }
}
\cs_new_protected:Npn \__siunitx_range_exponent:
  {
    \bool_if:NT \l__siunitx_process_fixed_bool
      {
        \tl_set_eq:NN \l__siunitx_tmpa_tl \l__siunitx_exponent_product_tl
        \bool_if:NT \l__siunitx_tight_bool
          {
            \tl_set:Nx \l__siunitx_tmpa_tl
              { \exp_not:N \mathord \exp_not:o \l__siunitx_tmpa_tl }
          }
        \tl_set:Nx \l__siunitx_tmpa_tl
          {
            \exp_not:N \ensuremath { { } \exp_not:o \l__siunitx_tmpa_tl  { } }
            10 \exp_not:N \PrintSuperscript
              { \int_use:N \l__siunitx_process_fixed_int }
          }
        \__siunitx_print:nV { number } \l__siunitx_tmpa_tl
      }
  }
\AtBeginDocument {
  \@ifpackageloaded { cellspace }
      {
        \cs_if_exist:NT \NC@find@S
          {
            \newcolumntype { C } [1]
              { > { \bcolumn #1 \@nil } #1 < { \ecolumn } }
            \cs_set:Npn \__siunitx_tmp:w #1 \NC@do S #2 \q_stop
              { \NC@list { #1 #2 } }
            \exp_after:wN \__siunitx_tmp:w \tex_the:D \NC@list \q_stop
            \cs_undefine:N \NC@find@S
            \msg_new:nnn { siunitx } { moved-cellspace-column }
              { Column~type~for~cellspace~package~moved~to~'#1'. }
            \msg_warning:nnn { siunitx } { moved-cellspace-column } { C }
            \ifcellspace@m
              \def \env@matrix
                {
                  \hskip -\arraycolsep
                  \let \@ifnextchar \new@ifnextchar
                  \array
                    {
                      * { \c@MaxMatrixCols }
                        { > { \bcolumn c \@nil $ } c < { $ \ecolumn } } @ { }
                    }
                }
            \fi
         }
      }
      { }
}
\cs_new_protected:Npn \__siunitx_table_rewrite_create:N #1 {
  \newcolumntype {#1} { }
  \cs_set_protected:Npn
    \__siunitx_table_rewrite_create_aux:w \NC@do ##1##2 \NC@do #1
    {  \NC@list { \NC@do ##1 \NC@do #1 ##2 } }
  \exp_after:wN \__siunitx_table_rewrite_create_aux:w \tex_the:D \NC@list
  \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [1] [ ]
    {
      \@temptokena \exp_after:wN
        {
          \tex_the:D \@temptokena
          > { \__siunitx_table_collect_begin:Nn #1 {##1} }
          c
          < { \__siunitx_table_print: }
        }
      \NC@find
    }
}
\AtBeginDocument
  {
    \@ifpackageloaded { mdwtab }
      {
        \cs_set_protected:Npn \__siunitx_table_rewrite_create:N #1
          {
            \newcolumntype {#1} [1] []
              {
                > { \__siunitx_table_collect_begin:Nn #1 {##1} }
                c
                < { \__siunitx_table_print: }
              }
           }
      }
      { }
  }
\cs_new_protected:Npn \__siunitx_table_rewrite_create_aux:w { }
\AtBeginDocument { \__siunitx_table_rewrite_create:N s }
\AtBeginDocument { \__siunitx_table_rewrite_create:N S }
\tl_new:N \l__siunitx_table_collect_tl
\tl_new:N \l__siunitx_table_collect_pre_tl
\tl_new:N \l__siunitx_table_collect_post_tl
\tl_new:N \l__siunitx_number_valid_tl
\bool_new:N \l__siunitx_table_math_bool
\bool_new:N \l__siunitx_table_collect_pre_bool
\bool_new:N \l__siunitx_table_collect_post_bool
\cs_new_protected:Npn \__siunitx_table_collect_begin:Nn #1#2
  {
    \keys_set:nn { siunitx } {#2}
    \__siunitx_table_collect_begin:Nw #1
  }
\cs_new_protected:Npn \__siunitx_table_collect_begin:Nw #1#2 \ignorespaces
  { \use:c { __siunitx_table_collect_begin_ #1 : } #2 }
\cs_new_protected:Npn \__siunitx_table_collect_begin_s: {
  \cs_set_eq:NN \__siunitx_table_collect_token:N
    \__siunitx_table_collect_token_s:N
  \cs_set_eq:NN \__siunitx_table_print: \__siunitx_table_print_s:
  \__siunitx_table_collect_init_s:
  \__siunitx_table_collect_get:
}
\cs_new_protected:Npn \__siunitx_table_collect_begin_S: {
  \cs_set_eq:NN \__siunitx_table_collect_token:N
    \__siunitx_table_collect_token_S:N
  \cs_set_eq:NN \__siunitx_table_print: \__siunitx_table_print_S:
  \__siunitx_table_collect_init_S:
  \__siunitx_detect_font:
  \bool_if:NTF \l__siunitx_number_parse_bool
    { \__siunitx_table_collect_get: }
    { \__siunitx_table_print_S_direct: }
}
\cs_new_protected:Npn \__siunitx_table_collect_braced:n #1 { }
\cs_new_protected:Npn \__siunitx_table_collect_expand:N #1 {
  \cs_if_eq:NNTF #1 \color
    {
      \bool_if:NTF \l__siunitx_table_collect_pre_bool
        {
          \tl_clear:N \l__siunitx_number_color_tl
          \tl_clear:N \l__siunitx_unit_color_tl
          \tl_put_right:Nn \l__siunitx_table_collect_pre_tl {#1}
        }
        {
          \bool_set_true:N \l__siunitx_table_collect_post_bool
          \tl_put_right:Nn \l__siunitx_table_collect_post_tl {#1}
        }
    }
    {
      \__siunitx_cs_if_tl:NTF #1
        {
          \tl_use:N \l__siunitx_table_collect_pre_tl
          \tl_clear:N \l__siunitx_table_collect_pre_tl
          \cs_set:Npn \__siunitx_table_collect_next:
            { \exp_after:wN \__siunitx_table_collect_get: #1 }
        }
        {
          \bool_if:NTF \l__siunitx_table_collect_pre_bool
            {
              \tl_put_right:Nn \l__siunitx_table_collect_pre_tl {#1}
              \__siunitx_table_collect_expand_math:N #1
            }
            {
              \bool_set_true:N \l__siunitx_table_collect_post_bool
              \tl_put_right:Nn \l__siunitx_table_collect_post_tl {#1}
            }
        }
    }
}
\cs_new_protected:Npn \__siunitx_table_collect_expand_math:N #1 {
  \token_if_math_toggle:NTF #1
    {
      \bool_if:NTF \l__siunitx_table_math_bool
        { \bool_set_false:N \l__siunitx_table_math_bool }
        { \bool_set_true:N \l__siunitx_table_math_bool }
    }
    {
      \cs_if_eq:NNTF #1 \( % \)
        { \bool_set_true:N \l__siunitx_table_math_bool }
        { % \(
          \cs_if_eq:NNT #1 \)
            { \bool_set_false:N \l__siunitx_table_math_bool }
        }
    }
}
\cs_new_protected:Npn \__siunitx_table_collect_get:
  {
    \cs_set_eq:NN \__siunitx_table_collect_next:
      \__siunitx_table_collect_get:
    \peek_catcode_ignore_spaces:NTF \c_group_begin_token
      { \__siunitx_table_collect_braced:n }
      { \__siunitx_table_collect_not_braced:N }
  }
\cs_new_protected:Npn \__siunitx_table_collect_init: {
  \tl_clear:N \l__siunitx_table_collect_tl
  \tl_clear:N \l__siunitx_table_collect_pre_tl
  \tl_clear:N \l__siunitx_table_collect_post_tl
  \bool_set_false:N \l__siunitx_table_collect_post_bool
  \bool_set_false:N \l__siunitx_table_math_bool
}
\cs_new_protected:Npn \__siunitx_table_collect_init_s: {
  \__siunitx_table_collect_init:
  \bool_set_false:N \l__siunitx_table_collect_pre_bool
  \cs_set_protected:Npn \__siunitx_table_collect_braced:n ##1
    {
      \tl_put_right:Nn \l__siunitx_table_collect_tl { {##1} }
      \__siunitx_table_collect_next:
    }
}
\cs_new_protected:Npn \__siunitx_table_collect_init_S: {
  \__siunitx_number_in_init:
  \tl_set:Nx \l__siunitx_number_valid_tl
    {
      \exp_not:V \l__siunitx_input_complex_tl
      \exp_not:V \l__siunitx_input_decimal_tl
      \exp_not:V \l__siunitx_input_digit_tl
      \exp_not:V \l__siunitx_input_exponent_tl
      \exp_not:V \l__siunitx_input_ignore_tl
      \exp_not:V \l__siunitx_input_comparator_tl
      \exp_not:V \l__siunitx_input_uncert_close_tl
      \exp_not:V \l__siunitx_input_uncert_open_tl
      \exp_not:V \l__siunitx_input_sign_tl
      \exp_not:V \l__siunitx_input_symbol_tl
    }
  \bool_set_true:N \l__siunitx_table_collect_pre_bool
  \cs_set_protected:Npn \__siunitx_table_collect_braced:n ##1
    {
      \bool_if:NTF \l__siunitx_table_collect_pre_bool
        { \tl_put_right:Nn \l__siunitx_table_collect_pre_tl { {##1} } }
        {
          \bool_set_true:N \l__siunitx_table_collect_post_bool
          \tl_put_right:Nn \l__siunitx_table_collect_post_tl { {##1} }
        }
      \__siunitx_table_collect_next:
    }
}
\cs_new_protected:Npn \__siunitx_table_collect_next: { }
\cs_new_protected:Npn \__siunitx_table_collect_newline: {
  \__siunitx_table_print:
  \cs_set_eq:NN \__siunitx_table_print: \prg_do_nothing:
  \tabularnewline
}
\cs_new_protected:Npn \__siunitx_table_collect_end: {
  \__siunitx_table_print:
  \cs_set_eq:NN \__siunitx_table_print: \prg_do_nothing:
  \end
}
\cs_new_protected:Npn \__siunitx_table_collect_not_braced:N #1
  {
    \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D
      {
        \token_if_eq_meaning:NNF #1 \tex_unskip:D
          { \__siunitx_table_collect_not_braced_aux_i:N #1 }
      }
    \__siunitx_table_collect_next:
  }
\AtBeginDocument
  {
    \@ifpackageloaded { mdwtab }
      {
        \cs_set_protected:Npn \__siunitx_table_collect_not_braced:N #1
          {
            \token_if_eq_meaning:NNF #1 \tex_ignorespaces:D
              {
                \token_if_eq_meaning:NNF #1 \tex_unskip:D
                  {
                    \token_if_eq_meaning:NNF #1 \tab@setcr
                      {
                        \token_if_eq_meaning:NNF #1 \@maybe@unskip
                          { \__siunitx_table_collect_not_braced_aux_i:N #1 }
                      }
                  }
              }
            \__siunitx_table_collect_next:
          }
      }
      { }
  }
\cs_new_protected:Npn \__siunitx_table_collect_not_braced_aux_i:N #1 {
  \cs_set:Npn \__siunitx_table_collect_not_braced_aux_ii:N ##1
    {
      \token_if_eq_meaning:NNT #1 ##1
        { \cs_set_eq:NN \__siunitx_table_collect_next: ##1 }
    }
  \tl_map_function:nN
    { \cs:w \scan_stop: \__siunitx_table_print: }
    \__siunitx_table_collect_not_braced_aux_ii:N
  \token_if_eq_meaning:NNT \__siunitx_table_collect_next:
    \__siunitx_table_collect_get:
    {
      \token_if_eq_meaning:NNTF #1 \tabularnewline
        {
          \cs_set_eq:NN \__siunitx_table_collect_next:
            \__siunitx_table_collect_newline:
        }
        {
          \token_if_eq_meaning:NNTF #1 \end
            {
              \cs_set_eq:NN \__siunitx_table_collect_next:
                \__siunitx_table_collect_end:
            }
            { \__siunitx_table_collect_token:N #1 }
        }
    }
}
\cs_new_protected:Npn \__siunitx_table_collect_not_braced_aux_ii:N #1 { }
\cs_new_protected:Npn \__siunitx_table_collect_token:N #1 { }
\cs_new_protected:Npn \__siunitx_table_collect_token_s:N #1 {
  \tl_put_right:Nn \l__siunitx_table_collect_tl {#1}
}
\cs_new_protected:Npn \__siunitx_table_collect_token_S:N #1 {
  \bool_if:NTF  \l__siunitx_table_collect_post_bool
    { \tl_put_right:Nn \l__siunitx_table_collect_post_tl {#1} }
    {
      \tl_if_in:NnTF \l__siunitx_number_valid_tl {#1}
        {
          \bool_set_false:N \l__siunitx_table_collect_pre_bool
          \tl_put_right:Nn \l__siunitx_table_collect_tl {#1}
        }
        { \__siunitx_table_collect_expand:N #1 }
    }
}
\skip_const:Nn \c__siunitx_one_fill_skip { 0pt plus 1fill }
\AtBeginDocument
  {
    \@ifpackageloaded { colortbl }
      {
        \cs_new_protected:Npn \__siunitx_table_colortbl_correction:
          {
            \skip_horizontal:n { 0pt plus -0.5fill }
            \tex_kern:D \c_zero_skip
          }
      }
      { \cs_new_protected:Npn \__siunitx_table_colortbl_correction: { } }
  }
\cs_new_protected:Npn \__siunitx_table_align_left:n #1
  {
    \__siunitx_table_colortbl_correction:
    \skip_horizontal:n {#1}
    \tex_kern:D \c_zero_skip
  }
\cs_new_protected:Npn \__siunitx_table_align_right:n #1
  {
    \skip_horizontal:n { \c__siunitx_one_fill_skip - #1 }
    \tex_kern:D \c_zero_skip
    \__siunitx_table_colortbl_correction:
  }
\cs_new_eq:NN \__siunitx_table_column_begin:n \__siunitx_table_align_left:n
\cs_new_eq:NN \__siunitx_table_column_end:n   \__siunitx_table_align_right:n
\keys_define:nn { siunitx }
  {
    table-column-width .code:n =
      {
        \dim_compare:nNnTF {#1} = { \c_zero_dim }
          {
            \cs_set_eq:NN \__siunitx_table_column_begin:n
              \__siunitx_table_align_left:n
            \cs_set_eq:NN \__siunitx_table_column_end:n
              \__siunitx_table_align_right:n
          }
          {
            \cs_set_protected:Npn \__siunitx_table_column_begin:n ##1
              {
                \__siunitx_table_colortbl_correction:
                \tex_hbox:D to \dim_eval:n {#1}
                \c_group_begin_token
                  \skip_horizontal:n {##1}
                  \tex_kern:D \c_zero_skip
              }
            \cs_set_protected:Npn \__siunitx_table_column_end:n ##1
              {
                  \skip_horizontal:n { \c__siunitx_one_fill_skip - ##1 }
                  \tex_kern:D \c_zero_skip
                \c_group_end_token
                \__siunitx_table_colortbl_correction:
              }
          }
      }
  }
\skip_new:N \l__siunitx_table_unit_align_skip
\keys_define:nn { siunitx }
  {
    table-unit-alignment .choice:,
    table-unit-alignment /
      center             .code:n =
        {
          \skip_set:Nn \l__siunitx_table_unit_align_skip
            { 0pt plus 0.5fill }
        },
    table-unit-alignment /
      left               .code:n =
        { \skip_set:Nn \l__siunitx_table_unit_align_skip { \c_zero_skip } },
      table-unit-alignment /
        right            .code:n =
          {
            \skip_set:Nn \l__siunitx_table_unit_align_skip
              { 0pt plus 1fill }
          }
  }
\keys_set:nn { siunitx } { table-unit-alignment = center }
\cs_new_protected:Npn \__siunitx_table_print_s:
  {
    \__siunitx_table_column_begin:n { \l__siunitx_table_unit_align_skip }
      \tl_if_empty:NF \l__siunitx_table_collect_tl
        { \__siunitx_unit_output:Vn \l__siunitx_table_collect_tl { } }
    \__siunitx_table_column_end:n { \l__siunitx_table_unit_align_skip }
  }
\prop_new:N \l__siunitx_table_model_prop
\dim_new:N \l__siunitx_table_exponent_dim
\dim_new:N \l__siunitx_table_integer_dim
\dim_new:N \l__siunitx_table_mantissa_dim
\dim_new:N \l__siunitx_table_marker_dim
\dim_new:N \l__siunitx_table_result_dim
\dim_new:N \l__siunitx_table_uncert_dim
\dim_new:N \l__siunitx_table_fill_pre_dim
\dim_new:N \l__siunitx_table_fill_post_dim
\dim_new:N \l__siunitx_table_fill_mid_dim
\box_new:N \l__siunitx_table_pre_box
\box_new:N \l__siunitx_table_post_box
\box_new:N \l__siunitx_table_mantissa_box
\box_new:N \l__siunitx_table_result_box
\skip_new:N \l__siunitx_table_number_align_skip
\skip_new:N \l__siunitx_table_text_align_skip
\cs_new_protected:Npn \__siunitx_table_print_S_direct_main: { }
\cs_new_protected:Npn \__siunitx_table_print_S_parsed: { }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_store_fill:n #1 { }
\keys_define:nn { siunitx }
  {
    table-align-comparator    .choice:,
    table-align-comparator /
      false                   .code:n     =
        {
          \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
            \__siunitx_table_print_S_reserved_store_fill_pre:n
        },
    table-align-comparator /
      true                    .code:n     =
        {
          \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
            \__siunitx_table_print_S_reserved_store_fill_mid:n
        },
    table-align-comparator    .default:n  = true,
    table-align-exponent      .bool_set:N =
      \l__siunitx_table_align_exponent_bool,
    table-align-text-pre      .bool_set:N =
      \l__siunitx_table_align_text_pre_bool,
    table-align-text-post     .bool_set:N =
      \l__siunitx_table_align_text_post_bool,
    table-align-uncertainty  .bool_set:N  = \l__siunitx_table_align_uncert_bool,
    table-auto-round          .bool_set:N = \l__siunitx_table_auto_round_bool,
    table-number-alignment    .choice:,
    table-number-alignment /
      center                  .code:n     =
        {
          \skip_set:Nn \l__siunitx_table_number_align_skip
            { 0pt plus 0.5fill }
          \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
            \__siunitx_table_print_S_direct_reserved:
          \cs_set_eq:NN \__siunitx_table_print_S_parsed:
            \__siunitx_table_print_S_reserved:
        },
    table-number-alignment /
      center-decimal-marker   .code:n     =
        {
          \skip_set:Nn \l__siunitx_table_number_align_skip
            { 0pt plus 0.5fill }
          \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
            \__siunitx_table_print_S_direct_centered:
          \cs_set_eq:NN \__siunitx_table_print_S_parsed:
            \__siunitx_table_print_S_centered:
        },
    table-number-alignment /
      left                    .code:n     =
        {
          \skip_zero:N \l__siunitx_table_number_align_skip
          \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
            \__siunitx_table_print_S_direct_reserved:
          \cs_set_eq:NN \__siunitx_table_print_S_parsed:
            \__siunitx_table_print_S_reserved:
        },
    table-number-alignment /
      right                 .code:n     =
        {
          \skip_set:Nn \l__siunitx_table_number_align_skip
            { 0pt plus 1fill }
          \cs_set_eq:NN \__siunitx_table_print_S_direct_main:
            \__siunitx_table_print_S_direct_reserved:
          \cs_set_eq:NN \__siunitx_table_print_S_parsed:
            \__siunitx_table_print_S_reserved:
        },
    table-omit-exponent       .bool_set:N =
      \l__siunitx_table_omit_exponent_bool,
    table-text-alignment      .choice:,
    table-text-alignment /
      center                  .code:n     =
        {
          \skip_set:Nn \l__siunitx_table_text_align_skip
            { 0pt plus 0.5fill }
        },
    table-text-alignment /
      left                    .code:n     =
        { \skip_zero:N \l__siunitx_table_text_align_skip  },
    table-text-alignment /
      right                   .code:n     =
        {
          \skip_set:Nn \l__siunitx_table_text_align_skip
            { 0pt plus 1fill }
        },
    table-comparator          .choice:,
    table-comparator /
      false                   .code:n     =
        { \prop_remove:Nn \l__siunitx_table_model_prop { comparator } },
    table-comparator /
      true                    .code:n     =
        { \prop_put:Nnn \l__siunitx_table_model_prop { comparator } { > } },
    table-comparator          .default:n  = true,
    table-figures-decimal     .code:n     =
      {
        \int_compare:nNnTF {#1} = 0
          {
            \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-decimal }
            \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-decimal-raw }
            \prop_remove:Nn \l__siunitx_table_model_prop
              { mantissa-decimal-marker }
            \prop_if_in:NnTF \l__siunitx_table_model_prop { mantissa-integer }
              {
                \prop_put:Nnn \l__siunitx_table_model_prop { mantissa }
                   { true }
              }
              { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa } }
          }
          {
            \prop_put:Nnx \l__siunitx_table_model_prop { mantissa-decimal }
              { \prg_replicate:nn {#1} { 8 } }
            \prop_put:Nnn \l__siunitx_table_model_prop { mantissa-decimal-raw }
              {#1}
            \prop_put:Nnn \l__siunitx_table_model_prop { mantissa } { true }
            \prop_put:NnV \l__siunitx_table_model_prop
              { mantissa-decimal-marker } \l__siunitx_output_decimal_tl
          }
      },
    table-figures-exponent    .code:n     =
      {
        \int_compare:nNnTF {#1} = 0
          { \prop_remove:Nn \l__siunitx_table_model_prop { exponent-integer } }
          {
            \prop_put:Nnx \l__siunitx_table_model_prop { exponent-integer }
              { \prg_replicate:nn {#1} { 8 } }
            \prop_put:Nnn \l__siunitx_table_model_prop { exponent } { true }
          }
      },
    table-figures-integer     .code:n     =
      {
        \int_compare:nNnTF {#1} = 0
          {
            \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-integer }
            \prop_if_in:NnTF \l__siunitx_table_model_prop { mantissa-decimal }
              {
                \prop_put:Nnn \l__siunitx_table_model_prop { mantissa }
                   { true }
              }
              { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa } }
          }
          {
            \prop_put:Nnx \l__siunitx_table_model_prop { mantissa-integer }
              { \prg_replicate:nn {#1} { 8 } }
            \prop_put:Nnn \l__siunitx_table_model_prop { mantissa } { true }
          }
      },
    table-figures-uncertainty .code:n     =
      {
        \int_compare:nNnTF {#1} = 0
          { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-uncertainty } }
          {
            \prop_put:Nnx \l__siunitx_table_model_prop { mantissa-uncertainty }
              { \prg_replicate:nn {#1} { 8 } }
          }
      },
    table-parse-only          .bool_set:N = \l__siunitx_table_parse_only_bool,
    table-space-text-pre      .tl_set:N   = \l__siunitx_table_pre_tl,
    table-space-text-post     .tl_set:N   = \l__siunitx_table_post_tl,
    table-sign-exponent       .choice:,
    table-sign-exponent / true .code:n  =
      { \prop_put:Nnn \l__siunitx_table_model_prop { exponent-sign } { - } },
    table-sign-exponent / false .code:n =
      { \prop_remove:Nn \l__siunitx_table_model_prop { exponent-sign } },
    table-sign-exponent       .default:n = true,
    table-sign-mantissa       .choice:,
    table-sign-mantissa / true .code:n  =
      { \prop_put:Nnn \l__siunitx_table_model_prop { mantissa-sign } { - } },
    table-sign-mantissa / false .code:n =
      { \prop_remove:Nn \l__siunitx_table_model_prop { mantissa-sign } },
    table-sign-mantissa       .default:n = true,
  }
\keys_define:nn { siunitx }
  {
    table-alignment .meta:n =
      {
        table-number-alignment = #1,
        table-text-alignment   = #1,
        table-unit-alignment   = #1
      }
  }
\keys_define:nn { siunitx }
  {
    table-format .code:n    =
      {
        \bool_set_eq:NN \l__siunitx_process_plus_saved_bool \l__siunitx_process_plus_bool
        \bool_set_true:N \l__siunitx_process_plus_bool
        \__siunitx_number_in_parse:n {#1}
        \prop_set_eq:NN \l__siunitx_table_model_prop \l__siunitx_number_in_prop
        \tl_clear:N \l__siunitx_tmpa_tl
        \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-integer }
          \l__siunitx_tmpb_tl
          {
            \tl_set:Nx \l__siunitx_tmpa_tl
              { table-figures-integer = \l__siunitx_tmpb_tl }
          }
        \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-decimal }
          \l__siunitx_tmpb_tl
          {
            \clist_put_right:Nx \l__siunitx_tmpa_tl
              { table-figures-decimal = \l__siunitx_tmpb_tl }
          }
        \prop_get:NnNT \l__siunitx_number_in_prop { mantissa-uncertainty }
          \l__siunitx_tmpb_tl
          {
            \clist_put_right:Nx \l__siunitx_tmpa_tl
              { table-figures-uncertainty = \l__siunitx_tmpb_tl }
          }
        \prop_if_in:NnTF \l__siunitx_number_in_prop { mantissa-sign }
          {
            \clist_put_right:Nn \l__siunitx_tmpa_tl
              { table-sign-mantissa =true }
          }
          {
            \clist_put_right:Nn \l__siunitx_tmpa_tl
              { table-sign-mantissa =false }
          }
        \prop_get:NnNT \l__siunitx_number_in_prop { exponent-integer }
          \l__siunitx_tmpb_tl
          {
            \clist_put_right:Nx \l__siunitx_tmpa_tl
              { table-figures-exponent = \l__siunitx_tmpb_tl }
          }
        \prop_if_in:NnTF \l__siunitx_number_in_prop { exponent-sign }
          {
            \clist_put_right:Nn \l__siunitx_tmpa_tl
              { table-sign-exponent =true }
          }
          {
            \clist_put_right:Nn \l__siunitx_tmpa_tl
              { table-sign-exponent =false }
          }
        \clist_put_right:Nn \l__siunitx_tmpa_tl
          { table-number-alignment = center }
        \keys_set:nV { siunitx } \l__siunitx_tmpa_tl
        \bool_set_eq:NN \l__siunitx_process_plus_bool \l__siunitx_process_plus_saved_bool
      }
  }
\bool_new:N \l__siunitx_process_plus_saved_bool
\cs_new_protected:Npn \__siunitx_table_print_S:
  {
    \bool_if:NTF \l__siunitx_table_collect_pre_bool
      {
        \__siunitx_table_column_begin:n { \l__siunitx_table_text_align_skip }
          \l__siunitx_table_collect_pre_tl
        \__siunitx_table_column_end:n   { \l__siunitx_table_text_align_skip }
      }
      {
        \__siunitx_table_column_begin:n { \l__siunitx_table_number_align_skip }
          \bool_if:NTF \l__siunitx_table_parse_only_bool
            { \__siunitx_table_print_S_no_alignment: }
            { \__siunitx_table_print_S_alignment: }
          \bool_if:NTF \l__siunitx_table_align_text_pre_bool
            { \__siunitx_table_print_S_pre_aligned: }
            { \__siunitx_table_print_S_pre_not_aligned: }
          \box_use:N \l__siunitx_table_result_box
          \bool_if:NTF \l__siunitx_table_align_text_post_bool
            { \__siunitx_table_print_S_post_aligned: }
            { \__siunitx_table_print_S_post_not_aligned: }
        \__siunitx_table_column_end:n   { \l__siunitx_table_number_align_skip }
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_no_alignment:
  {
    \l__siunitx_table_collect_pre_tl
    \__siunitx_number_output:V \l__siunitx_table_collect_tl
    \l__siunitx_table_collect_post_tl
  }
\cs_new_protected:Npn \__siunitx_table_print_S_alignment:
  { \__siunitx_table_print_S_parsed: }
\cs_new_protected:Npn \__siunitx_table_print_S_parse:
  {
    \bool_set_false:N \l__siunitx_error_bool
    \__siunitx_number_in_parse:V \l__siunitx_table_collect_tl
    \bool_if:NF \l__siunitx_error_bool
      {
        \bool_if:NTF \l__siunitx_table_omit_exponent_bool
          {
            \bool_set_true:N \l__siunitx_process_fixed_bool
            \__siunitx_number_process:
            \prop_remove:Nn \l__siunitx_number_in_prop { exponent }
            \prop_remove:Nn \l__siunitx_number_in_prop { exponent-integer }
          }
          { \__siunitx_number_process: }
        \__siunitx_number_format:
        \__siunitx_number_output_color:
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_measure:NN #1#2
  {
    \tl_if_empty:NTF #1
      { \dim_zero:N #2 }
      {
        \group_begin:
          \hbox_set:Nn \l__siunitx_tmp_box
            { \__siunitx_print:nV { number } #1 }
        \exp_args:NNNo \group_end:
        \dim_set:Nn #2 { \dim_use:N \box_wd:N \l__siunitx_tmp_box }
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_pre_aligned:
  {
    \box_use:N \l__siunitx_table_pre_box
    \hbox_to_wd:nn { \l__siunitx_table_fill_pre_dim } { \tex_hfil:D }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_pre_not_aligned:
  {
    \hbox_to_wd:nn { \l__siunitx_table_fill_pre_dim } { \tex_hfil:D }
    \box_use:N \l__siunitx_table_pre_box
  }
\cs_new_protected:Npn \__siunitx_table_print_S_post_aligned:
  {
    \hbox_to_wd:nn { \l__siunitx_table_fill_post_dim } { \tex_hfil:D }
    \box_use:N \l__siunitx_table_post_box
  }
\cs_new_protected:Npn \__siunitx_table_print_S_post_not_aligned:
  {
    \box_use:N \l__siunitx_table_post_box
    \hbox_to_wd:nn { \l__siunitx_table_fill_post_dim } { \tex_hfil:D }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_centered:
  {
    \__siunitx_table_print_S_centered_ends:
    \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
    \__siunitx_table_print_S_parse:
    \bool_if:NF \l__siunitx_error_bool
      {
        \__siunitx_table_print_S_centered_measure:
        \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
        \dim_set:Nn \l__siunitx_table_fill_pre_dim
          {
              \l__siunitx_table_result_dim
            - \l__siunitx_table_integer_dim
            - \l__siunitx_table_marker_dim
          }
        \dim_compare:nNnTF \l__siunitx_table_integer_dim >
          \l__siunitx_table_fill_pre_dim
          { \__siunitx_table_print_S_centered_integer: }
          { \__siunitx_table_print_S_centered_decimal: }
    }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_centered_ends:
  {
    \hbox_set:Nn \l__siunitx_table_pre_box
      {
        {
          \l__siunitx_table_collect_pre_tl
          \bool_if:NT \l__siunitx_table_math_bool
            {
              \scan_stop:
              \c_math_toggle_token
            }
        }
      }
    \dim_compare:nNnT
      { \box_wd:N \l__siunitx_table_pre_box } = \c_zero_dim
      {
        \box_clear:N \l__siunitx_table_pre_box
        \l__siunitx_table_collect_pre_tl
        \bool_set_false:N \l__siunitx_font_set_bool
      }
    \hbox_set:Nn \l__siunitx_table_post_box
      {
        \bool_if:NT \l__siunitx_table_math_bool
          {
            \c_math_toggle_token
            \scan_stop:
          }
        \l__siunitx_table_collect_post_tl
      }
    \dim_compare:nNnTF
      { \box_wd:N \l__siunitx_table_pre_box } >
        { \box_wd:N \l__siunitx_table_post_box }
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
          { \box_wd:N \l__siunitx_table_pre_box }
          {
            \hbox_unpack:N \l__siunitx_table_post_box
            \tex_hfil:D
          }
      }
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_pre_box
          { \box_wd:N \l__siunitx_table_post_box }
          {
            \tex_hfil:D
            \hbox_unpack:N \l__siunitx_table_pre_box
          }
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure:
  {
    \__siunitx_table_print_S_centered_measure_int_part:
    \__siunitx_table_print_S_centered_measure_marker:
    \__siunitx_table_print_S_centered_measure_result:
  }
\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure_int_part:
  {
    \prop_get:NnNF \l__siunitx_number_out_prop { comparator } \l__siunitx_tmpa_tl
      { \tl_clear:N \l__siunitx_tmpa_tl }
    \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-sign }
      \l__siunitx_tmpb_tl
      { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
    \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-integer }
      \l__siunitx_tmpb_tl
      { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
    \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl
      \l__siunitx_table_integer_dim
  }
\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure_marker:
  {
    \__siunitx_table_print_S_measure:NN \l__siunitx_output_decimal_tl
      \l__siunitx_table_marker_dim
  }
\cs_new_protected:Npn \__siunitx_table_print_S_centered_measure_result:
  {
    \prop_get:NnN \l__siunitx_number_out_prop { result } \l__siunitx_tmpa_tl
    \hbox_set:Nn \l__siunitx_table_result_box
      { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
    \dim_set:Nn \l__siunitx_table_result_dim
      { \box_wd:N \l__siunitx_table_result_box }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_centered_integer:
  {
    \dim_set:Nn \l__siunitx_table_fill_post_dim
      { \l__siunitx_table_integer_dim - \l__siunitx_table_fill_pre_dim }
    \dim_zero:N \l__siunitx_table_fill_pre_dim
  }
\cs_new_protected:Npn \__siunitx_table_print_S_centered_decimal:
  {
    \dim_sub:Nn \l__siunitx_table_fill_pre_dim
      { \l__siunitx_table_integer_dim }
    \dim_zero:N \l__siunitx_table_fill_post_dim
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved:
  {
    \__siunitx_table_print_S_reserved_init:
    \__siunitx_table_print_S_reserved_ends:
    \bool_if:NT \l__siunitx_table_auto_round_bool
      { \__siunitx_table_print_S_reserved_round_auto: }
    \__siunitx_table_print_S_parse:
    \bool_if:NF \l__siunitx_error_bool
      {
        \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
        \__siunitx_table_print_S_reserved_comparator:
        \__siunitx_table_print_S_reserved_mantissa:
        \__siunitx_table_print_S_reserved_exponent:
        \bool_if:NT \l__siunitx_table_math_bool { \c_math_toggle_token }
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_init:
  {
    \dim_zero:N \l__siunitx_table_fill_mid_dim
    \dim_zero:N \l__siunitx_table_fill_post_dim
    \prop_set_eq:NN \l__siunitx_number_in_prop \l__siunitx_table_model_prop
    \__siunitx_number_process_sign:
    \__siunitx_number_process_zero_fill:
    \__siunitx_number_process_mantissa:
    \prop_if_in:NnF \l__siunitx_number_in_prop { symbolic }
      { \__siunitx_number_process_uncertainty: }
    \__siunitx_number_format:
        \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-decimal-raw }
          \l__siunitx_tmpa_tl
          {
            \prop_put:NnV \l__siunitx_number_out_prop { mantissa-decimal-raw }
              \l__siunitx_tmpa_tl
          }
    \prop_set_eq:NN \l__siunitx_table_model_prop \l__siunitx_number_out_prop
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_ends:
  {
    \hbox_set:Nn \l__siunitx_table_pre_box
      {
        {
          \l__siunitx_table_collect_pre_tl
          \bool_if:NT \l__siunitx_table_math_bool
            {
              \scan_stop:
              \c_math_toggle_token
            }
        }
      }
    \dim_compare:nNnT
      { \box_wd:N \l__siunitx_table_pre_box } = \c_zero_dim
      {
        \box_clear:N \l__siunitx_table_pre_box
        \l__siunitx_table_collect_pre_tl
        \bool_set_false:N \l__siunitx_font_set_bool
      }
    \hbox_set:Nn \l__siunitx_tmp_box { { \l__siunitx_table_pre_tl } }
    \hbox_set_to_wd:Nnn \l__siunitx_table_pre_box
      { \box_wd:N \l__siunitx_tmp_box }
      {
        \tex_hfil:D
        \hbox_unpack:N \l__siunitx_table_pre_box
      }
    \hbox_set:Nn \l__siunitx_tmp_box { \l__siunitx_table_post_tl }
    \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
      { \box_wd:N \l__siunitx_tmp_box }
      {
        {
          \bool_if:NT \l__siunitx_table_math_bool
            {
              \c_math_toggle_token
              \scan_stop:
            }
          \l__siunitx_table_collect_post_tl
        }
        \tex_hfil:D
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_round_auto:
  {
    \prop_get:NnNTF \l__siunitx_table_model_prop { mantissa-decimal-raw }
      \l__siunitx_tmpa_tl
      { \int_set:Nn \l__siunitx_process_precision_int { \l__siunitx_tmpa_tl } }
      { \int_zero:N \l__siunitx_process_precision_int }
    \tl_set:Nn \l__siunitx_round_tl { places }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_comparator:
  {
    \prop_get:NnNTF \l__siunitx_table_model_prop { comparator }
      \l__siunitx_tmpa_tl
      {
        \hbox_set:Nn \l__siunitx_tmp_box
          { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
        \prop_get:NnNTF \l__siunitx_number_out_prop { comparator }
          \l__siunitx_tmpa_tl
          {
            \hbox_set_to_wd:Nnn \l__siunitx_table_result_box
              { \box_wd:N \l__siunitx_tmp_box }
              { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
          }
          {
            \dim_add:Nn \l__siunitx_table_fill_pre_dim
              { \box_wd:N \l__siunitx_tmp_box }
            \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
              \__siunitx_table_print_S_reserved_store_fill_pre:n
          }
      }
      {
        \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
          \__siunitx_table_print_S_reserved_store_fill_pre:n
        \prop_if_in:NnT \l__siunitx_number_out_prop { comparator }
          {
            \msg_error:nnx { siunitx } { table-partial-number }
              { a~comparator }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_store_fill_pre:n
  { \dim_add:Nn \l__siunitx_table_fill_pre_dim }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_store_fill_mid:n
  { \dim_add:Nn \l__siunitx_table_fill_mid_dim }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa:
  {
    \prop_get:NnNTF \l__siunitx_table_model_prop { mantissa }
      \l__siunitx_tmpa_tl
      {
        \hbox_set:Nn \l__siunitx_tmp_box
          { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
        \prop_get:NnNTF \l__siunitx_number_out_prop { mantissa }
          \l__siunitx_tmpa_tl
          {
            \dim_set:Nn \l__siunitx_table_mantissa_dim
              { \box_wd:N \l__siunitx_tmp_box }
            \hbox_set:Nn \l__siunitx_table_mantissa_box
              { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
            \__siunitx_table_print_S_reserved_mantissa_parts:
          }
          {
            \__siunitx_table_print_S_reserved_store_fill:n
              { \box_wd:N \l__siunitx_tmp_box }
          }
      }
      {
        \prop_if_in:NnT \l__siunitx_number_out_prop { mantissa }
          {
            \msg_error:nnx { siunitx } { table-partial-number }
              { a~mantissa }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa_parts:
  {
    \__siunitx_table_print_S_reserved_mantissa_integer:
    \hbox_set:Nn \l__siunitx_table_result_box
      {
        \hbox_unpack:N \l__siunitx_table_result_box
        \hbox_to_wd:nn { \l__siunitx_table_fill_mid_dim } { \tex_hfil:D }
        \hbox_unpack:N \l__siunitx_table_mantissa_box
      }
    \dim_set:Nn \l__siunitx_table_fill_mid_dim
      {
          \l__siunitx_table_mantissa_dim
        - \box_wd:N \l__siunitx_table_mantissa_box
        - \l__siunitx_table_integer_dim
      }
    \__siunitx_table_print_S_reserved_mantissa_uncert:
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa_integer:
  {
    \prop_get:NnNF \l__siunitx_table_model_prop { mantissa-sign }
      \l__siunitx_tmpa_tl
      { \tl_clear:N \l__siunitx_tmpa_tl }
    \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-integer }
      \l__siunitx_tmpb_tl
      { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
    \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl
      \l__siunitx_table_integer_dim
    \prop_get:NnNF \l__siunitx_number_out_prop { mantissa-sign }
      \l__siunitx_tmpa_tl
      { \tl_clear:N \l__siunitx_tmpa_tl }
    \prop_get:NnNT \l__siunitx_number_out_prop { mantissa-integer }
      \l__siunitx_tmpb_tl
      { \tl_put_right:No \l__siunitx_tmpa_tl \l__siunitx_tmpb_tl }
    \tl_if_empty:NF \l__siunitx_tmpa_tl
      {
        \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl
          \l__siunitx_tmp_dim
        \dim_sub:Nn \l__siunitx_table_integer_dim { \l__siunitx_tmp_dim }
      }
    \__siunitx_table_print_S_reserved_store_fill:n
      { \l__siunitx_table_integer_dim }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_mantissa_uncert:
  {
    \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-uncertainty }
      \l__siunitx_tmpa_tl
      {
        \__siunitx_number_format_join_uncert_pm:N \l__siunitx_tmpa_tl
        \hbox_set:Nn \l__siunitx_tmp_box
          { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
        \prop_get:NnNTF \l__siunitx_number_out_prop { mantissa-uncertainty }
          \l__siunitx_tmpa_tl
          {
            \dim_set:Nn \l__siunitx_table_uncert_dim
              { \box_wd:N \l__siunitx_tmp_box }
            \__siunitx_number_format_join_uncert_pm:N \l__siunitx_tmpa_tl
            \hbox_set:Nn \l__siunitx_tmp_box
              { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
            \bool_if:NTF \l__siunitx_table_align_uncert_bool
              { \__siunitx_table_print_S_reserved_mantissa_uncert_aligned: }
              { \__siunitx_table_print_S_reserved_mantissa_uncert_not_aligned: }
          }
          {
            \cs_set_eq:NN \__siunitx_table_print_S_reserved_store_fill:n
              \__siunitx_table_print_S_reserved_store_fill_mid:n
            \__siunitx_table_print_S_reserved_store_fill:n
              { \box_wd:N \l__siunitx_tmp_box }
          }
      }
  }
\cs_new_protected:Npn
  \__siunitx_table_print_S_reserved_mantissa_uncert_aligned:
  {
    \hbox_set:Nn \l__siunitx_table_result_box
      {
        \hbox_unpack:N \l__siunitx_table_result_box
        \hbox_to_wd:nn { \l__siunitx_table_fill_mid_dim } { \tex_hfil:D }
        \hbox_unpack:N \l__siunitx_tmp_box
      }
    \dim_set:Nn \l__siunitx_table_fill_mid_dim
      { \l__siunitx_table_uncert_dim - \box_wd:N \l__siunitx_tmp_box }
  }
\cs_new_protected:Npn
  \__siunitx_table_print_S_reserved_mantissa_uncert_not_aligned:
  {
    \hbox_set:Nn \l__siunitx_table_result_box
      {
        \hbox_unpack:N \l__siunitx_table_result_box
        \hbox_unpack:N \l__siunitx_tmp_box
      }
    \dim_add:Nn \l__siunitx_table_fill_mid_dim
      {
          \l__siunitx_table_uncert_dim
        - \box_wd:N \l__siunitx_tmp_box
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_exponent:
  {
    \prop_get:NnNTF \l__siunitx_table_model_prop { exponent-result }
      \l__siunitx_tmpa_tl
      {
        \prop_if_in:NnT \l__siunitx_table_model_prop { mantissa }
          { \__siunitx_table_print_S_reserved_exponent_product: }
        \hbox_set:Nn \l__siunitx_tmp_box
          { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
        \prop_get:NnNTF \l__siunitx_number_out_prop { exponent-result }
          \l__siunitx_tmpa_tl
          {
            \dim_set:Nn \l__siunitx_table_exponent_dim
              { \box_wd:N \l__siunitx_tmp_box }
            \tl_if_empty:NT \l__siunitx_output_exponent_tl
              {
                \prop_if_in:NnTF \l__siunitx_number_out_prop { mantissa }
                  { \__siunitx_table_print_S_reserved_exponent_product: }
                  { \__siunitx_table_print_S_reserved_exponent_product_correction: }
              }
            \hbox_set:Nn \l__siunitx_tmp_box
              { \__siunitx_print:nV { number } \l__siunitx_tmpa_tl }
            \bool_if:NTF \l__siunitx_table_align_exponent_bool
              { \__siunitx_table_print_S_reserved_exponent_aligned: }
              { \__siunitx_table_print_S_reserved_exponent_not_aligned: }
          }
          {
            \dim_set:Nn \l__siunitx_table_fill_post_dim
              { \l__siunitx_table_fill_mid_dim + \box_wd:N \l__siunitx_tmp_box }
          }
      }
      {
        \prop_if_in:NnT \l__siunitx_number_out_prop { exponent-result }
          {
            \msg_error:nnx { siunitx } { table-partial-number }
              { an~exponent }
          }
        \dim_set_eq:NN  \l__siunitx_table_fill_post_dim
          \l__siunitx_table_fill_mid_dim
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_exponent_product:
  {
    \tl_set_eq:NN \l__siunitx_tmpb_tl \l__siunitx_exponent_product_tl
    \bool_if:NT \l__siunitx_tight_bool
      {
        \tl_set:Nx \l__siunitx_tmpb_tl
          { \exp_not:N \mathord \exp_not:o \l__siunitx_tmpb_tl }
      }
    \tl_set:Nx \l__siunitx_tmpa_tl
      {
        \exp_not:N \ensuremath { { } \exp_not:o \l__siunitx_tmpb_tl  { } }
        \exp_not:o \l__siunitx_tmpa_tl
      }
  }
\cs_new_protected:Npn
  \__siunitx_table_print_S_reserved_exponent_product_correction:
  {
    \group_begin:
      \tl_clear:N \l__siunitx_tmpa_tl
      \__siunitx_table_print_S_reserved_exponent_product:
      \tl_set:Nx \l__siunitx_tmpa_tl
          { { } \exp_not:o \l__siunitx_tmpa_tl { } }
      \__siunitx_table_print_S_measure:NN \l__siunitx_tmpa_tl \l__siunitx_tmp_dim
    \exp_args:NNNo \group_end:
    \dim_set:Nn \l__siunitx_tmp_dim { \dim_use:N \l__siunitx_tmp_dim }
    \__siunitx_table_print_S_reserved_store_fill:n { \l__siunitx_tmp_dim }
    \dim_sub:Nn \l__siunitx_table_exponent_dim { \l__siunitx_tmp_dim }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_reserved_exponent_aligned:
  {
    \hbox_set:Nn \l__siunitx_table_result_box
      {
        \hbox_unpack:N \l__siunitx_table_result_box
        \hbox_to_wd:nn { \l__siunitx_table_fill_mid_dim } { \tex_hfil:D }
        \hbox_unpack:N \l__siunitx_tmp_box
      }
    \dim_set:Nn \l__siunitx_table_fill_post_dim
      {
          \l__siunitx_table_exponent_dim
        - \box_wd:N \l__siunitx_tmp_box
      }
  }
\cs_new_protected:Npn
  \__siunitx_table_print_S_reserved_exponent_not_aligned:
  {
    \hbox_set:Nn \l__siunitx_table_result_box
      {
        \hbox_unpack:N \l__siunitx_table_result_box
        \hbox_unpack:N \l__siunitx_tmp_box
      }
    \dim_set:Nn \l__siunitx_table_fill_post_dim
      {
          \l__siunitx_table_fill_mid_dim
        + \l__siunitx_table_exponent_dim
        - \box_wd:N \l__siunitx_tmp_box
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_direct:
  {
    \peek_catcode_ignore_spaces:NTF \c_group_begin_token
      { \__siunitx_table_print_S_direct_text:n }
      { \__siunitx_table_print_S_direct_main: }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_direct_text:n #1
  {
    \__siunitx_table_column_begin:n { \l__siunitx_table_text_align_skip }
      #1
    \__siunitx_table_column_end:n   { \l__siunitx_table_text_align_skip }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered:
  {
    \cs_set_eq:NN \__siunitx_table_print:
      \__siunitx_table_print_S_direct_centered_end:
    \hbox_set:Nn \l__siunitx_tmp_box
      { \ensuremath { \l__siunitx_output_decimal_tl } }
    \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
      { \box_wd:N \l__siunitx_tmp_box }
      { \tex_hfil:D }
    \hbox_set:Nw \l__siunitx_table_pre_box
      \c_math_toggle_token
      \tl_map_function:NN \l__siunitx_input_decimal_tl
        \__siunitx_table_print_S_direct_centered_aux:N
  }
\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered_aux:N #1
  {
    \char_set_active_eq:NN #1 \__siunitx_table_print_S_direct_centered_begin:
    \char_set_mathcode:nn { `#1 } { "8000 }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered_begin:
  {
      \c_math_toggle_token
    \hbox_set_end:
    \hbox_set:Nw \l__siunitx_table_post_box
      \c_math_toggle_token
      \l__siunitx_output_decimal_tl
  }
\cs_new_protected:Npn \__siunitx_table_print_S_direct_centered_end:
  {
      \c_math_toggle_token
    \hbox_set_end:
    \dim_compare:nNnTF
      { \box_wd:N \l__siunitx_table_pre_box } >
        { \box_wd:N \l__siunitx_table_post_box }
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
          { \box_wd:N \l__siunitx_table_pre_box }
          {
            \hbox_unpack:N \l__siunitx_table_post_box
            \tex_hfil:D
          }
      }
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_pre_box
          { \box_wd:N \l__siunitx_table_post_box }
          {
            \tex_hfil:D
            \hbox_unpack:N \l__siunitx_table_pre_box
          }
      }
    \box_use:N \l__siunitx_table_pre_box
    \box_use:N \l__siunitx_table_post_box
  }
\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved:
  {
    \cs_set_eq:NN \__siunitx_table_print:
      \__siunitx_table_print_S_direct_reserved_end:
    \prop_get:NnNF \l__siunitx_table_model_prop { mantissa-integer }
      \l__siunitx_tmpa_tl
      { \tl_clear:N \l__siunitx_tmpa_tl }
    \hbox_set:Nn \l__siunitx_tmp_box
      {
        \ensuremath
          {
            \prop_get:NnNT \l__siunitx_table_model_prop { mantissa-sign }
              \l__siunitx_tmpb_tl
              { \l__siunitx_tmpb_tl }
            \l__siunitx_tmpa_tl
          }
      }
    \dim_set:Nn \l__siunitx_table_integer_dim
      { \box_wd:N \l__siunitx_tmp_box }
    \prop_get:NnNF \l__siunitx_table_model_prop { mantissa-decimal }
      \l__siunitx_tmpa_tl
      { \tl_clear:N \l__siunitx_tmpa_tl }
    \hbox_set:Nn \l__siunitx_tmp_box
      {
        \ensuremath
          {
            \l__siunitx_output_decimal_tl
            \l__siunitx_tmpa_tl
          }
      }
    \hbox_set_to_wd:Nnn \l__siunitx_table_post_box
      { \box_wd:N \l__siunitx_tmp_box }
      { \tex_hfil:D }
    \tex_setbox:D \l__siunitx_table_pre_box \tex_hbox:D to \l__siunitx_table_integer_dim
      \c_group_begin_token
        \c_math_toggle_token
        \tl_map_function:NN \l__siunitx_input_decimal_tl
          \__siunitx_table_print_S_direct_reserved_aux:N
        \tex_hfill:D
  }
\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved_aux:N #1
  {
    \char_set_active_eq:NN #1 \__siunitx_table_print_S_direct_reserved_begin:
    \char_set_mathcode:nn { `#1 } { "8000 }
  }
\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved_begin:
  {
      \c_math_toggle_token
    \c_group_end_token
    \tex_setbox:D \l__siunitx_table_post_box \tex_hbox:D to \box_wd:N \l__siunitx_tmp_box
      \c_group_begin_token
        \c_math_toggle_token
        \l__siunitx_output_decimal_tl
      }
\cs_new_protected:Npn \__siunitx_table_print_S_direct_reserved_end:
  {
      \c_math_toggle_token
      \tex_hfil:D
    \c_group_end_token
    \__siunitx_table_align_left:n { \l__siunitx_table_number_align_skip }
    \box_use:N \l__siunitx_table_pre_box
    \box_use:N \l__siunitx_table_post_box
    \__siunitx_table_align_right:n { \l__siunitx_table_number_align_skip }
  }
\keys_set:nn { siunitx }
  {
    table-align-comparator  = true,
    table-align-exponent    = true,
    table-align-text-pre    = true,
    table-align-text-post   = true,
    table-align-uncertainty = true,
    table-omit-exponent     = false,
    table-parse-only        = false,
    table-number-alignment  = center-decimal-marker,
    table-text-alignment    = center,
    table-figures-decimal   = 2,
    table-figures-integer   = 3
  }
\keys_define:nn { siunitx }
  { redefine-symbols .bool_set:N = \l__siunitx_redefine_symbols_bool }
\keys_set:nn { siunitx } { redefine-symbols = true }
\AtBeginDocument
  {
    \bool_if:NT \l__siunitx_redefine_symbols_bool
      {
        \@ifpackageloaded { fourier }
          {
            \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_text_tl
              { \textohm }
              { \text { \ensuremath { \l__siunitx_ohm_math_tl } } }
          }
          { }
        \@ifpackageloaded { mathptmx }
          {
            \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_text_tl
              { \textohm }
              { \text { \ensuremath { \l__siunitx_ohm_math_tl } } }
          }
          { }
        \str_if_eq:VnT \encodingdefault { OT1 }
          {
            \__siunitx_option_unchanged:Nnn \l__siunitx_angstrom_math_tl
              { \text { \AA } }
              { \text { \capitalring { A } } }
            \__siunitx_option_unchanged:Nnn \l__siunitx_angstrom_text_tl
              { \AA }
              { \capitalring { A } }
          }
        \@ifpackageloaded { unicode-math }
          {
            \exp_args:NNnx
              \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_math_tl
              { \text { \ensuremath { \Omega } } }
              {  \char_generate:nn { "03A9 } { 12 } }
          }
          { }
        \@ifpackageloaded { upgreek }
          {
            \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_math_tl
              { \text { \ensuremath { \Omega } } }
              { \text { \ensuremath { \Upomega } } }
          }
          {
            \cs_if_exist:NT \upOmega
              {
                \__siunitx_option_unchanged:Nnn \l__siunitx_ohm_math_tl
                  { \text { \ensuremath { \Omega } } }
                  { \text { \ensuremath { \upOmega } } }
              }
          }
      }
  }
\keys_define:nn { siunitx } {
  math-angstrom   .tl_set:N = \l__siunitx_angstrom_math_tl,
  math-arcminute  .tl_set:N = \l__siunitx_arcminute_math_tl,
  math-arcsecond  .tl_set:N = \l__siunitx_arcsecond_math_tl,
  math-celsius    .tl_set:N = \l__siunitx_celsius_math_tl,
  math-degree     .tl_set:N = \l__siunitx_degree_math_tl,
  math-micro      .tl_set:N = \l__siunitx_micro_math_tl,
  math-ohm        .tl_set:N = \l__siunitx_ohm_math_tl
}
\keys_set:nn { siunitx } {
  math-angstrom  = \text { \AA },
  math-arcminute = { } ^ { \prime },
  math-arcsecond = { } ^ { \prime \prime },
  math-celsius   = \text { \textdegree } \__siunitx_unit_mathrm:n { C } ,
  math-degree    = \text { \textdegree },
  math-micro     = \text { \textmu },
  math-ohm       = \text { \ensuremath { \Omega } },
}
\keys_define:nn { siunitx } {
  text-angstrom  .tl_set:N = \l__siunitx_angstrom_text_tl,
  text-arcminute .tl_set:N = \l__siunitx_arcminute_text_tl,
  text-arcsecond .tl_set:N = \l__siunitx_arcsecond_text_tl,
  text-celsius   .tl_set:N = \l__siunitx_celsius_text_tl,
  text-degree    .tl_set:N = \l__siunitx_degree_text_tl,
  text-micro     .tl_set:N = \l__siunitx_micro_text_tl,
  text-ohm       .tl_set:N = \l__siunitx_ohm_text_tl,
}
\keys_set:nn { siunitx } {
  text-angstrom  = \AA,
  text-arcminute = \ensuremath { { } ^ { \prime } },
  text-arcsecond = \ensuremath { { } ^ { \prime \prime } },
  text-celsius   = \text { \textdegree } C,
  text-degree    = \text { \textdegree },
  text-micro     = \textmu ,
  text-ohm       = \textohm
}
\cs_new_protected:Npn \__siunitx_symbol_new:n #1
  {
    \cs_set_protected:cpn { SIUnitSymbol #1 }
      {
         \use:c
           {
             l__siunitx_
             \str_foldcase:n {#1}
             _
             \mode_if_math:TF { math } { text }
             _tl
           }
      }
  }
\__siunitx_symbol_new:n { Angstrom }
\__siunitx_symbol_new:n { Arcminute }
\__siunitx_symbol_new:n { Arcsecond }
\__siunitx_symbol_new:n { Celsius }
\__siunitx_symbol_new:n { Degree }
\__siunitx_symbol_new:n { Micro }
\__siunitx_symbol_new:n { Ohm }
\clist_new:N \l__siunitx_pgf_link_clist
\cs_new_protected:Npn \__siunitx_pgf_link: {
  \clist_clear:N \l__siunitx_pgf_link_clist
  \str_if_eq:VnT \l__siunitx_round_tl { figure }
    {
      \clist_put_right:Nn \l__siunitx_pgf_link_clist { fixed }
      \clist_put_right:Nn \l__siunitx_pgf_link_clist
        { fixed~zerofill = true }
    }
  \clist_put_right:Nx \l__siunitx_pgf_link_clist
    { precision = \int_use:N \l__siunitx_process_precision_int }
  \clist_put_right:Nx \l__siunitx_pgf_link_clist
    {
      set~decimal~separator =
        { { \exp_not:V \l__siunitx_output_decimal_tl } }
    }
  \clist_put_right:Nx \l__siunitx_pgf_link_clist
    { set~thousands~separator = { \exp_not:V \l__siunitx_group_sep_tl } }
  \clist_put_right:Nx \l__siunitx_pgf_link_clist
    {
       min~exponent~for~1000~sep = \int_eval:n { \l__siunitx_group_min_int - 1 }
    }
  \bool_lazy_or:nnF
    { \l__siunitx_group_decimal_bool } { \l__siunitx_group_integer_bool }
    {
      \clist_put_right:Nn \l__siunitx_pgf_link_clist
        { min~exponent~for~1000~sep = 999 }
    }
  \bool_if:NTF \l__siunitx_process_integer_zero_bool
    {
      \clist_put_right:Nn \l__siunitx_pgf_link_clist
        { skip~0. = false }
    }
    {
      \clist_put_right:Nn \l__siunitx_pgf_link_clist
        { skip~0. = true }
    }
  \str_if_eq:VnTF \l__siunitx_process_sign_tl { + }
    {
      \clist_put_right:Nn \l__siunitx_pgf_link_clist
        { showpos = true }
    }
    {
      \clist_put_right:Nn \l__siunitx_pgf_link_clist
        { showpos = false }
    }
  \use:x
    {
      \exp_not:N \pgfqkeys
        { /pgf/number~format }
        { \exp_not:V \l__siunitx_pgf_link_clist }
    }
}
\msg_new:nnnn { siunitx } { bad-arc-sign }
  { Incorrect~use~of~sign~in~degree-minute-second~angle. }
  { Only~the~highest~value~part~of~an~angle~can~have~a~sign. }
\msg_new:nnnn { siunitx } { color-not-loaded }
  { Package~"color"~not~loaded. }
  { The~command~\token_to_str:N \color \ is~not~available. }
\msg_new:nnnn { siunitx } { duplicate-complex-root-token }
  { Duplicate~complex~root~token~'#1'~in~input. }
  { Only~one~complex~root~token~can~appear~in~a~single~number. }
\msg_new:nnnn { siunitx } { duplicate-decimal-token }
  { Duplicate~decimal~marker~token~'#1'~in~input. }
  { Only~one~decimal~marker~token~can~appear~in~a~single~number. }
\msg_new:nnnn { siunitx } { duplicate-exponent-token }
  { Duplicate~exponent~marker~token~'#1'~in~input. }
  { Only~one~exponent~marker~token~can~appear~in~a~single~number. }
\msg_new:nnnn { siunitx } { duplicate-quotient-token }
  { Duplicate~quotient~token. }
  { Only~one~quotient~token~can~appear~in~a~single~number. }
\msg_new:nnnn { siunitx } { duplicate-sticky-per }
  { Duplicate~\token_to_str:N \per. }
  {
    When~the~'sticky-per'~option~is~active,~only~one
    \token_to_str:N \per may~appear~in~a~unit.
  }
\msg_new:nnnn { siunitx } { empty-arc }
  { Empty~degree-minute-second~angle. }
  { The~angle~given~does~not~contain~any~numbers. }
\msg_new:nnnn { siunitx } { empty-uncertainty }
  { Empty~uncertainty~given~in~'#1'. }
  { The~number~given~contains~an~empty~uncertainty. }
\msg_new:nnnn { siunitx } { ending-product-token }
  { Misplaced~product~token. }
  { A~number~cannot~end~with~a~product~token. }
\msg_new:nnnn { siunitx } { ending-quotient-token }
  { Misplaced~quotient~token. }
  { A~number~cannot~end~with~a~quotient~token. }
\msg_new:nnnn { siunitx } { invalid-arc-format }
  { Invalid~degree-minute-second angle~'#1'. }
  {
    Angles~given~in~degree-minute-second~format~should~contain~two~';'
    symbols~to~divide~up~the~parts~of~the~input.
  }
\msg_new:nnnn { siunitx } { invalid-number }
  { Invalid~numerical~input~'#1'. }
  {
    The~input~given~as~a~number~does~not~make~logical~sense.~
    This~happens,~for~example,~if~a~number~only~contains~a~sign.
  }
\msg_new:nnnn { siunitx } { invalid-token-in-exponent }
  { Invalid~exponent~in~numerical~input~'#1'. }
  {
    The~exponent~part~of~a~number~cannot~contain~an~uncertainty~or~
    complex~part: \\
    the~input~given~appears~to~contain~one~of~these~in~the~exponent.
  }
\msg_new:nnnn { siunitx } { invalid-token-in-number }
  { Invalid~token~'#1'~in~numerical~input. }
  {
    Numbers~can~only~contain~tokens~defined~using~the~
    'input-...'~options:\\
    the~token~'#1'~is~not~set~up~as~a~valid~part~of~a~number.
  }
\msg_new:nnnn { siunitx } { invalid-token-in-uncertainty }
  { Invalid~uncertainty~in~numerical~input~'#1'. }
  {
    The~uncertainty~part~of~a~number~may~only~contain~digits~or~
    symbols.
  }
\msg_new:nnnn { siunitx } { literal-unit }
  { Literal~units~disabled. }
  {
    You~gave~the~literal~input~'#1'~
    but~literal~unit~output~is~disabled.
  }
\msg_new:nnnn { siunitx } { misplaced-sign-token }
  { Misplaced~sign~token~'#1'. }
  { Sign~tokens~can~only~come~at~the~beginning~of~a~number. }
\msg_new:nnnn { siunitx } { misplaced-complex-root-token }
  { Misplaced~complex~token~in~numerical~input~'#1'. }
  {
    The~root~token~must~come~either~before~or~after~the~real~digits~
    of~the~complex~part.
  }
\msg_new:nnnn { siunitx } { misplaced-uncertainty-token }
  { Misplaced~uncertainty~token~'#1'. }
  {
    The~uncertainty~in~a~number~must~be~given~between~a~set~of~
    delimiters~as~defined~by~the\\
    \ \ 'input-open-uncertainty'~and~'input-close-uncertainty'~
    options.
  }
\msg_new:nnnn { siunitx } { multi-part-range }
  { Numerical~range~with~multiple~parts. }
  {
    The~input~'#1'~is~a~number~which~has~more~than~one~part: \\
    ranges~can~only~contain~one~number~in~each~part.
  }
\msg_new:nnn { siunitx } { non-convertible-exponent }
  { Exponent~'#1'~cannot~be~converted~into~a~symbolic~prefix. }
\msg_new:nnn { siunitx } { option-not-available }
  { Option~'#1'~not~available~in~strict~mode. }
\msg_new:nnn { siunitx } { option-preamble-only }
  { Option~'#1'~only~available~in~the~preamble. }
\msg_new:nnnn { siunitx } { prefix-base-mismatch }
  { Prefix~bases~do~not~match. }
  {
    You~have~asked~for~prefixes~to~be~converted~into~a~power,~
    but~the~bases~do~not~match.
  }
\msg_new:nnn { siunitx } { prefix-only }
  { Prefix~with~no~unit. }
\msg_new:nnnn { siunitx } { qualifier-before-unit }
  { Qualifier~before~unit. }
  { Unit~qualifiers~have~to~follow~after~units,~not~before~them. }
\msg_new:nnnn { siunitx } { restricted-number }
  { Token~'#1'~forbidden~in~restricted~numerical~input. }
  {
    The~current~input~must~be~a~real~number~and~cannot~contain: \\
    \ -~an~exponent; \\
    \ -~an~uncertainty; \\
    \ -~a~complex~part.
  }
\msg_new:nnnn { siunitx } { starting-product-token }
  { Misplaced~product~token. }
  { A~number~cannot~begin~with~a~product~token. }
\msg_new:nnnn { siunitx } { starting-quotient-token }
  { Misplaced~quotient~token. }
  { A~number~cannot~begin~with~a~quotient~token. }
\msg_new:nnnn { siunitx } { table-partial-number }
  { No~space~reserved~for~#1~\msg_line_context:. }
  {
    The~number~in~the~current~table~cell~contains~#1~part,
    but~you~did~not~reserve~any~space~to~print~it: \\
    it~will~be~missing~in~the~output.
  }
\msg_new:nnnn { siunitx } { unknown-option }
  { Unknown~option~'#1'. }
  {
    The~option~file~'#1'~is~not~known~by~siunitx:
    perhaps~it~is~spelled~incorrectly.
  }
\msg_new:nnnn { siunitx } { version-1-option }
  { Version~1~option~'#1'~detected. }
  {
    Use: \\
    \ \ \token_to_str:N \usepackage [ version-1-compatibility ]
    \iow_char:N \{ siunitx \token_to_str:N \iow_char:N \} \\
    in~the~preamble~to~load~the~appropriate~code.
  }
\NewDocumentCommand \DeclareBinaryPrefix { m m m } {
  \__siunitx_declare_prefix:Nnnn #1 {#2} { 2 } {#3}
}
\NewDocumentCommand \DeclareSIPostPower { m m } {
  \__siunitx_declare_power_after:Nn #1 {#2}
}
\NewDocumentCommand \DeclareSIPrefix { m m m } {
  \__siunitx_declare_prefix:Nnnn #1 {#2} { 10 } {#3}
}
\NewDocumentCommand \DeclareSIPrePower { m m } {
  \__siunitx_declare_power_before:Nn #1 {#2}
}
\NewDocumentCommand \DeclareSIQualifier { m m } {
  \__siunitx_declare_qualifier:Nn #1 {#2}
}
\NewDocumentCommand \DeclareSIUnit { O { } m m } {
  \__siunitx_declare_unit:Nnn #2 {#3} {#1}
}
\NewDocumentCommand \DeclareSIUnitWithOptions { m m m } {
  \__siunitx_declare_unit:Nnn #1 {#2} {#3}
}
\@onlypreamble \DeclareBinaryPrefix
\@onlypreamble \DeclareSIPostPower
\@onlypreamble \DeclareSIPrefix
\@onlypreamble \DeclareSIPrePower
\@onlypreamble \DeclareSIQualifier
\@onlypreamble \DeclareSIUnit
\@onlypreamble \DeclareSIUnitWithOptions
\cs_new_protected:Npn \SendSettingsToPgf { \__siunitx_pgf_link: }
\NewDocumentCommand \ang { o > { \SplitArgument { 2 } { ; } } m } {
  \group_begin:
    \IfNoValueF {#1}
      { \keys_set:nn { siunitx } {#1} }
    \__siunitx_angle_output:nnn #2
  \group_end:
}
\NewDocumentCommand \num { o m } {
  \leavevmode
  \group_begin:
    \bool_set_false:N \l__siunitx_font_set_bool
    \IfNoValueF {#1}
      { \keys_set:nn { siunitx } {#1} }
    \__siunitx_number_output:n {#2}
  \group_end:
}
\NewDocumentCommand \numlist { o > { \SplitList { ; } } m } {
  \leavevmode
  \group_begin:
    \bool_set_false:N \l__siunitx_font_set_bool
    \IfNoValueF {#1}
      { \keys_set:nn { siunitx } {#1} }
    \__siunitx_list_numbers:n {#2}
  \group_end:
}
\NewDocumentCommand \numrange { o m m } {
  \leavevmode
  \group_begin:
    \bool_set_false:N \l__siunitx_font_set_bool
    \IfNoValueF {#1}
      { \keys_set:nn { siunitx } {#1} }
    \__siunitx_range_numbers:nn {#2} {#3}
  \group_end:
}
\NewDocumentCommand \SIlist { o > { \SplitList { ; } } m m } {
  \leavevmode
  \group_begin:
    \bool_set_false:N \l__siunitx_font_set_bool
    \IfNoValueTF {#1}
      { \__siunitx_list_units:nnn {#2} {#3} { }  }
      {
        \keys_set:nn { siunitx } {#1}
        \__siunitx_list_units:nnn {#2} {#3} {#1}
      }
  \group_end:
}
\NewDocumentCommand \SIrange { o m m m } {
  \leavevmode
  \group_begin:
    \bool_set_false:N \l__siunitx_font_set_bool
    \IfNoValueTF {#1}
      { \__siunitx_range_unit:nnnn {#4} { } {#2} {#3} }
      {
        \keys_set:nn { siunitx } {#1}
        \__siunitx_range_unit:nnnn {#4} {#1} {#2} {#3}
      }
  \group_end:
}
\NewDocumentCommand \SI { o m o m } {
  \leavevmode
  \group_begin:
    \bool_set_false:N \l__siunitx_font_set_bool
    \IfNoValueTF {#1}
      { \__siunitx_combined:nnnn { } {#2} {#3} {#4} }
      {
        \keys_set:nn { siunitx } {#1}
        \__siunitx_combined:nnnn {#1} {#2} {#3} {#4}
      }
  \group_end:
}
\NewDocumentCommand \sisetup { m } {
  \keys_set:nn { siunitx } {#1}
}
\NewDocumentCommand \tablenum { o m } {
  \leavevmode
  \group_begin:
    \bool_set_false:N \l__siunitx_font_set_bool
    \IfNoValueF {#1}
      { \keys_set:nn { siunitx } {#1} }
    \bool_if:NTF \l__siunitx_number_parse_bool
      {
        \tl_set:Nn \l__siunitx_table_collect_tl {#2}
        \bool_set_false:N \l__siunitx_table_collect_pre_bool
        \__siunitx_table_print_S:
      }
      { \__siunitx_table_print_S_direct: #2 \__siunitx_table_print: }
  \group_end:
}
\NewDocumentCommand \si { o m } {
  \leavevmode
  \group_begin:
    \bool_set_false:N \l__siunitx_font_set_bool
    \IfNoValueTF {#1}
      { \__siunitx_unit_output:nn {#2} { } }
      {
        \keys_set:nn { siunitx } {#1}
        \__siunitx_unit_output:nn {#2} {#1}
      }
  \group_end:
}
\cs_new_protected:Npn \__siunitx_contents_bookmarks:
  {
    \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
      { \__siunitx_unit_print_literal_aux:N ##1 }
    \cs_if_exist:NT \FB@fg
      { \cs_set_eq:NN \fg \FB@fg }
    \msg_redirect_name:nnn { xparse } { redefine-command } { none }
    \cs_set_eq:NN \num      \numInBookmark
    \cs_set_eq:NN \numrange \numrangeInBookmark
    \cs_set_eq:NN \si       \siInBookmark
    \cs_set_eq:NN \SI       \SIInBookmark
    \cs_set_eq:NN \SIrange  \SIrangeInBookmark
    \cs_set_eq:NN \si       \siInBookmark
    \cs_set_eq:NN \highlight \use_ii:nn
    \cs_set_eq:NN \__siunitx_textsuperscript:n \use:n
    \cs_set:Npn \SIUnitSymbolAngstrom  { \AA }
    \cs_set:Npn \SIUnitSymbolArcminute { ' }
    \cs_set:Npn \SIUnitSymbolArcsecond { '' }
    \cs_set:Npn \SIUnitSymbolCelsius   { \textcelsius }
    \cs_set:Npn \SIUnitSymbolDegree    { \textdegree }
    \cs_set:Npn \SIUnitSymbolMicro     { \textmu }
    \cs_set:Npn \SIUnitSymbolOhm       { \textohm }
  }
\DeclareExpandableDocumentCommand \numInBookmark { o m } {#2}
\DeclareExpandableDocumentCommand \numrangeInBookmark { o m m }
  { #2 \l__siunitx_range_phrase_tl #3 }
\DeclareExpandableDocumentCommand \SIInBookmark { o m o m }
  { \IfNoValueF {#3} {#3} #2 ~ #4 }
\DeclareExpandableDocumentCommand \SIlistInBookmark
  { o m m } { \__siunitx_bookmark_SIlist_map:nn {#1} {#2} }
\DeclareExpandableDocumentCommand \SIrangeInBookmark
  { o m m m } { #2 ~ #4 \l__siunitx_range_phrase_tl #3 ~ #4 }
\DeclareExpandableDocumentCommand \siInBookmark { o m } {#2}
\cs_new:Npn \__siunitx_bookmark_SIlist_map:nn #1#2 {
  \__siunitx_bookmark_SIlist_map_aux:nw {#2} #1 ; \q_recursion_tail ;
    \q_recursion_tail ; \q_recursion_stop
}
\cs_new:Npn \__siunitx_bookmark_SIlist_map_aux:nw #1#2 ; #3 ; #4 {
  #2 ~ #1
  \quark_if_recursion_tail_stop:n {#3}
  \quark_if_recursion_tail_stop_do:nn {#4}
    {
      \l__siunitx_list_separator_final_tl
      #3 ~ #1
    }
  \l__siunitx_list_separator_tl
  \__siunitx_bookmark_SIlist_map_aux:nw {#1} #3 ; #4
}
\AtBeginDocument {
  \@ifpackageloaded { hyperref }
    { \pdfstringdefDisableCommands { \__siunitx_contents_bookmarks: } }
    { }
}
\DeclareSIUnit \kilogram { \kilo \gram }
\DeclareSIUnit \metre    { m }
\DeclareSIUnit \meter    { \metre }
\DeclareSIUnit \mole     { mol }
\DeclareSIUnit \second   { s }
\DeclareSIUnit \ampere   { A }
\DeclareSIUnit \kelvin   { K }
\DeclareSIUnit \candela  { cd }
\DeclareSIUnit \gram { g }
\DeclareSIPrefix \yocto { y } { -24 }
\DeclareSIPrefix \zepto { z } { -21 }
\DeclareSIPrefix \atto  { a } { -18 }
\DeclareSIPrefix \femto { f } { -15 }
\DeclareSIPrefix \pico  { p } { -12 }
\DeclareSIPrefix \nano  { n } { -9 }
\DeclareSIPrefix \micro { \SIUnitSymbolMicro } { -6 }
\DeclareSIPrefix \milli { m } { -3 }
\DeclareSIPrefix \centi { c } { -2 }
\DeclareSIPrefix \deci  { d } { -1 }
\DeclareSIPrefix \deca  { da } { 1 }
\DeclareSIPrefix \deka  { da } { 1 }
\DeclareSIPrefix \hecto { h }  { 2 }
\DeclareSIPrefix \kilo  { k }  { 3 }
\DeclareSIPrefix \mega  { M }  { 6 }
\DeclareSIPrefix \giga  { G }  { 9 }
\DeclareSIPrefix \tera  { T }  { 12 }
\DeclareSIPrefix \peta  { P }  { 15 }
\DeclareSIPrefix \exa   { E }  { 18 }
\DeclareSIPrefix \zetta { Z }  { 21 }
\DeclareSIPrefix \yotta { Y }  { 24 }
\DeclareSIUnit \becquerel     { Bq }
\DeclareSIUnit \celsius       { \SIUnitSymbolCelsius }
\DeclareSIUnit \degreeCelsius { \SIUnitSymbolCelsius }
\DeclareSIUnit \coulomb       { C }
\DeclareSIUnit \farad         { F }
\DeclareSIUnit \gray          { Gy }
\DeclareSIUnit \hertz         { Hz }
\DeclareSIUnit \henry         { H }
\DeclareSIUnit \joule         { J }
\DeclareSIUnit \katal         { kat }
\DeclareSIUnit \lumen         { lm }
\DeclareSIUnit \lux           { lx }
\DeclareSIUnit \newton    { N }
\DeclareSIUnit \ohm       { \SIUnitSymbolOhm }
\DeclareSIUnit \pascal    { Pa }
\DeclareSIUnit \radian    { rad }
\DeclareSIUnit \siemens   { S }
\DeclareSIUnit \sievert   { Sv }
\DeclareSIUnit \steradian { sr }
\DeclareSIUnit \tesla     { T }
\DeclareSIUnit \volt      { V }
\DeclareSIUnit \watt      { W }
\DeclareSIUnit \weber     { Wb }
\DeclareSIUnit [ number-unit-product = ] \arcmin { \arcminute }
\DeclareSIUnit [ number-unit-product = ]
  \arcminute { \SIUnitSymbolArcminute }
\DeclareSIUnit [ number-unit-product = ]
  \arcsecond { \SIUnitSymbolArcsecond }
\DeclareSIUnit \day { d }
\DeclareSIUnit[ number-unit-product = ]  \degree { \SIUnitSymbolDegree }
\DeclareSIUnit \hectare { ha }
\DeclareSIUnit \hour    { h }
\DeclareSIUnit \litre   { l }
\DeclareSIUnit \liter   { L }
\DeclareSIUnit \minute  { min }
\DeclareSIUnit \percent { \char 37 }
\DeclareSIUnit \tonne   { t }
\DeclareSIUnit \astronomicalunit { au }
\DeclareSIUnit \atomicmassunit   { u }
\DeclareSIUnit \electronvolt     { eV }
\DeclareSIUnit \dalton           { Da }
\group_begin:
\cs_set_eq:NN \endgroup \group_end:
\char_set_catcode_math_subscript:N \_
\use:n
  {
    \endgroup
    \DeclareSIUnit \clight { \text { \ensuremath { c _ { 0 } } } }
    \DeclareSIUnit \electronmass
      { \text { \ensuremath { m _ { \textup { e } } } } }
  }
\DeclareSIUnit \planckbar { \text { \ensuremath { \hbar } } }
\DeclareSIUnit \elementarycharge { \text { \ensuremath { e } } }
\group_begin:
\cs_set_eq:NN \endgroup \group_end:
\char_set_catcode_math_subscript:N \_
\use:n
  {
    \endgroup
    \DeclareSIUnit \bohr { \text { \ensuremath { a _ { 0 } } } }
    \DeclareSIUnit \hartree
      { \text { \ensuremath { E _ { \textup { h } } } } }
  }
\DeclareSIUnit \angstrom     { \SIUnitSymbolAngstrom }
\DeclareSIUnit \bar          { bar }
\DeclareSIUnit \barn         { b }
\DeclareSIUnit \bel          { B }
\DeclareSIUnit \decibel      { \deci \bel }
\DeclareSIUnit \knot         { kn }
\DeclareSIUnit \mmHg         { mmHg }
\DeclareSIUnit \nauticalmile { M }
\DeclareSIUnit \neper        { Np }
\DeclareSIPrePower  \square  { 2 }
\DeclareSIPostPower \squared { 2 }
\DeclareSIPrePower  \cubic   { 3 }
\DeclareSIPostPower \cubed   { 3 }
\keys_define:nn { siunitx } {
  strict .code:n =
    {
      \keys_set:nn { siunitx }
        {
          bracket-numbers  = true,
          detect-family    = false,
          detect-mode      = false,
          detect-shape     = false,
          detect-weight    = false,
          multi-part-units = brackets,
          parse-numbers    = true,
          parse-units      = true,
          product-units    = repeat
        }
      \__siunitx_strict_option:n
        {
          bracket-numbers  ,
          detect-family    ,
          detect-italic    ,
          detect-mode      ,
          detect-shape     ,
          detect-weight    ,
          multi-part-units ,
          parse-numbers    ,
          parse-units      ,
          product-units
        }
      \keys_define:nn { siunitx }
        {
          per-mode / repeated-symbol .code:n =
            {
              \msg_warning:nnx { siunitx } { option-not-available }
                {  per-mode~=~repeated-symbol }
            }
        }
    }
}
\__siunitx_option_deactivate:n { strict }
\cs_new_protected:Npn \__siunitx_strict_option:n #1 {
  \clist_map_function:nN {#1} \__siunitx_strict_option_aux:n
}
\cs_new_protected:Npn \__siunitx_strict_option_aux:n #1 {
  \keys_define:nn { siunitx }
    { #1 .code:n =
      { \msg_warning:nnx { siunitx } { option-not-available } {#1} }
    }
}
\keys_define:nn { siunitx } {
  locale .choice:,
  locale /
    DE   .meta:n =
      {
        exponent-product      = \ensuremath { \cdot } ,
        inter-unit-product    = \,                    ,
        output-decimal-marker = { , }
      },
  locale /
    FR   .meta:n =
      {
        exponent-product      = \ensuremath { \times } ,
        inter-unit-product    = \,                     ,
        output-decimal-marker = { , }
      },
  locale /
    UK   .meta:n =
      {
        exponent-product      = \ensuremath { \times } ,
        inter-unit-product    = \,                     ,
        output-decimal-marker = .
      },
  locale /
    US   .meta:n = { locale = UK },
  locale /
    USA  .meta:n = { locale = UK },
  locale /
    ZA   .meta:n =
      {
        exponent-product      = \ensuremath { \times } ,
        inter-unit-product    = \ensuremath { \cdot }  ,
        output-decimal-marker = { , }
      },
}
\file_if_exist:nT { translator.sty }
  {
    \RequirePackage { translator }
    \usedictionary { translator-basic-dictionary }
    \providetranslation [ to = English ]
      { to~(numerical~range) } { to }
    \providetranslation [ to = French ]
      { to~(numerical~range) } { \`a }
    \providetranslation [ to = German ]
      { to~(numerical~range) } { bis }
    \providetranslation [ to = Spanish ]
      { to~(numerical~range) } { a }
    \sisetup
      {
        list-final-separator = { ~ \translate { and } ~ },
        list-pair-separator  = { ~ \translate { and } ~ },
        range-phrase         = { ~ \translate { to~(numerical~range) } ~ }
      }
  }
\tl_const:Nn \c__siunitx_configuration_ext_tl { cfg }
\keys_define:nn { siunitx }
  {
    abbreviations .choice:,
    abbreviations /
      true        .code:n    = { \__siunitx_load_abbreviations: },
    abbreviations /
      false       .code:n    =
        { \cs_set_eq:NN \__siunitx_load_abbreviations: \prg_do_nothing: } ,
    abbreviations .default:n = true ,
    binary-units  .choice:,
    binary-units  /
      true        .code:n    = { \AtBeginDocument { \__siunitx_load_binary: } },
    binary-units  /
      false       .code:n    =
        { \cs_set_eq:NN \__siunitx_load_binary: \prg_do_nothing: } ,
    binary-units  .default:n = true
  }
\cs_new_protected:Npn \__siunitx_load_abbreviations:
  {
    \@onefilewithoptions { siunitx-abbreviations } [ ] [ ]
      \c__siunitx_configuration_ext_tl
  }
\cs_new_protected:Npn \__siunitx_load_binary:
  {
    \@onefilewithoptions { siunitx-binary } [ ] [ ]
      \c__siunitx_configuration_ext_tl
  }
\AtBeginDocument { \__siunitx_load_abbreviations: }
\__siunitx_option_deactivate:n { abbreviations , binary }
\keys_define:nn { siunitx }
  {
    version-1-compatibility .choice:          ,
    version-1-compatibility /
      true                  .code:n    =
        {
          \@onefilewithoptions { siunitx-version-1 } [ ] [ ]
            \c__siunitx_configuration_ext_tl
        },
    version-1-compatibility /
      false                 .code:n    = { } ,
    version-1-compatibility .default:n = true
  }
\__siunitx_option_deactivate:n { version-1-compatibility }
\keys_define:nn { siunitx } {
  load-configurations .code:n =
    {
      \clist_if_in:nnT {#1} { version-1 }
        {
          \@onefilewithoptions { siunitx-version-1 } [ ] [ ]
            \c__siunitx_configuration_ext_tl
        }
    }
}
\__siunitx_option_deactivate:n { load-configurations }
\file_if_exist:nT { siunitx . \c__siunitx_configuration_ext_tl }
  {
    \@onefilewithoptions { siunitx } [ ] [ ]
      \c__siunitx_configuration_ext_tl
  }
\ProcessKeysOptions { siunitx }
\AtBeginDocument {
  \bool_if:NTF \l__siunitx_create_free_bool
    { \__siunitx_unit_create_functions: }
    { \__siunitx_unit_create_empty_functions: }
}
%% Copyright (C) 2008-2021 by
%%   Joseph Wright <joseph.wright@morningstar2.co.uk>
%% 
%% It may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License (LPPL), either version 1.3c of
%% this license or (at your option) any later version.  The latest
%% version of this license is in the file:
%%    http://www.latex-project.org/lppl.txt
%% 
%% This work is "maintained" (as per LPPL maintenance status) by
%%   Joseph Wright.
%% 
%% This work consists of the file  siunitx.dtx
%%           and the derived files siunitx.pdf,
%%                                 siunitx.sty and
%%                                 siunitx.ins.
%%
%% End of file `siunitx-v2.sty'.