%%
%% This is file `siunitx.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% siunitx.dtx  (with options: `package,init')
%% siunitx-angle.dtx  (with options: `package')
%% siunitx-complex.dtx  (with options: `package')
%% siunitx-compound.dtx  (with options: `package')
%% siunitx-locale.dtx  (with options: `package')
%% siunitx-number.dtx  (with options: `package')
%% siunitx-print.dtx  (with options: `package')
%% siunitx-table.dtx  (with options: `package')
%% siunitx-unit.dtx  (with options: `package')
%% siunitx-quantity.dtx  (with options: `package')
%% siunitx-symbol.dtx  (with options: `package')
%% siunitx-abbreviation.dtx  (with options: `package')
%% siunitx-binary.dtx  (with options: `package')
%% siunitx-command.dtx  (with options: `package')
%% siunitx-emulation.dtx  (with options: `package,options')
%% siunitx.dtx  (with options: `package,options')
%% siunitx.dtx  (with options: `package,interfaces')
%% siunitx-emulation.dtx  (with options: `package,interfaces')
%% 
\providecommand\DeclareRelease[3]{}
\providecommand\DeclareCurrentRelease[2]{}
\DeclareRelease{2}{2010-05-23}{siunitx-v2.sty}
\DeclareRelease{v2}{2010-05-23}{siunitx-v2.sty}
\DeclareCurrentRelease{}{2021-05-17}
\@ifundefined{ExplLoaderFileDate}
  {\RequirePackage{expl3}}
  {}
\@ifl@t@r\ExplLoaderFileDate{2020-01-09}
  {}
  {%
    \PackageError{siunitx}{Support package expl3 too old}
      {%
        You need to update your installation of the bundles 'l3kernel' and
        'l3packages'.\MessageBreak
        Loading~siunitx~will~abort!%
      }%
    \endinput
  }%
\ProvidesExplPackage {siunitx} {2022-02-15} {3.0.49}
  {A comprehensive (SI) units package}
\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
  {
    \@ifpackageloaded {#1}
      { \msg_error:nnx { siunitx } { incompatible-package } {#1} }
      { }
  }
\clist_map_function:nN
  { SIunits , sistyle , unitsdef , fancyunits }
  \__siunitx_load_check:n
\AtBeginDocument
  {
    \clist_map_function:nN { SIunits , sistyle }
      \__siunitx_load_check:n
  }
\providecommand \IfFormatAtLeastTF { \@ifl@t@r \fmtversion }
\tl_new:N \l__siunitx_tmp_tl
\bool_new:N \l__siunitx_angle_tmp_bool
\dim_new:N \l__siunitx_angle_tmp_dim
\tl_new:N \l__siunitx_angle_tmp_tl
\keys_define:nn { siunitx }
  {
    angle-mode .choice: ,
    angle-mode / arc .code:n =
      {
        \bool_set_true:N \l__siunitx_angle_force_arc_bool
        \bool_set_false:N \l__siunitx_angle_force_decimal_bool
      } ,
    angle-mode / decimal .code:n =
      {
        \bool_set_false:N \l__siunitx_angle_force_arc_bool
        \bool_set_true:N \l__siunitx_angle_force_decimal_bool
      } ,
    angle-mode / input .code:n =
      {
        \bool_set_false:N \l__siunitx_angle_force_arc_bool
        \bool_set_false:N \l__siunitx_angle_force_decimal_bool
      } ,
    angle-symbol-degree .tl_set:N =
      \l__siunitx_angle_symbol_degree_tl ,
    angle-symbol-minute .tl_set:N =
      \l__siunitx_angle_symbol_minute_tl ,
    angle-symbol-second .tl_set:N =
      \l__siunitx_angle_symbol_second_tl ,
    angle-symbol-over-decimal .bool_set:N =
      \l__siunitx_angle_astronomy_bool ,
    angle-separator .tl_set:N =
      \l__siunitx_angle_separator_tl ,
    fill-angle-degrees .bool_set:N =
      \l__siunitx_angle_fill_degrees_bool ,
    fill-angle-minutes .bool_set:N =
      \l__siunitx_angle_fill_minutes_bool ,
    fill-angle-seconds .bool_set:N =
      \l__siunitx_angle_fill_seconds_bool ,
    number-angle-product .tl_set:N =
      \l__siunitx_angle_product_tl
  }
\bool_new:N \l__siunitx_angle_force_arc_bool
\bool_new:N \l__siunitx_angle_force_decimal_bool
\cs_new_protected:Npn \siunitx_angle:n #1
  {
    \bool_if:NTF \l__siunitx_angle_force_arc_bool
      { \exp_args:Ne \__siunitx_angle_arc_convert:n { \fp_eval:n {#1} } }
      {
        \siunitx_number_parse:nN {#1} \l__siunitx_angle_degrees_tl
        \siunitx_number_process:NN \l__siunitx_angle_degrees_tl \l__siunitx_angle_degrees_tl
        \tl_set:Nx \l__siunitx_angle_degrees_tl
          { \siunitx_number_output:NN \l__siunitx_angle_degrees_tl \q_nil }
        \__siunitx_angle_arc_print:VVV
          \l__siunitx_angle_degrees_tl
          \c_empty_tl
          \c_empty_tl
      }
  }
\cs_new_protected:Npn \siunitx_angle:nnn #1#2#3
  {
    \bool_if:NTF \l__siunitx_angle_force_decimal_bool
      {
        \exp_args:Ne \siunitx_angle:n
          { \fp_eval:n { #1 + (#2) / 60 + (#3) / 3600 } }
      }
      { \__siunitx_angle_arc_sign:nnn {#1} {#2} {#3} }
  }
\cs_new_protected:Npn \__siunitx_angle_arc_convert:n #1
  {
    \use:x
      {
        \siunitx_angle:nnn
          { \fp_eval:n { trunc(#1,0) } }
          { \fp_eval:n { trunc((#1 - trunc(#1,0)) * 60,0) } }
          {
            \fp_eval:n
              {
                (
                          (#1 - trunc(#1,0)) * 60
                  - trunc((#1 - trunc(#1,0)) * 60,0)
                )
                * 60
              }
          }
      }
  }
\tl_new:N \l__siunitx_angle_degrees_tl
\tl_new:N \l__siunitx_angle_minutes_tl
\tl_new:N \l__siunitx_angle_seconds_tl
\tl_new:N \l__siunitx_angle_sign_tl
\cs_new_protected:Npn \__siunitx_angle_arc_sign:nnn #1#2#3
  {
    \group_begin:
      \keys_set:nn { siunitx }
        {
          input-close-uncertainty = ,
          input-exponent-markers  = ,
          input-open-uncertainty  = ,
          input-uncertainty-signs =
        }
      \tl_clear:N \l__siunitx_angle_sign_tl
      \__siunitx_angle_arc_sign:nn {#1} { degrees }
      \__siunitx_angle_arc_sign:nn {#2} { minutes }
      \__siunitx_angle_arc_sign:nn {#3} { seconds }
      \tl_if_empty:NF \l__siunitx_angle_sign_tl
        {
          \clist_map_inline:nn { degrees , minutes , seconds }
            {
              \tl_if_empty:cF { l__siunitx_angle_ ##1 _tl }
                {
                  \tl_set:cx { l__siunitx_angle_ ##1 _tl }
                    {
                       { }
                       { \exp_not:V \l__siunitx_angle_sign_tl }
                       \exp_after:wN \exp_after:wN \exp_after:wN
                         \__siunitx_angle_sign:nnnnnnn
                           \cs:w l__siunitx_angle_ ##1 _tl \cs_end:
                    }
                  \clist_map_break:
                }
            }
        }
      \clist_map_inline:nn { degrees , minutes , seconds }
        {
          \tl_if_empty:cF { l__siunitx_angle_ ##1 _tl }
            {
              \exp_args:Ncc \siunitx_number_process:NN
                { l__siunitx_angle_ ##1 _tl } { l__siunitx_angle_ ##1 _tl }
              \tl_set:cx { l__siunitx_angle_ ##1 _tl }
                {
                  \exp_args:Nc \siunitx_number_output:NN
                    { l__siunitx_angle_ ##1 _tl } \q_nil
                }
            }
        }
      \__siunitx_angle_arc_print:VVV
        \l__siunitx_angle_degrees_tl
        \l__siunitx_angle_minutes_tl
        \l__siunitx_angle_seconds_tl
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_angle_arc_sign:nn #1#2
  {
    \tl_if_blank:nTF {#1}
      {
        \bool_if:cTF { l__siunitx_angle_fill_ #2 _bool }
          {
            \tl_set:cn { l__siunitx_angle_ #2 _tl }
              { { } { } { 0 } { } { } { } { 0 } }
          }
          { \tl_clear:c { l__siunitx_angle_ #2 _tl } }
      }
      {
        \siunitx_number_parse:nN {#1} \l__siunitx_angle_tmp_tl
        \exp_after:wN \__siunitx_angle_extract_sign:nnnnnnnn \l__siunitx_angle_tmp_tl {#2}
      }
  }
\cs_new_protected:Npn \__siunitx_angle_extract_sign:nnnnnnnn #1#2#3#4#5#6#7#8
  {
    \tl_if_blank:nTF {#2}
      { \tl_set_eq:cN { l__siunitx_angle_ #8 _tl } \l__siunitx_angle_tmp_tl }
      {
        \tl_set:cn { l__siunitx_angle_ #8 _tl }
          { {#1} { } {#3} {#4} {#5} {#6} {#7} }
        \tl_set:Nn \l__siunitx_angle_sign_tl {#2}
        \keys_set:nn { siunitx }
          { input-comparators = , input-signs = }
      }
  }
\cs_new:Npn \__siunitx_angle_sign:nnnnnnn #1#2#3#4#5#6#7
  { \exp_not:n { {#3} {#4} {#5} {#6} {#7} } }
\box_new:N \l__siunitx_angle_marker_box
\box_new:N \l__siunitx_angle_unit_box
\cs_new_protected:Npn \__siunitx_angle_arc_print:nnn #1#2#3
  {
    \__siunitx_angle_arc_print_auxi:nVn {#1}
      \l__siunitx_angle_symbol_degree_tl {#2#3}
    \__siunitx_angle_arc_print_auxi:nVn {#2}
      \l__siunitx_angle_symbol_minute_tl {#3}
    \__siunitx_angle_arc_print_auxi:nVn {#3}
      \l__siunitx_angle_symbol_second_tl { }
  }
\cs_generate_variant:Nn \__siunitx_angle_arc_print:nnn { VVV }
\cs_new_protected:Npn \__siunitx_angle_arc_print_auxi:nnn #1#2#3
  {
    \tl_if_blank:nF {#1}
      {
        \bool_if:NTF \l__siunitx_angle_astronomy_bool
          { \__siunitx_angle_arc_print_auxii:nw {#2} #1 \q_stop }
          {
            \__siunitx_angle_arc_print_auxv:w #1 \q_stop
            \__siunitx_angle_arc_print_auxvi:n {#2}
          }
        \tl_if_blank:nF {#3}
          {
            \nobreak
            \l__siunitx_angle_separator_tl
          }
      }
  }
\cs_generate_variant:Nn \__siunitx_angle_arc_print_auxi:nnn { nV }
\cs_new_protected:Npn \__siunitx_angle_arc_print_auxii:nw
  #1#2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_stop
  {
    \mode_if_math:TF
      { \bool_set_true:N \l__siunitx_angle_tmp_bool }
      { \bool_set_false:N \l__siunitx_angle_tmp_bool }
    \siunitx_print_number:n {#2#3#4}
    \tl_if_blank:nTF {#6}
      { \__siunitx_angle_arc_print_auxvi:n {#1} }
      {
        \hbox_set:Nn \l__siunitx_angle_marker_box
          {
            \__siunitx_angle_arc_print_auxiii:n
               { \siunitx_print_number:n {#5} }
          }
        \hbox_set:Nn \l__siunitx_angle_unit_box
          {
            \__siunitx_angle_arc_print_auxiii:n
              {
                \siunitx_unit_format:nN {#1} \l__siunitx_angle_tmp_tl
                \siunitx_print_unit:V \l__siunitx_angle_tmp_tl
                \skip_horizontal:n { -\scriptspace }
              }
          }
        \dim_compare:nNnTF { \box_wd:N \l__siunitx_angle_marker_box } >
          { \box_wd:N \l__siunitx_angle_unit_box }
          {
            \__siunitx_angle_arc_print_auxiv:NN
              \l__siunitx_angle_marker_box
              \l__siunitx_angle_unit_box
          }
          {
            \__siunitx_angle_arc_print_auxiv:NN
              \l__siunitx_angle_unit_box
              \l__siunitx_angle_marker_box
          }
        \hbox_set_to_wd:Nnn \l__siunitx_angle_marker_box
          \l__siunitx_angle_tmp_dim
          {
            \hbox_overlap_right:n
              { \box_use_drop:N \l__siunitx_angle_marker_box }
            \hbox_overlap_right:n
              { \box_use_drop:N \l__siunitx_angle_unit_box }
            \tex_hfil:D
          }
        \box_use:N \l__siunitx_angle_marker_box
        \skip_horizontal:N \scriptspace
        \siunitx_print_number:n {#6}
      }
  }
\cs_new_protected:Npn \__siunitx_angle_arc_print_auxiii:n #1
  {
    \bool_if:NTF \l__siunitx_angle_tmp_bool
      { \ensuremath }
      { \use:n }
        {#1}
  }
\cs_new_protected:Npn \__siunitx_angle_arc_print_auxiv:NN #1#2
  {
    \dim_set:Nn \l__siunitx_angle_tmp_dim { \box_wd:N #1 }
    \hbox_set_to_wd:Nnn #2
      \l__siunitx_angle_tmp_dim
      {
        \tex_hss:D
        \hbox_unpack_drop:N #2
        \tex_hss:D
      }
  }
\cs_new_protected:Npn \__siunitx_angle_arc_print_auxv:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_stop
  { \siunitx_print_number:n {#1#2#3#4#5} }
\cs_new_protected:Npn \__siunitx_angle_arc_print_auxvi:n #1
  {
    \nobreak
    \l__siunitx_angle_product_tl
    \siunitx_unit_format:nN {#1} \l__siunitx_angle_tmp_tl
    \siunitx_print_unit:V \l__siunitx_angle_tmp_tl
  }
\keys_set:nn { siunitx }
  {
    angle-mode                = input      ,
    angle-symbol-degree       = \degree    ,
    angle-symbol-minute       = \arcminute ,
    angle-symbol-over-decimal = false      ,
    angle-symbol-second       = \arcsecond ,
    angle-separator           =            ,
    fill-angle-degrees        = false      ,
    fill-angle-minutes        = false      ,
    fill-angle-seconds        = false      ,
    number-angle-product      =
  }
\fp_new:N \l__siunitx_complex_tmp_fp
\tl_new:N \l__siunitx_complex_tmp_tl
\tl_new:N \l__siunitx_complex_input_tl
\tl_new:N \l__siunitx_complex_comparator_tl
\tl_new:N \l__siunitx_complex_exp_tl
\tl_new:N \l__siunitx_complex_real_tl
\tl_new:N \l__siunitx_complex_img_tl
\tl_new:N \l__siunitx_complex_join_tl
\tl_new:N \l__siunitx_complex_sign_tl
\bool_new:N \l__siunitx_complex_root_after_bool
\keys_define:nn { siunitx }
  {
    complex-root-position .choice: ,
    complex-root-position / after-number .code:n =
      { \bool_set_true:N \l__siunitx_complex_root_after_bool } ,
    complex-root-position / before-number .code:n =
      { \bool_set_false:N \l__siunitx_complex_root_after_bool } ,
    input-complex-root .tl_set:N =
      \l__siunitx_complex_input_root_tl ,
    output-complex-root .tl_set:N =
      \l__siunitx_complex_output_root_tl
  }
\cs_new_protected:Npn \__siunitx_complex_parse:nNN #1#2#3
  {
    \group_begin:
      \__siunitx_complex_parse_clear:
      \protected@edef \l__siunitx_complex_arg_tl {#1}
      \tl_set_eq:NN \l__siunitx_complex_input_tl \l__siunitx_complex_arg_tl
      \siunitx_number_normalize_symbols:N \l__siunitx_complex_arg_tl
      \tl_if_empty:NF \l__siunitx_complex_arg_tl
        { \__siunitx_complex_parse_comparator: }
      \__siunitx_complex_parse_check:
      \cs_set_protected:Npx \__siunitx_complex_parse_end:
        {
          \tl_set:Nn \exp_not:N #2 { \exp_not:V \l__siunitx_complex_real_tl }
          \tl_set:Nn \exp_not:N #3 { \exp_not:V \l__siunitx_complex_img_tl }
        }
    \exp_after:wN \group_end:
    \__siunitx_complex_parse_end:
  }
\cs_new_protected:Npn \__siunitx_complex_parse_end: { }
\cs_new_protected:Npn \__siunitx_complex_parse_clear:
  {
    \tl_clear:N \l__siunitx_complex_real_tl
    \tl_clear:N \l__siunitx_complex_img_tl
    \tl_clear:N \l__siunitx_complex_exp_tl
    \tl_clear:N \l__siunitx_complex_sign_tl
    \tl_clear:N \l__siunitx_complex_join_tl
  }
\cs_new_protected:Npn \__siunitx_complex_parse_check:
  {
    \bool_lazy_all:nTF
      {
        { \tl_if_empty_p:N \l__siunitx_complex_real_tl }
        { \tl_if_empty_p:N \l__siunitx_complex_img_tl }
        { \tl_if_empty_p:N \l__siunitx_complex_exp_tl }
      }
      {
        \msg_error:nnx { siunitx } { invalid-complex-number }
          { \exp_not:V \l__siunitx_complex_input_tl }
      }
      { \__siunitx_complex_parse_finalise: }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_finalise:
  {
    \tl_if_empty:NTF \l__siunitx_complex_img_tl
      { \__siunitx_complex_parse_finalise:N \l__siunitx_complex_real_tl }
      {
        \tl_if_empty:NTF \l__siunitx_complex_real_tl
          { \__siunitx_complex_parse_finalise:N \l__siunitx_complex_img_tl }
          {
            \__siunitx_complex_parse_finalise:N \l__siunitx_complex_real_tl
            \tl_set_eq:NN \l__siunitx_complex_sign_tl \l__siunitx_complex_join_tl
            \__siunitx_complex_parse_finalise:N \l__siunitx_complex_img_tl
          }
      }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_finalise:N #1
  {
    \tl_set:Nx #1
      {
        \exp_not:V \l__siunitx_complex_comparator_tl
        \exp_not:V \l__siunitx_complex_sign_tl
        \exp_not:V #1
        \exp_not:V \l__siunitx_complex_exp_tl
      }
    \tl_clear:N \l__siunitx_complex_comparator_tl
    \tl_clear:N \l__siunitx_complex_sign_tl
    \siunitx_number_parse:VN #1 #1
  }
\cs_new_protected:Npn \__siunitx_complex_parse_comparator:
  {
    \exp_after:wN \__siunitx_complex_parse_comparator_aux:Nw
      \l__siunitx_complex_arg_tl \q_stop
  }
\cs_new_protected:Npn \__siunitx_complex_parse_comparator_aux:Nw #1#2 \q_stop
  {
    \tl_if_in:NnTF \l_siunitx_number_input_comparator_tl {#1}
      {
        \tl_set:Nn \l__siunitx_complex_comparator_tl {#1}
        \tl_set:Nn \l__siunitx_complex_arg_tl {#2}
      }
      { \tl_clear:N \l__siunitx_complex_comparator_tl }
    \tl_if_empty:NF \l__siunitx_complex_arg_tl
      { \__siunitx_complex_parse_sign: }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_exponent:
  {
    \tl_if_empty:NTF \l_siunitx_number_input_exponent_tl
      { \__siunitx_complex_parse_root: }
      {
        \tl_set:Nx \l__siunitx_complex_tmp_tl
          { \tl_head:V \l_siunitx_number_input_exponent_tl }
        \tl_map_inline:Nn \l_siunitx_number_input_exponent_tl
          {
            \tl_replace_all:NnV \l__siunitx_complex_arg_tl
              {##1} \l__siunitx_complex_tmp_tl
          }
        \use:x
          {
            \cs_set_protected:Npn
              \exp_not:N \__siunitx_complex_parse_exponent_auxi:w
              ####1 \exp_not:V \l__siunitx_complex_tmp_tl
              ####2 \exp_not:V \l__siunitx_complex_tmp_tl
              ####3 \exp_not:N \q_stop
          }
            { \__siunitx_complex_parse_exponent_auxii:nn {##1} {##2} }
        \use:x
          {
            \__siunitx_complex_parse_exponent_auxi:w
              \exp_not:V \l__siunitx_complex_arg_tl
              \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_nil
              \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_stop
          }
      }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_exponent_auxi:w  { }
\cs_new_protected:Npn \__siunitx_complex_parse_exponent_auxii:nn #1#2
  {
    \quark_if_nil:nF {#2}
      {
        \tl_set:Nn \l__siunitx_complex_arg_tl {#1}
        \tl_set:Nx \l__siunitx_complex_exp_tl
          { \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:n {#2} }
      }
    \__siunitx_complex_parse_root:
  }
\cs_new_protected:Npn \__siunitx_complex_parse_root:
  {
    \tl_if_empty:NTF \l__siunitx_complex_input_root_tl
      { \tl_set_eq:NN \l__siunitx_complex_real_tl \l__siunitx_complex_arg_tl }
      {
        \tl_set:Nx \l__siunitx_complex_tmp_tl
          { \tl_head:V \l__siunitx_complex_input_root_tl }
        \tl_map_inline:Nn \l__siunitx_complex_input_root_tl
          {
            \tl_replace_all:NnV \l__siunitx_complex_arg_tl
              {##1} \l__siunitx_complex_tmp_tl
          }
        \use:x
          {
            \cs_set_protected:Npn
              \exp_not:N \__siunitx_complex_parse_root_auxi:w
              ####1 \exp_not:V \l__siunitx_complex_tmp_tl
              ####2 \exp_not:V \l__siunitx_complex_tmp_tl
              ####3 \exp_not:N \q_stop
          }
            { \__siunitx_complex_parse_root_auxii:nn {##1} {##2} }
        \use:x
          {
            \__siunitx_complex_parse_root_auxi:w
              \exp_not:V \l__siunitx_complex_arg_tl
              \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_nil
              \exp_not:V \l__siunitx_complex_tmp_tl \exp_not:N \q_stop
          }
      }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_root_auxi:w  { }
\cs_new_protected:Npn \__siunitx_complex_parse_root_auxii:nn #1#2
  {
    \quark_if_nil:nTF {#2}
      { \tl_set:Nn \l__siunitx_complex_real_tl {#1} }
      {
        \tl_set:Nn \l__siunitx_complex_img_tl {#2}
        \tl_if_blank:nTF {#1}
          {
            \tl_if_blank:nT {#2}
              { \tl_set:Nn \l__siunitx_complex_img_tl { 1 } }
          }
          {
            \tl_if_blank:nTF {#2}
              { \__siunitx_complex_parse_split:n {#1} }
              { \__siunitx_complex_parse_sign_check:n {#1} }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_sign:
  {
    \exp_after:wN \__siunitx_complex_parse_sign_aux:Nw
      \l__siunitx_complex_arg_tl \q_stop
  }
\cs_new_protected:Npn \__siunitx_complex_parse_sign_aux:Nw #1#2 \q_stop
  {
    \tl_if_in:NnT \l_siunitx_number_input_sign_tl {#1}
      {
        \tl_set:Nn \l__siunitx_complex_sign_tl {#1}
        \tl_set:Nn \l__siunitx_complex_arg_tl {#2}
      }
    \tl_if_empty:NF \l__siunitx_complex_arg_tl
      { \__siunitx_complex_parse_exponent: }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_sign_check:n #1
  {
    \__siunitx_complex_parse_sign_check:nN { } #1 \q_recursion_tail \q_recursion_stop
  }
\cs_new_protected:Npn \__siunitx_complex_parse_sign_check:nN #1#2
  {
    \quark_if_recursion_tail_stop_do:Nn #2
      { \__siunitx_complex_parse_clear: }
    \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#2}
      { \__siunitx_complex_parse_sign_check:nNw {#1} #2 }
      { \__siunitx_complex_parse_sign_check:nN {#1#2} }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_sign_check:nNw
  #1#2 #3 \q_recursion_tail \q_recursion_stop
  {
    \tl_if_blank:nTF {#3}
      {
        \tl_if_blank:nTF {#1}
          { \__siunitx_complex_parse_clear: }
          {
            \tl_set:Nn \l__siunitx_complex_real_tl {#1}
            \tl_set:Nn \l__siunitx_complex_join_tl {#2}
          }
      }
      { \__siunitx_complex_parse_clear: }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_split:n #1
  {
    \__siunitx_complex_parse_split:nN { } #1 \q_recursion_tail \q_recursion_stop
  }
\cs_new_protected:Npn \__siunitx_complex_parse_split:nN #1#2
  {
    \quark_if_recursion_tail_stop_do:Nn #2
      { \tl_set:Nn \l__siunitx_complex_img_tl {#1} }
    \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#2}
      {
        \tl_set:Nn \l__siunitx_complex_real_tl {#1}
        \tl_set:Nn \l__siunitx_complex_join_tl {#2}
        \__siunitx_complex_parse_split:w
      }
      { \__siunitx_complex_parse_split:nN {#1#2} }
  }
\cs_new_protected:Npn \__siunitx_complex_parse_split:w #1 \q_recursion_tail \q_recursion_stop
  {
    \tl_set:Nx \l__siunitx_complex_img_tl
      {
        \tl_if_blank:nTF {#1}
          { 1 }
          { \exp_not:n {#1} }
     }
    \tl_if_empty:NT \l__siunitx_complex_real_tl
      { \__siunitx_complex_parse_clear: }
  }
\tl_new:N \l__siunitx_complex_bracket_close_tl
\tl_new:N \l__siunitx_complex_bracket_open_tl
\tl_set:Nn \l__siunitx_complex_bracket_open_tl { ( }
\tl_set:Nn \l__siunitx_complex_bracket_close_tl { ) }
\tl_new:N \l__siunitx_complex_unit_tl
\cs_new_protected:Npn \siunitx_complex_number:n #1
  {
    \group_begin:
      \bool_if:NTF \l_siunitx_number_parse_bool
        {
          \__siunitx_complex_parse:nNN {#1} \l__siunitx_complex_real_tl \l__siunitx_complex_img_tl
          \__siunitx_complex_format:n { }
        }
        {
          \siunitx_number_format:nN {#1} \l__siunitx_complex_tmp_tl
          \siunitx_print_number:V \l__siunitx_complex_tmp_tl
        }
    \group_end:
  }
\cs_new_protected:Npn \siunitx_complex_quantity:nn #1#2
  {
    \group_begin:
      \bool_if:NTF \l_siunitx_number_parse_bool
        {
          \__siunitx_complex_parse:nNN {#1} \l__siunitx_complex_real_tl \l__siunitx_complex_img_tl
          \__siunitx_complex_format:n {#2}
        }
        { \siunitx_quantity:nn {#1} {#2} }
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_complex_format:n #1
  {
    \bool_lazy_and:nnF
      { \tl_if_empty_p:N \l__siunitx_complex_real_tl }
      { \tl_if_empty_p:N \l__siunitx_complex_img_tl }
      { \__siunitx_complex_format_auxi:n {#1} }
  }
\cs_new_protected:Npn \__siunitx_complex_format_auxi:n #1
  {
    \tl_clear:N \l__siunitx_complex_tmp_tl
    \tl_if_empty:NTF \l__siunitx_complex_img_tl
      {
        \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl
        \tl_set:Nx \l__siunitx_complex_tmp_tl
          { \siunitx_number_output:N \l__siunitx_complex_real_tl }
      }
      { \__siunitx_complex_format_auxii:n {#1} }
    \tl_if_blank:nTF {#1}
      { \siunitx_print_number:V \l__siunitx_complex_tmp_tl }
      { \siunitx_quantity_print:VV \l__siunitx_complex_tmp_tl \l__siunitx_complex_unit_tl }
  }
\cs_new_protected:Npn \__siunitx_complex_format_auxii:n #1
  {
    \__siunitx_complex_format_units:n {#1}
    \tl_if_empty:NF \l__siunitx_complex_real_tl
      { \exp_after:wN \__siunitx_complex_drop_exponent:nnnnnnn \l__siunitx_complex_real_tl }
    \exp_after:wN \__siunitx_complex_format_sign:nnnnnnn \l__siunitx_complex_img_tl
    \tl_set:Nx \l__siunitx_complex_tmp_tl
      { \siunitx_number_output:NN \l__siunitx_complex_img_tl \q_nil }
    \exp_after:wN \__siunitx_complex_extract_exponent:w \l__siunitx_complex_tmp_tl \q_stop
    \tl_set:Nx \l__siunitx_complex_tmp_tl
      {
        \bool_lazy_or:nnTF
          {
            \bool_lazy_and_p:nn
              { \l_siunitx_number_bracket_ambiguous_bool }
              { ! \tl_if_empty_p:N \l__siunitx_complex_exp_tl }
          }
          {
            ! \bool_lazy_any_p:n
              {
                { \tl_if_blank_p:n {#1} }
                { \tl_if_empty_p:N \l__siunitx_complex_real_tl }
                { \tl_if_empty_p:N \l__siunitx_complex_img_tl }
              }
          }
          { \__siunitx_complex_format_bracket:n }
          { \use:n }
          {
            \siunitx_number_output:N \l__siunitx_complex_real_tl
            \exp_not:V \l__siunitx_complex_sign_tl
            \bool_if:NF \l__siunitx_complex_root_after_bool
              { \exp_not:V \l__siunitx_complex_output_root_tl }
             \exp_not:V \l__siunitx_complex_tmp_tl
            \bool_if:NT \l__siunitx_complex_root_after_bool
              { \exp_not:V \l__siunitx_complex_output_root_tl }
           }
         \exp_not:V \l__siunitx_complex_exp_tl
      }
  }
\cs_new_protected:Npn \__siunitx_complex_drop_exponent:nnnnnnn #1#2#3#4#5#6#7
  { \tl_set:Nn \l__siunitx_complex_real_tl { {#1} {#2} {#3} {#4} {#5} { } { 0 } } }
\cs_new_protected:Npn \__siunitx_complex_format_sign:nnnnnnn #1#2#3#4#5#6#7
  {
    \tl_set:Nx \l__siunitx_complex_img_tl
      {
        { }
        {
          \tl_if_blank:nTF {#2}
            { \tl_if_empty:NF \l__siunitx_complex_real_tl { + } }
            { \exp_not:n {#2} }
        }
        \tl_if_blank:nTF {#4}
          {
            \str_if_eq:nnTF {#3} { 1 }
              { { } { } }
              { \exp_not:n { {#3} {#4} } }
          }
          { \exp_not:n { {#3} {#4} } }
        \exp_not:n { {#5} {#6} {#7} }
      }
  }
\cs_new_protected:Npn \__siunitx_complex_extract_exponent:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8
  \q_nil #9 \q_stop
  {
    \tl_set:Nn \l__siunitx_complex_sign_tl {#1#2}
    \bool_lazy_and:nnTF
      { \str_if_eq_p:nn {#3} { 1 } }
      { \tl_if_blank_p:n {#5} }
      { \__siunitx_complex_extract_exponent_aux:nw {#6#7#8} }
      { \__siunitx_complex_extract_exponent_aux:nw {#3#4#5#6#7#8} }
         #9 \q_stop
  }
\cs_new:Npn \__siunitx_complex_extract_exponent_aux:nw
  #1#2 \q_nil #3 \q_nil #4 \q_stop
  {
    \tl_set:Nn \l__siunitx_complex_tmp_tl {#1#2}
    \tl_set:Nn \l__siunitx_complex_exp_tl {#3#4}
  }
\cs_new_protected:Npn \__siunitx_complex_format_bracket:n #1
  {
    \exp_not:V \l__siunitx_complex_bracket_open_tl
    #1
    \exp_not:V \l__siunitx_complex_bracket_close_tl
  }
\cs_new_protected:Npn \__siunitx_complex_format_units:n #1
  {
    \tl_if_blank:nTF {#1}
      {
        \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl
        \siunitx_number_process:NN \l__siunitx_complex_img_tl \l__siunitx_complex_img_tl
      }
      {
        \use:c { __siunitx_complex_format_ \l_siunitx_quantity_prefix_mode_tl :n } {#1}
      }
  }
\cs_new_protected:cpn { __siunitx_complex_format_combine-exponent:n } #1
  {
    \tl_if_empty:NF \l__siunitx_complex_real_tl
      { \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl }
    \siunitx_number_process:NN \l__siunitx_complex_img_tl \l__siunitx_complex_img_tl
    \fp_set:Nn \l__siunitx_complex_tmp_fp
     { \exp_after:wN \__siunitx_complex_extract_exp:nnnnnnn \l__siunitx_complex_img_tl }
    \__siunitx_complex_drop_exp:N \l__siunitx_complex_real_tl
    \__siunitx_complex_drop_exp:N \l__siunitx_complex_img_tl
    \siunitx_unit_format_combine_exponent:nnN {#1}
      \l__siunitx_complex_tmp_fp \l__siunitx_complex_unit_tl
  }
\cs_new_protected:cpx { __siunitx_complex_format_extract-exponent:n } #1
  {
    \exp_not:N \siunitx_unit_format_extract_prefixes:nNN {#1}
      \exp_not:N \l__siunitx_complex_unit_tl \exp_not:N \l__siunitx_complex_tmp_fp
    \exp_not:c { __siunitx_complex_format_extract-exponent:N }
      \exp_not:N \l__siunitx_complex_img_tl
    \exp_not:N \tl_if_empty:NF \exp_not:N \l__siunitx_complex_real_tl
      {
        \exp_not:c { __siunitx_complex_format_extract-exponent:N }
          \exp_not:N \l__siunitx_complex_real_tl
      }
  }
\cs_new_protected:cpn { __siunitx_complex_format_extract-exponent:N } #1
  {
    \tl_set:Nx #1
      { \siunitx_number_adjust_exponent:Nn #1 \l__siunitx_complex_tmp_fp }
    \siunitx_number_process:NN #1 #1
  }
\cs_new_protected:Npn \__siunitx_complex_format_input:n #1
  {
    \siunitx_number_process:NN \l__siunitx_complex_real_tl \l__siunitx_complex_real_tl
    \siunitx_number_process:NN \l__siunitx_complex_img_tl \l__siunitx_complex_img_tl
    \siunitx_unit_format:nN {#1} \l__siunitx_complex_unit_tl
  }
\cs_new:Npn \__siunitx_complex_extract_exp:nnnnnnn #1#2#3#4#5#6#7 { #6#7 }
\cs_new_protected:Npn \__siunitx_complex_drop_exp:N #1
  { \exp_after:wN \__siunitx_complex_drop_exp:nnnnnnnN #1 #1 }
\cs_new_protected:Npn \__siunitx_complex_drop_exp:nnnnnnnN #1#2#3#4#5#6#7#8
  { \tl_set:Nn #8 { {#1} {#2} {#3} {#4} {#5} { } { 0 } } }
\msg_new:nnnn { siunitx } { invalid-complex-number }
  { Invalid~complex-number~'#1'. }
  {
    The~input~'#1'~could~not~be~parsed~as~a~complex|number~following~the~
    format~defined~in~module~documentation.
  }
\keys_set:nn { siunitx }
  {
    complex-root-position = after-number ,
    input-complex-root    = ij           ,
    output-complex-root   = \mathrm { i }
  }
\cs_generate_variant:Nn \keys_set:nn { nx }
\fp_new:N \l__siunitx_compound_tmp_fp
\seq_new:N \l__siunitx_compound_tmp_seq
\tl_new:N \l__siunitx_compound_tmp_tl
\tl_new:N \l__siunitx_compound_first_tl
\tl_new:N \l__siunitx_compound_exp_tl
\tl_new:N \l__siunitx_compound_start_tl
\tl_new:N \l__siunitx_compound_end_tl
\int_new:N \l__siunitx_compound_count_int
\bool_new:N \l__siunitx_compound_unit_bool
\tl_new:N \l__siunitx_compound_unit_tl
\tl_new:N \l__siunitx_compound_bracket_close_tl
\tl_new:N \l__siunitx_compound_bracket_open_tl
\tl_set:Nn \l__siunitx_compound_bracket_open_tl { ( }
\tl_set:Nn \l__siunitx_compound_bracket_close_tl { ) }
\bool_new:N \l__siunitx_compound_exp_bracket_bool
\bool_new:N \l__siunitx_compound_exp_combine_bool
\bool_new:N \l__siunitx_compound_separator_text_bool
\bool_new:N \l__siunitx_compound_unit_bracket_bool
\bool_new:N \l__siunitx_compound_unit_power_bool
\bool_new:N \l__siunitx_compound_unit_repeat_bool
\keys_define:nn { siunitx }
  {
    compound-exponents .choice: ,
    compound-exponents / combine .code:n =
      {
        \bool_set_false:N \l__siunitx_compound_exp_bracket_bool
        \bool_set_true:N \l__siunitx_compound_exp_combine_bool
      } ,
    compound-exponents / combine-bracket .code:n =
      {
        \bool_set_true:N \l__siunitx_compound_exp_bracket_bool
        \bool_set_true:N \l__siunitx_compound_exp_combine_bool
      } ,
    compound-exponents / individual .code:n =
      {
        \bool_set_false:N \l__siunitx_compound_exp_bracket_bool
        \bool_set_false:N \l__siunitx_compound_exp_combine_bool
      } ,
    compound-final-separator .tl_set:N =
      \l__siunitx_compound_separator_final_tl ,
    compound-pair-separator .tl_set:N =
      \l__siunitx_compound_separator_pair_tl ,
    compound-separator .tl_set:N =
      \l__siunitx_compound_separator_tl ,
    compound-separator-mode .choice: ,
    compound-separator-mode / number .code:n =
      { \bool_set_false:N \l__siunitx_compound_separator_text_bool } ,
    compound-separator-mode / text .code:n =
      { \bool_set_true:N \l__siunitx_compound_separator_text_bool } ,
    compound-units .choice: ,
    compound-units / bracket .code:n =
      {
        \bool_set_true:N  \l__siunitx_compound_unit_bracket_bool
        \bool_set_false:N \l__siunitx_compound_unit_power_bool
        \bool_set_false:N \l__siunitx_compound_unit_repeat_bool
      } ,
    compound-units / bracket-power .code:n =
      {
        \bool_set_true:N  \l__siunitx_compound_unit_bracket_bool
        \bool_set_true:N  \l__siunitx_compound_unit_power_bool
        \bool_set_false:N \l__siunitx_compound_unit_repeat_bool
      } ,
    compound-units / power .code:n =
      {
        \bool_set_false:N \l__siunitx_compound_unit_bracket_bool
        \bool_set_true:N  \l__siunitx_compound_unit_power_bool
        \bool_set_false:N \l__siunitx_compound_unit_repeat_bool
      } ,
    compound-units / repeat .code:n   =
      {
        \bool_set_false:N \l__siunitx_compound_unit_bracket_bool
        \bool_set_false:N \l__siunitx_compound_unit_power_bool
        \bool_set_true:N  \l__siunitx_compound_unit_repeat_bool
      } ,
    compound-units / single .code:n   =
      {
        \bool_set_false:N \l__siunitx_compound_unit_bracket_bool
        \bool_set_false:N \l__siunitx_compound_unit_power_bool
        \bool_set_false:N \l__siunitx_compound_unit_repeat_bool
      }
  }
\cs_new_protected:Npn \siunitx_compound_number:n #1
  {
    \group_begin:
      \bool_set_false:N \l__siunitx_compound_unit_bool
      \__siunitx_compound_format:nn {#1} { }
      \__siunitx_compound_print:N \siunitx_print_number:x
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_compound_format:nn #1#2
  {
    \seq_clear:N \l__siunitx_compound_tmp_seq
    \bool_if:NTF \l_siunitx_number_parse_bool
      {
        \exp_args:Nxx \__siunitx_compound_format:nnn
          { \tl_head:n {#1} }
          { \tl_tail:n {#1} }
          {#2}
      }
      { \tl_map_function:nN {#1} \__siunitx_compound_unparsed:n }
  }
\cs_new_protected:Npn \__siunitx_compound_format:nnn #1#2#3
  {
    \tl_if_blank:nTF {#1}
      {
        \tl_if_blank:nF {#2}
          { \__siunitx_compound_format:nn {#2} {#3} }
      }
      { \__siunitx_compound_format_aux:nnn {#1} {#2} {#3} }
  }
\cs_new_protected:Npn \__siunitx_compound_format_aux:nnn #1#2#3
  {
    \siunitx_number_parse:nN {#1} \l__siunitx_compound_tmp_tl
    \bool_if:NTF \l__siunitx_compound_unit_bool
      { \__siunitx_compound_format_units:nn {#2} {#3} }
      { \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl }
    \bool_lazy_and:nnTF
      { \l__siunitx_compound_exp_combine_bool }
      { \int_compare_p:nNn { \tl_count:n {#2} } > 0 }
      { \__siunitx_compound_extract_exponents: }
      {
        \bool_if:NTF \l__siunitx_compound_unit_bool
          {
            \tl_set:Nx \l__siunitx_compound_tmp_tl
              { \siunitx_number_output:NN \l__siunitx_compound_first_tl \q_nil }
            \tl_set:Nx \l__siunitx_compound_tmp_tl
              { \__siunitx_compound_uncert_bracket:N \l__siunitx_compound_tmp_tl }
          }
          {
            \tl_set:Nx \l__siunitx_compound_tmp_tl
              { \siunitx_number_output:N \l__siunitx_compound_first_tl }
          }
        \seq_put_right:NV \l__siunitx_compound_tmp_seq \l__siunitx_compound_tmp_tl
      }
    \tl_map_function:nN {#2} \__siunitx_compound_parsed:n
  }
\cs_new_protected:Npn \__siunitx_compound_extract_exponents:
  {
    \tl_set:Nx \l__siunitx_compound_tmp_tl
      { \siunitx_number_output:NN \l__siunitx_compound_first_tl \q_nil }
    \exp_after:wN \__siunitx_compound_extract_exponents_auxi:w
      \l__siunitx_compound_tmp_tl \q_stop
  }
\cs_new_protected:Npn \__siunitx_compound_extract_exponents_auxi:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil #8
  \q_nil #9 \q_stop
  {
    \__siunitx_compound_extract_exponents_auxii:nw {#1#2#3#4#5#6#7#8} #9 \q_stop
  }
\cs_new_protected:Npn \__siunitx_compound_extract_exponents_auxii:nw
  #1#2 \q_nil #3 \q_nil #4 \q_stop
  {
    \seq_put_right:Nn \l__siunitx_compound_tmp_seq { #1#2 }
    \tl_set:Nn \l__siunitx_compound_exp_tl { #3#4 }
    \exp_after:wN \__siunitx_compound_extract_exponents_auxiii:nnnnnnn
      \l__siunitx_compound_first_tl
  }
\cs_new_protected:Npn \__siunitx_compound_extract_exponents_auxiii:nnnnnnn
  #1#2#3#4#5#6#7
  {
    \keys_set:nn { siunitx }
      {
        drop-exponent  = true  ,
        exponent-mode  = fixed ,
        fixed-exponent = #6#7
      }
  }
\cs_new_protected:Npn \__siunitx_compound_parsed:n #1
  {
    \tl_if_blank:nF {#1}
      { \__siunitx_compound_parsed_aux:n {#1} }
  }
\cs_new_protected:Npn \__siunitx_compound_parsed_aux:n #1
  {
    \bool_if:NTF \l__siunitx_compound_unit_bool
      {
        \siunitx_number_parse:nN {#1} \l__siunitx_compound_tmp_tl
        \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_tmp_tl
        \tl_set:Nx \l__siunitx_compound_tmp_tl
          { \siunitx_number_output:NN \l__siunitx_compound_tmp_tl \q_nil }
        \tl_set:Nx \l__siunitx_compound_tmp_tl
          { \__siunitx_compound_uncert_bracket:N \l__siunitx_compound_tmp_tl }
      }
      { \siunitx_number_format:nN {#1} \l__siunitx_compound_tmp_tl }
    \seq_put_right:NV \l__siunitx_compound_tmp_seq \l__siunitx_compound_tmp_tl
  }
\cs_new_protected:Npn \__siunitx_compound_unparsed:n #1
  {
    \tl_if_blank:nF {#1}
      { \seq_put_right:Nn \l__siunitx_compound_tmp_seq { \ensuremath {#1} } }
  }
\cs_new_protected:Npn \__siunitx_compound_format_units:nn #1#2
  {
    \bool_if:NTF \l__siunitx_compound_unit_power_bool
      {
        \use:c { __siunitx_compound_format_ \l_siunitx_quantity_prefix_mode_tl :nn }
          {#2} { \tl_count:n {#1} + 1 }
      }
      {
        \use:c { __siunitx_compound_format_ \l_siunitx_quantity_prefix_mode_tl :n } {#2}
      }
  }
\cs_new_protected:cpx { __siunitx_compound_format_combine-exponent:n } #1
  {
    \exp_not:c { __siunitx_compound_format_combine-exponent_aux:n }
      {
        \exp_not:N \siunitx_unit_format_combine_exponent:nnN
          {#1}
      }
  }
\cs_new_protected:cpx { __siunitx_compound_format_combine-exponent:nn } #1#2
  {
    \exp_not:c { __siunitx_compound_format_combine-exponent_aux:n }
      {
        \exp_not:N \siunitx_unit_format_multiply_combine_exponent:nnnN
          {#1} {#2}
      }
  }
\cs_new_protected:cpn { __siunitx_compound_format_combine-exponent_aux:n } #1
  {
    \bool_set_true:N \l__siunitx_compound_exp_combine_bool
    \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl
    \exp_args:NV \__siunitx_compound_extract_exp:nN
      \l__siunitx_compound_first_tl \l__siunitx_compound_tmp_fp
    #1 \l__siunitx_compound_tmp_fp \l__siunitx_compound_unit_tl
  }
\cs_new_protected:cpx { __siunitx_compound_format_extract-exponent:n } #1
  {
    \exp_not:c { __siunitx_compound_format_extract-exponent_aux:n }
      { \exp_not:N \siunitx_unit_format_extract_prefixes:nNN {#1} }
  }
\cs_new_protected:cpx { __siunitx_compound_format_extract-exponent:nn } #1#2
  {
    \exp_not:c { __siunitx_compound_format_extract-exponent_aux:n }
      {
        \exp_not:N \siunitx_unit_format_multiply_extract_prefixes:nnNN
          {#1} {#2}
      }
  }
\cs_new_protected:cpn { __siunitx_compound_format_extract-exponent_aux:n } #1
  {
    #1 \l__siunitx_compound_unit_tl \l__siunitx_compound_tmp_fp
    \tl_set:Nx \l__siunitx_compound_tmp_tl
      { \siunitx_number_adjust_exponent:Nn \l__siunitx_compound_tmp_tl \l__siunitx_compound_tmp_fp }
    \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl
    \bool_set_true:N \l__siunitx_compound_exp_combine_bool
  }
\cs_new_protected:Npn \__siunitx_compound_format_input:n #1
  {
    \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl
    \siunitx_unit_format:nN {#1} \l__siunitx_compound_unit_tl
  }
\cs_new_protected:Npn \__siunitx_compound_format_input:nn #1#2
  {
    \siunitx_number_process:NN \l__siunitx_compound_tmp_tl \l__siunitx_compound_first_tl
    \siunitx_unit_format_multiply:nnN {#1} {#2} \l__siunitx_compound_unit_tl
  }
\cs_new_protected:Npn \__siunitx_compound_extract_exp:nN #1#2
  { \__siunitx_compound_extract_exp:nnnnnnnN #1 #2 }
\cs_new_protected:Npn \__siunitx_compound_extract_exp:nnnnnnnN #1#2#3#4#5#6#7#8
  { \fp_set:Nn #8 {#6#7} }
\cs_new_protected:Npn \siunitx_compound_quantity:nn #1#2
  {
    \group_begin:
      \bool_if:NT \l__siunitx_compound_unit_bracket_bool
        { \bool_set_true:N \l__siunitx_compound_exp_bracket_bool }
      \bool_if:NT \l__siunitx_compound_unit_repeat_bool
        { \bool_set_false:N \l__siunitx_compound_exp_combine_bool }
      \bool_lazy_or:nnT
        { \l__siunitx_compound_unit_bracket_bool }
        { ! \l__siunitx_compound_unit_repeat_bool }
        { \bool_set_false:N \l_siunitx_number_bracket_ambiguous_bool }
      \bool_set_true:N \l__siunitx_compound_unit_bool
      \__siunitx_compound_format:nn {#1} {#2}
      \bool_if:NF \l_siunitx_number_parse_bool
        { \siunitx_unit_format:nN {#2} \l__siunitx_compound_unit_tl }
      \str_if_eq:VnT \l_siunitx_quantity_prefix_mode_tl { combine-exponent }
        { \tl_clear:N \l__siunitx_compound_exp_tl }
      \bool_if:NTF \l__siunitx_compound_unit_repeat_bool
        { \__siunitx_compound_print:N \__siunitx_compound_print_quantity:x }
        {
          \bool_lazy_and:nnTF
            { \l__siunitx_compound_unit_bracket_bool }
            { \tl_if_empty_p:N \l__siunitx_compound_exp_tl }
            {
              \siunitx_print_number:V \l__siunitx_compound_bracket_open_tl
              \__siunitx_compound_print:N \siunitx_print_number:x
              \siunitx_print_number:V \l__siunitx_compound_bracket_close_tl
            }
            { \__siunitx_compound_print:N \siunitx_print_number:x }
          \__siunitx_compound_print_quantity:n { }
        }
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_compound_print:N #1
  {
    \bool_lazy_and:nnTF
      { \l__siunitx_compound_exp_bracket_bool }
      { ! \tl_if_empty_p:N \l__siunitx_compound_exp_tl }
      {
        \__siunitx_compound_print:xxN
          { \exp_not:V \l__siunitx_compound_bracket_open_tl }
          {
            \exp_not:V \l__siunitx_compound_bracket_close_tl
            \exp_not:V \l__siunitx_compound_exp_tl
          }
          #1
      }
      { \__siunitx_compound_print:xxN { } { \exp_not:V \l__siunitx_compound_exp_tl } #1 }
  }
\cs_new_protected:Npn \__siunitx_compound_print:nnN #1#2#3
  {
    \exp_args:Nx \__siunitx_compound_print:nnnN
      { \seq_count:N \l__siunitx_compound_tmp_seq } {#1} {#2} #3
  }
\cs_generate_variant:Nn \__siunitx_compound_print:nnN { xx }
\cs_new_protected:Npn \__siunitx_compound_print:nnnN #1#2#3#4
  {
    \int_case:nnF {#1}
      {
        { 0 } { }
        { 1 }
          {
            #4
              { \seq_item:Nn \l__siunitx_compound_tmp_seq { 1 } }
          }
        { 2 }
          {
            #4
              {
                \exp_not:n {#2}
                \seq_item:Nn \l__siunitx_compound_tmp_seq { 1 }
              }
            \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_pair_tl
            #4
              {
                \seq_item:Nn \l__siunitx_compound_tmp_seq { 2 }
                \exp_not:n {#3}
              }
          }
      }
      {
        \int_set:Nn \l__siunitx_compound_count_int {#1}
        \tl_set:Nn \l__siunitx_compound_start_tl {#2}
        \tl_set:Nn \l__siunitx_compound_end_tl {#3}
        \cs_set_eq:NN \__siunitx_compound_print_aux:n #4
        \seq_map_indexed_function:NN
          \l__siunitx_compound_tmp_seq
          \__siunitx_compound_print_aux:nn
      }
  }
\cs_new_protected:Npn \__siunitx_compound_print_aux:n #1 { }
\cs_new_protected:Npn \__siunitx_compound_print_aux:nn #1#2
  {
    \int_case:nnF {#1}
      {
        { 1 }
          {
            \__siunitx_compound_print_aux:n
              {
                \exp_not:V \l__siunitx_compound_start_tl
                \exp_not:n {#2}
              }
            \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_tl
          }
        { \l__siunitx_compound_count_int - 1 }
          {
            \__siunitx_compound_print_aux:n { \exp_not:n {#2} }
            \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_final_tl
          }
        { \l__siunitx_compound_count_int }
          {
            \__siunitx_compound_print_aux:n
              {
                \exp_not:n {#2}
                \exp_not:V \l__siunitx_compound_end_tl
              }
          }
      }
      {
        \__siunitx_compound_print_aux:n { \exp_not:n {#2} }
        \__siunitx_compound_print_separator:V \l__siunitx_compound_separator_tl
      }
  }
\cs_new_protected:Npn \__siunitx_compound_print_quantity:n #1
  { \siunitx_quantity_print:nV {#1} \l__siunitx_compound_unit_tl }
\cs_generate_variant:Nn  \__siunitx_compound_print_quantity:n { x }
\cs_new_protected:Npn \__siunitx_compound_print_separator:n #1
  {
    \bool_if:NTF \l__siunitx_compound_separator_text_bool
      { #1 }
      { \siunitx_print_number:n {#1} }
  }
\cs_generate_variant:Nn \__siunitx_compound_print_separator:n { V }
\cs_new:Npn \__siunitx_compound_uncert_bracket:N #1
  { \exp_after:wN \__siunitx_compound_uncert_bracket:w #1 \q_stop }
\cs_new:Npn \__siunitx_compound_uncert_bracket:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil
  #8 \q_nil #9 \q_stop
  { \__siunitx_compound_uncert_bracket:nnw {#1#2#3#4#5#6} {#7#8} #9 \q_stop }
\cs_new:Npn \__siunitx_compound_uncert_bracket:nnw #1#2 #3 \q_nil #4 \q_nil #5 \q_stop
  {
    \bool_lazy_or:nnTF
      { \tl_if_blank_p:n {#2#3} }
      { ! \tl_if_blank_p:n {#5} }
      { \exp_not:n {#1#2#3#4#5} }
      {
        \exp_not:V \l__siunitx_compound_bracket_open_tl
        \exp_not:n {#1#2#3}
        \exp_not:V \l__siunitx_compound_bracket_close_tl
        \exp_not:n {#4#5}
      }
  }
\tl_new:N \l__siunitx_list_exp_tl
\tl_new:N \l__siunitx_list_units_tl
\keys_define:nn { siunitx }
  {
    list-exponents .choices:nn =
      { combine , combine-bracket , individual }
      { \tl_set_eq:NN \l__siunitx_list_exp_tl \l_keys_choice_tl } ,
    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 .choices:nn =
      { bracket , repeat , single }
      { \tl_set_eq:NN \l__siunitx_list_units_tl \l_keys_choice_tl }
  }
\cs_new_protected:Npn \siunitx_number_list:nn #1
  {
    \group_begin:
      \__siunitx_list_aux:
      \siunitx_compound_number:n {#1}
    \group_end:
  }
\cs_new_protected:Npn \siunitx_quantity_list:nn #1#2
  {
    \group_begin:
      \__siunitx_list_aux:
      \siunitx_compound_quantity:nn {#1} {#2}
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_list_aux:
  {
    \keys_set:nx { siunitx }
      {
        compound-exponents       = \l__siunitx_list_exp_tl ,
        compound-final-separator =
          { \exp_not:V \l_siunitx_list_separator_final_tl } ,
        compound-pair-separator  =
          { \exp_not:V \l_siunitx_list_separator_pair_tl } ,
        compound-separator       =
          { \exp_not:V \l_siunitx_list_separator_tl } ,
        compound-separator-mode  = text ,
        compound-units           = \l__siunitx_list_units_tl
      }
  }
\tl_new:N \l__siunitx_product_exp_tl
\bool_new:N \l__siunitx_product_phrase_bool
\tl_new:N \l__siunitx_product_units_tl
\keys_define:nn { siunitx }
  {
    product-exponents .choices:nn =
      { combine , combine-bracket , individual }
      { \tl_set_eq:NN \l__siunitx_product_exp_tl \l_keys_choice_tl } ,
    product-mode .choice: ,
    product-mode / phrase .code:n =
      { \bool_set_true:N \l__siunitx_product_phrase_bool } ,
    product-mode / symbol .code:n =
      { \bool_set_false:N \l__siunitx_product_phrase_bool } ,
    product-phrase .tl_set:N = \l__siunitx_product_phrase_tl ,
    product-symbol .tl_set:N = \l__siunitx_product_symbol_tl ,
    product-units .choices:nn =
      { bracket , bracket-power , power , repeat , single }
      { \tl_set_eq:NN \l__siunitx_product_units_tl \l_keys_choice_tl }
  }
\cs_new_protected:Npn \siunitx_number_product:n #1
  {
    \group_begin:
      \__siunitx_product_aux:
      \siunitx_compound_number:n {#1}
    \group_end:
  }
\cs_new_protected:Npn \siunitx_quantity_product:nn #1#2
  {
    \group_begin:
      \__siunitx_product_aux:
      \siunitx_compound_quantity:nn {#1} {#2}
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_product_aux:
  {
    \bool_if:NTF \l__siunitx_product_phrase_bool
      { \__siunitx_product_aux:x { \exp_not:V \l__siunitx_product_phrase_tl } }
      { \__siunitx_product_aux:x { { } \exp_not:V \l__siunitx_product_symbol_tl { } } }
  }
\cs_new_protected:Npn \__siunitx_product_aux:n #1
  {
    \keys_set:nx { siunitx }
      {
        compound-exponents       = \l__siunitx_product_exp_tl ,
        compound-final-separator = { \exp_not:n {#1} } ,
        compound-pair-separator  = { \exp_not:n {#1} } ,
        compound-separator       = { \exp_not:n {#1} } ,
        compound-separator-mode  =
          \bool_if:NTF \l__siunitx_product_phrase_bool { text } { number } ,
        compound-units           = \l__siunitx_product_units_tl
      }
  }
\cs_generate_variant:Nn \__siunitx_product_aux:n { x }
\tl_new:N \l__siunitx_range_exp_tl
\tl_new:N \l__siunitx_range_units_tl
\keys_define:nn { siunitx }
  {
    range-exponents .choices:nn =
      { combine , combine-bracket , individual }
      { \tl_set_eq:NN \l__siunitx_range_exp_tl \l_keys_choice_tl } ,
    range-phrase .tl_set:N = \l_siunitx_range_phrase_tl ,
    range-units .choices:nn =
      { bracket , repeat , single }
      { \tl_set_eq:NN \l__siunitx_range_units_tl \l_keys_choice_tl }
  }
\cs_new_protected:Npn \siunitx_number_range:nn #1#2
  {
    \group_begin:
      \__siunitx_range_aux:
      \siunitx_compound_number:n { {#1} {#2} }
    \group_end:
  }
\cs_new_protected:Npn \siunitx_quantity_range:nnn #1#2#3
  {
    \group_begin:
      \__siunitx_range_aux:
      \siunitx_compound_quantity:nn { {#1} {#2} } {#3}
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_range_aux:
  {
    \keys_set:nx { siunitx }
      {
        compound-exponents       = \l__siunitx_range_exp_tl ,
        compound-pair-separator  = { \exp_not:V \l_siunitx_range_phrase_tl } ,
        compound-separator-mode  = text ,
        compound-units           = \l__siunitx_range_units_tl
      }
  }
\keys_set:nn { siunitx }
  {
    compound-exponents       = individual  ,
    compound-final-separator =
      {
        \ifmmode \  \else \space \fi
        \text { and }
        \ifmmode \  \else \space \fi
      } ,
    compound-pair-separator  =
      {
        \ifmmode \  \else \space \fi
        \text { and }
        \ifmmode \  \else \space \fi
      } ,
    compound-separator       =
      { , \ifmmode \  \else \space \fi } ,
    compound-separator-mode  = text        ,
    compound-units           = repeat      ,
    list-exponents           = individual  ,
    list-final-separator     =
      {
        \ifmmode \  \else \space \fi
        \text { and }
        \ifmmode \  \else \space \fi
      } ,
    list-pair-separator      =
      {
        \ifmmode \  \else \space \fi
        \text { and }
        \ifmmode \  \else \space \fi
      } ,
    list-separator           =
      { , \ifmmode \  \else \space \fi } ,
    list-units               = repeat      ,
    product-exponents        = individual  ,
    product-mode             = symbol      ,
    product-phrase           =
      {
        \ifmmode \  \else \space \fi
        \text { by }
        \ifmmode \  \else \space \fi
      } ,
    product-symbol           = \times      ,
    product-units            = repeat      ,
    range-exponents          = individual  ,
    range-phrase             =
      {
        \ifmmode \  \else \space \fi
        \text { to }
        \ifmmode \  \else \space \fi
      } ,
    range-units              = repeat
  }
\keys_define:nn { siunitx }
  {
    locale .choice: ,
    locale / DE .meta:n =
      {
        exponent-product      = \cdot ,
        inter-unit-product    = \,    ,
        output-decimal-marker = { , }
      } ,
    locale / PL .meta:n =
      {
        exponent-product      = \cdot ,
        inter-unit-product    = \cdot ,
        output-decimal-marker = { , }
      } ,
    locale / FR .meta:n =
      {
        exponent-product      = \times ,
        inter-unit-product    = \,     ,
        output-decimal-marker = { , }
      } ,
    locale / SI .meta:n =
      {
        exponent-product      = \times ,
        inter-unit-product    = \,     ,
        output-decimal-marker = { , }
      } ,
    locale / UK .meta:n =
      {
        exponent-product      = \times ,
        inter-unit-product    = \,     ,
        output-decimal-marker = .
      },
    locale / US .meta:n =
      {
        exponent-product      = \times ,
        inter-unit-product    = \,     ,
        output-decimal-marker = .
      } ,
    locale / ZA .meta:n =
      {
        exponent-product      = \times ,
        inter-unit-product    = \cdot  ,
        output-decimal-marker = { , }
      }
  }
\file_if_exist:nT { translations.sty }
  {
    \RequirePackage { translations }
    \DeclareTranslation { Catalan } { and } { i }
    \DeclareTranslation { Slovene } { and } { in }
    \DeclareTranslation { Catalan } { to~(numerical~range) } { a }
    \DeclareTranslation { English } { to~(numerical~range) } { to }
    \DeclareTranslation { French }  { to~(numerical~range) } { à }
    \DeclareTranslation { German }  { to~(numerical~range) } { bis }
    \DeclareTranslation { Polish }  { to~(numerical~range) } { do }
    \DeclareTranslation { Slovene } { to~(numerical~range) } { do }
    \DeclareTranslation { Spanish } { to~(numerical~range) } { a }
    \keys_set:nn { siunitx }
      {
        list-final-separator =
          {
            \ifmmode \  \else \space \fi
            \text { \GetTranslation { and } }
            \ifmmode \  \else \space \fi
          } ,
        list-pair-separator  =
          {
            \ifmmode \  \else \space \fi
            \text { \GetTranslation { and } }
            \ifmmode \  \else \space \fi
          } ,
        range-phrase         =
          {
            \ifmmode \  \else \space \fi
            \text { \GetTranslation { to~(numerical~range) } }
            \ifmmode \  \else \space \fi
          }
      }
  }
\cs_generate_variant:Nn \tl_if_blank:nTF { f }
\cs_generate_variant:Nn \tl_if_blank_p:n { f }
\cs_generate_variant:Nn \tl_if_in:NnTF { NV }
\cs_generate_variant:Nn \tl_remove_all:Nn { NV }
\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV }
\tl_new:N \l__siunitx_number_tmp_tl
\tl_new:N \l__siunitx_number_outputted_tl
\tl_new:N \l_siunitx_number_parse_bool
\keys_define:nn { siunitx }
  {
    parse-numbers .bool_set:N = \l_siunitx_number_parse_bool
  }
\cs_new_protected:Npn \siunitx_number_format:nN #1#2
  {
    \group_begin:
      \bool_if:NTF \l_siunitx_number_parse_bool
        {
          \siunitx_number_parse:nN {#1} \l__siunitx_number_parsed_tl
          \siunitx_number_process:NN \l__siunitx_number_parsed_tl \l__siunitx_number_parsed_tl
          \tl_set:Nx \l__siunitx_number_outputted_tl
            { \siunitx_number_output:N \l__siunitx_number_parsed_tl }
        }
        { \tl_set:Nn \l__siunitx_number_outputted_tl { \ensuremath {#1} } }
    \exp_args:NNNV \group_end:
    \tl_set:Nn #2 \l__siunitx_number_outputted_tl
  }
\tl_new:N \l_siunitx_number_input_decimal_tl
\keys_define:nn { siunitx }
  {
    evaluate-expression .bool_set:N =
      \l__siunitx_number_expression_bool ,
    expression .code:n =
      \cs_set:Npn \__siunitx_number_expression:n ##1 {#1} ,
    input-close-uncertainty .tl_set:N =
      \l__siunitx_number_input_uncert_close_tl ,
    input-comparators .tl_set:N =
      \l_siunitx_number_input_comparator_tl ,
    input-decimal-markers .tl_set:N =
      \l_siunitx_number_input_decimal_tl ,
    input-digits .tl_set:N =
      \l__siunitx_number_input_digit_tl ,
    input-exponent-markers .tl_set:N =
      \l_siunitx_number_input_exponent_tl ,
    input-ignore .tl_set:N =
      \l__siunitx_number_input_ignore_tl ,
    input-open-uncertainty .tl_set:N =
      \l__siunitx_number_input_uncert_open_tl ,
    input-signs .tl_set:N =
      \l_siunitx_number_input_sign_tl ,
    input-uncertainty-signs .code:n =
      {
        \tl_set:Nn \l__siunitx_number_input_uncert_sign_tl {#1}
        \tl_map_inline:nn {#1}
          {
            \tl_if_in:NnF \l_siunitx_number_input_sign_tl {##1}
              { \tl_put_right:Nn \l_siunitx_number_input_sign_tl {##1} }
          }
      } ,
    parse-numbers .bool_set:N =
      \l_siunitx_number_parse_bool ,
    retain-explicit-decimal-marker .bool_set:N =
      \l__siunitx_number_explicit_decimal_bool ,
    retain-explicit-plus .bool_set:N =
      \l__siunitx_number_explicit_plus_bool ,
    retain-zero-uncertainty .bool_set:N =
      \l__siunitx_number_zero_uncert_bool
  }
\cs_new:Npn \__siunitx_number_expression:n #1 { }
\tl_new:N \l__siunitx_number_input_uncert_sign_tl
\tl_new:N \l__siunitx_number_arg_tl
\tl_new:N \l__siunitx_number_comparator_tl
\tl_new:N \l__siunitx_number_exponent_tl
\tl_new:N \l__siunitx_number_flex_tl
\tl_new:N \l__siunitx_number_parsed_tl
\tl_new:N \l__siunitx_number_input_tl
\tl_new:N \l__siunitx_number_partial_tl
\bool_new:N \l__siunitx_number_validate_bool
\cs_new_protected:Npn \siunitx_number_normalize_symbols:N #1
  {
    \__siunitx_number_normalize_minus:N #1
    \exp_after:wN \__siunitx_number_normalize_aux:NnN \exp_after:wN #1
      \c__siunitx_number_normalize_tl
      { ? } \q_recursion_tail
        \q_recursion_stop
  }
\cs_set_protected:Npn \__siunitx_number_normalize_aux:NnN #1#2#3
  {
    \quark_if_recursion_tail_stop:N #3
    \tl_replace_all:Nnn #1 {#2} {#3}
    \__siunitx_number_normalize_aux:NnN #1
  }
\tl_const:Nn \c__siunitx_number_normalize_tl
  {
    { -+ } \mp
    { +- } \pm
    { << } \ll
    { <= } \le
    { >> } \gg
    { >= } \ge
  }
\group_begin:
  \char_set_catcode_active:N \-
  \cs_new_protected:Npx \__siunitx_number_normalize_minus:N #1
    {
      \tl_replace_all:Nnn #1
        { \exp_not:N - }  { \token_to_str:N - }
    }
\group_end:
\cs_new_protected:Npn \siunitx_number_parse:nN #1#2
  {
    \bool_if:NTF \l_siunitx_number_parse_bool
      { \__siunitx_number_parse:nN {#1} #2 }
      { \tl_clear:N #2 }
  }
\cs_generate_variant:Nn \siunitx_number_parse:nN { V }
\cs_new_protected:Npn \__siunitx_number_parse:nN #1#2
  {
    \group_begin:
      \tl_clear:N \l__siunitx_number_parsed_tl
      \tl_map_inline:Nn \l__siunitx_number_input_ignore_tl
        {
          \token_if_macro:NT ##1
            { \cs_set_eq:NN ##1 \scan_stop: }
        }
      \protected@edef \l__siunitx_number_arg_tl
        {
          \bool_if:NTF \l__siunitx_number_expression_bool
            { \fp_eval:n { \__siunitx_number_expression:n {#1} } }
            {#1}
        }
      \tl_set_eq:NN \l__siunitx_number_input_tl \l__siunitx_number_arg_tl
      \siunitx_number_normalize_symbols:N \l__siunitx_number_arg_tl
      \tl_map_inline:Nn \l__siunitx_number_input_ignore_tl
        { \tl_remove_all:Nn \l__siunitx_number_arg_tl {##1} }
      \tl_if_empty:NF \l__siunitx_number_arg_tl
        { \__siunitx_number_parse_comparator: }
      \__siunitx_number_parse_check:
    \exp_args:NNNV \group_end:
    \tl_set:Nn #2 \l__siunitx_number_parsed_tl
  }
\cs_new_protected:Npn \__siunitx_number_parse_check:
  {
    \tl_if_empty:NF \l__siunitx_number_flex_tl
      {
        \bool_lazy_and:nnTF
          {
            \tl_if_blank_p:f
              { \exp_after:wN \use_iv:nnnn \l__siunitx_number_parsed_tl }
          }
          {
            \tl_if_blank_p:f
              { \exp_after:wN \use_iv:nnnn \l__siunitx_number_flex_tl }
          }
          {
            \tl_set:Nx \l__siunitx_number_tmp_tl
              { \exp_after:wN \use_i:nnnn \l__siunitx_number_flex_tl }
            \tl_if_in:NVTF \l__siunitx_number_input_uncert_sign_tl
              \l__siunitx_number_tmp_tl
              { \__siunitx_number_parse_combine_uncert: }
              { \tl_clear:N \l__siunitx_number_parsed_tl }
          }
          { \tl_clear:N \l__siunitx_number_parsed_tl }
      }
    \tl_if_empty:NTF \l__siunitx_number_parsed_tl
      {
        \bool_if:NF \l__siunitx_number_validate_bool
          {
            \msg_error:nnx { siunitx } { invalid-number }
              { \exp_not:V \l__siunitx_number_input_tl }
          }
      }
      { \__siunitx_number_parse_finalise: }
  }
\cs_new_protected:Npn \__siunitx_number_parse_combine_uncert:
  {
    \exp_after:wN \exp_after:wN \exp_after:wN
    \__siunitx_number_parse_combine_uncert_auxi:nnnnnnnn
      \exp_after:wN \l__siunitx_number_parsed_tl \l__siunitx_number_flex_tl
  }
\cs_new_protected:Npn
  \__siunitx_number_parse_combine_uncert_auxi:nnnnnnnn #1#2#3#4#5#6#7#8
  {
     \__siunitx_number_parse_combine_uncert_auxii:fnnnn
        { \int_eval:n { \tl_count:n {#3} - \tl_count:n {#7} } }
        {#2} {#3} {#6} {#7}
  }
\cs_new_protected:Npn
  \__siunitx_number_parse_combine_uncert_auxii:nnnnn #1
  {
    \__siunitx_number_parse_combine_uncert_auxiii:fnnnnn
      { \prg_replicate:nn { \int_abs:n {#1} } { 0 } }
      {#1}
  }
\cs_generate_variant:Nn \__siunitx_number_parse_combine_uncert_auxii:nnnnn { f }
\cs_new_protected:Npn
  \__siunitx_number_parse_combine_uncert_auxiii:nnnnnn #1#2#3#4#5#6
  {
    \int_compare:nNnTF {#2} > 0
      {
        \__siunitx_number_parse_combine_uncert_auxiv:nnnn
          {#3} {#4} {#5} { #6 #1 }
      }
      {
        \__siunitx_number_parse_combine_uncert_auxiv:nnnn
          {#3} { #4 #1 } {#5} {#6}
      }
  }
\cs_generate_variant:Nn
  \__siunitx_number_parse_combine_uncert_auxiii:nnnnnn { f }
\cs_new_protected:Npn
  \__siunitx_number_parse_combine_uncert_auxiv:nnnn #1#2#3#4
  {
    \tl_set:Nx \l__siunitx_number_parsed_tl
      {
        { \tl_head:V \l__siunitx_number_parsed_tl }
        { \exp_not:n {#1} }
        {
          \bool_lazy_and:nnTF
            { \tl_if_blank_p:n {#2} }
            { ! \tl_if_blank_p:n {#4} }
            { 0 }
            { \exp_not:n {#2} }
        }
        {
          \__siunitx_number_parse_combine_uncert_auxv:w #3#4
            \q_recursion_tail \q_recursion_stop
        }
      }
  }
\cs_new:Npn \__siunitx_number_parse_combine_uncert_auxv:w #1
  {
    \quark_if_recursion_tail_stop_do:Nn #1
      {
        \bool_if:NT \l__siunitx_number_zero_uncert_bool
          { { S } { 0 } }
      }
    \str_if_eq:nnTF {#1} { 0 }
      { \__siunitx_number_parse_combine_uncert_auxv:w }
      { \__siunitx_number_parse_combine_uncert_auxvi:w #1 }
  }
\cs_new:Npn \__siunitx_number_parse_combine_uncert_auxvi:w
  #1 \q_recursion_tail \q_recursion_stop
  { { S } { \exp_not:n {#1} } }
\cs_new_protected:Npn \__siunitx_number_parse_comparator:
  {
    \exp_after:wN \__siunitx_number_parse_comparator_aux:Nw
      \l__siunitx_number_arg_tl \q_stop
  }
\cs_new_protected:Npn \__siunitx_number_parse_comparator_aux:Nw #1#2 \q_stop
  {
    \tl_if_in:NnTF \l_siunitx_number_input_comparator_tl {#1}
      {
        \tl_set:Nn \l__siunitx_number_comparator_tl {#1}
        \tl_set:Nn \l__siunitx_number_arg_tl {#2}
      }
      { \tl_clear:N \l__siunitx_number_comparator_tl }
    \tl_if_empty:NF \l__siunitx_number_arg_tl
      { \__siunitx_number_parse_sign: }
  }
\cs_new_protected:Npn \__siunitx_number_parse_exponent:
  {
    \tl_if_empty:NTF \l_siunitx_number_input_exponent_tl
      {
        \tl_set:Nn \l__siunitx_number_exponent_tl { { } 0 }
        \tl_if_empty:NF \l__siunitx_number_parsed_tl
          { \__siunitx_number_parse_loop: }
      }
      {
        \tl_set:Nx \l__siunitx_number_tmp_tl
          { \tl_head:V \l_siunitx_number_input_exponent_tl }
        \tl_map_inline:Nn \l_siunitx_number_input_exponent_tl
          {
            \tl_replace_all:NnV \l__siunitx_number_arg_tl
              {##1} \l__siunitx_number_tmp_tl
          }
        \use:x
          {
            \cs_set_protected:Npn
              \exp_not:N \__siunitx_number_parse_exponent_auxi:w
              ####1 \exp_not:V \l__siunitx_number_tmp_tl
              ####2 \exp_not:V \l__siunitx_number_tmp_tl
              ####3 \exp_not:N \q_stop
          }
            { \__siunitx_number_parse_exponent_auxii:nn {##1} {##2} }
        \use:x
          {
            \__siunitx_number_parse_exponent_auxi:w
              \exp_not:V \l__siunitx_number_arg_tl
              \exp_not:V \l__siunitx_number_tmp_tl \exp_not:N \q_nil
              \exp_not:V \l__siunitx_number_tmp_tl \exp_not:N \q_stop
          }
      }
  }
\cs_new_protected:Npn \__siunitx_number_parse_exponent_auxi:w  { }
\cs_new_protected:Npn \__siunitx_number_parse_exponent_auxii:nn #1#2
  {
    \quark_if_nil:nTF {#2}
      { \tl_set:Nn \l__siunitx_number_exponent_tl { { } 0 } }
      {
        \tl_set:Nn \l__siunitx_number_arg_tl {#1}
        \tl_if_blank:nTF {#2}
          { \tl_clear:N \l__siunitx_number_parsed_tl }
          { \__siunitx_number_parse_exponent_auxiii:Nw #2 \q_stop }
      }
    \tl_if_empty:NF \l__siunitx_number_parsed_tl
      { \__siunitx_number_parse_loop: }
  }
\cs_new_protected:Npn \__siunitx_number_parse_exponent_auxiii:Nw #1#2 \q_stop
  {
    \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#1}
      { \__siunitx_number_parse_exponent_auxiv:nn {#1} {#2} }
      { \__siunitx_number_parse_exponent_auxiv:nn { } {#1#2} }
    \tl_if_empty:NT \l__siunitx_number_exponent_tl
      { \tl_clear:N \l__siunitx_number_parsed_tl }
  }
\cs_new_protected:Npn \__siunitx_number_parse_exponent_auxiv:nn #1#2
  {
    \bool_lazy_or:nnTF
      { \l__siunitx_number_explicit_plus_bool }
      { ! \str_if_eq_p:nn {#1} { + } }
      { \tl_set:Nn \l__siunitx_number_exponent_tl { {#1} } }
      { \tl_set:Nn \l__siunitx_number_exponent_tl { { } } }
    \tl_if_blank:nTF {#2}
      { \tl_clear:N \l__siunitx_number_parsed_tl }
      {
        \__siunitx_number_parse_exponent_zero_test:N #2
          \q_recursion_tail \q_recursion_stop
      }
  }
\cs_new_protected:Npn \__siunitx_number_parse_exponent_zero_test:N #1
  {
    \quark_if_recursion_tail_stop_do:Nn #1
      { \tl_set:Nn \l__siunitx_number_exponent_tl { { } 0 } }
    \str_if_eq:nnTF {#1} { 0 }
      { \__siunitx_number_parse_exponent_zero_test:N }
      { \__siunitx_number_parse_exponent_check:N #1 }
  }
\cs_new_protected:Npn \__siunitx_number_parse_exponent_check:N #1
  {
    \quark_if_recursion_tail_stop:N #1
    \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#1}
      {
        \tl_put_right:Nn \l__siunitx_number_exponent_tl {#1}
        \__siunitx_number_parse_exponent_check:N
      }
      { \__siunitx_number_parse_exponent_cleanup:wN }
  }
\cs_new_protected:Npn \__siunitx_number_parse_exponent_cleanup:wN
  #1 \q_recursion_stop
  { \tl_clear:N \l__siunitx_number_parsed_tl }
\cs_new_protected:Npn \__siunitx_number_parse_finalise:
  {
    \tl_if_empty:NF \l__siunitx_number_parsed_tl
      {
        \tl_set:Nx \l__siunitx_number_parsed_tl
          {
            { \exp_not:V \l__siunitx_number_comparator_tl }
            \exp_not:V \l__siunitx_number_parsed_tl
            \exp_after:wN \__siunitx_number_parse_finalise:nw
              \l__siunitx_number_exponent_tl \q_stop
          }
      }
  }
\cs_new:Npn \__siunitx_number_parse_finalise:nw #1#2 \q_stop
  {
    { \exp_not:n {#1} }
    { \exp_not:n {#2} }
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop:
  {
    \tl_clear:N \l__siunitx_number_partial_tl
    \exp_after:wN \__siunitx_number_parse_loop_first:NNN
      \exp_after:wN \l__siunitx_number_parsed_tl \exp_after:wN \c_true_bool
        \l__siunitx_number_arg_tl
        \q_recursion_tail \q_recursion_stop
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_first:NNN #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #3
      {
        \bool_if:NTF #2
          { \tl_put_right:Nn #1 { { } { } { } } }
          { \__siunitx_number_parse_loop_break:wN \q_recursion_stop }
      }
    \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#3}
      {
        \__siunitx_number_parse_loop_main:NNNNN
          #1 \c_true_bool \c_false_bool #2 #3
      }
      {
        \tl_if_in:NnTF \l_siunitx_number_input_decimal_tl {#3}
          {
            \tl_put_right:Nn #1 { { 0 } }
            \__siunitx_number_parse_loop_after_decimal:NNN #1 #2
          }
          { \__siunitx_number_parse_loop_break:wN }
      }
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_main:NNNNN #1#2#3#4#5
  {
    \quark_if_recursion_tail_stop_do:Nn #5
      { \__siunitx_number_parse_loop_main_end:NN #1#2 }
    \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#5}
      { \__siunitx_number_parse_loop_main_digit:NNNNN #1#2#3#4#5 }
      {
        \tl_if_in:NnTF \l_siunitx_number_input_decimal_tl {#5}
          {
            \bool_if:NTF #2
              { \__siunitx_number_parse_loop_main_decimal:NN #1 #4 }
              { \__siunitx_number_parse_loop_break:wN }
          }
          {
            \tl_if_in:NnTF \l__siunitx_number_input_uncert_open_tl {#5}
              { \__siunitx_number_parse_loop_main_uncert:NNN #1#2 #4 }
              {
                \bool_if:NTF #4
                  {
                    \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#5}
                      {
                        \__siunitx_number_parse_loop_main_sign:NNN
                          #1#2 #5
                      }
                      { \__siunitx_number_parse_loop_break:wN }
                  }
                  { \__siunitx_number_parse_loop_break:wN }
              }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_main_end:NN #1#2
  {
    \tl_if_empty:NT \l__siunitx_number_partial_tl
      {
        \bool_if:NTF #2
          { \tl_set:Nn \l__siunitx_number_partial_tl { 0 } }
          {
            \bool_if:NT \l__siunitx_number_explicit_decimal_bool
              { \tl_set:Nn \l__siunitx_number_partial_tl { \empty } }
          }
      }
    \tl_put_right:Nx #1
      {
        { \exp_not:V \l__siunitx_number_partial_tl }
        \bool_if:NT #2 { { } }
        { }
      }
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_main_digit:NNNNN #1#2#3#4#5
  {
    \bool_lazy_or:nnTF
      {#3} { ! \str_if_eq_p:nn {#5} { 0 } }
      {
        \tl_put_right:Nn \l__siunitx_number_partial_tl {#5}
        \__siunitx_number_parse_loop_main:NNNNN #1 #2 \c_true_bool #4
      }
      { \__siunitx_number_parse_loop_main:NNNNN #1 #2 \c_false_bool #4 }
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_main_decimal:NN #1#2
  {
    \__siunitx_number_parse_loop_main_store:NNN #1 \c_false_bool \c_false_bool
    \__siunitx_number_parse_loop_after_decimal:NNN #1 #2
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_main_uncert:NNN #1#2#3
  {
    \__siunitx_number_parse_loop_main_store:NNN #1 #2 \c_false_bool
    \__siunitx_number_parse_uncert:NN #1
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_main_sign:NNN #1#2#3
  {
    \__siunitx_number_parse_loop_main_store:NNN #1 #2 \c_true_bool
    \tl_set:Nn \l__siunitx_number_flex_tl { {#3} }
    \__siunitx_number_parse_loop_first:NNN
      \l__siunitx_number_flex_tl \c_false_bool
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_main_store:NNN #1#2#3
  {
    \tl_if_empty:NT \l__siunitx_number_partial_tl
      { \tl_set:Nn \l__siunitx_number_partial_tl { 0 } }
    \tl_put_right:Nx #1
      {
        { \exp_not:V \l__siunitx_number_partial_tl }
        \bool_if:NT #2 { { } }
        \bool_if:NT #3 { { } }
      }
    \tl_clear:N \l__siunitx_number_partial_tl
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_after_decimal:NNN #1#2#3
  {
    \tl_if_blank:fTF { \exp_after:wN \use_none:n #1 }
      {
        \quark_if_recursion_tail_stop_do:Nn #3
          { \__siunitx_number_parse_loop_break:wN \q_recursion_stop }
        \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#1}
          {
            \tl_put_right:Nn \l__siunitx_number_partial_tl {#3}
            \__siunitx_number_parse_loop_main:NNNNN
              #1 \c_false_bool \c_true_bool #2
          }
          { \__siunitx_number_parse_loop_break:wN }
      }
      {
        \__siunitx_number_parse_loop_main:NNNNN
          #1 \c_false_bool \c_true_bool #2 #3
      }
  }
\cs_new_protected:Npn \__siunitx_number_parse_loop_break:wN
  #1 \q_recursion_stop
  {
    \tl_clear:N \l__siunitx_number_flex_tl
    \tl_clear:N \l__siunitx_number_parsed_tl
  }
\cs_new_protected:Npn \__siunitx_number_parse_sign:
  {
    \exp_after:wN \__siunitx_number_parse_sign_aux:Nw
      \l__siunitx_number_arg_tl \q_stop
  }
\cs_new_protected:Npn \__siunitx_number_parse_sign_aux:Nw #1#2 \q_stop
  {
    \tl_if_in:NnTF \l_siunitx_number_input_sign_tl {#1}
      {
        \tl_set:Nn \l__siunitx_number_arg_tl {#2}
        \bool_lazy_and:nnTF
          { \token_if_eq_charcode_p:NN #1 + }
          { ! \l__siunitx_number_explicit_plus_bool }
          { \tl_set:Nn \l__siunitx_number_parsed_tl { { } } }
          { \tl_set:Nn \l__siunitx_number_parsed_tl { {#1} } }
      }
      { \tl_set:Nn \l__siunitx_number_parsed_tl { { } } }
    \tl_if_empty:NTF \l__siunitx_number_arg_tl
      { \tl_clear:N \l__siunitx_number_parsed_tl }
      { \__siunitx_number_parse_exponent: }
  }
\cs_new_protected:Npn \__siunitx_number_parse_uncert:NN #1#2
  {
    \quark_if_recursion_tail_stop_do:Nn #2
      { \__siunitx_number_parse_loop_break:wN \q_recursion_stop }
    \tl_if_in:NnTF \l__siunitx_number_input_uncert_close_tl {#2}
      { \__siunitx_number_parse_loop_break:wN }
      {
        \__siunitx_number_parse_uncert:NNNN
          #1 \c_false_bool \__siunitx_number_parse_uncert_auxi:NN #2
      }
  }
\cs_new_protected:Npn \__siunitx_number_parse_uncert:NNNN #1#2#3#4
  {
    \quark_if_recursion_tail_stop_do:Nn #4
      { \__siunitx_number_parse_loop_break:wN \q_recursion_stop }
    \tl_if_in:NnTF \l__siunitx_number_input_digit_tl {#4}
      {
        \bool_lazy_or:nnTF
          {#2} { ! \str_if_eq_p:nn {#4} { 0 } }
          {
            \tl_put_right:Nn \l__siunitx_number_partial_tl {#4}
            \__siunitx_number_parse_uncert:NNNN #1 \c_true_bool #3
          }
          { \__siunitx_number_parse_uncert:NNNN #1 \c_false_bool #3 }
      }
      { #3 #1#4 }
  }
\cs_new_protected:Npn \__siunitx_number_parse_uncert_auxi:NN #1#2
  {
    \tl_if_in:NnTF \l__siunitx_number_input_uncert_close_tl {#2}
      {
        \__siunitx_number_parse_uncert_auxiii:N #1
        \__siunitx_number_parse_uncert_after:N
      }
      {
        \tl_if_in:NnTF \l_siunitx_number_input_decimal_tl {#2}
          { \__siunitx_number_parse_uncert_marker:N #1 }
          { \__siunitx_number_parse_loop_break:wN }
      }
  }
\cs_new_protected:Npn \__siunitx_number_parse_uncert_auxii:NN #1#2
  {
    \tl_if_in:NnTF \l__siunitx_number_input_uncert_close_tl {#2}
      {
        \__siunitx_number_parse_uncert_auxiii:N #1
        \__siunitx_number_parse_uncert_after:N
      }
      { \__siunitx_number_parse_loop_break:wN }
  }
\cs_new_protected:Npn \__siunitx_number_parse_uncert_auxiii:N #1
  {
    \tl_if_empty:NTF \l__siunitx_number_partial_tl
      {
        \tl_put_right:Nx #1
          {
            {
              \bool_if:NT \l__siunitx_number_zero_uncert_bool
                { { S } { 0 } }
            }
         }
      }
      {
        \tl_set:Nx \l__siunitx_number_partial_tl
          { { S } { \exp_not:V \l__siunitx_number_partial_tl } }
         \__siunitx_number_parse_loop_main_store:NNN #1
           \c_false_bool \c_false_bool
      }
  }
\cs_new_protected:Npn \__siunitx_number_parse_uncert_marker:N #1
  { \exp_after:wN \__siunitx_number_parse_uncert_marker:nnnN #1 #1 }
\cs_new_protected:Npn \__siunitx_number_parse_uncert_marker:nnnN #1#2#3#4
  {
    \int_compare:nNnTF
      { \tl_count:N \l__siunitx_number_partial_tl } > { \tl_count:n {#2} }
      { \__siunitx_number_parse_loop_break:wN }
      { \__siunitx_number_parse_uncert_marker:nNw {#3} #4 }
  }
\cs_new_protected:Npn \__siunitx_number_parse_uncert_marker:nNw
  #1#2#3 \q_recursion_tail \q_recursion_stop
  {
    \int_compare:nNnTF
      { \tl_count:n {#3} - 1 } = { \tl_count:n {#1} }
      {
        \str_if_eq:eeTF
          { \exp_not:V \l__siunitx_number_partial_tl }
          { \prg_replicate:nn { \tl_count:N \l__siunitx_number_partial_tl } { 0 } }
          {
            \__siunitx_number_parse_uncert:NNNN
              #2 \c_false_bool
          }
          {
            \__siunitx_number_parse_uncert:NNNN
              #2 \c_true_bool
          }
            \__siunitx_number_parse_uncert_auxii:NN
      }
      { \exp_after:wN \__siunitx_number_parse_uncert_extend:nnnN #2 #2 }
    #3 \q_recursion_tail \q_recursion_stop
  }
\cs_new_protected:Npn \__siunitx_number_parse_uncert_extend:nnnN #1#2#3#4
  {
    \tl_set:Nn #4 { {#1} {#2} { #3 0 } }
    \__siunitx_number_parse_uncert:NNNN #4 \c_true_bool
      \__siunitx_number_parse_uncert_auxii:NN
  }
\cs_new_protected:Npn \__siunitx_number_parse_uncert_after:N #1
  {
    \quark_if_recursion_tail_stop:N #1
    \__siunitx_number_parse_loop_break:wN
  }
\keys_define:nn { siunitx }
  {
    drop-exponent .bool_set:N =
      \l__siunitx_number_drop_exponent_bool ,
    drop-uncertainty .bool_set:N =
      \l__siunitx_number_drop_uncertainty_bool ,
    drop-zero-decimal .bool_set:N =
      \l__siunitx_number_drop_zero_decimal_bool ,
    exponent-mode .choices:nn =
      { engineering , fixed , input , scientific }
      { \tl_set_eq:NN \l__siunitx_number_exponent_mode_tl \l_keys_choice_tl } ,
    fixed-exponent .int_set:N =
      \l__siunitx_number_exponent_fixed_int ,
    minimum-decimal-digits .int_set:N =
      \l__siunitx_number_min_decimal_int ,
    minimum-integer-digits .int_set:N =
      \l__siunitx_number_min_integer_int ,
    round-half .choice: ,
    round-half / even .code:n =
      { \bool_set_true:N \l__siunitx_number_round_half_even_bool } ,
    round-half / up .code:n =
      { \bool_set_false:N \l__siunitx_number_round_half_even_bool } ,
    round-minimum .code:n =
      { \__siunitx_number_set_round_min:n {#1} } ,
    round-mode .choices:nn =
      { figures , none , places, uncertainty }
      { \tl_set_eq:NN \l__siunitx_number_round_mode_tl \l_keys_choice_tl } ,
    round-pad .bool_set:N =
      \l__siunitx_number_round_pad_bool ,
    round-precision .int_set:N =
      \l__siunitx_number_round_precision_int ,
  }
\bool_new:N \l__siunitx_number_round_half_even_bool
\tl_new:N \l__siunitx_number_exponent_mode_tl
\tl_new:N \l__siunitx_number_round_mode_tl
\tl_new:N \l__siunitx_number_round_min_tl
\cs_new_protected:Npn \__siunitx_number_set_round_min:n #1
  {
    \siunitx_number_parse:nN {#1} \l__siunitx_number_tmp_tl
    \exp_after:wN \__siunitx_number_set_round_min:nnnnnnn \l__siunitx_number_tmp_tl
  }
\cs_new:Npn \__siunitx_number_set_round_min:nnnnnnn #1#2#3#4#5#6#7
  {
    \tl_set:Nx \l__siunitx_number_round_min_tl
      {
        \bool_lazy_and:nnF
          { \str_if_eq_p:nn {#3} { 0 } }
          {
            \str_if_eq_p:ee
              { \exp_not:n {#4} }
              { \prg_replicate:nn { \tl_count:n {#4} } { 0 } }
          }
          { \exp_not:n { {#3} {#4} } }
      }
  }
\cs_new_protected:Npn \siunitx_number_process:NN #1#2
  {
    \tl_if_empty:NTF #1
      { \tl_clear:N #2 }
      {
        \__siunitx_number_drop_uncertainty:NN #1 #2
        \exp_after:wN \__siunitx_number_process:nnnnnnnNN #2 #2 #2
        \__siunitx_number_drop_exponent:NN #2 #2
        \__siunitx_number_zero_decimal:NN #2 #2
        \__siunitx_number_digits:NN #2 #2
      }
  }
\cs_new_protected:Npn \__siunitx_number_process:nnnnnnnNN #1#2#3#4#5#6#7#8#9
  {
    \bool_lazy_and:nnTF
      { \str_if_eq_p:nn {#3} { 0 } }
      {
        \str_if_eq_p:ee
          { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } }
      }
      { \__siunitx_number_round:NN #8 #9 }
      {
        \__siunitx_number_exponent:NN #8 #9
        \__siunitx_number_round:NN #9 #9
      }
  }
\cs_new_protected:Npn \__siunitx_number_exponent:NN #1#2
  {
    \tl_set:Nx #2
      {
        \cs:w
          __siunitx_number_exponent_ \l__siunitx_number_exponent_mode_tl :nnnnnnn
          \exp_after:wN
        \cs_end: #1
      }
    \str_if_eq:VnT \l__siunitx_number_exponent_mode_tl { engineering }
      {
        \tl_set:Nx #2
          { \exp_after:wN \__siunitx_number_exponent_engineering_aux:nnnnnnn #2 }
      }
  }
\cs_new:Npn \__siunitx_number_exponent_fixed:nnnnnnn #1#2#3#4#5#6#7
  {
    \exp_args:Nf \__siunitx_number_exponent_fixed:nnnnnnnn
      { \int_eval:n { \l__siunitx_number_exponent_fixed_int - (#6#7) } }
      {#1} {#2} {#3} {#4} {#5} {#6} {#7}
  }
\cs_new:Npn \__siunitx_number_exponent_fixed:nnnnnnnn #1#2#3#4#5#6#7#8
  {
    \exp_not:n { {#2} {#3} }
    \__siunitx_number_exponent_shift:nnn {#1} {#4} {#5}
    \__siunitx_number_exponent_uncert:n {#6}
    \exp_not:n { {#7} } { \int_use:N \l__siunitx_number_exponent_fixed_int }
  }
\cs_new:Npn \__siunitx_number_exponent_input:nnnnnnn #1#2#3#4#5#6#7
  { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
\cs_new:Npn \__siunitx_number_exponent_scientific:nnnnnnn #1#2#3#4#5#6#7
  {
    \exp_args:Nf \__siunitx_number_exponent_scientific:nnnnnnnn
      { \int_eval:n { \tl_count:n {#3} } }
      {#1} {#2} {#3} {#4} {#5} {#6} {#7}
  }
\cs_new:Npn \__siunitx_number_exponent_scientific:nnnnnnnn #1#2#3#4#5#6#7#8
  {
    \exp_not:n { {#2} {#3} }
    \int_compare:nNnTF {#1} = 1
      {
        \str_if_eq:nnTF {#4} { 0 }
          {
            \__siunitx_number_exponent_scientific:nnnw
              { 0 } {#6} { #7#8 } #5 \q_stop
          }
          { \exp_not:n { {#4} {#5} {#6} {#7} {#8} } }
      }
      {
        \__siunitx_number_exponent_shift:nnn { #1 - 1 } {#4} {#5}
        \__siunitx_number_exponent_uncert:n {#6}
        \__siunitx_number_exponent_finalise:n { #1 + #7#8 - 1 }
      }
  }
\cs_new_eq:NN \__siunitx_number_exponent_engineering:nnnnnnn
  \__siunitx_number_exponent_scientific:nnnnnnn
\cs_new:Npn \__siunitx_number_exponent_scientific:nnnw #1#2#3#4#5 \q_stop
  {
    \str_if_eq:nnTF {#4} { 0 }
      {
        \__siunitx_number_exponent_scientific:nnnw
          { #1 - 1 } {#2} {#3} #5 \q_stop
      }
      {
        \exp_not:n { {#4} {#5} {#2} }
        \__siunitx_number_exponent_finalise:n { #1 + #3 - 1 }
      }
  }
\cs_new:Npn \__siunitx_number_exponent_shift:nnn #1#2#3
  {
    \int_compare:nNnTF {#1} > 0
      { \__siunitx_number_exponent_shift_down:nnnw {#1} {#3} { } #2 \q_stop }
      {
        \int_compare:nNnTF {#1} < 0
          { \__siunitx_number_exponent_shift_up:nnn {#1} {#2} {#3} }
          { {#2} {#3} }
      }
  }
\cs_generate_variant:Nn \__siunitx_number_exponent_shift:nnn { nnf }
\cs_new:Npn \__siunitx_number_exponent_shift_down:nnnw #1#2#3#4#5 \q_stop
  {
    \tl_if_blank:nTF {#5}
      { \__siunitx_number_exponent_shift_down:nnn {#1} { #4 #3 } {#2} }
      { \__siunitx_number_exponent_shift_down:nnnw {#1} {#2} { #4 #3 } #5 \q_stop }
  }
\cs_new:Npn \__siunitx_number_exponent_shift_down:nnn #1#2#3
  {
    \int_compare:nNnTF {#1} = 0
      { { \tl_reverse:n {#2} } \exp_not:n { {#3} } }
      { \__siunitx_number_exponent_shift_down:nw {#1} #2 \q_stop {#3} }
  }
\cs_new:Npn \__siunitx_number_exponent_shift_down:nw #1#2#3 \q_stop #4
  {
    \tl_if_blank:nTF {#3}
      { \__siunitx_number_exponent_shift_down:nnn { #1 - 1 } { 0 } { #2#4 } }
      { \__siunitx_number_exponent_shift_down:nnn { #1 - 1 } {#3} { #2#4 } }
  }
\cs_new:Npn \__siunitx_number_exponent_shift_up:nnn #1#2#3
  {
    \tl_if_blank:nTF {#3}
      {
        \__siunitx_number_exponent_shift_up_aux:ffn
          { \int_eval:n { #1 + 1 } }
          { \str_if_eq:nnF {#2} { 0 } {#2} 0 }
          { }
        \__siunitx_number_exponent_shift_uncert:nw { 1 }
      }
      {  \__siunitx_number_exponent_shift_up:nnw {#1} {#2} #3 \q_stop }
  }
\cs_new:Npn \__siunitx_number_exponent_shift_up:nnw #1#2#3#4 \q_stop
  {
    \__siunitx_number_exponent_shift_up_aux:ffn
      { \int_eval:n { #1 + 1 } }
      { \str_if_eq:nnF {#2} { 0 } {#2} #3 }
      {#4}
  }
\cs_new:Npn \__siunitx_number_exponent_shift_up_aux:nnn #1#2#3
  {
    \int_compare:nNnTF {#1} = 0
      { \exp_not:n { {#2} {#3} } }
      {
        \tl_if_blank:nTF {#3}
          {
            {
              \exp_not:n {#2}
              \prg_replicate:nn { \int_abs:n {#1} } { 0 }
            }
            { }
            \__siunitx_number_exponent_shift_uncert:nw { \int_abs:n {#1} }
         }
         { \__siunitx_number_exponent_shift_up:nnn {#1} {#2} {#3} }
      }
  }
\cs_generate_variant:Nn \__siunitx_number_exponent_shift_up_aux:nnn { f , ff }
\cs_new:Npn \__siunitx_number_exponent_shift_uncert:nw
  #1#2 \__siunitx_number_exponent_uncert:n #3
  {
    \tl_if_blank:nTF {#3}
      {
        #2
        \__siunitx_number_exponent_uncert:n { }
      }
      {
        \str_if_eq:nnTF {#3} { 0 }
          {
            #2
            \__siunitx_number_exponent_uncert:n { { S } { 0 } }
          }
          {
            \use:c { __siunitx_number_exponent_shift_uncert_ \use_i:nn #3 :fnnn }
              { \prg_replicate:nn {#1} { 0 } }
              {#2}
              #3
          }
      }
  }
\cs_new:Npn \__siunitx_number_exponent_shift_uncert_S:nnnn #1#2#3#4
  {
    #2
    \__siunitx_number_exponent_uncert:n { { S } { #4#1 } }
  }
\cs_generate_variant:Nn \__siunitx_number_exponent_shift_uncert_S:nnnn { f }
\cs_new:Npn \__siunitx_number_exponent_uncert:n #1 { { \exp_not:n {#1} } }
\cs_new:Npn \__siunitx_number_exponent_finalise:n #1
  {
    \int_compare:nNnTF {#1} < 0
      { { - } }
      { { } }
      { \int_abs:n {#1} }
  }
\cs_new:Npn \__siunitx_number_exponent_engineering_aux:nnnnnnn #1#2#3#4#5#6#7
  {
    \exp_not:n { {#1} {#2} }
    \use:c
      {
        __siunitx_number_exponent_engineering_
     \int_compare:nNnTF {#6#7} < 0
       {
         \int_case:nnF { \int_mod:nn { #7 } { 3 } }
           {
             { 1 } { 2 }
             { 2 } { 1 }
           }
           { 0 }
       }
       { \int_mod:nn {#7} { 3 } }
       :nnnn
      }
        {#3} {#4} {#5} {#6#7}
  }
\cs_new:cpn { __siunitx_number_exponent_engineering_0:nnnn } #1#2#3#4
  {
    \exp_not:n { {#1} {#2} {#3} }
    \__siunitx_number_exponent_finalise:n {#4}
  }
\cs_new:cpn { __siunitx_number_exponent_engineering_1:nnnn } #1#2#3#4
  {
    \tl_if_blank:nTF {#2}
      {
        { \exp_not:n { #1 0 } } { }
        { \__siunitx_number_exponent_engineering_uncert:nn {#3} { 0 } }
      }
      {
        { \exp_not:n {#1} \exp_not:o { \tl_head:w #2 \q_stop } }
        { \exp_not:f { \tl_tail:n {#2} } }
        { \exp_not:n {#3} }
      }
    \__siunitx_number_exponent_finalise:n { #4 - 1 }
  }
\cs_new:cpn { __siunitx_number_exponent_engineering_2:nnnn } #1#2#3#4
  {
    \tl_if_blank:nTF {#2}
      {
        { \exp_not:n { #1 00 } } { }
        { \__siunitx_number_exponent_engineering_uncert:nn {#3} { 00 } }
      }
      { \__siunitx_number_exponent_engineering:nnNw {#1} {#3} #2 \q_stop }
    \__siunitx_number_exponent_finalise:n { #4 - 2 }
  }
\cs_new:Npn \__siunitx_number_exponent_engineering:nnNw #1#2#3#4 \q_stop
  {
    \tl_if_blank:nTF {#4}
      {
        { \exp_not:n { #1#3 0 } } { }
        { \__siunitx_number_exponent_engineering_uncert:nn {#2} { 0 } }
      }
      {
        { \exp_not:n {#1#3} \exp_not:o { \tl_head:w #4 \q_stop } }
        { \exp_not:f { \tl_tail:n {#4} } }
        { \exp_not:n {#2} }
      }
  }
\cs_new:Npn \__siunitx_number_exponent_engineering_uncert:nn #1#2
  {
    \tl_if_blank:nF {#1}
      {
        \use:c { __siunitx_number_exponent_engineering_uncert_ \use_i:nn #1 :nnn }
          #1 {#2}
      }
  }
\cs_new:Npn \__siunitx_number_exponent_engineering_uncert_S:nnn #1#2#3
  {
    { S }
    {
      \exp_not:n {#2}
      \str_if_eq:nnF {#2} { 0 } {#3}
    }
  }
\cs_new_protected:Npn \__siunitx_number_digits:NN #1#2
  {
    \tl_set:Nx #2
      { \exp_after:wN \__siunitx_number_digits:nnnnnnn #1 }
  }
\cs_new:Npn \__siunitx_number_digits:nnnnnnn #1#2#3#4#5#6#7
  {
    \exp_not:n { {#1} {#2} }
    {
      \__siunitx_number_digits:Nn \l__siunitx_number_min_integer_int {#3}
      \exp_not:n {#3}
    }
    {
      \exp_not:n {#4}
      \__siunitx_number_digits:Nn \l__siunitx_number_min_decimal_int {#4}
    }
    { \tl_if_blank:nF {#5} { \__siunitx_number_digits_uncert:nn #5 } }
    \exp_not:n { {#6} {#7} }
  }
\cs_new:Npn \__siunitx_number_digits:Nn #1#2
  {
    \int_compare:nNnT
      { #1 - \tl_count:n {#2} } > 0
      { \prg_replicate:nn { #1 - \tl_count:n {#2}  } { 0 } }
  }
\cs_new:Npn \__siunitx_number_digits_uncert:nn #1#2
  {
    { #1 }
    { \use:c { __siunitx_number_digits_uncert_ #1 :n } {#2} }
  }
\cs_new:Npn \__siunitx_number_digits_uncert_S:n #1
  {
    \exp_not:n {#1}
    \__siunitx_number_digits:Nn \l__siunitx_number_min_decimal_int {#1}
  }
\cs_new_protected:Npn \__siunitx_number_drop_exponent:NN #1#2
  {
    \bool_if:NT \l__siunitx_number_drop_exponent_bool
      {
        \str_if_eq:VnT \l__siunitx_number_exponent_mode_tl { input }
          { \msg_warning:nn { siunitx } { ambiguous-dropped-exponent } }
        \tl_set:Nx #2
          { \exp_after:wN \__siunitx_number_drop_exponent:nnnnnnn #1 }
      }
  }
\cs_new:Npn \__siunitx_number_drop_exponent:nnnnnnn #1#2#3#4#5#6#7
  { \exp_not:n { {#1} {#2} {#3} {#4} {#5} { } { 0 } } }
\cs_new_protected:Npn \__siunitx_number_drop_uncertainty:NN #1#2
  {
    \bool_if:NTF \l__siunitx_number_drop_uncertainty_bool
      {
        \tl_set:Nx #2
          { \exp_after:wN \__siunitx_number_drop_uncertainty:nnnnnnn #1 }
      }
      { \tl_set_eq:NN #2 #1 }

  }
\cs_new:Npn \__siunitx_number_drop_uncertainty:nnnnnnn #1#2#3#4#5#6#7
  { \exp_not:n { {#1} {#2} {#3} {#4} { } {#6} {#7} } }
\cs_new_protected:Npn \__siunitx_number_round:NN #1#2
  {
    \tl_set:Nx #2
      {
        \str_if_eq:VnTF \l__siunitx_number_round_mode_tl { none }
          { \exp_not:V #1 }
          { \exp_after:wN \__siunitx_number_round:nnnnnnn #1 }
       }
  }
\cs_new:Npn \__siunitx_number_round:nnnnnnn #1#2#3#4#5#6#7
  {
    \str_if_eq:nnTF {#4} { \empty }
      { \use:c { __siunitx_number_round_ \l__siunitx_number_round_mode_tl :nnnnnnn } {#1} {#2} {#3} { } }
      { \use:c { __siunitx_number_round_ \l__siunitx_number_round_mode_tl :nnnnnnn } {#1} {#2} {#3} {#4} }
        {#5} {#6} {#7}
  }
\cs_new:Npn \__siunitx_number_round:nnn #1#2#3
  {
    \__siunitx_number_round_auxi:nnnN {#1} {#2} { }
      #3 \q_recursion_tail \q_recursion_stop
  }
\cs_generate_variant:Nn \__siunitx_number_round:nnn { f }
\cs_new:Npn \__siunitx_number_round_auxi:nnnN #1#2#3#4
  {
    \quark_if_recursion_tail_stop_do:Nn #4
      {
        \__siunitx_number_round_auxii:nnnN {#1} {#3} { } #2
          \q_recursion_tail \q_recursion_stop
      }
    \__siunitx_number_round_auxi:nnnN {#1} {#2} {#4#3}
  }
\cs_new:Npn \__siunitx_number_round_auxii:nnnN #1#2#3#4
  {
    \quark_if_recursion_tail_stop_do:Nn #4
      {
        \tl_if_blank:nTF {#2}
          {
            \__siunitx_number_round_auxiv:nnnN {#1} { } { } #3
              \q_recursion_tail \q_recursion_stop
          }
          {
            \__siunitx_number_round_auxiii:nnnN {#1} {#3} { } #2
              \q_recursion_tail \q_recursion_stop
          }
      }
    \__siunitx_number_round_auxii:nnnN {#1} {#2} {#4#3}
  }
\cs_new:Npn \__siunitx_number_round_auxiii:nnnN #1#2#3#4
  {
    \quark_if_recursion_tail_stop_do:Nn #4
      {
        \__siunitx_number_round_auxiv:nnnN {#1} { } {#3} #2
          \q_recursion_tail \q_recursion_stop
      }
    \int_compare:nNnTF {#1} > 0
      {
        \exp_args:Nf \__siunitx_number_round_auxiii:nnnN
          { \int_eval:n { #1 - 1 } } {#2} { #4#3 }
      }
      { \__siunitx_number_round_auxv:nnN {#3} {#2} #4 }
  }
\cs_new:Npn \__siunitx_number_round_auxiv:nnnN #1#2#3#4
  {
    \quark_if_recursion_tail_stop_do:Nn #4
      {
        \int_compare:nNnTF {#1} = 0
          {
            \__siunitx_number_round_auxvi:nnN {#3} {#2}
              0 \q_recursion_tail \q_recursion_stop
          }
          { { 0 } { } }
      }
    \int_compare:nNnTF {#1} > 0
      {
        \exp_args:Nf \__siunitx_number_round_auxiv:nnnN
          { \int_eval:n { #1 - 1 } } { #2 0 } { #4#3 }
      }
      { \__siunitx_number_round_auxvi:nnN {#3} {#2} #4 }
  }
\cs_new:Npn \__siunitx_number_round_auxv:nnN #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #3
      {
        \__siunitx_number_round_auxvi:nnN
          {#1} { } #2 \q_recursion_tail \q_recursion_stop
      }
    \bool_lazy_or:nnTF
      { \int_compare_p:nNn { 0 \tl_head:n {#1} } < 5 }
      {
        \bool_lazy_all_p:n
          {
            { \l__siunitx_number_round_half_even_bool }
            { ! \int_if_odd_p:n {#3} }
            { \__siunitx_number_round_if_half_p:n {#1} }
          }
      }
      { \__siunitx_number_round_final_decimal:nnw }
      { \__siunitx_number_round_auxvii:nnN }
        {#2} { } #3
  }
\cs_new:Npn \__siunitx_number_round_auxvi:nnN #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #3
      { { 0 } { } }
    \bool_lazy_or:nnTF
      { \int_compare_p:nNn { 0 \tl_head:n {#1} } < 5 }
      {
        \bool_lazy_all_p:n
          {
            { \l__siunitx_number_round_half_even_bool }
            { ! \int_if_odd_p:n {#3} }
            { \__siunitx_number_round_if_half_p:n {#1} }
          }
      }
      { \__siunitx_number_round_final_integer:nnw }
      { \__siunitx_number_round_auxviii:nnN }
        { } {#2} #3
  }
\cs_new:Npn \__siunitx_number_round_auxvii:nnN #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #3
      {
        \str_if_eq:nnTF {#1} { 0 }
          {
            \__siunitx_number_round_final_output:ff
              { 1 }
              { \__siunitx_number_round_truncate:n {#2} }
          }
          {
            \__siunitx_number_round_auxviii:nnN {#2} { } #1
              \q_recursion_tail \q_recursion_stop
          }
      }
    \int_compare:nNnTF {#3} = 9
      { \__siunitx_number_round_auxvii:nnN {#1} { 0 #2 } }
      {
        \int_compare:nNnTF {#3} = 0
          {
            \__siunitx_number_round_final_decimal:nnw
              {#1} { 1 \__siunitx_number_round_truncate:n {#2} }
          }
          {
            \__siunitx_number_round_final:fn
              { \int_eval:n { #3 + 1 } }
              { \__siunitx_number_round_final_decimal:nnw {#1} {#2} }
          }
      }
  }
\cs_new:Npn \__siunitx_number_round_auxviii:nnN #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #3
      {
        \tl_if_blank:nTF {#1}
          {
            \__siunitx_number_round_final_shift:ff
              {
                \exp_last_unbraced:Nf 1
                  { \__siunitx_number_round_truncate_direct:n {#2} } 0
              }
              { }
          }
          {
            \__siunitx_number_round_final_shift:ff
              { 1 #2 }
              { \__siunitx_number_round_truncate:n {#1} }
          }
      }
    \int_compare:nNnTF {#3} = 9
      { \__siunitx_number_round_auxviii:nnN {#1} { 0 #2 } }
      {
        \__siunitx_number_round_final:fn
          { \int_eval:n { #3 + 1 } }
          { \__siunitx_number_round_final_integer:nnw {#1} {#2} }
      }
  }
\cs_new:Npn \__siunitx_number_round_final_decimal:nnw
  #1#2#3 \q_recursion_tail \q_recursion_stop
  {
    \__siunitx_number_round_final_output:ff
      { \tl_reverse:n {#1} }
      { \tl_reverse:n {#3} #2 }
  }
\cs_new:Npn \__siunitx_number_round_final_integer:nnw
  #1#2#3 \q_recursion_tail \q_recursion_stop
  {
    \__siunitx_number_round_final_output:ff
      { \exp_args:Ne \__siunitx_number_round_final_significant:n { \tl_reverse:n {#3} #2 } }
      {#1}
  }
\cs_new:Npn \__siunitx_number_round_final_significant:n #1
  {
     \__siunitx_number_round_final_significant:N #1
       \q_recursion_tail \q_recursion_stop
  }
\cs_new:Npn \__siunitx_number_round_final_significant:N #1
  {
    \quark_if_recursion_tail_stop_do:Nn #1 { 0 }
    \int_compare:nNnTF {#1} = 0
      { \__siunitx_number_round_final_significant:N }
      {
        #1
        \__siunitx_number_round_final_significant:w
      }
  }
\cs_new:Npn \__siunitx_number_round_final_significant:w
  #1 \q_recursion_tail \q_recursion_stop
  {#1}
\cs_new:Npn \__siunitx_number_round_final_output:nn #1#2 { {#1} {#2} }
\cs_generate_variant:Nn \__siunitx_number_round_final_output:nn { ff }
\cs_new:Npn \__siunitx_number_round_final:nn #1#2
  { #2 #1 }
\cs_generate_variant:Nn \__siunitx_number_round_final:nn { f }
\cs_new:Npn \__siunitx_number_round_final_shift:nn #1#2
  {
    \str_if_eq:VnTF \l__siunitx_number_round_mode_tl { places }
      {
        \use:c
          { __siunitx_number_round_ \l__siunitx_number_exponent_mode_tl :nn }
          {#1} {#2}
      }
      { {#1} {#2} }
  }
\cs_generate_variant:Nn \__siunitx_number_round_final_shift:nn { ff }
\cs_new:Npn \__siunitx_number_round_engineering:nn #1#2
  {
    \int_compare:nNnTF { \tl_count:n {#1} } = 4
      {
        \__siunitx_number_round_engineering:NNNNn #1 {#2}
        \__siunitx_number_round_final_shift:Nw 3
      }
      { {#1} {#2} }
  }
\cs_new:Npn \__siunitx_number_round_engineering:NNNNn #1#2#3#4#5
  {
    {#1}
    \exp_args:NV \__siunitx_number_round_engineering:nnN
      { \l__siunitx_number_round_precision_int } { }
      #2#3#4#5 \q_recursion_tail \q_recursion_stop
  }
\cs_new:Npn \__siunitx_number_round_engineering:nnN #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #3 { {#2} }
    \int_compare:nNnTF {#1} = { 0 }
      { \use_i_delimit_by_q_recursion_stop:nw { {#2} } }
      { \__siunitx_number_round_engineering:nnN { #1 - 1 } { #2#3 } }
  }
\cs_new:Npn \__siunitx_number_round_fixed:nn #1#2 { {#1} {#2} }
\cs_new:Npn \__siunitx_number_round_input:nn #1#2 { {#1} {#2} }
\cs_new:Npn \__siunitx_number_round_scientific:nn #1#2
  {
    \__siunitx_number_exponent_shift:nnf
      { 1 } {#1} { \__siunitx_number_round_truncate_direct:n {#2} }
    \__siunitx_number_round_final_shift:Nw 1
  }
\cs_new:Npn \__siunitx_number_round_final_shift:Nw #1#2 \__siunitx_number_round_places_end:nnn #3#4#5
  {
    \exp_not:n { {#3} }
    \__siunitx_number_exponent_finalise:n { #4#5 + #1 }
  }
\cs_new:Npn \__siunitx_number_round_truncate:n #1
  {
    \str_if_eq:VnTF \l__siunitx_number_round_mode_tl { figures }
      { \__siunitx_number_round_truncate_direct:n {#1} }
      {#1}
  }
\cs_new:Npn \__siunitx_number_round_truncate_direct:n #1
  {
    \__siunitx_number_round_truncate:nnN { } { }
      #1 \q_recursion_tail \q_recursion_stop
  }
\cs_new:Npn \__siunitx_number_round_truncate:nnN #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #3 { #1 }
    \__siunitx_number_round_truncate:nnN {#1#2} {#3}
  }
\prg_new_conditional:Npnn \__siunitx_number_round_if_half:n #1 { p }
  {
    \int_compare:nNnTF { \tl_head:n { #1 0 } } = 5
      {
        \exp_after:wN \__siunitx_number_round_if_half:N \use_none:n #1 0
          \q_recursion_tail \q_recursion_stop
      }
      { \prg_return_false: }
  }
\cs_new:Npn \__siunitx_number_round_if_half:N #1
  {
    \quark_if_recursion_tail_stop_do:Nn #1
      { \prg_return_true: }
    \int_compare:nNnTF {#1} = 0
      { \__siunitx_number_round_if_half:N }
      { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_false: } }
  }
\cs_new:Npn \__siunitx_number_round_pad:nnn #1#2#3
  {
    {#2}
    {
      #3
      \bool_if:NT \l__siunitx_number_round_pad_bool
        { \prg_replicate:nn {#1} { 0 } }
    }
  }
\cs_new:Npn \__siunitx_number_round_figures:nnnnnnn #1#2#3#4#5#6#7
  {
    \bool_lazy_and:nnTF
      { \str_if_eq_p:nn {#3} { 0 } }
      {
        \str_if_eq_p:ee
          { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } }
      }
      { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
      { \__siunitx_number_round_figures_aux:nnnnnnn {#1} {#2} {#3} {#4} {#5} {#6} {#7} }
  }
\cs_new:Npn \__siunitx_number_round_figures_aux:nnnnnnn #1#2#3#4#5#6#7
  {
    \tl_if_blank:nTF {#5}
      {
        \int_compare:nNnTF \l__siunitx_number_round_precision_int > 0
          {
            \exp_not:n { {#1} {#2} }
            \__siunitx_number_round_figures_count:nnN {#3} {#4} #3#4
              \q_recursion_tail \q_recursion_stop
            \exp_not:n { { } {#6} {#7} }
          }
          { { } { } { 0 } { } { } { } { 0 } }
      }
      { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
  }
\cs_new:Npn \__siunitx_number_round_figures_count:nnN #1#2#3
  {
    \quark_if_recursion_tail_stop_do:Nn #3
      { { } { } { 0 } { } { } { } { 0 } }
    \int_compare:nNnTF {#3} = 0
      { \__siunitx_number_round_figures_count:nnN {#1} {#2} }
      { \__siunitx_number_round_figures_count:nnnN { 1 } {#1} {#2} }
  }
\cs_new:Npn \__siunitx_number_round_figures_count:nnnN #1#2#3#4
  {
    \quark_if_recursion_tail_stop_do:Nn #4
      {
        \int_compare:nNnTF {#1} > \l__siunitx_number_round_precision_int
          {
            \__siunitx_number_round:fnn
              { \int_eval:n { #1 - \l__siunitx_number_round_precision_int } }
              {#2} {#3}
          }
          {
            \__siunitx_number_round_pad:nnn
              { \l__siunitx_number_round_precision_int - (#1) } {#2} {#3}
          }
      }
    \exp_args:Nf \__siunitx_number_round_figures_count:nnnN
      { \int_eval:n { #1 + 1 } } {#2} {#3}
  }
\cs_new:Npn \__siunitx_number_round_places:nnnnnnn #1#2#3#4#5#6#7
  {
    \tl_if_blank:nTF {#5}
      {
        \exp_args:Ne \__siunitx_number_round_places_finalise:n
          {
            \exp_not:n { {#1} {#2} }
            \int_compare:nNnTF \l__siunitx_number_round_precision_int > 0
              { \__siunitx_number_round_places_decimal:nn }
              { \__siunitx_number_round_places_integer:nn }
                {#3} {#4}
            \__siunitx_number_round_places_end:nnn { } {#6} {#7}
          }
      }
      { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
  }
\cs_new:Npn \__siunitx_number_round_places_end:nnn #1#2#3 { \exp_not:n { {#1} {#2} {#3} } }
\cs_new:Npn \__siunitx_number_round_places_decimal:nn #1#2
  {
    \int_compare:nNnTF
      { \l__siunitx_number_round_precision_int - 0 \tl_count:n {#2} } > 0
      {
        \__siunitx_number_round_pad:nnn
          { \l__siunitx_number_round_precision_int - 0 \tl_count:n {#2} }
          {#1} {#2}
      }
      {
        \__siunitx_number_round:fnn
           {
             \int_eval:n
               { 0 \tl_count:n {#2} - \l__siunitx_number_round_precision_int }
           }
           {#1} {#2}
      }
  }
\cs_new:Npn \__siunitx_number_round_places_integer:nn #1#2
  {
    \__siunitx_number_round:fnn
       {
         \int_eval:n
           { 0 \tl_count:n {#2} - \l__siunitx_number_round_precision_int }
       }
       {#1} {#2}
  }
\cs_new:Npn \__siunitx_number_round_places_finalise:n #1
  { \__siunitx_number_round_places_finalise:nnnnnnn #1 }
\cs_new:Npn \__siunitx_number_round_places_finalise:nnnnnnn #1#2#3#4#5#6#7
  {
    \bool_lazy_and:nnTF
      { \str_if_eq_p:nn {#3} { 0 } }
      {
        \str_if_eq_p:ee
          { \exp_not:n {#4} } { \prg_replicate:nn { \tl_count:n {#4} } { 0 } }
      }
      {
        \tl_if_empty:NTF \l__siunitx_number_round_min_tl
          {
            \exp_not:n { {#1} }
            { \str_if_eq:nnF {#2} { - } { \exp_not:n {#2} } }
            \exp_not:n { {#3} {#4} {#5} {#6} {#7} }
          }
          {
            \exp_after:wN \__siunitx_number_round_places_finalise:nnnnn
              \l__siunitx_number_round_min_tl {#2} {#6} {#7}
          }
      }
      { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
  }
\cs_new:Npn \__siunitx_number_round_places_finalise:nnnnn #1#2#3#4#5
  {
    {
      \str_if_eq:nnTF {#3} { - }
        { > }
        { < }
    }
    \exp_not:n { {#3} {#1} {#2} { } {#4} {#5} }
  }
\cs_new:Npn \__siunitx_number_round_uncertainty:nnnnnnn #1#2#3#4#5#6#7
  {
    \bool_lazy_or:nnTF
      { \tl_if_blank_p:n {#5} }
      { ! \int_compare_p:nNn \l__siunitx_number_round_precision_int > 0 }
      { \exp_not:n { {#1} {#2} {#3} {#4} { } {#6} {#7} } }
      {
        \str_if_eq:eeTF { \tl_head:n {#5} } { S }
          {
            \exp_not:n { {#1} {#2} }
            \exp_args:Nnno \__siunitx_number_round_uncertainty:nnn
              {#3} {#4} { \use_ii:nn #5 }
            \__siunitx_number_round_uncertainty_end:nn {#6} {#7}
          }
          { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
      }
  }
\cs_new:Npn \__siunitx_number_round_uncertainty_end:nn #1#2
  { \exp_not:n { {#1} {#2} } }
\cs_new:Npn \__siunitx_number_round_uncertainty:nnn #1#2#3
  {
    \exp_args:Nf \__siunitx_number_round_uncertainty:nnnn
      {
        \int_eval:n
          { \tl_count:n {#3} - \l__siunitx_number_round_precision_int }
      }
      {#1} {#2} {#3}
  }
\cs_new:Npn \__siunitx_number_round_uncertainty:nnnn #1#2#3#4
  {
    \exp_last_unbraced:Nf \__siunitx_number_round_uncertainty:nnnnn
      { \__siunitx_number_round:nnn {#1} { } {#4} }
      {#2} {#3} {#1}
  }
\cs_new:Npn \__siunitx_number_round_uncertainty:nnnnn #1#2#3#4#5
  {
    \tl_if_blank:nTF {#1}
      {
        \exp_args:Nf \__siunitx_number_round_uncertainty_simple:nnnnn
          {
            \prg_replicate:nn
              {
                \int_max:nn
                  {
                    \tl_if_blank:nTF {#4}
                      { #5 }
                      { 0 - ( \tl_count:n {#4} - \tl_count:n {#2} - #5 +  1 ) }
                  }
                  { 0 }
              }
              { 0 }
          }
          {#3} {#4} {#2} {#5}
      }
      { \__siunitx_number_round_uncertainty_shift:nnnnn {#3} {#4} {#1} {#2} {#5} }

  }
\cs_new:Npn \__siunitx_number_round_uncertainty_simple:nnnnn #1#2#3#4#5
  {
    \__siunitx_number_round:nnn
      {#5}
      {#2} {#3}
    { { S } { #4 #1 } }
  }
\cs_new:Npn \__siunitx_number_round_uncertainty_shift:nnnnn #1#2#3#4#5
  {
    \exp_args:Ne \__siunitx_number_round_uncertainty_shift:nn
      { \__siunitx_number_round:fnn { \int_eval:n { #5 + 1 } } {#1} {#2} }
      {#5}
  }
\cs_new:Npn \__siunitx_number_round_uncertainty_shift:nn #1#2
  { \__siunitx_number_round_uncertainty_shift:nnnw #1 {#2} }
\cs_new:Npn \__siunitx_number_round_uncertainty_shift:nnnw
  #1#2#3 #4 \__siunitx_number_round_uncertainty_end:nn #5#6
  {
    #4
    \bool_lazy_and:nnTF
      { \int_compare_p:nNn {#3} > { \tl_count:n {#1} } }
      {
        ! \bool_lazy_and_p:nn
          { \str_if_eq_p:Vn \l__siunitx_number_exponent_mode_tl { scientific } }
          { \str_if_eq_p:nn { #1.#2 } { 10. } }
      }
      {
        \exp_args:Nf \__siunitx_number_round_uncertainty_shift_aux:nnnnn
          {
            \prg_replicate:nn
              {
                \tl_if_blank:nTF {#2}
                  { \int_min:nn {#3} { \tl_count:n {#1} - 1 } }
                  { 0 }
              }
              { 0 }
          }
          {#1} {#2}
      }
      {
        \use:c
          { __siunitx_number_round_uncertainty_ \l__siunitx_number_exponent_mode_tl :nnn }
            {#1}
      }
         {#5} {#6}
  }
\cs_new:Npn \__siunitx_number_round_uncertainty_shift_aux:nnnnn #1#2#3#4#5
  {
    \use:c
      { __siunitx_number_round_ \l__siunitx_number_exponent_mode_tl :nn }
        {#2} {#3}
    \__siunitx_number_round_places_end:nnn { { S } { 1 #1 } } {#4} {#5}
  }
\cs_new:Npn \__siunitx_number_round_uncertainty_engineering:nnn #1#2#3
  {
    \use:c
      {
         __siunitx_number_round_uncertainty_
         \l__siunitx_number_exponent_mode_tl _
     \tl_count:n {#1}
         :n
      }
        {#2#3}
  }
\cs_new:cpn { __siunitx_number_round_uncertainty_engineering_2:n } #1
  {
    { 10 } { } { { S } { 10 } }
    \__siunitx_number_exponent_finalise:n {#1}
  }
\cs_new:cpn { __siunitx_number_round_uncertainty_engineering_3:n } #1
  {
    { 100 } { } { { S } { 100 } }
    \__siunitx_number_exponent_finalise:n {#1}
  }
\cs_new:cpn { __siunitx_number_round_uncertainty_engineering_4:n } #1
  {
    { 1 } { } { { S } { 1 } }
    \__siunitx_number_exponent_finalise:n { #1 + 3 }
  }
\cs_new:Npn \__siunitx_number_round_uncertainty_fixed:nnn #1#2#3
  {
    {#1} { }
    { { S } { 1 \prg_replicate:nn { \tl_count:n {#1} - 1 } { 0 } } }
    {#2} {#3}
  }
\cs_new_eq:NN \__siunitx_number_round_uncertainty_input:nnn
   \__siunitx_number_round_uncertainty_fixed:nnn
\cs_new:Npn \__siunitx_number_round_uncertainty_scientific:nnn #1#2#3
  {
    { 1 } { } { { S } { 1 } }
    \__siunitx_number_exponent_finalise:n { #2#3 + \tl_count:n {#1} - 1 }
  }
\cs_new_protected:Npn \__siunitx_number_zero_decimal:NN #1#2
  {
    \bool_if:NT \l__siunitx_number_drop_zero_decimal_bool
      {
        \tl_set:Nx #2
          { \exp_after:wN \__siunitx_number_zero_decimal:nnnnnnn #1 }
      }
  }
\cs_new:Npn \__siunitx_number_zero_decimal:nnnnnnn #1#2#3#4#5#6#7
  {
    \exp_not:n { {#1} {#2} {#3} }
    \str_if_eq:eeTF
      { \exp_not:n {#4} }
      { \prg_replicate:nn { \tl_count:n {#4} } { 0 } }
      { { } }
      { \exp_not:n { {#4} } }
    \exp_not:n { {#5} {#6} {#7} }
  }
\cs_new:Npn \siunitx_number_adjust_exponent:nn #1#2
  { \__siunitx_number_adjust_exp:nnnnnnnn #1 {#2} }
\cs_new:Npn \siunitx_number_adjust_exponent:Nn #1#2
  {
    \tl_if_empty:NF #1
      { \exp_args:NV \siunitx_number_adjust_exponent:nn #1 {#2} }
  }
\cs_new:Npn \__siunitx_number_adjust_exp:nnnnnnnn #1#2#3#4#5#6#7#8
  {
    \exp_not:n { {#1} {#2} {#3} {#4} {#5} }
    \exp_args:Ne \__siunitx_number_adjust_exp:nn { \fp_eval:n { #6#7 + #8 } } {#6}
  }
\cs_new:Npn \__siunitx_number_adjust_exp:nn #1#2
  { \__siunitx_number_adjust_exp:nNw {#2} #1 \q_stop }
\cs_new:Npn \__siunitx_number_adjust_exp:nNw #1#2#3 \q_stop
  {
    \token_if_eq_meaning:NNTF #2 -
      { { - } { \exp_not:n {#3} } }
      { { \str_if_eq:nnT {#1} { + } { + } } { \exp_not:n {#2#3} } }
  }
\tl_new:N \l__siunitx_number_bracket_close_tl
\tl_new:N \l__siunitx_number_bracket_open_tl
\tl_set:Nn \l__siunitx_number_bracket_open_tl { ( }
\tl_set:Nn \l__siunitx_number_bracket_close_tl { ) }
\bool_new:N \l_siunitx_number_bracket_ambiguous_bool
\tl_new:N \l_siunitx_number_output_decimal_tl
\keys_define:nn { siunitx }
  {
    bracket-ambiguous-numbers .bool_set:N =
      \l_siunitx_number_bracket_ambiguous_bool ,
    bracket-negative-numbers .bool_set:N =
      \l__siunitx_number_bracket_negative_bool ,
    exponent-base .tl_set:N =
      \l__siunitx_number_exponent_base_tl ,
    exponent-product .tl_set:N =
      \l__siunitx_number_exponent_product_tl ,
    group-digits .choice: ,
    group-digits / all .code:n =
      {
        \bool_set_true:N \l__siunitx_number_group_decimal_bool
        \bool_set_true:N \l__siunitx_number_group_integer_bool
      } ,
    group-digits / decimal .code:n =
      {
        \bool_set_true:N  \l__siunitx_number_group_decimal_bool
        \bool_set_false:N \l__siunitx_number_group_integer_bool
      } ,
    group-digits / integer .code:n =
      {
        \bool_set_false:N \l__siunitx_number_group_decimal_bool
        \bool_set_true:N  \l__siunitx_number_group_integer_bool
      } ,
    group-digits / none .code:n =
      {
        \bool_set_false:N \l__siunitx_number_group_decimal_bool
        \bool_set_false:N \l__siunitx_number_group_integer_bool
      } ,
    group-digits .default:n  = all ,
    group-minimum-digits .int_set:N  =
      \l__siunitx_number_group_minimum_int ,
    group-separator .tl_set:N =
      \l__siunitx_number_group_separator_tl ,
    negative-color .tl_set:N =
    \l__siunitx_number_negative_color_tl ,
    output-close-uncertainty .tl_set:N =
      \l__siunitx_number_output_uncert_close_tl ,
    output-decimal-marker .tl_set:N =
      \l_siunitx_number_output_decimal_tl ,
    output-exponent-marker .tl_set:N =
      \l__siunitx_number_output_exp_marker_tl ,
    output-open-uncertainty .tl_set:N =
      \l__siunitx_number_output_uncert_open_tl ,
    print-implicit-plus .bool_set:N =
      \l__siunitx_number_implicit_plus_bool ,
    print-unity-mantissa .bool_set:N =
      \l__siunitx_number_unity_mantissa_bool ,
    print-zero-exponent .bool_set:N =
      \l__siunitx_number_zero_exponent_bool ,
    print-zero-integer .bool_set:N =
      \l__siunitx_number_zero_integer_bool ,
    tight-spacing .bool_set:N =
      \l__siunitx_number_tight_bool ,
    uncertainty-mode .choices:nn =
      { compact , compact-marker , full , separate }
      { \tl_set_eq:NN \l__siunitx_number_uncert_mode_tl \l_keys_choice_tl } ,
    uncertainty-separator .tl_set:N =
      \l__siunitx_number_uncert_separator_tl
  }
\bool_new:N \l__siunitx_number_group_decimal_bool
\bool_new:N \l__siunitx_number_group_integer_bool
\tl_new:N \l__siunitx_number_uncert_mode_tl
\cs_new:Npn \siunitx_number_output:N #1
  { \__siunitx_number_output:Nn #1 { } }
\cs_new:Npn \siunitx_number_output:n #1
  { \__siunitx_number_output:nn #1 { } }
\cs_new:Npn \siunitx_number_output:NN #1#2
  { \__siunitx_number_output:Nn #1 {#2} }
\cs_new:Npn \siunitx_number_output:nN #1#2
  { \__siunitx_number_output:nn #1 {#2} }
\cs_new:Npn \__siunitx_number_output:Nn #1#2
  {
    \tl_if_empty:NF #1
      { \exp_after:wN \__siunitx_number_output:nnnnnnn #1 {#2} }
  }
\cs_new:Npn \__siunitx_number_output:nn #1#2
  {
    \tl_if_empty:nF {#1}
      { \__siunitx_number_output:nnnnnnn #1 {#2} }
  }
\cs_new:Npn \__siunitx_number_output:nnnnnnn #1#2#3#4#5#6#7#8
  {
    \__siunitx_number_output_color:n {#2}
    \__siunitx_number_output_comparator:nn {#1} {#8}
    \__siunitx_number_output_bracket:nn {#5} {#7}
    \__siunitx_number_output_sign:nnn {#1} {#2} {#8}
    \__siunitx_number_output_integer:nnn {#3} {#4} {#7}
    \__siunitx_number_output_decimal:nn {#4} {#8}
    \__siunitx_number_output_uncertainty:nnn {#5} {#4} {#8}
    \__siunitx_number_output_exponent:nnnnn {#6} {#7} {#3} {#4} {#8}
    \__siunitx_number_output_end:
  }
\cs_new:Npn \__siunitx_number_output_bracket:nn #1#2
  {
    \bool_lazy_all:nT
      {
        { \str_if_eq_p:Vn \l__siunitx_number_uncert_mode_tl { separate } }
        { \l_siunitx_number_bracket_ambiguous_bool }
        { ! \tl_if_blank_p:n {#1} }
        {
          \bool_lazy_or_p:nn
            { \l__siunitx_number_zero_exponent_bool }
            { ! \str_if_eq_p:nn {#2} { 0 } }
        }
      }
    \__siunitx_number_output_bracket:w
  }
\cs_new:Npn \__siunitx_number_output_bracket:w #1 \__siunitx_number_output_exponent:nnnnn
  {
    \exp_not:V \l__siunitx_number_bracket_open_tl
    #1
    \exp_not:V \l__siunitx_number_bracket_close_tl
    \__siunitx_number_output_exponent:nnnnn
  }
\cs_new:Npn \__siunitx_number_output_color:n #1
  {
    \bool_lazy_and:nnT
      { \str_if_eq_p:nn {#1} { - } }
      { ! \tl_if_empty_p:N \l__siunitx_number_negative_color_tl }
      { \exp_not:N \color { \exp_not:V \l__siunitx_number_negative_color_tl } }
  }
\cs_new:Npn \__siunitx_number_output_comparator:nn #1#2
  {
    \tl_if_blank:nF {#1}
      { \exp_not:n { \mathord {#1} } }
    \exp_not:n {#2}
  }
\cs_new:Npn \__siunitx_number_output_sign:nnn #1#2#3
  {
    \tl_if_blank:nTF {#2}
      {
        \bool_if:NT \l__siunitx_number_implicit_plus_bool
          { \__siunitx_number_output_sign:nN {#1} + }
      }
      {
        \str_if_eq:nnTF {#2} { - }
          {
            \bool_if:NTF \l__siunitx_number_bracket_negative_bool
              { \__siunitx_number_output_sign_brackets:w }
              { \__siunitx_number_output_sign:nN {#1} - }
          }
          { \__siunitx_number_output_sign:nN {#1} #2 }
      }
    \exp_not:n {#3}
  }
\cs_new:Npn \__siunitx_number_output_sign:nN #1#2
  {
    \tl_if_blank:nTF {#1}
      { \use:n }
      { \mathord }
        { \exp_not:n {#2} }
  }
\cs_new:Npn
  \__siunitx_number_output_sign_brackets:w #1 \__siunitx_number_output_end:
  {
    \exp_not:V \l__siunitx_number_bracket_open_tl
    #1
    \exp_not:V \l__siunitx_number_bracket_close_tl
    \__siunitx_number_output_end:
  }
\cs_new:Npn \__siunitx_number_output_integer:nnn #1#2#3
  {
    \tl_if_blank:nTF {#1}
      {
        \bool_lazy_and:nnT
          { \str_if_eq_p:nn {#3} { 0 } }
          { ! \l__siunitx_number_zero_exponent_bool }
          { \__siunitx_number_output_digits:nn { integer } { 1 } }
      }
      {
        \bool_lazy_or:nnT
          { \l__siunitx_number_zero_integer_bool }
          { ! \str_if_eq_p:nn {#1} { 0 } }
          {
            \bool_lazy_any:nT
              {
                { \l__siunitx_number_unity_mantissa_bool }
                { ! \str_if_eq_p:nn { #1 . #2 } { 1. } }
                {
                  \bool_lazy_and_p:nn
                    { \str_if_eq_p:nn {#3} { 0 } }
                    { ! \l__siunitx_number_zero_exponent_bool }
                }
                {
                  \bool_lazy_and_p:nn
                    { \str_if_eq_p:nn {#1} { 0 } }
                    { \l__siunitx_number_zero_integer_bool }
                }
              }
              { \__siunitx_number_output_digits:nn { integer } {#1} }
          }
      }
  }
\cs_new:Npn \__siunitx_number_output_decimal:nn #1#2
  {
    \exp_not:n {#2}
    \tl_if_blank:nF {#1}
      {
        \str_if_eq:VnTF \l_siunitx_number_output_decimal_tl { , }
          { \exp_not:N \mathord }
          { \use:n }
            { \exp_not:V \l_siunitx_number_output_decimal_tl }
      }
    \exp_not:n {#2}
    \str_if_eq:nnF {#1} { \empty }
      { \__siunitx_number_output_digits:nn { decimal } {#1} }
  }
\cs_generate_variant:Nn \__siunitx_number_output_decimal:nn { f }
\cs_new:Npn \__siunitx_number_output_digits:nn #1#2
  {
    \bool_if:cTF { l__siunitx_number_group_ #1 _ bool }
      {
        \int_compare:nNnTF
          { \tl_count:n {#2} } < \l__siunitx_number_group_minimum_int
          { \exp_not:n {#2} }
          { \use:c { __siunitx_number_output_ #1 _aux:n } {#2} }
      }
      { \exp_not:n {#2} }
  }
\cs_new:Npn \__siunitx_number_output_integer_aux:n #1
  {
     \use:c
       {
         __siunitx_number_output_integer_aux_
         \int_eval:n { \int_mod:nn { \tl_count:n {#1} } { 3 } }
         :n
       } {#1}
  }
\cs_new:cpn { __siunitx_number_output_integer_aux_0:n } #1
  { \__siunitx_number_output_integer_first:nnNN #1 \q_nil }
\cs_new:cpn { __siunitx_number_output_integer_aux_1:n } #1
  { \__siunitx_number_output_integer_first:nnNN { } { } #1 \q_nil }
\cs_new:cpn { __siunitx_number_output_integer_aux_2:n } #1
  { \__siunitx_number_output_integer_first:nnNN { } #1 \q_nil }
\cs_new:Npn \__siunitx_number_output_integer_first:nnNN #1#2#3#4
  {
    \exp_not:n {#1#2#3}
    \quark_if_nil:NF #4
      { \__siunitx_number_output_integer_loop:NNNN #4 }
  }
\cs_new:Npn \__siunitx_number_output_integer_loop:NNNN #1#2#3#4
  {
    \str_if_eq:VnTF \l__siunitx_number_group_separator_tl { , }
      { \exp_not:N \mathord }
      { \use:n }
        { \exp_not:V \l__siunitx_number_group_separator_tl }
    \exp_not:n {#1#2#3}
    \quark_if_nil:NF #4
      { \__siunitx_number_output_integer_loop:NNNN #4 }
  }
\cs_new:Npn \__siunitx_number_output_decimal_aux:n #1
  {
    \__siunitx_number_output_decimal_loop:NNNN \c_empty_tl
      #1 \q_nil \q_nil \q_nil
  }
\cs_new:Npn \__siunitx_number_output_decimal_loop:NNNN #1#2#3#4
  {
    \quark_if_nil:NF #2
      {
        \exp_not:V #1
        \exp_not:n {#2}
        \quark_if_nil:NTF #3
          { \use_none:n }
          {
            \exp_not:n {#3}
            \quark_if_nil:NTF #4
              { \use_none:nn }
              {
                \exp_not:n {#4}
                \__siunitx_number_output_decimal_loop:NNNN
                  \l__siunitx_number_group_separator_tl
              }
          }
      }
  }
\cs_new:Npn \__siunitx_number_output_uncertainty:nnn #1#2#3
  {
    \tl_if_blank:nTF {#1}
      { \__siunitx_number_output_uncertainty_unaligned:n {#3} }
      {
        \use:c { __siunitx_number_output_uncert_ \tl_head:n {#1} :nnnw }
          {#2} {#3} #1
      }
  }
\cs_new:Npn \__siunitx_number_output_uncertainty_unaligned:n #1
  { \exp_not:n { #1 #1 #1 #1 } }
\cs_new:Npn \__siunitx_number_output_uncert_S:nnnw #1#2#3#4
  {
    \str_if_eq:VnTF \l__siunitx_number_uncert_mode_tl { separate }
      {
        \exp_not:n {#2}
        \bool_if:NTF \l__siunitx_number_tight_bool
          { \mathord }
          { \use:n }
            { \exp_not:n { \pm } }
        \exp_not:n {#2}
        \__siunitx_number_output_uncert_S_aux:nnn
          { \int_eval:n { \tl_count:n {#4} - \tl_count:n {#1} } }
          {#4} {#2}
      }
      {
        \exp_not:V \l__siunitx_number_uncert_separator_tl
        \exp_not:V \l__siunitx_number_output_uncert_open_tl
        \use:c { __siunitx_number_output_uncert_S_ \l__siunitx_number_uncert_mode_tl :nn } {#1} {#4}
        \exp_not:V \l__siunitx_number_output_uncert_close_tl
        \__siunitx_number_output_uncertainty_unaligned:n {#2}
      }
  }
\cs_new:Npn \__siunitx_number_output_uncert_S_aux:nnn #1#2#3
  {
    \int_compare:nNnTF {#1} > 0
      {
        \__siunitx_number_output_uncert_S_aux:fnnw
          { \int_eval:n { #1 - 1 } }
          {#3}
          { }
          #2 \q_nil
      }
      {
        0
        \__siunitx_number_output_decimal:fn
          {
            \prg_replicate:nn { \int_abs:n {#1} } { 0 }
            #2
          }
          {#3}
      }
  }
\cs_generate_variant:Nn \__siunitx_number_output_uncert_S_aux:nnn { f }
\cs_new:Npn \__siunitx_number_output_uncert_S_aux:nnnw #1#2#3#4
  {
    \quark_if_nil:NF #4
      {
        \int_compare:nNnTF {#1} = 0
          { \__siunitx_number_output_uncert_S_aux:nnw {#3#4} {#2} }
          {
            \__siunitx_number_output_uncert_S_aux:fnnw
              { \int_eval:n { #1 - 1 } }
              {#2}
              {#3#4}
          }
      }
  }
\cs_generate_variant:Nn \__siunitx_number_output_uncert_S_aux:nnnw { f }
\cs_new:Npn \__siunitx_number_output_uncert_S_aux:nnw #1#2#3 \q_nil
  {
    \__siunitx_number_output_digits:nn { integer } {#1}
    \__siunitx_number_output_decimal:nn {#3} {#2}
  }
\cs_new:Npn \__siunitx_number_output_uncert_S_compact:nn #1#2
  { \exp_not:n {#2} }
\cs_new:cpn { __siunitx_number_output_uncert_S_compact-marker:nn } #1#2
  {
    \bool_lazy_or:nnTF
      { \tl_if_blank_p:n {#1} }
      { ! \int_compare_p:nNn { \tl_count:n {#2} } > { \tl_count:n {#1} } }
      { \__siunitx_number_output_uncert_S_compact:nn }
      { \__siunitx_number_output_uncert_S_full:nn }
        {#1} {#2}
  }
\cs_new:Npn \__siunitx_number_output_uncert_S_full:nn #1#2
  {
    \__siunitx_number_output_uncert_S_aux:fnn
      { \int_eval:n { \tl_count:n {#2} - \tl_count:n {#1} } }
      {#2} { }
  }
\cs_new:Npn \__siunitx_number_output_exponent:nnnnn #1#2#3#4#5
  {
    \exp_not:n {#5}
    \bool_lazy_or:nnTF
      { \l__siunitx_number_zero_exponent_bool }
      { ! \str_if_eq_p:nn {#2} { 0 } }
      {
        \tl_if_empty:NTF \l__siunitx_number_output_exp_marker_tl
          { \__siunitx_number_output_exponent_auxi:nnnnn }
          { \__siunitx_number_output_exponent_auxii:nnnnn }
            {#1} {#2} {#3} {#4} {#5}
      }
      { \exp_not:n {#5} }
  }
\cs_new:Npn \__siunitx_number_output_exponent_auxi:nnnnn #1#2#3#4#5
  {
    \bool_lazy_or:nnT
      {
        \bool_lazy_and_p:nn
          { \l__siunitx_number_unity_mantissa_bool }
          { \str_if_eq_p:nn { #3 . #4 } { 1. } }
      }
      {
        ! \bool_lazy_or_p:nn
          { \str_if_eq_p:nn { #3 . #4 } { 1. } }
          { \tl_if_blank_p:n {#3} }
      }
      {
        \bool_if:NTF \l__siunitx_number_tight_bool
          { \exp_not:N \mathord }
          { \use:n }
            { \exp_not:V \l__siunitx_number_exponent_product_tl }
      }
    \exp_not:n {#5}
    \exp_not:V \l__siunitx_number_exponent_base_tl
    ^
      { \__siunitx_number_output_exponent_auxiii:nn {#1} {#2} }
  }
\cs_new:Npn \__siunitx_number_output_exponent_auxii:nnnnn #1#2#3#4#5
  {
    \exp_not:n {#5}
    \exp_not:V \l__siunitx_number_output_exp_marker_tl
    \__siunitx_number_output_exponent_auxiii:nn {#1} {#2}
  }
\cs_new:Npn \__siunitx_number_output_exponent_auxiii:nn #1#2
  {
    \tl_if_blank:nTF {#1}
      {
        \bool_lazy_and:nnT
          { \l__siunitx_number_implicit_plus_bool }
          { ! \str_if_eq_p:nn {#2} { 0 } }
          { + }
      }
      { \exp_not:n {#1} }
    \__siunitx_number_output_digits:nn { integer } {#2}
  }
\cs_new:Npn \__siunitx_number_output_end: { }
\tl_new:N \l__siunitx_number_valid_tl
\prg_new_protected_conditional:Npnn \siunitx_if_number:n #1
  { T , F , TF }
  {
    \group_begin:
      \bool_set_true:N \l__siunitx_number_validate_bool
      \bool_set_true:N \l_siunitx_number_parse_bool
      \siunitx_number_parse:nN {#1} \l__siunitx_number_parsed_tl
      \tl_if_empty:NTF \l__siunitx_number_parsed_tl
        {
          \group_end:
          \prg_return_false:
        }
        {
          \group_end:
          \prg_return_true:
        }
  }
\prg_new_conditional:Npnn \siunitx_if_number_token:N #1
  { p , T , F , TF }
  {
    \__siunitx_number_token_auxi:NN #1
      \l_siunitx_number_input_decimal_tl
      \l__siunitx_number_input_uncert_close_tl
      \l_siunitx_number_input_comparator_tl
      \l__siunitx_number_input_digit_tl
      \l_siunitx_number_input_exponent_tl
      \l__siunitx_number_input_ignore_tl
      \l__siunitx_number_input_uncert_open_tl
      \l_siunitx_number_input_sign_tl
      \l__siunitx_number_input_uncert_sign_tl
      \q_recursion_tail
      \q_recursion_stop
  }
\cs_new:Npn \__siunitx_number_token_auxi:NN #1#2
  {
    \quark_if_recursion_tail_stop_do:Nn #2 { \prg_return_false: }
    \__siunitx_number_token_auxii:NN #1 #2
    \__siunitx_number_token_auxi:NN #1
  }
\cs_new:Npn \__siunitx_number_token_auxii:NN #1#2
  {
    \exp_after:wN \__siunitx_number_token_auxiii:NN \exp_after:wN #1
      #2 \q_recursion_tail \q_recursion_stop
  }
\cs_new:Npn \__siunitx_number_token_auxiii:NN #1#2
  {
    \quark_if_recursion_tail_stop:N #2
    \str_if_eq:nnT {#1} {#2}
      {
        \use_i_delimit_by_q_recursion_stop:nw
          {
            \use_i_delimit_by_q_recursion_stop:nw
              { \prg_return_true: }
          }
      }
    \__siunitx_number_token_auxiii:NN #1
  }
\msg_new:nnnn { siunitx } { invalid-number }
  { Invalid~number~'#1'. }
  {
    The~input~'#1'~could~not~be~parsed~as~a~number~following~the~
    format~defined~in~module~documentation.
  }
\msg_new:nnnn { siunitx } { ambiguous-dropped-exponent }
  { Potentially~ambiguous~dropping~of~exponent. }
  {
    The~option~"drop-exponent"~is~active~but~values~do~not~have~an~
    exponent~fixed~by~"exponent-mode".~The~result~could~be~misleading.
  }
\keys_set:nn { siunitx }
  {
    bracket-ambiguous-numbers      = true                                   ,
    bracket-negative-numbers       = false                                  ,
    drop-exponent                  = false                                  ,
    drop-uncertainty               = false                                  ,
    drop-zero-decimal              = false                                  ,
    evaluate-expression            = false                                  ,
    exponent-base                  = 10                                     ,
    exponent-mode                  = input                                  ,
    exponent-product               = \times                                 ,
    expression                     = #1                                     ,
    fixed-exponent                 = 0                                      ,
    group-digits                   = all                                    ,
    group-minimum-digits           = 5                                      ,
    group-separator                = \,                                     , % (
    input-close-uncertainty        = )                                      ,
    input-comparators              = { <=>\approx\ge\geq\gg\le\leq\ll\sim } ,
    input-decimal-markers          = { ., }                                 ,
    input-digits                   = 0123456789                             ,
    input-exponent-markers         = dDeE                                   ,
    input-ignore                   = \,                                     ,
    input-open-uncertainty         = (                                      , % )
    input-signs                    = +-\mp\pm                               ,
    input-uncertainty-signs        = \pm                                    ,
    minimum-decimal-digits         = 0                                      ,
    minimum-integer-digits         = 0                                      ,
    negative-color                 =                                        , % (
    output-close-uncertainty       = )                                      ,
    output-decimal-marker          = .                                      ,
    output-open-uncertainty        = (                                      , % )
    parse-numbers                  = true                                   ,
    print-implicit-plus            = false                                  ,
    print-unity-mantissa           = true                                   ,
    print-zero-exponent            = false                                  ,
    print-zero-integer             = true                                   ,
    retain-explicit-decimal-marker = false                                  ,
    retain-explicit-plus           = false                                  ,
    retain-zero-uncertainty        = false                                  ,
    round-half                     = up                                     ,
    round-minimum                  = 0                                      ,
    round-mode                     = none                                   ,
    round-pad                      = true                                   ,
    round-precision                = 2                                      ,
    tight-spacing                  = false                                  ,
    uncertainty-mode               = compact                                ,
    uncertainty-separator          =
  }
\RequirePackage { amstext }
\cs_new_eq:NN \__siunitx_print_ams_text:n \text
\AtBeginDocument { \RequirePackage { color } }
\cs_generate_variant:Nn \tl_replace_all:Nnn { NV }
\tl_new:N \l__siunitx_print_tmp_tl
\tl_new:N \l__siunitx_print_number_mode_tl
\tl_new:N \l__siunitx_print_unit_mode_tl
\keys_define:nn { siunitx }
  {
    color .meta:n =
      { number-color = #1 , unit-color = #1 } ,
    mode .meta:n =
      { number-mode = #1 , unit-mode = #1 } ,
    number-color .tl_set:N =
      \l__siunitx_print_number_color_tl ,
    number-mode .choices:nn =
      { match , math , text }
      {
        \tl_set_eq:NN
          \l__siunitx_print_number_mode_tl \l_keys_choice_tl
      } ,
    propagate-math-font .bool_set:N =
      \l__siunitx_print_math_font_bool ,
    reset-math-version .bool_set:N =
      \l__siunitx_print_math_version_bool ,
    reset-text-family .bool_set:N =
      \l__siunitx_print_text_family_bool ,
    reset-text-series .bool_set:N =
      \l__siunitx_print_text_series_bool ,
    reset-text-shape .bool_set:N =
      \l__siunitx_print_text_shape_bool ,
    text-family-to-math .bool_set:N =
      \l__siunitx_print_math_family_bool ,
    text-font-command .tl_set:N =
      \l__siunitx_print_text_font_tl ,
    text-series-to-math .bool_set:N =
      \l__siunitx_print_math_series_bool ,
    unit-color .tl_set:N =
      \l__siunitx_print_unit_color_tl ,
    unit-mode .choices:nn =
      { match , math , text }
      {
        \tl_set_eq:NN
          \l__siunitx_print_unit_mode_tl \l_keys_choice_tl
      }
  }
\keys_define:nn { siunitx / series-version-mapping }
  {
    ul . tl_set:N = \l__siunitx_print_version_ul_tl ,
    el . tl_set:N = \l__siunitx_print_version_el_tl ,
    l  . tl_set:N = \l__siunitx_print_version_l_tl ,
    sl . tl_set:N = \l__siunitx_print_version_sl_tl ,
    m  . tl_set:N = \l__siunitx_print_version_m_tl ,
    sb . tl_set:N = \l__siunitx_print_version_sb_tl ,
    b  . tl_set:N = \l__siunitx_print_version_b_tl ,
    eb . tl_set:N = \l__siunitx_print_version_eb_tl ,
    ub . tl_set:N = \l__siunitx_print_version_ub_tl
  }
\cs_new_protected:Npn \siunitx_print_number:n #1
  { \__siunitx_print_aux:nn { number } {#1} }
\cs_generate_variant:Nn \siunitx_print_number:n { V , x }
\cs_new_protected:Npn \siunitx_print_unit:n #1
  { \__siunitx_print_aux:nn { unit } {#1} }
\cs_generate_variant:Nn \siunitx_print_unit:n { V , x }
\cs_new_protected:Npn \__siunitx_print_aux:nn #1#2
  {
    \tl_if_empty:cTF { l__siunitx_print_ #1 _color_tl }
      { \use:n }
      { \exp_args:Nv \textcolor { l__siunitx_print_ #1 _color_tl } }
        {
          \use:c
            {
              siunitx_print_
              \tl_use:c { l__siunitx_print_ #1 _mode_tl } :n
            }
              {#2}
        }
  }
\cs_new_protected:Npn \siunitx_print_match:n #1
  {
    \mode_if_math:TF
      { \siunitx_print_math:n {#1} }
      { \siunitx_print_text:n {#1} }
  }
\cs_new_protected:Npn \__siunitx_print_replace_font:N #1
  {
    \tl_if_empty:NF \l_siunitx_unit_font_tl
      {
        \tl_replace_all:NVn #1
          \l_siunitx_unit_font_tl
          { \use:n }
      }
  }
\clist_map_inline:nn { uc , ec , c , sc , sx , x , ex , ux }
  { \tl_const:cn { c__siunitx_print_series_ #1 _tl } { m } }
\clist_map_inline:nn { l , m , b }
  { \tl_const:cn { c__siunitx_print_series_ #1 _tl } { #1 } }
\tl_new:N \l__siunitx_print_math_html_tl
\cs_new_protected:Npn \siunitx_print_math:n #1
  {
    \bool_lazy_and:nnTF
      { \l__siunitx_print_math_series_bool }
      { \str_if_eq_p:Vn \math@version { normal } }
      {
        \tl_set:Nx \l__siunitx_print_tmp_tl
          { \exp_after:wN \__siunitx_print_extract_series:Nw \f@series ? \q_stop }
        \tl_if_empty:NTF \l__siunitx_print_tmp_tl
          { \__siunitx_print_math_auxi:n {#1} }
          { \__siunitx_print_math_version:Vn \l__siunitx_print_tmp_tl {#1} }
      }
      { \__siunitx_print_math_auxi:n {#1} }
  }
\cs_new:Npn \__siunitx_print_extract_series:Nw #1#2 ? #3 \q_stop
  {
    \cs_if_exist:cTF { c__siunitx_print_series_ #1#2 _tl }
      { \__siunitx_print_convert_series:v { c__siunitx_print_series_ #1#2 _tl } }
      {
        \cs_if_exist:cTF { c__siunitx_print_series_ #1 _tl }
          { \__siunitx_print_convert_series:v { c__siunitx_print_series_ #1 _tl } }
          { \__siunitx_print_convert_series:n {#1#2} }
      }
  }
\cs_new:Npn \__siunitx_print_convert_series:n #1
  { \tl_use:c { l__siunitx_print_version_ #1 _tl } }
\cs_generate_variant:Nn \__siunitx_print_convert_series:n { v }
\cs_new_protected:Npn \__siunitx_print_math_auxi:n #1
  {
    \bool_if:NTF \l__siunitx_print_math_version_bool
      { \__siunitx_print_math_version:nn { normal } {#1} }
      { \__siunitx_print_math_auxii:n {#1} }
  }
\cs_new_protected:Npn \__siunitx_print_math_version:nn #1#2
  {
    \str_if_eq:VnTF \math@version { #1 }
      { \__siunitx_print_math_auxii:n {#2} }
      {
        \mode_if_math:TF
          { \text }
          { \use:n }
            {
              \mathversion {#1}
              \__siunitx_print_math_auxii:n {#2}
            }
       }
  }
\cs_generate_variant:Nn \__siunitx_print_math_version:nn { V }
\cs_new_protected:Npn \__siunitx_print_math_auxii:n #1
  {
    \group_begin:
      \tl_if_head_eq_meaning:nNTF {#1} \sfrac
        {
          \cs_set_protected:Npn \text ##1
            {
              \cs_set_eq:NN \text \__siunitx_print_ams_text:n
              \__siunitx_print_math_text_setup:
              ##1
            }
        }
        { \__siunitx_print_math_text_setup: }
      \tl_set:Nn \l__siunitx_print_tmp_tl {#1}
      \exp_after:wN \__siunitx_print_math_replace:Nn
        \l__siunitx_print_math_html_tl
        \q_recursion_tail { } \q_recursion_stop
      \exp_args:NV \__siunitx_print_math_auxiii:n \l__siunitx_print_tmp_tl
     \group_end:
  }
\cs_new_protected:Npn \__siunitx_print_math_text_setup:
  {
    \cs_set_protected:Npn \text ##1
      {
        \cs_set_eq:NN \text \__siunitx_print_ams_text:n
        \siunitx_print_text:n {##1}
      }
  }
\cs_new_protected:Npn \__siunitx_print_math_replace:Nn #1#2
  {
    \quark_if_recursion_tail_stop:N #1
    \tl_replace_all:Nnn \l__siunitx_print_tmp_tl {#1} {#2}
    \__siunitx_print_math_replace:Nn
  }
\cs_new_protected:Npn \__siunitx_print_math_auxiii:n #1
  {
    \bool_if:NTF \l__siunitx_print_math_family_bool
      {
        \str_case_e:nnF { \f@family }
          {
            { \rmdefault } { \__siunitx_print_math_auxv:n }
            { \sfdefault } { \__siunitx_print_math_auxix:Nn \mathsf }
            { \ttdefault } { \__siunitx_print_math_auxix:Nn \mathtt }
          }
          { \__siunitx_print_math_auxiv:n }
      }
      { \__siunitx_print_math_auxiv:n }
        {#1}
  }
\cs_new_protected:Npn \__siunitx_print_math_auxiv:n #1
  {
    \bool_if:NTF \l__siunitx_print_math_font_bool
      {
        \__siunitx_print_math_auxvii:N
          \mathbf \mathit \mathsf \mathtt
          \q_recursion_tail \q_recursion_stop
      }
      { \__siunitx_print_math_auxv:n }
        {#1}
  }
\cs_new_protected:Npn \__siunitx_print_math_auxv:n #1
  {
    \bool_lazy_or:nnTF
      { \int_compare_p:nNn \fam = { -1 } }
      { \int_compare_p:nNn \fam = \symoperators }
      { \__siunitx_print_math_ensure:n }
      { \__siunitx_print_math_auxvi:Nn \mathrm }
        {#1}
  }
\cs_new_protected:Npn \__siunitx_print_math_auxvi:Nn #1#2
  { \__siunitx_print_math_ensure:n { #1 {#2} } }
\cs_new_protected:Npn \__siunitx_print_math_auxvii:N #1
  {
    \quark_if_recursion_tail_stop_do:Nn #1 { \__siunitx_print_math_auxv:n }
    \exp_after:wN \exp_after:wN \exp_after:wN \__siunitx_print_math_auxviii:w
      \cs:w \cs_to_str:N #1 \c_space_tl \cs_end:
        \use@mathgroup ? { -2 } \q_stop #1
  }
\cs_new_protected:Npn \__siunitx_print_math_auxviii:w #1 \use@mathgroup #2#3 #4 \q_stop #5
  {
    \int_compare:nNnTF \fam = {#3}
      { \use_i_delimit_by_q_recursion_stop:nw { \__siunitx_print_math_auxix:Nn #5 } }
      { \__siunitx_print_math_auxvii:N }
  }
\cs_new_protected:Npx \__siunitx_print_math_auxix:Nn #1#2
  {
    \group_begin:
      \tl_set:Nn \exp_not:N \l__siunitx_print_tmp_tl {#2}
      \__siunitx_print_replace_font:N \exp_not:N \l__siunitx_print_tmp_tl
      \tl_replace_all:Nnn \exp_not:N \l__siunitx_print_tmp_tl
        { \char_generate:nn { `\_ } { 8 } }
        { \exp_not:N \__siunitx_print_math_sub:n }
      \tl_replace_all:Nnn \exp_not:N \l__siunitx_print_tmp_tl
        { ^ }
        { \exp_not:N \__siunitx_print_math_super:n }
      \exp_not:N \exp_args:NNV \__siunitx_print_math_auxvi:Nn
        #1 \exp_not:N \l__siunitx_print_tmp_tl
    \group_end:
  }
\cs_new_protected:Npx \__siunitx_print_math_sub:n #1
  {
    \char_generate:nn { `\_ } { 8 }
      { \exp_not:N \__siunitx_print_math_script:n {#1} }
  }
\cs_new_protected:Npn \__siunitx_print_math_super:n #1
  { ^ { \__siunitx_print_math_script:n {#1} } }
\cs_new_protected:Npn \__siunitx_print_math_script:n #1
  {
    \group_begin:
      \tl_set:Nn \l__siunitx_print_tmp_tl {#1}
      \__siunitx_print_replace_font:N \l__siunitx_print_tmp_tl
      \tl_use:N \l__siunitx_print_tmp_tl
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_print_math_ensure:n #1
  {
    \tl_if_blank:nF {#1}
      {
        \mode_if_math:TF
          {#1}
          { $ #1 $ }
      }
  }
\AtBeginDocument
  {
    \@ifpackageloaded { tex4ht }
      { \tl_set:Nx \l__siunitx_print_math_html_tl { ^ { \token_to_str:N ^ } } }
      { }
  }
\cs_new_protected:Npn \siunitx_print_text:n #1
  {
    \text
      {
        \bool_if:NT \l__siunitx_print_text_family_bool
          { \fontfamily { \familydefault } }
        \bool_if:NT \l__siunitx_print_text_series_bool
          { \fontseries { \seriesdefault } }
        \bool_if:NT \l__siunitx_print_text_shape_bool
          { \fontshape { \shapedefault } }
        \bool_lazy_any:nT
          {
            { \l__siunitx_print_text_family_bool }
            { \l__siunitx_print_text_series_bool }
            { \l__siunitx_print_text_shape_bool }
          }
          { \selectfont }
        \tl_use:N \l__siunitx_print_text_font_tl
        \exp_args:NnV \tl_if_head_eq_meaning:nNTF {#1} \l_siunitx_unit_fraction_tl
          { \__siunitx_print_text_fraction:Nnn #1 }
          { \__siunitx_print_text_replace:n {#1} }
      }
  }
\cs_new_protected:Npn \__siunitx_print_text_replace:n #1
  {
    \group_begin:
      \tl_if_head_eq_meaning:nNTF {#1} \mathchoice
        { \__siunitx_print_text_replace:Nnnnn #1 }
        {
          \tl_set:Nn \l__siunitx_print_tmp_tl {#1}
          \tl_if_empty:NF \l__siunitx_print_tmp_tl
            {
              \tl_if_empty:NF \l_siunitx_unit_font_tl
                { \exp_after:wN \cs_set_eq:NN \l_siunitx_unit_font_tl \use:n }
              \cs_set:Npn \mathord ##1
                { \__siunitx_print_text_replace_first:N ##1 }
              \cs_set:Npn \pm { \: \exp_not:N \textpm \: }
              \tl_map_inline:nn
                { \mp \ge \le \gg \ll }
                { \cs_set:Npn ##1 { \exp_not:N \ensuremath { \exp_not:N ##1 } } }
              \cs_set:Npn \cdot { \: \exp_not:N \textperiodcentered \: }
              \cs_set:Npn \times { \: \exp_not:N \texttimes \: }
              \protected@edef \l__siunitx_print_tmp_tl
                { \exp_after:wN \__siunitx_print_text_replace_first:N \l__siunitx_print_tmp_tl }
              \__siunitx_print_text_replace:N \l__siunitx_print_tmp_tl
              \__siunitx_print_text_replace_aux:n { \tl_use:N \l__siunitx_print_tmp_tl }
            }
        }
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_print_text_replace_aux:n #1 {#1}
\cs_new:Npn \__siunitx_print_text_replace_first:N #1
  {
    \str_case:nnF {#1}
      {
        { \cdot }  { \exp_not:N \textperiodcentered }
        { \pm }    { \exp_not:N \textpm }
        { \times } { \exp_not:N \texttimes }
      }
      {#1}
  }
\cs_new_protected:Npx \__siunitx_print_text_replace:N #1
  {
    \exp_not:N \__siunitx_print_text_replace:NNn #1
      -
        { \exp_not:N \textminus }
      \char_generate:nn { `\_ } { 8 }
        { \exp_not:N \__siunitx_print_text_sub:n }
      ^
        { \exp_not:N \__siunitx_print_text_super:n }
      \exp_not:N \q_recursion_tail
        { ? }
      \exp_not:N \q_recursion_stop
  }
\cs_new_protected:Npn \__siunitx_print_text_replace:NNn #1#2#3
  {
    \quark_if_recursion_tail_stop:N #2
    \tl_replace_all:Nnn #1 {#2} {#3}
    \__siunitx_print_text_replace:NNn #1
  }
\cs_new_protected:Npn \__siunitx_print_text_replace:Nnnnn #1#2#3#4#5
  {
    \ensuremath
      {
        \mathchoice
          { \__siunitx_print_print_replace_frac:n {#2} }
          { \__siunitx_print_print_replace_frac:n {#3} }
          { \__siunitx_print_print_replace_frac:n {#4} }
          { \__siunitx_print_print_replace_frac:n {#5} }
      }
  }
\cs_new_protected:Npn \__siunitx_print_print_replace_frac:n #1
  {
    \exp_args:NnV \tl_if_head_eq_meaning:nNTF {#1} \l_siunitx_unit_fraction_tl
      { \__siunitx_print_text_fraction:Nnn #1 }
      { \mbox { \__siunitx_print_text_replace:n {#1} } }
  }
\sys_if_engine_xetex:T
  {
    \AtBeginDocument
      {
         \@ifpackageloaded { bidi }
           {
             \cs_set_protected:Npn \__siunitx_print_text_replace_aux:n #1 { \LRE {#1} }
           }
       { }
      }
  }
\cs_new_protected:Npn \__siunitx_print_text_sub:n #1
  {
    \__siunitx_print_text_scripts:NnN
      \textsubscript {#1} \__siunitx_print_text_super:n
  }
\cs_new_protected:Npn \__siunitx_print_text_super:n #1
  {
    \__siunitx_print_text_scripts:NnN
      \textsuperscript {#1} \__siunitx_print_text_sub:n
  }
\cs_new_protected:Npn \__siunitx_print_text_scripts:NnN #1#2#3
  {
    \cs_set_protected:Npn \__siunitx_print_text_scripts:
      {
        \if_meaning:w \l_peek_token #3
          \exp_after:wN \__siunitx_print_text_scripts_two:NnNn
        \else:
          \exp_after:wN \__siunitx_print_text_scripts_one:Nn
        \fi:
          #1 {#2}
      }
    \peek_after:Nw \__siunitx_print_text_scripts:
  }
\cs_new_protected:Npn \__siunitx_print_text_scripts: { }
\cs_new_protected:Npn \__siunitx_print_text_scripts_one:Nn #1#2
  {
    \group_begin:
      \tl_set:Nn \l__siunitx_print_tmp_tl {#2}
      \__siunitx_print_text_replace:N \l__siunitx_print_tmp_tl
    \exp_args:NNV \group_end:
    #1 \l__siunitx_print_tmp_tl
  }
\cs_new_protected:Npn \__siunitx_print_text_scripts_two:NnNn #1#2#3#4
  {
    \cs_if_eq:NNTF #1 \textsubscript
      { \__siunitx_print_text_scripts_two:nn {#4} {#2} }
      { \__siunitx_print_text_scripts_two:nn {#2} {#4} }
  }
\cs_new_protected:Npx \__siunitx_print_text_scripts_two:nn #1#2
  {
    \group_begin:
      \exp_not:N \m@th
      \exp_not:N \ensuremath
        {
          ^ { \exp_not:N \__siunitx_print_text_scripts_two:n {#1} }
          \char_generate:nn { `\_ } { 8 }
            { \exp_not:N \__siunitx_print_text_scripts_two:n {#2} }
        }
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_print_text_scripts_two:n #1
  {
    \mbox
      {
        \fontsize \sf@size \z@ \selectfont
        \__siunitx_print_text_scripts_one:Nn \use:n {#1}
      }
  }
\cs_new_protected:Npn \__siunitx_print_text_fraction:Nnn #1#2#3
  {
    \ensuremath
      {
        #1
          { \mbox { \__siunitx_print_text_replace:n {#2} } }
          { \mbox { \__siunitx_print_text_replace:n {#3} } }
      }
  }
\keys_set:nn { siunitx }
  {
    color               =       ,
    mode                = math  ,
    number-color        =       ,
    number-mode         = math  ,
    propagate-math-font = false ,
    reset-math-version  = true  ,
    reset-text-shape    = true  ,
    reset-text-series   = true  ,
    reset-text-family   = true  ,
    text-family-to-math = false ,
    text-font-command   =       ,
    text-series-to-math = false ,
    unit-color          =       ,
    unit-mode           = math
  }
\keys_set:nn { siunitx / series-version-mapping }
  {
    ul = light  ,
    el = light  ,
    l  = light  ,
    sl = light  ,
    m  = normal ,
    sb = bold   ,
    b  = bold   ,
    eb = bold   ,
    ub = bold
  }
\box_new:N \l__siunitx_table_tmp_box
\dim_new:N \l__siunitx_table_tmp_dim
\tl_new:N \l__siunitx_table_tmp_tl
\bool_new:N \l__siunitx_table_text_bool
\cs_new_protected:Npn \siunitx_cell_begin:w
  {
    \bool_set_false:N \l__siunitx_table_text_bool
    \bool_if:NTF \l_siunitx_number_parse_bool
      { \__siunitx_table_collect_begin: }
      { \__siunitx_table_direct_begin: }
  }
\cs_new_protected:Npn \siunitx_cell_end:
  {
    \bool_if:NF \l__siunitx_table_text_bool
      {
        \bool_if:NTF \l_siunitx_number_parse_bool
          { \__siunitx_table_collect_end: }
          { \__siunitx_table_direct_end: }
      }
  }
\tl_new:N \l__siunitx_table_collect_tl
\cs_new_protected:Npn \__siunitx_table_collect_begin:
  {
    \group_begin:
      \tl_clear:N \l__siunitx_table_collect_tl
      \if_false: { \fi:
      \cs_set_protected:Npn \cr
        {
          \__siunitx_table_collect_loop:
          \tex_cr:D
        }
      \if_false: } \fi:
      \__siunitx_table_collect_begin:w
  }
\cs_new_protected:Npn \__siunitx_table_collect_begin:w #1 \ignorespaces
  { \__siunitx_table_collect_loop: #1 }
\cs_new_protected:Npn \__siunitx_table_collect_loop:
  {
    \peek_remove_spaces:n
      {
        \peek_catcode:NTF \c_group_begin_token
          { \__siunitx_table_collect_group:n }
          { \__siunitx_table_collect_token:N }
      }
  }
\cs_new_protected:Npn \__siunitx_table_collect_group:n #1
  {
    \tl_put_right:Nn \l__siunitx_table_collect_tl { {#1} }
    \__siunitx_table_collect_loop:
  }
\cs_new_protected:Npn \__siunitx_table_collect_token:N #1
  {
    \__siunitx_table_collect_search:NnF #1
      {
        \unskip            { \__siunitx_table_collect_loop: }
        \end               { \tabularnewline \end }
        \relax             { \__siunitx_table_collect_relax:N #1 }
        \tabularnewline    { \tabularnewline }
        \siunitx_cell_end: { \siunitx_cell_end: }
      }
      { \__siunitx_table_collect_token_aux:N #1 }
  }
\cs_new_protected:Npn \__siunitx_table_collect_token_aux:N #1
  {
    \tl_put_right:Nn \l__siunitx_table_collect_tl {#1}
    \__siunitx_table_collect_loop:
  }
\cs_new_protected:Npn \__siunitx_table_collect_relax:N #1
  {
    \str_if_eq:nnTF {#1} { \relax }
      { \relax }
      { \__siunitx_table_collect_token_aux:N #1 }
  }
\AtBeginDocument
  {
    \@ifpackageloaded { mdwtab }
      {
        \cs_set_protected:Npn \__siunitx_table_collect_token:N #1
          {
            \__siunitx_table_collect_search:NnF #1
              {
                \@maybe@unskip     { \__siunitx_table_collect_loop: }
                \tab@setcr         { \__siunitx_table_collect_loop: }
                \unskip            { \__siunitx_table_collect_loop: }
                \end               { \tabularnewline \end }
                \relax             { \__siunitx_table_collect_relax:N #1 }
                \tabularnewline    { \tabularnewline }
                \siunitx_cell_end: { \siunitx_cell_end: }
              }
              { \__siunitx_table_collect_token_aux:N #1 }
          }
      }
      { }
  }
\cs_new_protected:Npn \__siunitx_table_collect_search:NnF #1#2#3
  {
    \__siunitx_table_collect_search_aux:NNn #1
      #2
      #1 {#3}
    \q_stop
  }
\cs_new_protected:Npn \__siunitx_table_collect_search_aux:NNn #1#2#3
  {
    \token_if_eq_meaning:NNTF #1 #2
      { \use_i_delimit_by_q_stop:nw {#3} }
      { \__siunitx_table_collect_search_aux:NNn #1 }
  }
\tl_new:N \l__siunitx_table_before_tl
\tl_new:N \l__siunitx_table_number_tl
\tl_new:N \l__siunitx_table_after_tl
\cs_new_protected:Npn \__siunitx_table_collect_end:
  {
    \exp_args:NNV \group_end:
    \__siunitx_table_collect_end:n \l__siunitx_table_collect_tl
    \exp_args:NV \__siunitx_table_split:nNNN
      \l__siunitx_table_collect_tl
      \l__siunitx_table_before_tl
      \l__siunitx_table_number_tl
      \l__siunitx_table_after_tl
    \tl_if_empty:NTF \l__siunitx_table_number_tl
      { \__siunitx_table_print_text:V \l__siunitx_table_before_tl }
      {
        \__siunitx_table_print:VVV
          \l__siunitx_table_before_tl
          \l__siunitx_table_number_tl
          \l__siunitx_table_after_tl
      }
  }
\cs_new_protected:Npn \__siunitx_table_collect_end:n #1
  {
    \str_if_eq:eeTF { \exp_not:n {#1} }
      { { \__siunitx_table_collect_end_aux:n {#1} } }
      { \tl_set:Nn }
      {
        \cs_if_exist:NT \array@row@rst
          { \cs_set_eq:NN \array@row@rst \scan_stop: }
        \protected@edef
      }
        \l__siunitx_table_collect_tl {#1}
  }
\cs_new:Npn \__siunitx_table_collect_end_aux:n #1
  { \exp_after:wN \__siunitx_table_collect_end:w #1 \q_stop }
\cs_new:Npn \__siunitx_table_collect_end:w #1 \q_stop
  { \exp_not:n {#1} }
\cs_new_protected:Npn \__siunitx_table_split:nNNN #1#2#3#4
  {
    \tl_clear:N #2
    \tl_clear:N #3
    \tl_clear:N #4
    \__siunitx_table_split_loop:NNN #2#3#4 #1 \q_recursion_tail \q_recursion_stop
    \__siunitx_table_split_tidy:N #2
    \__siunitx_table_split_tidy:N #4
  }
\cs_new_protected:Npn \__siunitx_table_split_loop:NNN #1#2#3
  {
    \peek_remove_spaces:n
      {
        \peek_catcode:NTF \c_group_begin_token
          { \__siunitx_table_split_group:NNNn #1#2#3 }
          { \__siunitx_table_split_token:NNNN #1#2#3 }
      }
  }
\cs_new_protected:Npn \__siunitx_table_split_group:NNNn #1#2#3#4
  {
    \tl_if_empty:NTF #2
      { \tl_put_right:Nn #1 { {#4} } }
      { \tl_put_right:Nn #3 { {#4} } }
    \__siunitx_table_split_loop:NNN #1#2#3
  }
\cs_new_protected:Npn \__siunitx_table_split_token:NNNN #1#2#3#4
  {
    \quark_if_recursion_tail_stop:N #4
    \tl_if_empty:NTF \l__siunitx_table_after_tl
      {
        \siunitx_if_number_token:NTF #4
          { \tl_put_right:Nn #2 {#4} }
          {
            \tl_if_empty:NTF #2
              { \tl_put_right:Nn #1 {#4} }
              { \tl_put_right:Nn #3 {#4} }
          }
      }
      { \tl_put_right:Nn #3 {#4} }
    \__siunitx_table_split_loop:NNN #1#2#3
  }
\cs_new_protected:Npn \__siunitx_table_split_tidy:N #1
  {
    \tl_if_empty:NF #1
      { \__siunitx_table_split_tidy:NV #1 #1 }
  }
\cs_new_protected:Npn \__siunitx_table_split_tidy:Nn #1#2
  {
    \str_if_eq:onT { \exp_after:wN { \use:n #2 } } {#2}
      { \tl_set:No #1 { \use:n #2 } }
  }
\cs_generate_variant:Nn \__siunitx_table_split_tidy:Nn { NV }
\cs_new_protected:Npn \__siunitx_table_skip:n #1
  {
    \skip_horizontal:n {#1}
    \tex_kern:D \c_zero_skip
  }
\dim_new:N \l__siunitx_table_column_width_dim
\keys_define:nn { siunitx }
  {
    table-column-width .code:n =
      {
        \dim_set:Nn \l__siunitx_table_column_width_dim {#1}
        \dim_compare:nNnT \l__siunitx_table_column_width_dim > \c_zero_dim
          { \bool_set_true:N \l__siunitx_table_fixed_width_bool }
      } ,
    table-fixed-width .bool_set:N =
      \l__siunitx_table_fixed_width_bool
  }
\cs_new_protected:Npn \__siunitx_table_align_center:n #1
  { \__siunitx_table_align_auxi:nn {#1} { 0pt~plus~0.5fill } }
\cs_new_protected:Npn \__siunitx_table_align_left:n #1
  { \__siunitx_table_align_auxi:nn {#1} { 0pt } }
\cs_new_protected:Npn \__siunitx_table_align_right:n #1
  { \__siunitx_table_align_auxi:nn {#1} { 0pt~plus~1fill } }
\cs_new_protected:Npn \__siunitx_table_align_none:n #1
  {
    \bool_if:NTF \l__siunitx_table_fixed_width_bool
      { \hbox_to_wd:nn \l__siunitx_table_column_width_dim }
      { \use:n }
        {#1}
  }
\cs_new_protected:Npn \__siunitx_table_align_auxi:nn #1#2
  {
    \bool_if:NTF \l__siunitx_table_fixed_width_bool
      { \hbox_to_wd:nn \l__siunitx_table_column_width_dim }
      { \use:n }
        {
          \__siunitx_table_skip:n {#2}
          #1
          \__siunitx_table_skip:n { 0pt~plus~1fill - #2 }
        }
  }
\AtBeginDocument
  {
    \@ifpackageloaded { colortbl }
      {
        \cs_new_eq:NN
          \__siunitx_table_align_auxii:nn
          \__siunitx_table_align_auxi:nn
        \cs_set_protected:Npn \__siunitx_table_align_auxi:nn #1#2
          {
            \__siunitx_table_skip:n{ 0pt~plus~-0.5fill }
            \__siunitx_table_align_auxii:nn {#1} {#2}
            \__siunitx_table_skip:n { 0pt~plus~-0.5fill }
          }
      }
      { }
  }
\keys_define:nn { siunitx }
  {
    table-text-alignment .choices:nn =
      { center , left , right , none }
      { \tl_set:Nn \l__siunitx_table_align_text_tl {#1} } ,
  }
\tl_new:N \l__siunitx_table_align_text_tl
\cs_new_protected:Npn \__siunitx_table_print_text:n #1
  {
    \bool_set_true:N \l__siunitx_table_text_bool
    \use:c { __siunitx_table_align_ \l__siunitx_table_align_text_tl :n } {#1}
  }
\cs_generate_variant:Nn \__siunitx_table_print_text:n { V }
\box_new:N \l__siunitx_table_integer_box
\box_new:N \l__siunitx_table_decimal_box
\cs_new_eq:NN \__siunitx_table_fil: \tex_hfil:D
\cs_new_eq:NN \__siunitx_table_fill: \tex_hfill:D
\cs_new:Npn \__siunitx_table_cleanup_decimal:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil
  { #1#2#3#4#5#6#7 }
\cs_new_protected:Npn \__siunitx_table_color_check:N #1
  { \exp_after:wN \__siunitx_table_color_check:w #1 \q_stop }
\cs_new_protected:Npn \__siunitx_table_color_check:w #1 \q_nil #2 \q_stop
  {
    \tl_if_head_eq_meaning:nNT {#1} \color
      { \__siunitx_table_color_check:Nnw #1 \q_stop }
  }
\cs_new_protected:Npn \__siunitx_table_color_check:Nnw #1#2#3 \q_stop
  { \keys_set:nn { siunitx } { number-color = #2 } }
\cs_new_protected:Npn \__siunitx_table_center_marker:
  {
    \hbox_set:Nn \l__siunitx_table_tmp_box
      { \ensuremath { \mathord { \l_siunitx_number_output_decimal_tl } } }
    \dim_compare:nNnTF
      { \box_wd:N \l__siunitx_table_integer_box }
        >
          {
              \box_wd:N \l__siunitx_table_decimal_box
            - \box_wd:N \l__siunitx_table_tmp_box
          }
      {
        \bool_if:NTF \l__siunitx_table_align_after_bool
          {
            \__siunitx_table_center_marker_aux:Nnnn \l__siunitx_table_decimal_box
              {
                  \box_wd:N \l__siunitx_table_integer_box
                + \box_wd:N \l__siunitx_table_tmp_box
              }
           }
           {
             \__siunitx_table_center_marker_aux:Nnnn \l__siunitx_table_after_box
               {
                   \box_wd:N \l__siunitx_table_after_box
                 + \box_wd:N \l__siunitx_table_integer_box
                 - \box_wd:N \l__siunitx_table_decimal_box
                 + \box_wd:N \l__siunitx_table_tmp_box
               }
           }
               { } { \__siunitx_table_fil: }
      }
      {
        \bool_if:NTF \l__siunitx_table_align_before_bool
          {
            \__siunitx_table_center_marker_aux:Nnnn \l__siunitx_table_integer_box
              {
                  \box_wd:N \l__siunitx_table_decimal_box
                - \box_wd:N \l__siunitx_table_tmp_box
              }
          }
          {
            \__siunitx_table_center_marker_aux:Nnnn \l__siunitx_table_before_box
               {
                   \box_wd:N \l__siunitx_table_before_box
                 + \box_wd:N \l__siunitx_table_decimal_box
                 - \box_wd:N \l__siunitx_table_integer_box
                 - \box_wd:N \l__siunitx_table_tmp_box
               }
          }
              { \__siunitx_table_fil: } { }
      }
  }
\cs_new_protected:Npn \__siunitx_table_center_marker_aux:Nnnn #1#2#3#4
  {
    \hbox_set_to_wd:Nnn #1 {#2}
      {
        #3
        \hbox_unpack:N #1
        #4
      }
  }
\keys_define:nn { siunitx }
  {
    table-alignment .meta:n =
      { table-number-alignment = #1 , table-text-alignment = #1 },
    table-alignment-mode .choices:nn =
      { none , format , marker }
      { \tl_set_eq:NN \l__siunitx_table_align_mode_tl \l_keys_choice_tl } ,
    table-auto-round .bool_set:N =
      \l__siunitx_table_auto_round_bool ,
    table-format .code:n =
      {
        \group_begin:
          \protected@edef \l__siunitx_table_tmp_tl {#1}
        \exp_args:NNV \group_end:
        \__siunitx_table_split:nNNN \l__siunitx_table_tmp_tl
          \l__siunitx_table_before_model_tl
          \l__siunitx_table_model_tl
          \l__siunitx_table_after_model_tl
        \exp_args:NV \__siunitx_table_generate_model:n \l__siunitx_table_model_tl
        \tl_set:Nn \l__siunitx_table_align_mode_tl { format }
      } ,
    table-number-alignment .choices:nn =
      { center , left , right }
      { \tl_set_eq:NN \l__siunitx_table_align_number_tl \l_keys_choice_tl }
  }
\tl_new:N \l__siunitx_table_align_mode_tl
\tl_new:N \l__siunitx_table_align_number_tl
\tl_new:N \l__siunitx_table_format_tl
\tl_new:N \l__siunitx_table_before_model_tl
\tl_new:N \l__siunitx_table_model_tl
\tl_new:N \l__siunitx_table_after_model_tl
\cs_new_protected:Npn \__siunitx_table_generate_model:n #1
  {
    \group_begin:
      \bool_set_true:N \l_siunitx_number_parse_bool
      \keys_set:nn { siunitx } { retain-explicit-plus = true }
      \siunitx_number_parse:nN {#1} \l__siunitx_table_format_tl
    \exp_args:NNNV \group_end:
    \tl_set:Nn \l__siunitx_table_format_tl \l__siunitx_table_format_tl
    \tl_if_empty:NF \l__siunitx_table_format_tl
      {
        \exp_after:wN \__siunitx_table_generate_model:nnnnnnn
          \l__siunitx_table_format_tl
      }
  }
\cs_new_protected:Npn \__siunitx_table_generate_model:nnnnnnn #1#2#3#4#5#6#7
  {
    \tl_set:Nx \l__siunitx_table_model_tl
      {
        \exp_not:n { {#1} {#2} }
        { \prg_replicate:nn {#3} { 8 } }
        { \prg_replicate:nn { 0 #4 } { 8 } }
        {
          \tl_if_blank:nF {#5}
            {
              \use:c { __siunitx_table_generate_model_ \tl_head:n {#5} :nnw }
                {#4} #5
            }
        }
        \exp_not:n { {#6} }
        {
          \int_compare:nNnTF {#7} = 0
            { 0 }
            { \prg_replicate:nn {#7} { 8 } }
        }
      }
  }
\cs_new:Npn \__siunitx_table_generate_model_S:nnw #1#2#3
  {
    { S }
    {
      \exp_args:Nff \__siunitx_table_generate_model_S:nnn
        { \tl_count:n {#1} } { \tl_count:n {#3} }
        {#3}
    }
  }
\cs_new:Npn \__siunitx_table_generate_model_S:nnn #1#2#3
  {
    \prg_replicate:nn
      {
        \int_compare:nNnTF {#2} > {#1}
          {
            \str_range:nnn {#3} { 1 } {#1}
            +
            \str_range:nnn {#3} { 1 + #1 } {#2}
          }
          {#3}
      }
      { 8 }
  }
\cs_new_protected:Npn \__siunitx_table_direct_begin:
  { \__siunitx_table_direct_begin:w }
\cs_new_protected:Npn \__siunitx_table_direct_begin:w #1 \ignorespaces
  {
    #1
    \peek_remove_spaces:n
      {
        \peek_catcode:NTF \c_group_begin_token
          { \__siunitx_table_print_text:n }
          {
            \m@th
            \use:c { __siunitx_table_direct_ \l__siunitx_table_align_mode_tl : }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_table_direct_end:
  { \use:c { __siunitx_table_direct_ \l__siunitx_table_align_mode_tl _end: } }
\cs_new_protected:Npn \__siunitx_table_direct_marker:
  {
    \hbox_set:Nn \l__siunitx_table_tmp_box
      { \ensuremath { \mathord { \l_siunitx_number_output_decimal_tl } } }
    \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box
      { \box_wd:N \l__siunitx_table_tmp_box }
      { \__siunitx_table_fil: }
    \hbox_set:Nw \l__siunitx_table_integer_box
      \c_math_toggle_token
      \tl_map_inline:Nn \l_siunitx_number_input_decimal_tl
        {
          \char_set_active_eq:NN ##1 \__siunitx_table_direct_marker_switch:
          \char_set_mathcode:nn { `##1 } { "8000 }
        }
  }
\cs_new_protected:Npn \__siunitx_table_direct_marker_switch:
  {
      \c_math_toggle_token
    \hbox_set_end:
    \hbox_set:Nw \l__siunitx_table_decimal_box
      \c_math_toggle_token
      \l_siunitx_number_output_decimal_tl
  }
\cs_new_protected:Npn \__siunitx_table_direct_marker_end:
  {
      \c_math_toggle_token
    \hbox_set_end:
    \bool_set_true:N \l__siunitx_table_align_before_bool
    \bool_set_true:N \l__siunitx_table_align_after_bool
    \__siunitx_table_center_marker:
    \use:c { __siunitx_table_align_ \l__siunitx_table_align_text_tl :n }
      {
        \box_use_drop:N \l__siunitx_table_integer_box
        \box_use_drop:N \l__siunitx_table_decimal_box
      }
  }
\cs_new_protected:Npn \__siunitx_table_direct_format:
  {
    \tl_set:Nx \l__siunitx_table_tmp_tl
      { \siunitx_number_output:NN \l__siunitx_table_model_tl \q_nil }
    \exp_after:wN \__siunitx_table_direct_format_aux:w
      \l__siunitx_table_tmp_tl \q_stop
  }
\cs_new_protected:Npn \__siunitx_table_direct_format_aux:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_stop
  {
    \hbox_set:Nn \l__siunitx_table_tmp_box
      { \ensuremath { \__siunitx_table_cleanup_decimal:w #4 } }
    \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box
      { \box_wd:N \l__siunitx_table_tmp_box }
      { \__siunitx_table_fil: }
    \hbox_set:Nn \l__siunitx_table_tmp_box { \ensuremath { #1#2#3 } }
    \hbox_set_to_wd:Nnw \l__siunitx_table_integer_box
      { \box_wd:N \l__siunitx_table_tmp_box }
      \c_math_toggle_token
      \tl_map_inline:Nn \l_siunitx_number_input_decimal_tl
        {
          \char_set_active_eq:NN ##1 \__siunitx_table_direct_format_switch:
          \char_set_mathcode:nn { `##1 } { "8000 }
        }
      \__siunitx_table_fill:
  }
\cs_new_protected:Npn \__siunitx_table_direct_format_switch:
  {
      \c_math_toggle_token
    \hbox_set_end:
    \hbox_set_to_wd:Nnw \l__siunitx_table_decimal_box
      { \box_wd:N \l__siunitx_table_decimal_box }
      \c_math_toggle_token
      \mathord { \l_siunitx_number_output_decimal_tl }
  }
\cs_new_protected:Npn \__siunitx_table_direct_format_end:
  {
      \c_math_toggle_token
      \__siunitx_table_fil:
    \hbox_set_end:
    \use:c { __siunitx_table_align_ \l__siunitx_table_align_number_tl :n }
      {
        \box_use_drop:N \l__siunitx_table_integer_box
        \box_use_drop:N \l__siunitx_table_decimal_box
      }
  }
\cs_new_protected:Npn \__siunitx_table_direct_none: { \c_math_toggle_token }
\cs_new_protected:Npn \__siunitx_table_direct_none_end: { \c_math_toggle_token }
\box_new:N \l__siunitx_table_before_box
\box_new:N \l__siunitx_table_after_box
\dim_new:N \l__siunitx_table_before_dim
\dim_new:N \l__siunitx_table_carry_dim
\keys_define:nn { siunitx }
  {
    table-align-comparator .bool_set:N =
      \l__siunitx_table_align_comparator_bool ,
    table-align-exponent .bool_set:N =
      \l__siunitx_table_align_exponent_bool ,
    table-align-text-after .bool_set:N =
      \l__siunitx_table_align_after_bool ,
    table-align-text-before .bool_set:N =
      \l__siunitx_table_align_before_bool ,
    table-align-uncertainty .bool_set:N =
      \l__siunitx_table_align_uncertainty_bool
  }
\cs_new_protected:Npn \__siunitx_table_print:nnn #1#2#3
  { \use:c { __siunitx_table_print_ \l__siunitx_table_align_mode_tl :nnn } {#1} {#2} {#3} }
\cs_generate_variant:Nn \__siunitx_table_print:nnn { VVV }
\cs_new_protected:Npn \__siunitx_table_print_marker:nnn #1#2#3
  {
    \hbox_set:Nn \l__siunitx_table_before_box {#1}
    \dim_compare:nNnT { \box_wd:N \l__siunitx_table_before_box } = { 0pt }
      {
        \box_clear:N \l__siunitx_table_before_box
        #1
      }
    \hbox_set:Nn \l__siunitx_table_after_box {#3}
    \dim_compare:nNnTF
      { \box_wd:N \l__siunitx_table_after_box }
       > { \box_wd:N \l__siunitx_table_before_box }
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_before_box
          { \box_wd:N \l__siunitx_table_after_box }
          {
            \__siunitx_table_fil:
            \hbox_unpack:N \l__siunitx_table_before_box
          }
      }
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_after_box
          { \box_wd:N \l__siunitx_table_before_box }
          {
            \hbox_unpack:N \l__siunitx_table_after_box
            \__siunitx_table_fil:
          }
      }
    \siunitx_number_parse:nN {#2} \l__siunitx_table_tmp_tl
    \siunitx_number_process:NN \l__siunitx_table_tmp_tl \l__siunitx_table_tmp_tl
    \tl_set:Nx \l__siunitx_table_tmp_tl
      { \siunitx_number_output:NN \l__siunitx_table_tmp_tl \q_nil }
    \__siunitx_table_color_check:N \l__siunitx_table_tmp_tl
    \exp_after:wN \__siunitx_table_print_marker:w
      \l__siunitx_table_tmp_tl \q_stop
  }
\cs_new_protected:Npn \__siunitx_table_print_marker:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_stop
  {
    \hbox_set:Nn \l__siunitx_table_integer_box
      { \siunitx_print_number:n { #1#2#3 } }
    \hbox_set:Nn \l__siunitx_table_decimal_box
      {
        \siunitx_print_number:x
          { \__siunitx_table_print_marker_aux:w #4 \q_stop }
      }
    \__siunitx_table_center_marker:
    \use:c { __siunitx_table_align_ \l__siunitx_table_align_text_tl :n }
      {
            \box_use_drop:N \l__siunitx_table_before_box
        \box_use_drop:N \l__siunitx_table_integer_box
        \box_use_drop:N \l__siunitx_table_decimal_box
            \box_use_drop:N \l__siunitx_table_after_box
      }
  }
\cs_new:Npn \__siunitx_table_print_marker_aux:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5
     \q_nil #6 \q_nil #7 \q_nil #8 \q_stop
  {
    \exp_not:n {#1#2#3#4#5#6}
    \tl_if_blank:nT {#1#2#3#4#5#6} { { } }
    \exp_not:n {#7#8}
  }
\cs_new_protected:Npn \__siunitx_table_print_format:nnn #1#2#3
  {
    \hbox_set:Nn \l__siunitx_table_tmp_box { \l__siunitx_table_before_model_tl }
    \hbox_set:Nn \l__siunitx_table_before_box {#1}
    \dim_compare:nNnT { \box_wd:N \l__siunitx_table_before_box } = { 0pt }
      {
        \box_clear:N \l__siunitx_table_before_box
        #1
      }
    \dim_set:Nn \l__siunitx_table_before_dim { \box_wd:N \l__siunitx_table_tmp_box }
    \siunitx_number_parse:nN {#2} \l__siunitx_table_tmp_tl
    \group_begin:
      \bool_if:NT \l__siunitx_table_auto_round_bool
        {
          \exp_args:Nx \keys_set:nn { siunitx }
            {
              round-mode      = places ,
              round-pad       = true   ,
              round-precision =
                \exp_after:wN \__siunitx_table_print_format:nnnnnn
                  \l__siunitx_table_format_tl
            }
        }
      \siunitx_number_process:NN \l__siunitx_table_tmp_tl \l__siunitx_table_tmp_tl
    \exp_args:NNNV \group_end:
    \tl_set:Nn \l__siunitx_table_tmp_tl \l__siunitx_table_tmp_tl
    \tl_set:Nx \l__siunitx_table_tmp_tl
      {
        \siunitx_number_output:NN \l__siunitx_table_model_tl \q_nil
        \exp_not:N \q_mark
        \siunitx_number_output:NN \l__siunitx_table_tmp_tl \q_nil
      }
    \exp_after:wN \__siunitx_table_print_format_auxi:w
      \l__siunitx_table_tmp_tl \q_stop
    \hbox_set:Nn \l__siunitx_table_tmp_box { \l__siunitx_table_after_model_tl }
    \hbox_set_to_wd:Nnn \l__siunitx_table_after_box
      { \box_wd:N \l__siunitx_table_tmp_box + \l__siunitx_table_carry_dim }
      {
        \bool_if:NT \l__siunitx_table_align_after_bool
          { \skip_horizontal:n { \l__siunitx_table_carry_dim } }
        #3
        \__siunitx_table_fil:
      }
    \use:c { __siunitx_table_align_ \l__siunitx_table_align_number_tl :n }
      {
        \box_use_drop:N \l__siunitx_table_before_box
        \box_use_drop:N \l__siunitx_table_integer_box
        \box_use_drop:N \l__siunitx_table_decimal_box
        \box_use_drop:N \l__siunitx_table_after_box
      }
  }
\cs_new:Npn \__siunitx_table_print_format:nnnnnn #1#2#3#4#5#6#7
  { 0 #4 }
\cs_new_protected:Npn \__siunitx_table_print_format_auxi:w
  #1 \q_nil #2 \q_mark #3 \q_nil #4 \q_stop
  {
    \__siunitx_table_color_check:w #3 \q_nil \q_stop
    \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#1}
    \bool_if:NTF \l__siunitx_table_align_before_bool
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box
          { \box_wd:N \l__siunitx_table_tmp_box }
          {
            \__siunitx_table_fil:
            \tl_if_blank:nF {#3}
             { \siunitx_print_number:n {#3} }
          }
      }
      {
        \__siunitx_table_print_format_box:Nn \l__siunitx_table_integer_box {#3}
        \dim_add:Nn \l__siunitx_table_before_dim
          {
              \box_wd:N \l__siunitx_table_tmp_box
            - \box_wd:N \l__siunitx_table_integer_box
          }
      }
    \__siunitx_table_print_format_auxii:w #2 \q_mark #4 \q_stop
  }
\cs_new_protected:Npn \__siunitx_table_print_format_auxii:w
  #1 \q_nil #2 \q_nil #3 \q_mark #4 \q_nil #5 \q_nil #6 \q_stop
  {
    \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#1#2}
    \dim_set:Nn \l__siunitx_table_tmp_dim { \box_wd:N \l__siunitx_table_tmp_box }
    \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#4#5}
    \dim_compare:nNnT { \box_wd:N \l__siunitx_table_tmp_box } > \l__siunitx_table_tmp_dim
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_tmp_box \l__siunitx_table_tmp_dim
          { \hbox_unpack:N \l__siunitx_table_tmp_box }
        \hbox_set_to_wd:Nnn \l__siunitx_table_tmp_box \l__siunitx_table_tmp_dim
          {
            \tex_hss:D
            \hbox_unpack:N \l__siunitx_table_tmp_box
          }
      }
    \bool_lazy_and:nnTF
      { \l__siunitx_table_align_comparator_bool }
      { \dim_compare_p:nNn { \box_wd:N \l__siunitx_table_integer_box } > { 0pt } }
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box
          {
              \box_wd:N \l__siunitx_table_integer_box
            + \l__siunitx_table_tmp_dim
          }
          {
            \hbox_unpack:N \l__siunitx_table_integer_box
            \__siunitx_table_fil:
            \hbox_unpack:N \l__siunitx_table_tmp_box
          }
      }
      {
        \bool_if:NTF \l__siunitx_table_align_before_bool
          {
            \hbox_set_to_wd:Nnn \l__siunitx_table_integer_box
              {
                  \box_wd:N \l__siunitx_table_integer_box
                + \l__siunitx_table_tmp_dim
              }
              {
                \__siunitx_table_fil:
                \hbox_unpack:N \l__siunitx_table_integer_box
                \hbox_unpack:N \l__siunitx_table_tmp_box
              }
          }
          {
            \hbox_set:Nn \l__siunitx_table_integer_box
              {
                \hbox_unpack:N \l__siunitx_table_integer_box
                \hbox_unpack:N \l__siunitx_table_tmp_box
              }
            \dim_add:Nn \l__siunitx_table_before_dim
              {
                  \l__siunitx_table_tmp_dim
                - \box_wd:N \l__siunitx_table_tmp_box
              }
          }
      }
    \hbox_set_to_wd:Nnn \l__siunitx_table_before_box \l__siunitx_table_before_dim
      {
        \__siunitx_table_fil:
        \hbox_unpack:N \l__siunitx_table_before_box
      }
    \__siunitx_table_print_format_auxiii:w #3 \q_mark #6 \q_stop
  }
\cs_new_protected:Npn \__siunitx_table_print_format_auxiii:w
  #1 \q_nil #2 \q_nil #3 \q_mark #4 \q_nil #5 \q_nil #6 \q_stop
  {
    \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box {#1#2}
    \__siunitx_table_print_format_box:Nn \l__siunitx_table_decimal_box {#4#5}
    \dim_set:Nn \l__siunitx_table_carry_dim
      {
          \box_wd:N \l__siunitx_table_tmp_box
        - \box_wd:N \l__siunitx_table_decimal_box
      }
    \__siunitx_table_print_format_auxiv:w #3 \q_mark #6 \q_stop
  }
\cs_new_protected:Npn \__siunitx_table_print_format_auxiv:w
  #1 \q_nil #2 \q_mark #3 \q_nil #4 \q_stop
  {
    \tl_if_blank:nTF {#1}
      { \__siunitx_table_print_format_auxv:w }
      { \__siunitx_table_print_format_auxvi:w }
        #1#2 \q_mark #3#4 \q_stop
  }
\cs_new_protected:Npn \__siunitx_table_print_format_auxv:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_mark
  #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_stop
  { \__siunitx_table_print_format_auxvii:w #4 \q_mark #8 \q_stop }
\cs_new_protected:Npn \__siunitx_table_print_format_auxvi:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_mark
  #5 \q_nil #6 \q_nil #7 \q_nil #8 \q_stop
  {
    \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #1#2#3 }
    \dim_set:Nn \l__siunitx_table_tmp_dim { \box_wd:N \l__siunitx_table_tmp_box }
    \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #5#6#7 }
    \__siunitx_table_print_format_after:N \l__siunitx_table_align_uncertainty_bool
    \__siunitx_table_print_format_auxvii:w #4 \q_mark #8 \q_stop
  }
\cs_new_protected:Npn \__siunitx_table_print_format_auxvii:w
  #1 \q_nil #2 \q_mark #3 \q_nil #4 \q_stop
  {
    \tl_if_blank:nF {#2}
      {
        \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #1#2 }
        \dim_set:Nn \l__siunitx_table_tmp_dim { \box_wd:N \l__siunitx_table_tmp_box }
        \__siunitx_table_print_format_box:Nn \l__siunitx_table_tmp_box { { } #3#4 }
        \__siunitx_table_print_format_after:N \l__siunitx_table_align_exponent_bool
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_format_box:Nn #1#2
  {
    \hbox_set:Nn #1
      {
        \tl_if_blank:nF {#2}
          { \siunitx_print_number:n {#2} }
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_format_after:N #1
  {
    \bool_if:NTF #1
      {
        \hbox_set_to_wd:Nnn \l__siunitx_table_decimal_box
          {
              \box_wd:N \l__siunitx_table_decimal_box
            + \l__siunitx_table_carry_dim
            + \box_wd:N \l__siunitx_table_tmp_box
          }
          {
            \hbox_unpack:N \l__siunitx_table_decimal_box
            \__siunitx_table_fil:
            \hbox_unpack:N \l__siunitx_table_tmp_box
          }
        \dim_set:Nn \l__siunitx_table_carry_dim
          {
              \l__siunitx_table_tmp_dim
            - \box_wd:N \l__siunitx_table_tmp_box
          }
      }
      {
        \hbox_set:Nn \l__siunitx_table_decimal_box
          {
            \hbox_unpack:N \l__siunitx_table_decimal_box
            \hbox_unpack:N \l__siunitx_table_tmp_box
          }
        \dim_add:Nn \l__siunitx_table_carry_dim
          {
              \l__siunitx_table_tmp_dim
            - \box_wd:N \l__siunitx_table_tmp_box
          }
      }
  }
\cs_new_protected:Npn \__siunitx_table_print_none:nnn #1#2#3
  {
    \use:c { __siunitx_table_align_ \l__siunitx_table_align_number_tl :n }
      {
        #1
        \siunitx_number_format:nN {#2} \l__siunitx_table_tmp_tl
        \siunitx_print_number:V \l__siunitx_table_tmp_tl
        #3
     }
  }
\keys_set:nn { siunitx }
  {
    table-align-comparator  = true   ,
    table-align-exponent    = true   ,
    table-align-text-after  = true   ,
    table-align-text-before = true   ,
    table-align-uncertainty = true   ,
    table-alignment         = center ,
    table-auto-round        = false  ,
    table-column-width      = 0pt    ,
    table-fixed-width       = false  ,
    table-format            = 2.2    ,
    table-number-alignment  = center ,
    table-text-alignment    = center ,
    table-alignment-mode    = marker
  }
\cs_generate_variant:Nn \tl_replace_all:Nnn { NnV }
\fp_new:N \l__siunitx_unit_tmp_fp
\int_new:N \l__siunitx_unit_tmp_int
\tl_new:N  \l__siunitx_unit_tmp_tl
\tl_const:Nx \c__siunitx_unit_math_subscript_tl
  { \char_generate:nn { `\_ } { 8 } }
\bool_new:N \l__siunitx_unit_parsing_bool
\bool_new:N \l__siunitx_unit_test_bool
\prg_new_protected_conditional:Npnn \__siunitx_unit_if_symbolic:n #1 { TF }
  {
    \group_begin:
      \bool_set_true:N \l__siunitx_unit_test_bool
      \protected@edef \l__siunitx_unit_tmp_tl {#1}
    \exp_args:NNV \group_end:
    \tl_if_blank:nTF \l__siunitx_unit_tmp_tl
      { \prg_return_true: }
      { \prg_return_false: }
  }
\seq_new:N \l_siunitx_unit_symbolic_seq
\seq_new:N \l_siunitx_unit_seq
\cs_new_protected:Npn \__siunitx_unit_set_symbolic:Nnn #1
  { \__siunitx_unit_set_symbolic:Nnnn #1 { } }
\cs_new_protected:Npn \__siunitx_unit_set_symbolic:Npnn #1#2#
  { \__siunitx_unit_set_symbolic:Nnnn #1 {#2} }
\cs_new_protected:Npn \__siunitx_unit_set_symbolic:Nnnn #1#2#3#4
  {
    \seq_put_right:Nn \l_siunitx_unit_symbolic_seq {#1}
    \cs_set:cpn { __siunitx_unit_ \token_to_str:N #1 :w } #2
      {
        \bool_if:NF \l__siunitx_unit_test_bool
          {
            \bool_if:NTF \l__siunitx_unit_parsing_bool
              {#4}
              {#3}
          }
      }
  }
\cs_new_protected:Npn \siunitx_declare_power:NNn #1#2#3
  {
    \__siunitx_unit_set_symbolic:Nnn #1
      { \__siunitx_unit_literal_power:nn {#3} }
      { \__siunitx_unit_parse_power:nnN {#1} {#3} \c_true_bool }
    \__siunitx_unit_set_symbolic:Nnn #2
      { ^ {#3} }
      { \__siunitx_unit_parse_power:nnN {#2} {#3} \c_false_bool }
  }
\cs_new_protected:Npn \siunitx_declare_prefix:Nn #1#2
  {
    \__siunitx_unit_set_symbolic:Nnn #1
      {#2}
      { \__siunitx_unit_parse_prefix:Nn #1 {#2} }
  }
\cs_new_protected:Npn \siunitx_declare_prefix:Nnn #1#2#3
  {
    \siunitx_declare_prefix:Nn #1 {#3}
    \prop_put:Nnn \l__siunitx_unit_prefixes_forward_prop {#3} {#2}
    \prop_put:Nnn \l__siunitx_unit_prefixes_reverse_prop {#2} {#3}
  }
\cs_generate_variant:Nn \siunitx_declare_prefix:Nnn { Nnx }
\prop_new:N \l__siunitx_unit_prefixes_forward_prop
\prop_new:N \l__siunitx_unit_prefixes_reverse_prop
\cs_new_protected:Npn \siunitx_declare_qualifier:Nn #1#2
  {
    \__siunitx_unit_set_symbolic:Nnn #1
      { ~ ( #2 ) }
      { \__siunitx_unit_parse_qualifier:nn {#1} {#2} }
  }
\cs_new_protected:Npn \siunitx_declare_unit:Nn #1#2
  { \siunitx_declare_unit:Nnn #1 {#2} { } }
\cs_generate_variant:Nn \siunitx_declare_unit:Nn { Nx }
\cs_new_protected:Npn \siunitx_declare_unit:Nnn #1#2#3
  {
    \seq_put_right:Nn \l_siunitx_unit_seq {#1}
    \__siunitx_unit_set_symbolic:Nnn #1
      {#2}
      {
        \__siunitx_unit_if_symbolic:nTF {#2}
          {#2}
          { \__siunitx_unit_parse_unit:Nn #1 {#2} }
      }
    \tl_clear_new:c { l__siunitx_unit_options_ \token_to_str:N #1 _tl }
    \tl_if_empty:nF {#3}
      { \tl_set:cn { l__siunitx_unit_options_ \token_to_str:N #1 _tl } {#3} }
  }
\cs_generate_variant:Nn \siunitx_declare_unit:Nnn { Nx }
\bool_new:N \l__siunitx_unit_options_bool
\cs_new_protected:Npn \siunitx_unit_options_apply:n #1
  {
    \bool_if:NF \l__siunitx_unit_options_bool
      {
        \tl_if_single_token:nT {#1}
          {
            \tl_if_exist:cT { l__siunitx_unit_options_ \token_to_str:N #1 _tl }
              {
                \keys_set:nv { siunitx }
                  { l__siunitx_unit_options_ \token_to_str:N #1 _tl }
              }
          }
      }
    \bool_set_true:N \l__siunitx_unit_options_bool
  }
\__siunitx_unit_set_symbolic:Nnn \per
  { / }
  { \__siunitx_unit_parse_per: }
\__siunitx_unit_set_symbolic:Npnn \cancel
  { }
  { \__siunitx_unit_parse_special:n { \cancel } }
\__siunitx_unit_set_symbolic:Npnn \highlight #1
  { \__siunitx_unit_literal_special:nN { \textcolor {#1} } }
  { \__siunitx_unit_parse_special:n { \textcolor {#1} } }
\__siunitx_unit_set_symbolic:Npnn \of #1
  { \  ( #1 ) }
  { \__siunitx_unit_parse_qualifier:nn { \of {#1} } {#1} }
\__siunitx_unit_set_symbolic:Npnn \raiseto #1
  { \__siunitx_unit_literal_power:nn {#1} }
  { \__siunitx_unit_parse_power:nnN { \raiseto {#1} } {#1} \c_true_bool }
\__siunitx_unit_set_symbolic:Npnn \tothe #1
  { ^ {#1} }
  { \__siunitx_unit_parse_power:nnN { \tothe {#1} } {#1} \c_false_bool }
\keys_define:nn { siunitx }
  {
    extract-mass-in-kilograms .bool_set:N =
      \l__siunitx_unit_mass_kilogram_bool ,
    inter-unit-product .tl_set:N =
      \l__siunitx_unit_product_tl ,
    unit-font-command .tl_set:N =
      \l_siunitx_unit_font_tl
  }
\tl_new:N \l__siunitx_unit_formatted_tl
\cs_new_protected:Npn \siunitx_unit_format:nN #1#2
  {
    \bool_set_false:N \l__siunitx_unit_prefix_exp_bool
    \fp_zero:N \l__siunitx_unit_combine_exp_fp
    \fp_set:Nn \l__siunitx_unit_multiple_fp { \c_one_fp }
    \__siunitx_unit_format:nNN {#1} #2 \l__siunitx_unit_tmp_fp
  }
\cs_new_protected:Npn \siunitx_unit_format_extract_prefixes:nNN #1#2#3
  {
    \bool_set_true:N \l__siunitx_unit_prefix_exp_bool
    \fp_zero:N \l__siunitx_unit_combine_exp_fp
    \fp_set:Nn \l__siunitx_unit_multiple_fp { \c_one_fp }
    \__siunitx_unit_format:nNN {#1} #2 #3
  }
\cs_new_protected:Npn \siunitx_unit_format_combine_exponent:nnN #1#2#3
  {
    \bool_set_false:N \l__siunitx_unit_prefix_exp_bool
    \fp_set:Nn \l__siunitx_unit_combine_exp_fp {#2}
    \fp_set:Nn \l__siunitx_unit_multiple_fp { \c_one_fp }
    \__siunitx_unit_format:nNN {#1} #3 \l__siunitx_unit_tmp_fp
  }
\cs_new_protected:Npn \siunitx_unit_format_multiply:nnN #1#2#3
  {
    \bool_set_false:N \l__siunitx_unit_prefix_exp_bool
    \fp_zero:N \l__siunitx_unit_combine_exp_fp
    \fp_set:Nn \l__siunitx_unit_multiple_fp {#2}
    \__siunitx_unit_format:nNN {#1} #3 \l__siunitx_unit_tmp_fp
  }
\cs_new_protected:Npn \siunitx_unit_format_multiply_extract_prefixes:nnNN
  #1#2#3#4
  {
    \bool_set_true:N \l__siunitx_unit_prefix_exp_bool
    \fp_zero:N \l__siunitx_unit_combine_exp_fp
    \fp_set:Nn \l__siunitx_unit_multiple_fp {#2}
    \__siunitx_unit_format:nNN {#1} #3 #4
  }
\cs_new_protected:Npn \siunitx_unit_format_multiply_combine_exponent:nnnN
  #1#2#3#4
  {
    \bool_set_false:N \l__siunitx_unit_prefix_exp_bool
    \fp_set:Nn \l__siunitx_unit_combine_exp_fp {#3}
    \fp_set:Nn \l__siunitx_unit_multiple_fp {#2}
    \__siunitx_unit_format:nNN {#1} #4 \l__siunitx_unit_tmp_fp
  }
\cs_new_protected:Npn \__siunitx_unit_format:nNN #1#2#3
  {
    \group_begin:
      \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
        { \cs_set_eq:Nc ##1 { __siunitx_unit_ \token_to_str:N ##1 :w } }
      \tl_clear:N \l__siunitx_unit_formatted_tl
      \fp_zero:N \l__siunitx_unit_prefix_fp
      \bool_if:NTF \l__siunitx_unit_parse_bool
        {
          \__siunitx_unit_if_symbolic:nTF {#1}
            {
              \__siunitx_unit_parse:n {#1}
              \prop_if_empty:NF \l__siunitx_unit_parsed_prop
                { \__siunitx_unit_format_parsed: }
            }
            {
              \bool_if:NTF \l__siunitx_unit_forbid_literal_bool
                { \msg_error:nnn { siunitx } { unit / literal } {#1} }
                { \__siunitx_unit_format_literal:n {#1} }
            }
        }
        { \__siunitx_unit_format_literal:n {#1} }
      \cs_set_protected:Npx \__siunitx_unit_format_aux:
        {
          \tl_set:Nn \exp_not:N #2
            { \exp_not:V \l__siunitx_unit_formatted_tl }
          \fp_set:Nn \exp_not:N #3
            { \fp_use:N \l__siunitx_unit_prefix_fp }
        }
    \exp_after:wN \group_end:
    \__siunitx_unit_format_aux:
  }
\cs_new_protected:Npn \__siunitx_unit_format_aux: { }
\cs_new:Npn \__siunitx_unit_literal_power:nn #1#2 { #2 ^ {#1} }
\cs_new:Npn \__siunitx_unit_literal_special:nN #1#2 { #1 {#2} }
\group_begin:
  \char_set_catcode_active:n { `\~ }
  \cs_new_protected:Npx \__siunitx_unit_format_literal:n #1
    {
      \group_begin:
        \exp_not:n { \bool_set_false:N \l__siunitx_unit_parsing_bool }
        \tl_set:Nn \exp_not:N \l__siunitx_unit_tmp_tl {#1}
        \tl_replace_all:Nnn \exp_not:N \l__siunitx_unit_tmp_tl
          { \token_to_str:N ^ } { ^ }
        \tl_replace_all:Nnn \exp_not:N \l__siunitx_unit_tmp_tl
          { \token_to_str:N _ } { \c__siunitx_unit_math_subscript_tl }
        \char_set_active_eq:NN ^
          \exp_not:N \__siunitx_unit_format_literal_superscript:
        \char_set_active_eq:NN _
          \exp_not:N \__siunitx_unit_format_literal_subscript:
        \char_set_active_eq:NN \exp_not:N ~
          \exp_not:N \__siunitx_unit_format_literal_tilde:
        \exp_not:n
          {
            \protected@edef \l__siunitx_unit_tmp_tl
              { \l__siunitx_unit_tmp_tl }
            \tl_clear:N \l__siunitx_unit_formatted_tl
            \tl_if_empty:NF \l__siunitx_unit_tmp_tl
              {
                \exp_after:wN \__siunitx_unit_format_literal_auxi:w
                  \l__siunitx_unit_tmp_tl .
                  \q_recursion_tail . \q_recursion_stop
              }
            \exp_args:NNNV \group_end:
            \tl_set:Nn \l__siunitx_unit_formatted_tl
              \l__siunitx_unit_formatted_tl
          }
    }
\group_end:
\cs_new:Npx \__siunitx_unit_format_literal_subscript: { \c__siunitx_unit_math_subscript_tl }
\cs_new:Npn \__siunitx_unit_format_literal_superscript: { ^ }
\cs_new:Npn \__siunitx_unit_format_literal_tilde: { . }
\cs_new_protected:Npn \__siunitx_unit_format_literal_auxi:w #1 .
  {
    \quark_if_recursion_tail_stop:n {#1}
    \__siunitx_unit_format_literal_auxii:n {#1}
    \tl_set_eq:NN \l__siunitx_unit_separator_tl \l__siunitx_unit_product_tl
    \__siunitx_unit_format_literal_auxi:w
  }
\cs_set_protected:Npn \__siunitx_unit_format_literal_auxii:n #1
  {
    \__siunitx_unit_format_literal_auxiii:w
      #1 / \q_recursion_tail / \q_recursion_stop
  }
\cs_new_protected:Npn \__siunitx_unit_format_literal_auxiii:w #1 /
  {
    \quark_if_recursion_tail_stop:n {#1}
    \__siunitx_unit_format_literal_auxiv:n {#1}
    \tl_set:Nn \l__siunitx_unit_separator_tl { / }
    \__siunitx_unit_format_literal_auxiii:w
  }
\cs_new_protected:Npn \__siunitx_unit_format_literal_auxiv:n #1
  {
    \__siunitx_unit_format_literal_auxv:nw { }
      #1 \q_recursion_tail \q_recursion_stop
  }
\cs_new_protected:Npn \__siunitx_unit_format_literal_auxv:nw
  #1#2 \q_recursion_stop
  {
    \tl_if_head_is_N_type:nTF {#2}
      { \__siunitx_unit_format_literal_auxvi:nN }
      {
        \tl_if_head_is_group:nTF {#2}
          { \__siunitx_unit_format_literal_auxix:nn }
          { \__siunitx_unit_format_literal_auxx:nw }
      }
        {#1} #2 \q_recursion_stop
  }
\cs_new_protected:Npx \__siunitx_unit_format_literal_auxvi:nN #1#2
  {
    \exp_not:N \quark_if_recursion_tail_stop_do:Nn #2
      { \exp_not:N \__siunitx_unit_format_literal_add:n {#1} }
    \exp_not:N \token_if_eq_meaning:NNTF #2 ^
      { \exp_not:N \__siunitx_unit_format_literal_super:nn {#1} }
      {
        \exp_not:N \token_if_eq_meaning:NNTF
          #2 \c__siunitx_unit_math_subscript_tl
          { \exp_not:N \__siunitx_unit_format_literal_sub:nn {#1} }
          { \exp_not:N \__siunitx_unit_format_literal_auxvii:nN {#1} #2 }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_literal_auxvii:nN #1#2
  {
    \str_if_eq:nnTF {#2} { \protect }
      { \__siunitx_unit_format_literal_auxviii:nN {#1} }
      { \__siunitx_unit_format_literal_auxv:nw {#1#2} }
  }
\cs_new_protected:Npn \__siunitx_unit_format_literal_auxviii:nN #1#2
  { \__siunitx_unit_format_literal_auxv:nw { #1 \protect #2 } }
\cs_new_protected:Npn \__siunitx_unit_format_literal_super:nn #1#2
  {
    \quark_if_recursion_tail_stop:n {#2}
    \__siunitx_unit_format_literal_add:n {#1}
    \tl_put_right:Nn \l__siunitx_unit_formatted_tl { ^ {#2} }
    \__siunitx_unit_format_literal_auxvi:nN { }
  }
\cs_new_protected:Npx \__siunitx_unit_format_literal_sub:nn #1#2
  {
    \exp_not:N \quark_if_recursion_tail_stop:n {#2}
    \exp_not:N \__siunitx_unit_format_literal_add:n {#1}
    \tl_put_right:Nx \exp_not:N \l__siunitx_unit_formatted_tl
      {
        \c__siunitx_unit_math_subscript_tl
          {
            \exp_not:N \exp_not:V
              \exp_not:N \l_siunitx_unit_font_tl
                { \exp_not:N \exp_not:n {#2} }
          }
      }
    \exp_not:N \__siunitx_unit_format_literal_auxvi:nN { }
  }
\cs_new_protected:Npn \__siunitx_unit_format_literal_add:n #1
  {
    \tl_put_right:Nx \l__siunitx_unit_formatted_tl
      {
        \tl_if_empty:NF \l__siunitx_unit_formatted_tl
          { \exp_not:V \l__siunitx_unit_separator_tl }
        \tl_if_empty:nF {#1}
          { \exp_not:V \l_siunitx_unit_font_tl { \exp_not:n {#1} } }
      }
    \tl_clear:N \l__siunitx_unit_separator_tl
  }
\cs_new_protected:Npn \__siunitx_unit_format_literal_auxix:nn #1#2
  { \__siunitx_unit_format_literal_auxv:nw { #1 {#2} } }
\use:x
  {
    \cs_new_protected:Npn \exp_not:N \__siunitx_unit_format_literal_auxx:nw
      ##1 \c_space_tl
  }
  { \__siunitx_unit_format_literal_auxv:nw {#1} }
\tl_new:N \l__siunitx_unit_separator_tl
\cs_new_protected:Npn \siunitx_unit_pdfstring_context:
  {
    \bool_set_false:N \l__siunitx_unit_parsing_bool
    \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
      { \cs_set_eq:Nc ##1 { __siunitx_unit_ \token_to_str:N ##1 :w } }
  }
\keys_define:nn { siunitx }
  {
    sticky-per .bool_set:N = \l__siunitx_unit_sticky_per_bool
  }
\prop_new:N \l__siunitx_unit_parsed_prop
\bool_new:N \l__siunitx_unit_per_bool
\int_new:N \l__siunitx_unit_position_int
\cs_new_protected:Npn \__siunitx_unit_parse:n #1
  {
    \prop_clear:N \l__siunitx_unit_parsed_prop
    \bool_set_true:N \l__siunitx_unit_parsing_bool
    \bool_set_false:N \l__siunitx_unit_per_bool
    \bool_set_false:N \l__siunitx_unit_test_bool
    \int_zero:N \l__siunitx_unit_position_int
    \siunitx_unit_options_apply:n {#1}
    #1
    \int_step_inline:nn \l__siunitx_unit_position_int
      { \__siunitx_unit_parse_finalise:n {##1} }
    \__siunitx_unit_parse_finalise:
  }
\cs_new_protected:Npn \__siunitx_unit_parse_add:nnnn #1#2#3#4
  {
    \tl_set:Nx \l__siunitx_unit_tmp_tl { #1 - #2 }
    \prop_if_in:NVTF \l__siunitx_unit_parsed_prop
      \l__siunitx_unit_tmp_tl
      {
        \msg_error:nnxx { siunitx } { unit / duplicate-part }
          { \exp_not:n {#1} } { \token_to_str:N #3 }
      }
      {
        \prop_put:NVn \l__siunitx_unit_parsed_prop
          \l__siunitx_unit_tmp_tl {#4}
      }
  }
\cs_new_protected:Npn \__siunitx_unit_parse_prefix:Nn #1#2
  {
    \int_set:Nn \l__siunitx_unit_tmp_int { \l__siunitx_unit_position_int + 1 }
    \__siunitx_unit_parse_add:nnnn { prefix }
      { \int_use:N \l__siunitx_unit_tmp_int } {#1} {#2}
  }
\cs_new_protected:Npn \__siunitx_unit_parse_power:nnN #1#2#3
  {
    \tl_set:Nx \l__siunitx_unit_tmp_tl
      { unit- \int_use:N \l__siunitx_unit_position_int }
    \bool_lazy_or:nnTF
      {#3}
      {
        \prop_if_in_p:NV
          \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
      }
      {
        \__siunitx_unit_parse_add:nnnn { power }
          {
            \int_eval:n
              { \l__siunitx_unit_position_int \bool_if:NT #3 { + 1 } }
          }
          {#1} {#2}
      }
      {
        \msg_error:nnxx { siunitx }
          { unit / part-before-unit } { power } { \token_to_str:N #1 }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_parse_qualifier:nn #1#2
  {
    \tl_set:Nx \l__siunitx_unit_tmp_tl
      { unit- \int_use:N \l__siunitx_unit_position_int }
    \prop_if_in:NVTF \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
      {
        \__siunitx_unit_parse_add:nnnn { qualifier }
          { \int_use:N \l__siunitx_unit_position_int } {#1} {#2}
      }
      {
        \msg_error:nnnn { siunitx }
          { unit / part-before-unit } { qualifier } { \token_to_str:N #1 }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_parse_special:n #1
  {
    \__siunitx_unit_parse_add:nnnn { special }
      { \int_eval:n { \l__siunitx_unit_position_int + 1 } }
      {#1} {#1}
  }
\cs_new_protected:Npn \__siunitx_unit_parse_unit:Nn #1#2
  {
    \int_incr:N \l__siunitx_unit_position_int
    \tl_if_eq:nnT {#1} { \gram }
      {
        \__siunitx_unit_parse_add:nnnn { command }
          { \int_use:N \l__siunitx_unit_position_int }
          {#1} {#1}
      }
    \__siunitx_unit_parse_add:nnnn { unit }
      { \int_use:N \l__siunitx_unit_position_int }
      {#1} {#2}
    \bool_if:NT \l__siunitx_unit_per_bool
      {
        \__siunitx_unit_parse_add:nnnn { per }
          { \int_use:N \l__siunitx_unit_position_int }
          { \per } { true }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_parse_per:
  {
    \bool_if:NTF \l__siunitx_unit_sticky_per_bool
      {
        \bool_set_true:N \l__siunitx_unit_per_bool
        \cs_set_protected:Npn \per
          { \msg_error:nn { siunitx } { unit / duplicate-sticky-per } }
      }
      {
        \__siunitx_unit_parse_add:nnnn
          { per } { \int_eval:n { \l__siunitx_unit_position_int + 1 } }
          { \per } { true }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_parse_finalise:n #1
  {
    \tl_set:Nx \l__siunitx_unit_tmp_tl { per- #1 }
    \prop_if_in:NVT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
      {
        \prop_remove:NV \l__siunitx_unit_parsed_prop
          \l__siunitx_unit_tmp_tl
        \tl_set:Nx \l__siunitx_unit_tmp_tl { power- #1 }
        \prop_get:NVNTF
          \l__siunitx_unit_parsed_prop
          \l__siunitx_unit_tmp_tl
          \l__siunitx_unit_part_tl
          {
            \tl_set:Nx \l__siunitx_unit_part_tl
              { \fp_eval:n { \l__siunitx_unit_part_tl * -1 } }
            \fp_compare:nNnTF \l__siunitx_unit_part_tl = 1
              {
                \prop_remove:NV \l__siunitx_unit_parsed_prop
                  \l__siunitx_unit_tmp_tl
              }
              {
                \prop_put:NVV \l__siunitx_unit_parsed_prop
                  \l__siunitx_unit_tmp_tl \l__siunitx_unit_part_tl
              }
          }
          {
            \prop_put:NVn \l__siunitx_unit_parsed_prop
              \l__siunitx_unit_tmp_tl { -1 }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_parse_finalise:
  {
    \clist_map_inline:nn { per , power , prefix }
      {
        \tl_set:Nx \l__siunitx_unit_tmp_tl
          { ##1 - \int_eval:n { \l__siunitx_unit_position_int + 1 } }
        \prop_if_in:NVT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
          { \msg_error:nnn { siunitx } { unit / dangling-part } { ##1 } }
      }
  }
\keys_define:nn { siunitx }
  {
    bracket-unit-denominator .bool_set:N =
      \l__siunitx_unit_denominator_bracket_bool ,
    forbid-literal-units .bool_set:N =
      \l__siunitx_unit_forbid_literal_bool ,
    fraction-command .tl_set:N =
      \l_siunitx_unit_fraction_tl ,
    parse-units .bool_set:N =
      \l__siunitx_unit_parse_bool ,
    per-mode .choice: ,
    per-mode / fraction .code:n =
      {
        \bool_set_false:N \l__siunitx_unit_autofrac_bool
        \bool_set_false:N \l__siunitx_unit_per_symbol_bool
        \bool_set_true:N  \l__siunitx_unit_powers_positive_bool
        \bool_set_true:N  \l__siunitx_unit_two_part_bool
      } ,
    per-mode / power .code:n =
      {
        \bool_set_false:N \l__siunitx_unit_autofrac_bool
        \bool_set_false:N \l__siunitx_unit_per_symbol_bool
        \bool_set_false:N \l__siunitx_unit_powers_positive_bool
        \bool_set_false:N \l__siunitx_unit_two_part_bool
      } ,
    per-mode / power-positive-first .code:n =
      {
        \bool_set_false:N \l__siunitx_unit_autofrac_bool
        \bool_set_false:N \l__siunitx_unit_per_symbol_bool
        \bool_set_false:N \l__siunitx_unit_powers_positive_bool
        \bool_set_true:N  \l__siunitx_unit_two_part_bool
      } ,
    per-mode / repeated-symbol .code:n =
      {
        \bool_set_false:N \l__siunitx_unit_autofrac_bool
        \bool_set_true:N  \l__siunitx_unit_per_symbol_bool
        \bool_set_true:N  \l__siunitx_unit_powers_positive_bool
        \bool_set_false:N \l__siunitx_unit_two_part_bool
      } ,
    per-mode / symbol .code:n =
      {
        \bool_set_false:N \l__siunitx_unit_autofrac_bool
        \bool_set_true:N  \l__siunitx_unit_per_symbol_bool
        \bool_set_true:N  \l__siunitx_unit_powers_positive_bool
        \bool_set_true:N  \l__siunitx_unit_two_part_bool
      } ,
    per-mode / symbol-or-fraction .code:n =
      {
        \bool_set_true:N \l__siunitx_unit_autofrac_bool
        \bool_set_true:N \l__siunitx_unit_per_symbol_bool
        \bool_set_true:N \l__siunitx_unit_powers_positive_bool
        \bool_set_true:N \l__siunitx_unit_two_part_bool
      } ,
    per-symbol .tl_set:N =
      \l__siunitx_unit_per_symbol_tl ,
    qualifier-mode .choices:nn =
      { bracket , combine , phrase , subscript }
      { \tl_set_eq:NN \l__siunitx_unit_qualifier_mode_tl \l_keys_choice_tl } ,
    qualifier-phrase .tl_set:N =
      \l__siunitx_unit_qualifier_phrase_tl
  }
\bool_new:N \l__siunitx_unit_bracket_bool
\tl_new:N \l__siunitx_unit_bracket_open_tl
\tl_new:N \l__siunitx_unit_bracket_close_tl
\tl_set:Nn \l__siunitx_unit_bracket_open_tl { ( }
\tl_set:Nn \l__siunitx_unit_bracket_close_tl { ) }
\bool_new:N \l__siunitx_unit_font_bool
\bool_new:N \l__siunitx_unit_autofrac_bool
\bool_new:N \l__siunitx_unit_per_symbol_bool
\bool_new:N \l__siunitx_unit_powers_positive_bool
\bool_new:N \l__siunitx_unit_two_part_bool
\bool_new:N \l__siunitx_unit_numerator_bool
\tl_new:N \l__siunitx_unit_qualifier_mode_tl
\fp_new:N \l__siunitx_unit_combine_exp_fp
\bool_new:N \l__siunitx_unit_prefix_exp_bool
\fp_new:N \l__siunitx_unit_prefix_fp
\fp_new:N \l__siunitx_unit_multiple_fp
\tl_new:N \l__siunitx_unit_current_tl
\tl_new:N \l__siunitx_unit_part_tl
\tl_new:N \l__siunitx_unit_denominator_tl
\int_new:N \l__siunitx_unit_total_int
\cs_new_protected:Npn \__siunitx_unit_format_parsed:
  {
    \int_set_eq:NN \l__siunitx_unit_total_int \l__siunitx_unit_position_int
    \tl_clear:N \l__siunitx_unit_denominator_tl
    \tl_clear:N \l__siunitx_unit_formatted_tl
    \fp_zero:N \l__siunitx_unit_prefix_fp
    \int_zero:N \l__siunitx_unit_position_int
    \fp_compare:nNnF \l__siunitx_unit_combine_exp_fp = \c_zero_fp
      { \__siunitx_unit_format_combine_exp: }
    \fp_compare:nNnF \l__siunitx_unit_multiple_fp = \c_one_fp
      { \__siunitx_unit_format_multiply: }
    \bool_lazy_and:nnT
      { \l__siunitx_unit_prefix_exp_bool }
      { \l__siunitx_unit_mass_kilogram_bool }
      { \__siunitx_unit_format_mass_to_kilogram: }
    \int_do_while:nNnn
      \l__siunitx_unit_position_int < \l__siunitx_unit_total_int
      {
        \bool_set_false:N \l__siunitx_unit_bracket_bool
        \tl_clear:N \l__siunitx_unit_current_tl
        \bool_set_false:N \l__siunitx_unit_font_bool
        \bool_set_true:N \l__siunitx_unit_numerator_bool
        \int_incr:N \l__siunitx_unit_position_int
        \clist_map_inline:nn { prefix , unit , qualifier , power , special }
          { \__siunitx_unit_format_parsed_aux:n {##1} }
        \__siunitx_unit_format_output:
      }
    \__siunitx_unit_format_finalise:
  }
\cs_new_protected:Npn \__siunitx_unit_format_parsed_aux:n #1
  {
    \tl_set:Nx \l__siunitx_unit_tmp_tl
      { #1 - \int_use:N \l__siunitx_unit_position_int }
    \prop_get:NVNT \l__siunitx_unit_parsed_prop
      \l__siunitx_unit_tmp_tl \l__siunitx_unit_part_tl
      { \use:c { __siunitx_unit_format_ #1 : } }
  }
\cs_new_protected:Npn \__siunitx_unit_format_combine_exp:
  {
    \prop_get:NnNF \l__siunitx_unit_parsed_prop { power-1 } \l__siunitx_unit_tmp_tl
      { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } }
    \fp_set:Nn \l__siunitx_unit_tmp_fp
      { \l__siunitx_unit_combine_exp_fp / \l__siunitx_unit_tmp_tl }
    \prop_get:NnNTF \l__siunitx_unit_parsed_prop { prefix-1 } \l__siunitx_unit_tmp_tl
      {
        \prop_get:NVNF \l__siunitx_unit_prefixes_forward_prop
          \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl
          {
            \prop_get:NnN \l__siunitx_unit_parsed_prop { prefix-1 } \l__siunitx_unit_tmp_tl
            \msg_error:nnx { siunitx } { unit / non-numeric-exponent }
              { \l__siunitx_unit_tmp_tl }
            \tl_set:Nn \l__siunitx_unit_tmp_tl { 0 }
          }
      }
      { \tl_set:Nn \l__siunitx_unit_tmp_tl { 0 } }
    \tl_set:Nx \l__siunitx_unit_tmp_tl
      { \fp_eval:n { \l__siunitx_unit_tmp_fp + \l__siunitx_unit_tmp_tl } }
    \fp_compare:nNnTF \l__siunitx_unit_tmp_tl = \c_zero_fp
      { \prop_remove:Nn \l__siunitx_unit_parsed_prop { prefix-1 } }
      {
        \prop_get:NVNTF \l__siunitx_unit_prefixes_reverse_prop
          \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl
          { \prop_put:NnV \l__siunitx_unit_parsed_prop { prefix-1 } \l__siunitx_unit_tmp_tl }
          {
            \msg_error:nnx { siunitx } { unit / non-convertible-exponent }
              { \l__siunitx_unit_tmp_tl }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_multiply:
  {
    \int_step_inline:nn { \prop_count:N \l__siunitx_unit_parsed_prop  }
      {
        \prop_get:NnNF \l__siunitx_unit_parsed_prop { power- ##1 } \l__siunitx_unit_tmp_tl
          { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } }
        \fp_set:Nn \l__siunitx_unit_tmp_fp
          { \l__siunitx_unit_tmp_tl * \l__siunitx_unit_multiple_fp }
        \fp_compare:nNnTF \l__siunitx_unit_tmp_fp = \c_one_fp
          { \prop_remove:N \l__siunitx_unit_parsed_prop { power- ##1 } }
          {
            \prop_put:Nnx \l__siunitx_unit_parsed_prop { power- ##1 }
              { \fp_use:N \l__siunitx_unit_tmp_fp }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_mass_to_kilogram:
  {
    \int_step_inline:nn \l__siunitx_unit_total_int
      {
        \prop_if_in:NnT \l__siunitx_unit_parsed_prop { command- ##1 }
          {
            \prop_if_in:NnF \l__siunitx_unit_parsed_prop { prefix- ##1 }
              {
                \group_begin:
                  \bool_set_false:N \l__siunitx_unit_parsing_bool
                  \tl_set:Nx \l__siunitx_unit_tmp_tl { \kilo }
                \exp_args:NNNV \group_end:
                \tl_set:Nn \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl
                \prop_put:NnV \l__siunitx_unit_parsed_prop { prefix- ##1 }
                  \l__siunitx_unit_tmp_tl
                \prop_get:NnNF \l__siunitx_unit_parsed_prop { power- ##1 }
                  \l__siunitx_unit_tmp_tl
                  { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } }
                \fp_set:Nn \l__siunitx_unit_prefix_fp
                  { \l__siunitx_unit_prefix_fp - 3 * \l__siunitx_unit_tmp_tl }
              }
          }
      }
  }
\cs_new:Npn \__siunitx_unit_format_bracket:N #1
  {
    \bool_if:NTF \l__siunitx_unit_bracket_bool
      {
        \exp_not:V \l__siunitx_unit_bracket_open_tl
        \exp_not:V #1
        \exp_not:V \l__siunitx_unit_bracket_close_tl
      }
      { \exp_not:V #1 }
  }
\cs_new_protected:Npn \__siunitx_unit_format_power:
  {
    \__siunitx_unit_format_font:
    \exp_after:wN \__siunitx_unit_format_power_aux:wTF
      \l__siunitx_unit_part_tl - \q_stop
      { \__siunitx_unit_format_power_negative: }
      { \__siunitx_unit_format_power_positive: }
  }
\cs_new:Npn \__siunitx_unit_format_power_aux:wTF #1 - #2 \q_stop
  { \tl_if_empty:nTF {#1} }
\cs_new_protected:Npn \__siunitx_unit_format_power_positive:
  { \__siunitx_unit_format_power_superscript: }
\cs_new_protected:Npn \__siunitx_unit_format_power_negative:
  {
    \bool_set_false:N \l__siunitx_unit_numerator_bool
    \bool_if:NTF \l__siunitx_unit_powers_positive_bool
      {
        \tl_set:Nx \l__siunitx_unit_part_tl
          {
            \exp_after:wN \__siunitx_unit_format_power_negative_aux:w
              \l__siunitx_unit_part_tl \q_stop
          }
        \str_if_eq:VnF \l__siunitx_unit_part_tl { 1 }
          { \__siunitx_unit_format_power_superscript: }
      }
      { \__siunitx_unit_format_power_superscript: }
  }
\cs_new:Npn \__siunitx_unit_format_power_negative_aux:w - #1 \q_stop
  { \exp_not:n {#1} }
\cs_new_protected:Npn \__siunitx_unit_format_power_superscript:
  {
    \exp_after:wN \__siunitx_unit_format_power_superscipt:w
      \l__siunitx_unit_part_tl . . \q_stop
  }
\cs_new_protected:Npn \__siunitx_unit_format_power_superscipt:w #1 . #2 . #3 \q_stop
  {
    \tl_if_blank:nTF {#2}
      {
        \tl_set:Nx \l__siunitx_unit_current_tl
          {
            \__siunitx_unit_format_bracket:N \l__siunitx_unit_current_tl
            ^ { \exp_not:n {#1} }
          }
      }
      {
        \tl_set:Nx \l__siunitx_unit_tmp_tl
          {
            { }
            \tl_if_head_eq_charcode:nNTF {#1} -
              { { - } { \exp_not:o { \use_none:n #1 } } }
              { { } { \exp_not:n {#1} } }
            {#2}
            { }
            { }
            { 0 }
          }
        \tl_set:Nx \l__siunitx_unit_current_tl
          {
            \__siunitx_unit_format_bracket:N \l__siunitx_unit_current_tl
            ^ { \siunitx_number_output:N \l__siunitx_unit_tmp_tl }
          }
      }
    \bool_set_false:N \l__siunitx_unit_bracket_bool
  }
\cs_new_protected:Npn \__siunitx_unit_format_prefix:
  {
    \bool_if:NTF \l__siunitx_unit_prefix_exp_bool
      { \__siunitx_unit_format_prefix_exp: }
      { \__siunitx_unit_format_prefix_symbol: }
  }
\cs_new_protected:Npn \__siunitx_unit_format_prefix_exp:
  {
    \prop_get:NVNTF \l__siunitx_unit_prefixes_forward_prop
      \l__siunitx_unit_part_tl \l__siunitx_unit_part_tl
      {
        \bool_if:NT \l__siunitx_unit_mass_kilogram_bool
          {
            \tl_set:Nx \l__siunitx_unit_tmp_tl
              { command- \int_use:N \l__siunitx_unit_position_int }
            \prop_if_in:NVT \l__siunitx_unit_parsed_prop \l__siunitx_unit_tmp_tl
              { \__siunitx_unit_format_prefix_gram: }
          }
        \tl_set:Nx \l__siunitx_unit_tmp_tl
          { power- \int_use:N \l__siunitx_unit_position_int }
        \prop_get:NVNF \l__siunitx_unit_parsed_prop
          \l__siunitx_unit_tmp_tl \l__siunitx_unit_tmp_tl
          { \tl_set:Nn \l__siunitx_unit_tmp_tl { 1 } }
        \fp_add:Nn \l__siunitx_unit_prefix_fp
          { \l__siunitx_unit_tmp_tl * \l__siunitx_unit_part_tl }
      }
      { \__siunitx_unit_format_prefix_symbol: }
  }
\cs_new_protected:Npn \__siunitx_unit_format_prefix_gram:
  {
    \tl_set:Nx \l__siunitx_unit_part_tl
      { \int_eval:n { \l__siunitx_unit_part_tl - 3 } }
    \group_begin:
      \bool_set_false:N \l__siunitx_unit_parsing_bool
      \tl_set:Nx \l__siunitx_unit_current_tl { \kilo }
    \exp_args:NNNV \group_end:
    \tl_set:Nn \l__siunitx_unit_current_tl \l__siunitx_unit_current_tl
  }
\cs_new_protected:Npn \__siunitx_unit_format_prefix_symbol:
  { \tl_set_eq:NN \l__siunitx_unit_current_tl \l__siunitx_unit_part_tl }
\cs_new_protected:Npn \__siunitx_unit_format_qualifier:
  {
    \use:c
      {
        __siunitx_unit_format_qualifier_
        \l__siunitx_unit_qualifier_mode_tl :
      }
    \tl_put_right:NV \l__siunitx_unit_current_tl \l__siunitx_unit_part_tl
  }
\cs_new_protected:Npn \__siunitx_unit_format_qualifier_bracket:
  {
    \__siunitx_unit_format_font:
    \tl_set:Nx \l__siunitx_unit_part_tl
      {
        \exp_not:V \l__siunitx_unit_bracket_open_tl
        \exp_not:V \l_siunitx_unit_font_tl
          { \exp_not:V \l__siunitx_unit_part_tl }
        \exp_not:V \l__siunitx_unit_bracket_close_tl
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_qualifier_combine: { }
\cs_new_protected:Npn \__siunitx_unit_format_qualifier_phrase:
  {
    \__siunitx_unit_format_font:
    \tl_set:Nx \l__siunitx_unit_part_tl
      {
        \exp_not:V \l__siunitx_unit_qualifier_phrase_tl
        \exp_not:V \l_siunitx_unit_font_tl
          { \exp_not:V \l__siunitx_unit_part_tl }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_qualifier_subscript:
  {
    \__siunitx_unit_format_font:
    \tl_set:Nx \l__siunitx_unit_part_tl
      {
        \c__siunitx_unit_math_subscript_tl
          {
            \exp_not:V \l_siunitx_unit_font_tl
              { \exp_not:V \l__siunitx_unit_part_tl }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_special:
  {
    \tl_set:Nx \l__siunitx_unit_current_tl
      {
        \exp_not:V \l__siunitx_unit_part_tl
         {
           \bool_if:NTF \l__siunitx_unit_font_bool
             { \use:n }
             { \exp_not:V \l_siunitx_unit_font_tl }
              { \exp_not:V \l__siunitx_unit_current_tl }
         }
      }
    \bool_set_true:N \l__siunitx_unit_font_bool
  }
\cs_new_protected:Npn \__siunitx_unit_format_unit:
  {
    \tl_put_right:NV
      \l__siunitx_unit_current_tl \l__siunitx_unit_part_tl
  }
\cs_new_protected:Npn \__siunitx_unit_format_output:
  {
    \__siunitx_unit_format_font:
    \bool_set_false:N \l__siunitx_unit_bracket_bool
    \use:c
      {
        __siunitx_unit_format_output_
        \bool_if:NTF \l__siunitx_unit_numerator_bool
          { aux: }
          { denominator: }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_output_aux:
  {
    \__siunitx_unit_format_output_aux:nV { formatted }
      \l__siunitx_unit_product_tl
  }
\cs_new_protected:Npn \__siunitx_unit_format_output_denominator:
  {
    \bool_if:NTF \l__siunitx_unit_two_part_bool
      {
        \bool_lazy_and:nnT
          { \l__siunitx_unit_denominator_bracket_bool }
          { ! \tl_if_empty_p:N \l__siunitx_unit_denominator_tl }
          { \bool_set_true:N \l__siunitx_unit_bracket_bool }
        \__siunitx_unit_format_output_aux:nV { denominator }
          \l__siunitx_unit_product_tl
      }
      {
        \bool_lazy_and:nnT
          { \l__siunitx_unit_per_symbol_bool }
          { \tl_if_empty_p:N \l__siunitx_unit_formatted_tl }
          { \tl_set:Nn \l__siunitx_unit_formatted_tl { 1 } }
        \__siunitx_unit_format_output_aux:nv { formatted }
          {
            l__siunitx_unit_
            \bool_if:NTF \l__siunitx_unit_per_symbol_bool
              { per_symbol }
              { product }
            _tl
          }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_output_aux:nn #1#2
  {
    \tl_set:cx { l__siunitx_unit_ #1 _tl }
      {
         \exp_not:v { l__siunitx_unit_ #1 _tl }
         \tl_if_empty:cF { l__siunitx_unit_ #1 _tl }
           { \exp_not:n {#2} }
         \exp_not:V \l__siunitx_unit_current_tl
      }
  }
\cs_generate_variant:Nn \__siunitx_unit_format_output_aux:nn { nV , nv }
\cs_new_protected:Npn \__siunitx_unit_format_font:
  {
    \bool_if:NF \l__siunitx_unit_font_bool
      {
        \tl_set:Nx \l__siunitx_unit_current_tl
          {
            \exp_not:V \l_siunitx_unit_font_tl
              { \exp_not:V \l__siunitx_unit_current_tl }
          }
        \bool_set_true:N \l__siunitx_unit_font_bool
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_finalise:
  {
    \tl_if_empty:NF \l__siunitx_unit_denominator_tl
      {
        \bool_if:NTF \l__siunitx_unit_powers_positive_bool
          { \__siunitx_unit_format_finalise_fractional: }
          { \__siunitx_unit_format_finalise_power: }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_finalise_fractional:
  {
    \tl_if_empty:NT \l__siunitx_unit_formatted_tl
      { \tl_set:Nn \l__siunitx_unit_formatted_tl { 1 } }
    \bool_if:NTF \l__siunitx_unit_autofrac_bool
      { \__siunitx_unit_format_finalise_autofrac: }
      {
        \bool_if:NTF \l__siunitx_unit_per_symbol_bool
          { \__siunitx_unit_format_finalise_symbol: }
          { \__siunitx_unit_format_finalise_fraction: }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_finalise_autofrac:
  {
    \group_begin:
      \__siunitx_unit_format_finalise_fraction:
    \exp_args:NNNV \group_end:
    \tl_set:Nn \l__siunitx_unit_tmp_tl \l__siunitx_unit_formatted_tl
    \__siunitx_unit_format_finalise_symbol:
    \tl_set:Nx \l__siunitx_unit_formatted_tl
      {
        \mathchoice
          { \exp_not:V \l__siunitx_unit_tmp_tl }
          { \exp_not:V \l__siunitx_unit_formatted_tl }
          { \exp_not:V \l__siunitx_unit_formatted_tl }
          { \exp_not:V \l__siunitx_unit_formatted_tl }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_finalise_fraction:
  {
    \tl_set:Nx \l__siunitx_unit_formatted_tl
      {
        \exp_not:V \l_siunitx_unit_fraction_tl
          { \exp_not:V \l__siunitx_unit_formatted_tl }
          { \exp_not:V \l__siunitx_unit_denominator_tl }
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_finalise_symbol:
  {
    \tl_set:Nx \l__siunitx_unit_formatted_tl
      {
        \exp_not:V \l__siunitx_unit_formatted_tl
        \exp_not:V \l__siunitx_unit_per_symbol_tl
        \__siunitx_unit_format_bracket:N \l__siunitx_unit_denominator_tl
      }
  }
\cs_new_protected:Npn \__siunitx_unit_format_finalise_power:
  {
    \tl_if_empty:NTF \l__siunitx_unit_formatted_tl
      {
        \tl_set_eq:NN
          \l__siunitx_unit_formatted_tl
          \l__siunitx_unit_denominator_tl
      }
      {
        \tl_set:Nx \l__siunitx_unit_formatted_tl
          {
            \exp_not:V \l__siunitx_unit_formatted_tl
            \exp_not:V \l__siunitx_unit_product_tl
            \exp_not:V \l__siunitx_unit_denominator_tl
          }
      }
  }
\bool_lazy_or:nnTF
  { \sys_if_engine_luatex_p: }
  { \sys_if_engine_xetex_p: }
  {
    \cs_new:Npn \__siunitx_unit_non_latin:n #1
      { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
  }
  {
    \cs_new:Npn \__siunitx_unit_non_latin:n #1
      {
        \exp_last_unbraced:Nf \__siunitx_unit_non_latin:nnnn
          { \char_to_utfviii_bytes:n {#1} }
      }
    \cs_new:Npn \__siunitx_unit_non_latin:nnnn #1#2#3#4
      {
        \exp_after:wN \exp_after:wN \exp_after:wN
          \exp_not:N \char_generate:nn {#1} { 13 }
        \char_generate:nn {#2} { 12 }
        \tl_if_blank:nF {#3}
          { \char_generate:nn {#3} { 12 } }
      }
  }
\siunitx_declare_unit:Nn \kilogram { \kilo \gram }
\siunitx_declare_unit:Nn \metre    { m }
\siunitx_declare_unit:Nn \meter    { \metre }
\siunitx_declare_unit:Nn \mole     { mol }
\siunitx_declare_unit:Nn \second   { s }
\siunitx_declare_unit:Nn \ampere   { A }
\siunitx_declare_unit:Nn \kelvin   { K }
\siunitx_declare_unit:Nn \candela  { cd }
\siunitx_declare_unit:Nn \gram { g }
\siunitx_declare_prefix:Nnn \yocto { -24 } { y }
\siunitx_declare_prefix:Nnn \zepto { -21 } { z }
\siunitx_declare_prefix:Nnn \atto  { -18 } { a }
\siunitx_declare_prefix:Nnn \femto { -15 } { f }
\siunitx_declare_prefix:Nnn \pico  { -12 } { p }
\siunitx_declare_prefix:Nnn \nano  {  -9 } { n }
\siunitx_declare_prefix:Nnx \micro { -6 } { \__siunitx_unit_non_latin:n { "03BC } }
\siunitx_declare_prefix:Nnn \milli { -3 } { m }
\siunitx_declare_prefix:Nnn \centi { -2 } { c }
\siunitx_declare_prefix:Nnn \deci  { -1 } { d }
\siunitx_declare_prefix:Nnn \deca  { 1 }  { da }
\siunitx_declare_prefix:Nnn \deka  { 1 }  { da }
\siunitx_declare_prefix:Nnn \hecto { 2 }  { h }
\siunitx_declare_prefix:Nnn \kilo  { 3 }  { k }
\siunitx_declare_prefix:Nnn \mega  { 6 }  { M }
\siunitx_declare_prefix:Nnn \giga  { 9 }  { G }
\siunitx_declare_prefix:Nnn \tera  { 12 } { T }
\siunitx_declare_prefix:Nnn \peta  { 15 } { P }
\siunitx_declare_prefix:Nnn \exa   { 18 } { E }
\siunitx_declare_prefix:Nnn \zetta { 21 } { Z }
\siunitx_declare_prefix:Nnn \yotta { 24 } { Y }
\siunitx_declare_unit:Nn \becquerel { Bq }
\siunitx_declare_unit:Nx \degreeCelsius { \__siunitx_unit_non_latin:n { "00B0 } C }
\siunitx_declare_unit:Nn \coulomb   { C }
\siunitx_declare_unit:Nn \farad     { F }
\siunitx_declare_unit:Nn \gray      { Gy }
\siunitx_declare_unit:Nn \hertz     { Hz }
\siunitx_declare_unit:Nn \henry     { H }
\siunitx_declare_unit:Nn \joule     { J }
\siunitx_declare_unit:Nn \katal     { kat }
\siunitx_declare_unit:Nn \lumen     { lm }
\siunitx_declare_unit:Nn \lux       { lx }
\siunitx_declare_unit:Nn \newton    { N }
\siunitx_declare_unit:Nx \ohm       { \__siunitx_unit_non_latin:n { "2126 } }
\siunitx_declare_unit:Nn \pascal    { Pa }
\siunitx_declare_unit:Nn \radian    { rad }
\siunitx_declare_unit:Nn \siemens   { S }
\siunitx_declare_unit:Nn \sievert   { Sv }
\siunitx_declare_unit:Nn \steradian { sr }
\siunitx_declare_unit:Nn \tesla     { T }
\siunitx_declare_unit:Nn \volt      { V }
\siunitx_declare_unit:Nn \watt      { W }
\siunitx_declare_unit:Nn \weber     { Wb }
\siunitx_declare_unit:Nn \astronomicalunit { au }
\siunitx_declare_unit:Nn \bel              { B }
\siunitx_declare_unit:Nn \decibel          { \deci \bel }
\siunitx_declare_unit:Nn \dalton           { Da }
\siunitx_declare_unit:Nn \day              { d }
\siunitx_declare_unit:Nn \electronvolt     { eV }
\siunitx_declare_unit:Nn \hectare          { ha }
\siunitx_declare_unit:Nn \hour             { h }
\siunitx_declare_unit:Nn \litre            { L }
\siunitx_declare_unit:Nn \liter            { \litre }
\siunitx_declare_unit:Nn \minute           { min }
\siunitx_declare_unit:Nn \neper            { Np }
\siunitx_declare_unit:Nn \tonne            { t }
\siunitx_declare_unit:Nx \arcminute { \__siunitx_unit_non_latin:n { "02B9 } }
\siunitx_declare_unit:Nx \arcsecond { \__siunitx_unit_non_latin:n { "02BA } }
\siunitx_declare_unit:Nx \degree { \__siunitx_unit_non_latin:n { "00B0 } }
\siunitx_declare_unit:Nx \percent { \cs_to_str:N \% }
\siunitx_declare_power:NNn \square \squared { 2 }
\siunitx_declare_power:NNn \cubic  \cubed   { 3 }
\msg_new:nnnn { siunitx } { unit / dangling-part }
  { Found~#1~part~with~no~unit. }
  {
    Each~#1~part~must~be~associated~with~a~unit:~a~#1~part~was~found~
    but~no~following~unit~was~given.
  }
\msg_new:nnnn { siunitx } { unit / duplicate-part }
  { Duplicate~#1~part:~#2. }
  {
    Each~unit~may~have~only~one~#1:\\
    the~additional~#1~part~'#2'~will~be~ignored.
  }
\msg_new:nnnn { siunitx } { unit / 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 } { unit / literal }
  { Literal~units~disabled. }
  {
    You~gave~the~literal~input~'#1'~
    but~literal~unit~output~is~disabled.
  }
\msg_new:nnnn { siunitx } { unit / non-convertible-exponent }
  { Exponent~'#1'~cannot~be~converted~into~a~symbolic~prefix. }
  {
    The~exponent~'#1'~does~not~match~with~any~of~the~symbolic~prefixes~
    set~up.
  }
\msg_new:nnnn { siunitx } { unit / non-numeric-exponent }
  { Prefix~'#1'~does~not~have~a~numerical~value. }
  {
    The~prefix~'#1'~needs~to~be~combined~with~a~number,~but~it~has~no
    numerical~value.
  }
\msg_new:nnnn { siunitx } { unit / part-before-unit }
  { Found~#1~part~before~first~unit:~#2. }
  {
    The~#1~part~'#2'~must~follow~after~a~unit:~
    it~cannot~appear~before~any~units~and~will~therefore~be~ignored.
  }
\keys_set:nn { siunitx }
  {
    bracket-unit-denominator  = true      ,
    forbid-literal-units      = false     ,
    fraction-command          = \frac     ,
    inter-unit-product        = \,        ,
    extract-mass-in-kilograms = true      ,
    parse-units               = true      ,
    per-mode                  = power     ,
    per-symbol                = /         ,
    qualifier-mode            = subscript ,
    qualifier-phrase          =           ,
    sticky-per                = false     ,
    unit-font-command         = \mathrm
  }
\AtBeginDocument
  {
    \str_if_eq:eeT
      { \exp_not:o { \familydefault } }
      { \exp_not:n { \sfdefault } }
      { \keys_set:nn { siunitx } { unit-font-command = \mathsf } }
  }
\tl_new:N \l__siunitx_quantity_tmp_fp
\tl_new:N \l__siunitx_quantity_tmp_tl
\tl_new:N \l__siunitx_quantity_bracket_close_tl
\tl_new:N \l__siunitx_quantity_bracket_open_tl
\tl_set:Nn \l__siunitx_quantity_bracket_open_tl { ( }
\tl_set:Nn \l__siunitx_quantity_bracket_close_tl { ) }
\tl_new:N \l_siunitx_quantity_prefix_mode_tl
\bool_new:N \l__siunitx_quantity_uncert_bracket_bool
\bool_new:N \l__siunitx_quantity_uncert_repeat_bool
\keys_define:nn { siunitx }
  {
    allow-quantity-breaks .bool_set:N =
      \l__siunitx_quantity_break_bool ,
    prefix-mode .choices:nn =
      { combine-exponent , extract-exponent , input }
      { \tl_set_eq:NN \l_siunitx_quantity_prefix_mode_tl \l_keys_choice_tl } ,
    quantity-product .tl_set:N =
      \l__siunitx_quantity_product_tl ,
    separate-uncertainty-units .choice: ,
    separate-uncertainty-units / bracket .code:n =
      {
        \bool_set_true:N \l__siunitx_quantity_uncert_bracket_bool
        \bool_set_false:N \l__siunitx_quantity_uncert_repeat_bool
      } ,
    separate-uncertainty-units / repeat .code:n =
      {
        \bool_set_false:N \l__siunitx_quantity_uncert_bracket_bool
        \bool_set_true:N \l__siunitx_quantity_uncert_repeat_bool
      } ,
    separate-uncertainty-units / single .code:n =
      {
        \bool_set_false:N \l__siunitx_quantity_uncert_bracket_bool
        \bool_set_false:N \l__siunitx_quantity_uncert_repeat_bool
      }
  }
\tl_new:N \l__siunitx_quantity_number_tl
\tl_new:N \l__siunitx_quantity_unit_tl
\cs_new_protected:Npn \siunitx_quantity:nn #1#2
  {
    \group_begin:
      \siunitx_unit_options_apply:n {#2}
      \tl_if_blank:nTF {#1}
        {
          \siunitx_unit_format:nN {#2} \l__siunitx_quantity_unit_tl
          \siunitx_print_unit:V \l__siunitx_quantity_unit_tl
        }
        {
          \bool_if:NTF \l_siunitx_number_parse_bool
            { \__siunitx_quantity_parsed:nn {#1} {#2} }
            {
              \tl_set:Nn \l__siunitx_quantity_number_tl { \ensuremath {#1} }
              \siunitx_unit_format:nN {#2} \l__siunitx_quantity_unit_tl
              \siunitx_quantity_print:VV
                \l__siunitx_quantity_number_tl \l__siunitx_quantity_unit_tl
            }
        }
    \group_end:
  }
\cs_new_protected:Npn \__siunitx_quantity_parsed:nn #1#2
  {
    \bool_set_false:N \l_siunitx_number_bracket_ambiguous_bool
    \siunitx_number_parse:nN {#1} \l__siunitx_quantity_number_tl
    \use:c { __siunitx_quantity_parsed_ \l_siunitx_quantity_prefix_mode_tl :n } {#2}
    \tl_set:Nx \l__siunitx_quantity_number_tl
      { \siunitx_number_output:NN \l__siunitx_quantity_number_tl \q_nil }
    \exp_after:wN \__siunitx_quantity_parsed_aux:w \l__siunitx_quantity_number_tl \q_stop
  }
\cs_new_protected:cpn { __siunitx_quantity_parsed_combine-exponent:n } #1
  {
    \siunitx_number_process:NN \l__siunitx_quantity_number_tl \l__siunitx_quantity_number_tl
    \exp_args:NV \__siunitx_quantity_extract_exp:nNN
      \l__siunitx_quantity_number_tl \l__siunitx_quantity_tmp_fp \l__siunitx_quantity_number_tl
    \siunitx_unit_format_combine_exponent:nnN {#1}
      \l__siunitx_quantity_tmp_fp \l__siunitx_quantity_unit_tl
  }
\cs_new_protected:cpn { __siunitx_quantity_parsed_extract-exponent:n } #1
  {
    \siunitx_unit_format_extract_prefixes:nNN {#1}
      \l__siunitx_quantity_unit_tl \l__siunitx_quantity_tmp_fp
    \tl_set:Nx \l__siunitx_quantity_number_tl
      {
        \siunitx_number_adjust_exponent:Nn
          \l__siunitx_quantity_number_tl \l__siunitx_quantity_tmp_fp
      }
    \siunitx_number_process:NN \l__siunitx_quantity_number_tl \l__siunitx_quantity_number_tl
  }
\cs_new_protected:Npn \__siunitx_quantity_parsed_input:n #1
  {
    \siunitx_number_process:NN \l__siunitx_quantity_number_tl \l__siunitx_quantity_number_tl
    \siunitx_unit_format:nN {#1} \l__siunitx_quantity_unit_tl
  }
\cs_new_protected:Npn \__siunitx_quantity_parsed_aux:w
  #1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5 \q_nil #6 \q_nil #7 \q_nil
  #8 \q_nil #9 \q_stop
  { \__siunitx_quantity_parsed_aux:nnnw {#1} {#2#3#4#5} {#6#7#8} #9 \q_stop }
\cs_new_protected:Npn \__siunitx_quantity_parsed_aux:nnnw
  #1#2#3 #4 \q_nil #5 \q_nil #6 \q_stop
  { \__siunitx_quantity_parsed_aux:nnnn {#1} {#2} {#3#4} {#5#6} }
\cs_new_protected:Npn \__siunitx_quantity_parsed_aux:nnnn #1#2#3#4
  {
    \tl_if_blank:nTF {#3}
      { \siunitx_quantity_print:nV {#1#2#4} \l__siunitx_quantity_unit_tl }
      {
        \bool_if:NTF \l__siunitx_quantity_uncert_bracket_bool
          {
            \siunitx_quantity_print:xV
              {
                \exp_not:n {#1}
                \exp_not:V \l__siunitx_quantity_bracket_open_tl
                \exp_not:n {#2#3}
                \exp_not:V \l__siunitx_quantity_bracket_close_tl
                \exp_not:n {#4}
              }
            \l__siunitx_quantity_unit_tl
          }
          {
            \bool_if:NTF \l__siunitx_quantity_uncert_repeat_bool
              {
                \tl_if_blank:nTF {#4}
                  { \__siunitx_quantity_parsed_aux:nnn {#1#2} {#3} { } }
                  { \__siunitx_quantity_parsed_aux:nnn {#1#2} {#3} { { } #4 } }
              }
              { \siunitx_quantity_print:nV {#1#2#3#4} \l__siunitx_quantity_unit_tl }
          }
      }
  }
\cs_new_protected:Npn \__siunitx_quantity_parsed_aux:nnn #1#2#3
  {
    \siunitx_quantity_print:nV {#1#3} \l__siunitx_quantity_unit_tl
    \tl_if_blank:nF {#2}
      { \siunitx_quantity_print:nV { { } #2#3 } \l__siunitx_quantity_unit_tl }
  }
\cs_new_protected:Npn \__siunitx_quantity_extract_exp:nNN #1#2#3
  { \__siunitx_quantity_extract_exp:nnnnnnnNN #1 #2 #3 }
\cs_new_protected:Npn \__siunitx_quantity_extract_exp:nnnnnnnNN #1#2#3#4#5#6#7#8#9
  {
    \fp_set:Nn #8 {#6#7}
    \tl_set:Nx #9
      { {#1} {#2} {#3} {#4} {#5} { } { 0 } }
  }
\cs_new_protected:Npn \siunitx_quantity_print:nn #1#2
  {
    \siunitx_print_number:n {#1}
    \tl_if_blank:nF {#2}
      {
        \bool_lazy_or:nnTF
          { \tl_if_blank_p:n {#1} }
          { ! \tl_if_head_eq_charcode_p:nN {#2} { 1 } }
          {
            \tl_use:N \l__siunitx_quantity_product_tl
            \bool_if:NTF \l__siunitx_quantity_break_bool
              { \penalty \binoppenalty }
              { \nobreak }
            \siunitx_print_unit:n {#2}
          }
          {
            \exp_args:No \siunitx_print_unit:n { \use_none:n #2 }
          }
      }
  }
\cs_generate_variant:Nn \siunitx_quantity_print:nn { nV , VV , xV }
\keys_set:nn { siunitx }
  {
    allow-quantity-breaks      = false  ,
    prefix-mode                = input ,
    quantity-product           = \,     ,
    separate-uncertainty-units = bracket
  }
\bool_lazy_or:nnTF
  { \sys_if_engine_luatex_p: }
  { \sys_if_engine_xetex_p: }
  {
    \cs_new:Npn \__siunitx_quantity_non_latin:n #1
      { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
  }
  {
    \cs_new:Npn \__siunitx_quantity_non_latin:n #1
      {
        \exp_last_unbraced:Nf \__siunitx_quantity_non_latin:nnnn
          { \char_to_utfviii_bytes:n {#1} }
      }
    \cs_new:Npn \__siunitx_quantity_non_latin:nnnn #1#2#3#4
      {
        \exp_after:wN \exp_after:wN \exp_after:wN
          \exp_not:N \char_generate:nn {#1} { 13 }
        \exp_after:wN \exp_after:wN \exp_after:wN
          \exp_not:N \char_generate:nn {#2} { 13 }
      }
  }
\siunitx_declare_unit:Nxn \degree
  { \__siunitx_quantity_non_latin:n { "00B0 } }
  { quantity-product = { } }
\tl_new:N \l__siunitx_symbol_tmpa_tl
\tl_new:N \l__siunitx_symbol_tmpb_tl
\AtBeginDocument
  {
    \cs_if_free:cT { T@TS1 }
      { \RequirePackage { textcomp } }
  }
\bool_lazy_or:nnTF
  { \sys_if_engine_luatex_p: }
  { \sys_if_engine_xetex_p: }
  {
    \cs_new:Npn \__siunitx_symbol_non_latin:n #1
      { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
  }
  {
    \cs_new:Npn \__siunitx_symbol_non_latin:n #1
      {
        \exp_last_unbraced:Nf \__siunitx_symbol_non_latin:nnnn
          { \char_to_utfviii_bytes:n {#1} }
      }
    \cs_new:Npn \__siunitx_symbol_non_latin:nnnn #1#2#3#4
      {
        \__siunitx_symbol_deal_with_utf:
        \exp_after:wN \exp_after:wN \exp_after:wN
          \exp_not:N \char_generate:nn {#1} { 13 }
        \char_generate:nn {#2} { 12 }
        \tl_if_blank:nF {#3}
          { \char_generate:nn {#3} { 12 } }
      }
  }
\cs_new:Npn \__siunitx_symbol_deal_with_utf: { }
\prg_new_protected_conditional:Npnn \__siunitx_symbol_if_replace:Nn #1#2 { T , TF }
  {
    \group_begin:
      \protected@edef \l__siunitx_symbol_tmpa_tl
        { \exp_not:V \l_siunitx_unit_font_tl { \__siunitx_symbol_non_latin:n {#2} } }
      \int_step_inline:nnn { "80 } { "FF }
        { \char_set_active_eq:nN {##1} \scan_stop: }
      \keys_set:nn { siunitx } { parse-units = false }
      \siunitx_unit_format:nN {#1} \l__siunitx_symbol_tmpb_tl
      \str_if_eq:VVTF \l__siunitx_symbol_tmpa_tl \l__siunitx_symbol_tmpb_tl
        {
          \group_end:
          \prg_return_true:
        }
        {
          \group_end:
          \prg_return_false:
        }
  }
\AtBeginDocument
  {
    \__siunitx_symbol_if_replace:NnT \arcminute { "02B9 }
      {
        \siunitx_declare_unit:Nn \arcminute
          { \ensuremath { { } ' } }
      }
    \__siunitx_symbol_if_replace:NnT \arcsecond { "02BA }
      {
        \siunitx_declare_unit:Nn \arcsecond
          { \ensuremath { { } '' } }
      }
    \__siunitx_symbol_if_replace:NnT \degree { "00B0 }
      {
        \siunitx_declare_unit:Nxn \degree
          {
            \exp_not:N \ifmmode
              \@ifpackageloaded { unicode-math }
                { \__siunitx_symbol_non_latin:n { "00B0 } }
                { { } ^ { \exp_not:N \circ } }
            \exp_not:N \else
              \exp_not:N \text
                {
                  \@ifpackageloaded { inputenc }
                    { \exp_not:N \textdegree }
                    { \__siunitx_symbol_non_latin:n { "00B0 } }
                }
            \exp_not:N \fi
          }
          { quantity-product = { } }
      }
    \group_begin:
      \tl_set:Nx \l__siunitx_symbol_tmpa_tl { \__siunitx_symbol_non_latin:n { "00B0 } C }
      \protected@edef \l__siunitx_symbol_tmpa_tl
        { \exp_not:V \l_siunitx_unit_font_tl { \l__siunitx_symbol_tmpa_tl } }
      \keys_set:nn { siunitx } { parse-units = false }
      \siunitx_unit_format:nN { \degreeCelsius } \l__siunitx_symbol_tmpb_tl
      \str_if_eq:VVTF \l__siunitx_symbol_tmpa_tl \l__siunitx_symbol_tmpb_tl
        {
          \group_end:
          \siunitx_declare_unit:Nx \degreeCelsius
            {
              \exp_not:N \ifmmode
                \@ifpackageloaded { unicode-math }
                  { \__siunitx_symbol_non_latin:n { "00B0 } }
                  { { } ^ { \exp_not:N \circ } }
              \exp_not:N \else
                \exp_not:N \text
                  {
                    \@ifpackageloaded { inputenc }
                      { \exp_not:N \textdegree }
                      { \__siunitx_symbol_non_latin:n { "00B0 } }
                  }
              \exp_not:N \fi
                  C
            }
        }
        { \group_end: }
    \__siunitx_symbol_if_replace:NnT \ohm { "2126 }
      {
        \tl_set:Nx \l__siunitx_symbol_tmpa_tl
          {
            \cs_if_exist:NTF \upOmega
              { \exp_not:N \upOmega }
              { \exp_not:N \Omega }
          }
        \tl_set:Nx \l__siunitx_symbol_tmpb_tl
          {
            \exp_not:N \text
              { \exp_not:N \ensuremath { \exp_not:V \l__siunitx_symbol_tmpa_tl } }
          }
        \siunitx_declare_unit:Nx \ohm
          {
            \@ifpackageloaded { fourier }
              {
                \exp_not:N \ensuremath
                  { \exp_not:V \l__siunitx_symbol_tmpa_tl }
              }
              {
                \exp_not:N \ifmmode
                  \@ifpackageloaded { fontspec }
                    { \exp_not:V \l__siunitx_symbol_tmpb_tl }
                    {
                      \@ifclassloaded { beamer }
                        { \exp_not:V \l__siunitx_symbol_tmpb_tl }
                        { \exp_not:V \l__siunitx_symbol_tmpa_tl }
                    }
                \exp_not:N \else
                  \exp_not:N \text
                    {
                      \bool_lazy_or:nnTF
                        { \sys_if_engine_luatex_p: }
                        { \sys_if_engine_xetex_p: }
                        { \__siunitx_symbol_non_latin:n { "2126 } }
                        { \exp_not:N \textohm }
                    }
                \exp_not:N \fi
              }
          }
      }
    \__siunitx_symbol_if_replace:NnT \micro { "03BC }
      {
        \siunitx_declare_prefix:Nnx \micro { -6 }
          {
            \exp_not:N \text
              {
                \bool_lazy_or:nnTF
                  { \sys_if_engine_luatex_p: }
                  { \sys_if_engine_xetex_p: }
                  { \__siunitx_symbol_non_latin:n { "00B5 } }
                  { \exp_not:N \textmu }
              }
          }
      }
  }
\AtBeginDocument
  {
    \@ifpackageloaded { hyperref }
      {
        \exp_args:Nx \pdfstringdefDisableCommands
          {
            \cs_set_eq:NN \siunitx_print_text:n \exp_not:N \use:n
            \siunitx_declare_unit:Nn \exp_not:N \ohm
              { \__siunitx_symbol_non_latin:n { "03A9 } }
          }
      }
      { }
  }
\siunitx_declare_unit:Nn \A  {        \ampere }
\siunitx_declare_unit:Nn \pA { \pico  \ampere }
\siunitx_declare_unit:Nn \nA { \nano  \ampere }
\siunitx_declare_unit:Nn \uA { \micro \ampere }
\siunitx_declare_unit:Nn \mA { \milli \ampere }
\siunitx_declare_unit:Nn \kA { \kilo  \ampere }
\siunitx_declare_unit:Nn \Hz  {        \hertz }
\siunitx_declare_unit:Nn \mHz { \milli \hertz }
\siunitx_declare_unit:Nn \kHz { \kilo  \hertz }
\siunitx_declare_unit:Nn \MHz { \mega  \hertz }
\siunitx_declare_unit:Nn \GHz { \giga  \hertz }
\siunitx_declare_unit:Nn \THz { \tera  \hertz }
\siunitx_declare_unit:Nn \mol  {        \mole }
\siunitx_declare_unit:Nn \fmol { \femto \mole }
\siunitx_declare_unit:Nn \pmol { \pico  \mole }
\siunitx_declare_unit:Nn \nmol { \nano  \mole }
\siunitx_declare_unit:Nn \umol { \micro \mole }
\siunitx_declare_unit:Nn \mmol { \milli \mole }
\siunitx_declare_unit:Nn \kmol { \kilo  \mole }
\siunitx_declare_unit:Nn \V  {        \volt }
\siunitx_declare_unit:Nn \pV { \pico  \volt }
\siunitx_declare_unit:Nn \nV { \nano  \volt }
\siunitx_declare_unit:Nn \uV { \micro \volt }
\siunitx_declare_unit:Nn \mV { \milli \volt }
\siunitx_declare_unit:Nn \kV { \kilo  \volt }
\siunitx_declare_unit:Nn \hl { \hecto \litre }
\siunitx_declare_unit:Nn \l  {        \litre }
\siunitx_declare_unit:Nn \ml { \milli \litre }
\siunitx_declare_unit:Nn \ul { \micro \litre }
\siunitx_declare_unit:Nn \hL { \hecto \liter }
\siunitx_declare_unit:Nn \L  {        \liter }
\siunitx_declare_unit:Nn \mL { \milli \liter }
\siunitx_declare_unit:Nn \uL { \micro \liter }
\siunitx_declare_unit:Nn \fg  { \femto \gram }
\siunitx_declare_unit:Nn \pg  { \pico  \gram }
\siunitx_declare_unit:Nn \ng  { \nano  \gram }
\siunitx_declare_unit:Nn \ug  { \micro \gram }
\siunitx_declare_unit:Nn \mg  { \milli \gram }
\siunitx_declare_unit:Nn \g   { \gram }
\siunitx_declare_unit:Nn \kg  { \kilo \gram }
\siunitx_declare_unit:Nn \W   {        \watt }
\siunitx_declare_unit:Nn \uW  { \micro \watt }
\siunitx_declare_unit:Nn \mW  { \milli \watt }
\siunitx_declare_unit:Nn \kW  { \kilo  \watt }
\siunitx_declare_unit:Nn \MW  { \mega  \watt }
\siunitx_declare_unit:Nn \GW  { \giga  \watt }
\siunitx_declare_unit:Nn \J   { \joule }
\siunitx_declare_unit:Nn \uJ  { \micro \joule }
\siunitx_declare_unit:Nn \mJ  { \milli \joule }
\siunitx_declare_unit:Nn \kJ  { \kilo \joule }
\siunitx_declare_unit:Nn \eV  { \electronvolt }
\siunitx_declare_unit:Nn \meV { \milli \electronvolt }
\siunitx_declare_unit:Nn \keV { \kilo  \electronvolt }
\siunitx_declare_unit:Nn \MeV { \mega  \electronvolt }
\siunitx_declare_unit:Nn \GeV { \giga  \electronvolt }
\siunitx_declare_unit:Nn \TeV { \tera  \electronvolt }
\siunitx_declare_unit:Nnn \kWh { \kilo \watt \hour }
  { inter-unit-product = }
\siunitx_declare_unit:Nn \m  {        \metre }
\siunitx_declare_unit:Nn \pm { \pico  \metre }
\siunitx_declare_unit:Nn \nm { \nano  \metre }
\siunitx_declare_unit:Nn \um { \micro \metre }
\siunitx_declare_unit:Nn \mm { \milli \metre }
\siunitx_declare_unit:Nn \cm { \centi \metre }
\siunitx_declare_unit:Nn \dm { \deci  \metre }
\siunitx_declare_unit:Nn \km { \kilo  \metre }
\siunitx_declare_unit:Nn \K { \kelvin }
\siunitx_declare_unit:Nn \dB { \deci \bel }
\siunitx_declare_unit:Nn \F  {        \farad }
\siunitx_declare_unit:Nn \fF { \femto \farad }
\siunitx_declare_unit:Nn \pF { \pico  \farad }
\siunitx_declare_unit:Nn \nF { \nano  \farad }
\siunitx_declare_unit:Nn \uF { \micro \farad }
\siunitx_declare_unit:Nn \H  {        \henry }
\siunitx_declare_unit:Nn \mH { \milli \henry }
\siunitx_declare_unit:Nn \uH { \micro \henry }
\siunitx_declare_unit:Nn \N  {        \newton }
\siunitx_declare_unit:Nn \mN { \milli \newton }
\siunitx_declare_unit:Nn \kN { \kilo  \newton }
\siunitx_declare_unit:Nn \MN { \mega  \newton }
\siunitx_declare_unit:Nn \Pa  {        \pascal }
\siunitx_declare_unit:Nn \kPa { \kilo  \pascal }
\siunitx_declare_unit:Nn \MPa { \mega  \pascal }
\siunitx_declare_unit:Nn \GPa { \giga  \pascal }
\siunitx_declare_unit:Nn \mohm { \milli \ohm }
\siunitx_declare_unit:Nn \kohm { \kilo  \ohm }
\siunitx_declare_unit:Nn \Mohm { \mega  \ohm }
\siunitx_declare_unit:Nn \s  { \second }
\siunitx_declare_unit:Nn \as { \atto  \second }
\siunitx_declare_unit:Nn \fs { \femto \second }
\siunitx_declare_unit:Nn \ps { \pico  \second }
\siunitx_declare_unit:Nn \ns { \nano  \second }
\siunitx_declare_unit:Nn \us { \micro \second }
\siunitx_declare_unit:Nn \ms { \milli \second }
\siunitx_declare_prefix:Nn \kibi { Ki }
\siunitx_declare_prefix:Nn \mebi { Mi }
\siunitx_declare_prefix:Nn \gibi { Gi }
\siunitx_declare_prefix:Nn \tebi { Ti }
\siunitx_declare_prefix:Nn \pebi { Pi }
\siunitx_declare_prefix:Nn \exbi { Ei }
\siunitx_declare_prefix:Nn \zebi { Zi }
\siunitx_declare_prefix:Nn \yobi { Yi }
\siunitx_declare_unit:Nn \bit  { bit }
\siunitx_declare_unit:Nn \byte { B }
\tl_new:N \l__siunitx_command_tmp_tl
\keys_define:nn { siunitx }
  {
    free-standing-units .bool_set:N =
      \l__siunitx_command_create_bool ,
    overwrite-commands .bool_set:N =
      \l__siunitx_command_overwrite_bool ,
    space-before-unit .bool_set:N =
      \l__siunitx_command_prespace_bool ,
    unit-optional-argument .bool_set:N =
      \l__siunitx_command_optarg_bool ,
    use-xspace .bool_set:N =
      \l__siunitx_command_xspace_bool
  }
\AtBeginDocument
  {
    \clist_map_inline:nn
      {
        free-standing-units    ,
        overwrite-commands     ,
        space-before-unit      ,
        unit-optional-argument ,
        use-xspace
      }
      {
        \keys_define:nn { siunitx }
          {
            #1 .code:n =
              { \msg_warning:nnn { siunitx } { option-preamble-only } {#1} }
          }
      }
  }
\msg_new:nnn { siunitx } { option-preamble-only }
  { Option~'#1'~only~available~in~the~preamble. }
\cs_new_protected:Npn \siunitx_command_create:
  {
    \bool_if:NT \l__siunitx_command_create_bool
      { \__siunitx_command_create: }
    \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
      {
        \cs_if_free:NT ##1
          { \cs_set_protected:Npn ##1 { \ERROR } }
      }
    \@ifpackageloaded { soulpos }
      {
        \@ifpackageloaded { soul }
          { }
          {
            \cs_undefine:N \hl
            \cs_undefine:N \ul
          }
      }
      { }
  }
\AtBeginDocument { \siunitx_command_create: }
\cs_new_protected:Npn \__siunitx_command_create:
  {
    \bool_if:NT \l__siunitx_command_xspace_bool
      { \RequirePackage { xspace } }
    \bool_if:NT \l__siunitx_command_overwrite_bool
      {
        \seq_map_inline:Nn \l_siunitx_unit_symbolic_seq
          { \cs_undefine:N ##1 }
      }
    \cs_set_protected:Npx \__siunitx_command_create:N ##1
      {
        \ProvideDocumentCommand ##1 { \bool_if:NT \l__siunitx_command_optarg_bool { o } }
          {
            \mode_leave_vertical:
            \group_begin:
              \bool_if:NTF \l__siunitx_command_optarg_bool
                { \exp_not:N \IfNoValueTF {####1} }
                { \use_i:nn }
                {
                  \siunitx_unit_options_apply:n {##1}
                  \siunitx_unit_format:nN {##1}
                    \exp_not:N \l__siunitx_command_tmp_tl
                  \bool_if:NTF \l__siunitx_command_prespace_bool
                    { \siunitx_quantity_print:nV { } }
                    { \siunitx_print_unit:V }
                      \exp_not:N \l__siunitx_command_tmp_tl
                }
                { \siunitx_quantity:nn {####1} {##1} }
            \group_end:
            \bool_if:NT \l__siunitx_command_xspace_bool { \exp_not:N \xspace }
          }
      }
    \seq_map_function:NN \l_siunitx_unit_seq \__siunitx_command_create:N
  }
\cs_new_protected:Npn \__siunitx_command_create:N #1 { }
\keys_set:nn { siunitx }
  {
    free-standing-units    = false ,
    overwrite-commands     = false ,
    space-before-unit      = false ,
    unit-optional-argument = false ,
    use-xspace             = false
  }
\msg_new:nnn { siunitx } { option-deprecated }
  {
    Option~"#1"~has~been~deprecated~in~this~release.\\ \\
    Use~"#2"~as~a~replacement.
  }
\msg_new:nnn { siunitx } { option-removed }
  { Option~"#1"~has~been~removed~in~this~release. }
\cs_new_protected:Npn \__siunitx_option_deprecated:nn #1#2
  {
    \msg_info:nnnn { siunitx } { option-deprecated } {#1} {#2}
    \keys_set:nn { siunitx } {#2}
  }
\cs_new_protected:Npn \__siunitx_option_deprecated:nnn #1#2#3
  {
    \msg_info:nnnn { siunitx } { option-deprecated } {#1} {#2}
    \keys_set:nn { siunitx } { #2 = #3 }
  }
\cs_generate_variant:Nn \__siunitx_option_deprecated:nnn { nnV }
\cs_new_protected:Npn \__siunitx_option_removed:n #1
  {
    \msg_warning:nnx { siunitx } { option-removed }
      {#1}
  }
\cs_generate_variant:Nn \__siunitx_option_removed:n { V }
\clist_map_inline:nn
  {
    abbreviations           ,
    binary-units            ,
    load-configurations     ,
    version-1-compatibility
  }
  {
    \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
  }
\keys_define:nn { siunitx }
  {
    add-arc-degree-zero .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { add-arc-degree-zero }
          { fill-angle-degrees }
          \l_keys_value_tl
      } ,
    add-arc-degree-zero .default:n = true ,
    add-arc-minute-zero .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { add-arc-minute-zero }
          { fill-angle-minutes }
          \l_keys_value_tl
      } ,
    add-arc-minute-zero .default:n = true ,
    add-arc-second-zero .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { add-arc-second-zero }
          { fill-angle-seconds }
          \l_keys_value_tl
      } ,
    add-arc-second-zero .default:n = true ,
    arc-separator .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { arc-separator }
          { angle-separator }
          \l_keys_value_tl
      }
  }
\keys_define:nn { siunitx }
  {
    list-units / brackets .code:n =
      {
        \__siunitx_option_deprecated:nn
          { list-units~=~brackets }
          { list-units~=~bracket }
      } ,
    range-units / brackets .code:n =
      {
        \__siunitx_option_deprecated:nn
          { range-units~=~brackets }
          { range-units~=~bracket }
      } ,
    product-units / brackets .code:n =
      {
        \__siunitx_option_deprecated:nn
          { product-units~=~brackets }
          { product-units~=~bracket }
      }
  }
\keys_define:nn { siunitx }
  {
    overwrite-functions .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { overwrite-functions }
          { overwrite-commands }
          \l_keys_value_tl
      } ,
    overwrite-functions .default:n = true
  }
\keys_define:nn { siunitx }
  {
    detect-all .code:n =
      {
        \__siunitx_option_deprecated:nn
          { detect-all }
          {
            mode~=~match , ~
            propagate-math-font~=~true , ~
            reset-math-version~=~false , ~
            reset-text-family~=~false , ~
            reset-text-series~=~false , ~
            reset-text-shape~=~false , ~
            text-family-to-math~=~true , ~
            text-series-to-math~=~true
          }
      } ,
    detect-family .code:n =
      {
        \__siunitx_option_deprecated:nn
          { detect-family }
          {
            reset-text-family~=~false , ~
            text-family-to-math~=~true
          }
      } ,
    detect-mode .code:n =
      {
        \__siunitx_option_deprecated:nn
          { detect-mode }
          { mode~=~match }
      } ,
    detect-none .code:n =
      {
        \__siunitx_option_deprecated:nn
          { detect-none }
          {
            mode~=~math , ~
            propagate-math-font~=~false , ~
            reset-math-version~=~true , ~
            reset-text-family~=~true , ~
            reset-text-series~=~true , ~
            text-family-to-math~=~false , ~
            text-series-to-math~=~false
          }
      } ,
    detect-shape .code:n =
      {
        \__siunitx_option_deprecated:nn
          { detect-shape }
          { reset-text-shape~=~false }
      } ,
    detect-weight .code:n =
      {
        \__siunitx_option_deprecated:nn
          { detect-weight }
          {
            reset-text-series~=~false , ~
            text-series-to-math~=~true
          }
      }
  }
\clist_map_inline:nn
  {
    detect-display-math  ,
    detect-inline-family ,
    detect-inline-weight
  }
  {
    \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
  }
\clist_map_inline:nn
  {
    math-rm        ,
    math-sf        ,
    math-tt        ,
    number-math-rm ,
    number-math-sf ,
    number-math-tt ,
    number-text-rm ,
    number-text-sf ,
    number-text-tt ,
    text-rm        ,
    text-sf        ,
    text-tt        ,
    unit-math-rm   ,
    unit-math-sf   ,
    unit-math-tt   ,
    unit-text-rm   ,
    unit-text-sf   ,
    unit-text-tt
  }
  {
    \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
  }
\clist_map_inline:nn
  {
    math-angstrom  ,
    math-arcminute ,
    math-arcsecond ,
    math-celsius   ,
    math-degree    ,
    math-micro     ,
    math-ohm       ,
    text-angstrom  ,
    text-arcminute ,
    text-arcsecond ,
    text-celsius   ,
    text-degree    ,
    text-micro     ,
    text-ohm       ,
  }
  {
    \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
  }
\keys_define:nn { siunitx }
  {
    group-digits / false .code:n =
      {
        \__siunitx_option_deprecated:nn
          { group-digits ~ = ~ false }
          { group-digits ~ = ~ none }
      } ,
    group-digits / true .code:n =
      {
        \__siunitx_option_deprecated:nn
          { group-digits ~ = ~ true }
          { group-digits ~ = ~ all }
      } ,
    input-symbols .code:n =
      {
        \msg_info:nnnn { siunitx } { option-deprecated }
          { input-symbols } { input-digits }
        \tl_put_right:Nn \l__siunitx_number_input_digit_tl {#1}
      } ,
    separate-uncertainty .choice: ,
    separate-uncertainty / false .code:n =
      {
        \__siunitx_option_deprecated:nn
          { separate-uncertainty }
          { uncertainty-mode~=~compact }
      } ,
    separate-uncertainty / true .code:n =
      {
        \__siunitx_option_deprecated:nn
          { separate-uncertainty }
          { uncertainty-mode~=~separate }
      } ,
    separate-uncertainty .default:n = true
  }
\clist_map_inline:nn
  {
    input-protect-tokens ,
    input-quotient       ,
    output-product       ,
    quotient-mode
  }
  {
    \keys_define:nn { siunitx } { #1 .code:n = \__siunitx_option_removed:n {#1} }
  }
\keys_define:nn { siunitx }
  {
    add-decimal-zero .choice: ,
    add-decimal-zero / false .code:n =
      {
        \__siunitx_option_deprecated:nn
          { add-decimal-zero }
          { minimum-decimal-digits~=~0 }
      } ,
    add-decimal-zero / true .code:n =
      {
        \__siunitx_option_deprecated:nn
          { add-decimal-zero }
          { minimum-decimal-digits~=~1 }
      } ,
    add-decimal-zero .default:n = true ,
    add-integer-zero .code:n =
      {
        \__siunitx_option_deprecated:nn
          { add-integer-zero }
          { print-zero-integer }
      } ,
    close-bracket .code:n =
      { \__siunitx_option_removed:V \l_keys_key_tl } ,
    bracket-numbers .choice: ,
    bracket-numbers / false .code:n =
      {
        \__siunitx_option_deprecated:nn
          { bracket-numbers }
          { bracket-ambiguous-numbers~=~false }
      } ,
    bracket-numbers / true .code:n =
      {
        \__siunitx_option_deprecated:nn
          { bracket-numbers }
          { bracket-ambiguous-numbers~=~true }
      } ,
    bracket-numbers .default:n = true ,
    explicit-sign .code:n =
      {
        \str_if_eq:nnTF {#1} { + }
          {
            \__siunitx_option_deprecated:nn
              { explicit-sign }
              { print-implicit-plus~=~true  }
          }
          { \__siunitx_option_removed:V \l_keys_key_tl }
      } ,
    group-four-digits .choice: ,
    group-four-digits / false .code:n =
      {
        \__siunitx_option_deprecated:nn
          { group-four-digits~=~false }
          { group-minimum-digits~=~5 }
      } ,
    group-four-digits / true .code:n =
      {
        \__siunitx_option_deprecated:nn
          { group-four-digits~=~false }
          { group-minimum-digits~=~4 }
      } ,
    bracket-numbers .default:n = true ,
    omit-uncertainty .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { omit-uncertainty }
          { drop-uncertainty }
          \l_keys_value_tl
      } ,
    omit-uncertainty .default:n = true ,
    open-bracket .code:n =
      { \__siunitx_option_removed:V \l_keys_key_tl } ,
    retain-unity-mantissa .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { retain-unity-mantissa }
          { print-unity-mantissa }
          \l_keys_value_tl
      } ,
    retain-unity-mantissa .default:n = true ,
    retain-zero-exponent .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { retain-zero-exponent }
          { print-zero-exponent }
          \l_keys_value_tl
      } ,
    retain-zero-exponent .default:n = true ,
    round-integer-to-decimal .code:n =
      { \__siunitx_option_removed:V \l_keys_key_tl } ,
    scientific-notation .choice: ,
    scientific-notation / engineering .code:n =
      {
        \__siunitx_option_deprecated:nn
          { scientific-notation~=~engineering }
          { exponent-mode~=~engineering }
      } ,
    scientific-notation / fixed .code:n =
      {
        \__siunitx_option_deprecated:nn
          { scientific-notation~=~fixed }
          { exponent-mode~=~fixed }
      } ,
    scientific-notation / false .code:n =
      {
        \__siunitx_option_deprecated:nn
          { scientific-notation~=~false }
          { exponent-mode~=~input }
      } ,
    scientific-notation / true .code:n =
      {
        \__siunitx_option_deprecated:nn
          { scientific-notation~=~true }
          { exponent-mode~=~scientific }
      } ,
    scientific-notation .default:n = true ,
    zero-decimal-to-integer .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { zero-decimal-to-integer }
          { drop-zero-decimal }
          \l_keys_value_tl
      } ,
    zero-decimal-to-integer .default:n = true
  }
\keys_define:nn { siunitx }
  {
    table-align-text-post .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { table-align-text-post }
          { table-align-text-after }
          \l_keys_value_tl
      } ,
    table-align-text-post .default:n = true ,
    table-align-text-pre .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { table-align-text-pre }
          { table-align-text-before }
          \l_keys_value_tl
      } ,
    table-align-text-pre .default:n = true ,
    table-number-alignment / center-decimal-marker .code:n =
      {
        \msg_info:nnnn { siunitx } { option-deprecated }
          { table-number-alignment~=~center-decimal-marker }
          { table-alignment-mode~=~marker }
        \keys_set:nn
          { siunitx }
          { table-alignment-mode = marker }
      } ,
    table-omit-exponent .code:n =
      {
        \msg_info:nnnn { siunitx } { option-deprecated }
          { table-omit-exponent } { drop-exponent }
        \str_if_eq:VnTF \l_keys_value_tl { true }
          {
            \keys_set:nn
              { siunitx }
              { drop-exponent = true , exponent-mode = fixed }
          }
          {
            \keys_set:nn
              { siunitx }
              { drop-exponent = false }
          }
      } ,
    table-omit-exponent .default:n = true ,
    table-parse-only .code:n =
      {
        \msg_info:nnnn { siunitx } { option-deprecated }
          { table-parse-only }
          { table-alignment-mode~=~none }
        \str_if_eq:VnTF \l_keys_value_tl { false }
          {
            \keys_set:nn
              { siunitx }
              { table-alignment-mode = marker }
          }
          {
            \keys_set:nn
              { siunitx }
              { table-alignment-mode = none }
          }
      } ,
    table-space-text-post .code:n =
      {
        \msg_info:nnnn { siunitx } { option-deprecated }
          { table-space-text-post }
          { table-format }
        \tl_set:Nn \l__siunitx_table_after_model_tl {#1}
      } ,
    table-space-text-pre .code:n =
      {
        \msg_info:nnnn { siunitx } { option-deprecated }
          { table-space-text-post }
          { table-format }
        \tl_set:Nn \l__siunitx_table_before_model_tl {#1}
      }
  }
\cs_new_protected:Npn \__siunitx_option_table_format:n #1
  {
    \msg_info:nnnn { siunitx } { option-deprecated }
      { table- #1 }
      { table-format }
    \tl_set:Nx \l__siunitx_table_format_tl
      {
        \cs:w __siunitx_option_table_ #1 :nnnnnnnn
          \exp_after:wN \exp_after:wN \exp_after:wN \cs_end:
          \exp_after:wN \l__siunitx_table_format_tl
          \exp_after:wN { \l_keys_value_tl }
      }
    \exp_after:wN \__siunitx_table_generate_model:nnnnnnn
      \l__siunitx_table_format_tl
  }
\cs_new:Npn \__siunitx_option_table_comparator:nnnnnnnn #1#2#3#4#5#6#7#8
  { \exp_not:n { {#8} {#2} {#3} {#4} {#5} {#6} {#7} } }
\cs_new:cpn { __siunitx_option_table_figures-decimal:nnnnnnnn }
  #1#2#3#4#5#6#7#8
  { \exp_not:n { {#1} {#2} {#3} {#8} {#5} {#6} {#7} } }
\cs_new:cpn { __siunitx_option_table_figures-exponent:nnnnnnnn }
  #1#2#3#4#5#6#7#8
  { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#8} } }
\cs_new:cpn { __siunitx_option_table_figures-integer:nnnnnnnn }
  #1#2#3#4#5#6#7#8
  { \exp_not:n { {#1} {#2} {#8} {#4} {#5} {#6} {#7} } }
\cs_new:cpn { __siunitx_option_table_figures-uncertainty:nnnnnnnn }
  #1#2#3#4#5#6#7#8
  { \exp_not:n { {#1} {#2} {#3} {#4} { { S } {#8} } {#6} {#7} } }
\cs_new:cpn { __siunitx_option_table_sign-exponent:nnnnnnnn }
  #1#2#3#4#5#6#7#8
  { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#8} {#7} } }
\cs_new:cpn { __siunitx_option_table_sign-mantissa:nnnnnnnn }
  #1#2#3#4#5#6#7#8
  { \exp_not:n { {#1} {#8} {#3} {#4} {#5} {#6} {#7} } }
\keys_define:nn { siunitx }
  {
    table-comparator .code:n =
      { \__siunitx_option_table_format:n { comparator } } ,
    table-figures-decimal .code:n =
      { \__siunitx_option_table_format:n { figures-decimal } } ,
    table-figures-exponent .code:n =
      { \__siunitx_option_table_format:n { figures-exponent } } ,
    table-figures-integer .code:n =
      { \__siunitx_option_table_format:n { figures-integer } } ,
    table-figures-uncertainty .code:n =
      { \__siunitx_option_table_format:n { figures-uncertainty } } ,
    table-sign-exponent .code:n =
      { \__siunitx_option_table_format:n { sign-exponent } } ,
    table-sign-mantissa .code:n =
      { \__siunitx_option_table_format:n { sign-mantissa } }
  }
\keys_define:nn { siunitx }
  {
    fraction-function .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { fraction-function }
          { fraction-command }
          \l_keys_value_tl
      } ,
    literal-superscript-as-power .code:n =
      { \__siunitx_option_removed:V \l_keys_key_tl } ,
    per-mode / reciprocal .code:n =
      {
        \__siunitx_option_deprecated:nn
          { per-mode~=~reciprocal }
          { per-mode~=~power }
      } ,
    per-mode / reciprocal-positive-first .code:n =
      {
        \__siunitx_option_deprecated:nn
          { per-mode~=~reciprocal-positive-first }
          { per-mode~=~power-positive-first }
      } ,
    power-font .code:n =
      { \__siunitx_option_removed:V \l_keys_key_tl } ,
    qualifier-mode / brackets .code:n =
      {
        \__siunitx_option_deprecated:nn
          { qualifier-mode~=~brackets }
          { qualifier-mode~=~bracket }
      } ,
    qualifier-mode / space .code:n =
      {
        \msg_info:nnnn { siunitx } { option-deprecated }
          { qualifier-mode~=~space }
          { qualifier-mode~=~phrase"~plus~"qualifier-phrase=\  }
        \keys_set:nn
          { siunitx }
          { qualifier-mode = phrase, qualifier-phrase = \  }
      } ,
    qualifier-mode / text .code:n =
      {
        \__siunitx_option_deprecated:nn
          { qualifier-mode~=~text }
          { qualifier-mode~=~combine }
      }
  }
\keys_define:nn { siunitx }
  {
    allow-number-unit-breaks .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { allow-number-unit-breaks  }
          { allow-quantity-breaks }
          \l_keys_value_tl
      } ,
    allow-number-unit-breaks .default:n = true ,
    exponent-to-prefix .choice: ,
    exponent-to-prefix / false .code:n =
      {
        \__siunitx_option_deprecated:nn
          { exponent-to-prefix~=~false }
          { prefix-mode~=~input }
      } ,
    exponent-to-prefix / true .code:n =
      {
        \__siunitx_option_deprecated:nn
          { exponent-to-prefix~=~true }
          { prefix-mode~=~combine-exponent }
      } ,
    exponent-to-prefix .default:n = true ,
    multi-part-units .choice: ,
    multi-part-units / brackets . code:n =
      {
        \__siunitx_option_deprecated:nn
          { multi-part-units~=~brackets }
          { separate-uncertainty-units~=~bracket }
      } ,
    multi-part-units / repeat . code:n =
      {
        \__siunitx_option_deprecated:nn
          { multi-part-units~=~repeat }
          { separate-uncertainty-units~=~repeat }
      } ,
    multi-part-units / single . code:n =
      {
        \__siunitx_option_deprecated:nn
          { multi-part-units~=~single }
          { separate-uncertainty-units~=~single }
      } ,
    number-unit-product .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { number-unit-product }
          { quantity-product }
          \l_keys_value_tl
      } ,
    number-unit-separator .code:n =
      {
        \__siunitx_option_deprecated:nnV
          { number-unit-separator }
          { quantity-product }
          \l_keys_value_tl
      } ,
    prefixes-as-symbols .choice: ,
    prefixes-as-symbols / false . code:n =
      {
        \__siunitx_option_deprecated:nn
          { prefixes-as-symbols~=~false }
          { prefix-mode~=~extract-exponent }
      } ,
    prefixes-as-symbols / true . code:n =
      {
        \__siunitx_option_deprecated:nn
          { prefixes-as-symbols~=~true }
          { prefix-mode~=~input }
      } ,
    prefixes-as-symbols .default:n = true
  }
\keys_define:nn { siunitx }
  {
    table-column-type .tl_set:N =
      \l__siunitx_column_type_tl
  }
\keys_set:nn { siunitx }
  {
    table-column-type = S
  }
\IfFormatAtLeastTF { 2022-06-01 }
  { \ProcessKeyOptions [ siunitx ] }
  {
    \RequirePackage { l3keys2e }
    \ProcessKeysOptions { siunitx }
  }
\IfFormatAtLeastTF { 2020-10-01 }
  { }
  { \RequirePackage { xparse } }
\NewDocumentCommand \DeclareSIPower { +m +m m }
  {
    \siunitx_declare_power:NNn #1 #2 {#3}
  }
\NewDocumentCommand \DeclareSIPrefix { +m m m }
  {
    \siunitx_declare_prefix:Nnn #1 {#3} {#2}
  }
\NewDocumentCommand \DeclareSIQualifier { +m m }
  {
    \siunitx_declare_qualifier:Nn #1 {#2}
  }
\NewDocumentCommand \DeclareSIUnit { o +m m }
  {
    \IfNoValueTF {#1}
      { \siunitx_declare_unit:Nn #2 {#3} }
      { \siunitx_declare_unit:Nnn #2 {#3} {#1} }
  }
\@ifpackageloaded { physics }
  {
    \msg_new:nnn { siunitx } { physics-pkg }
      {
        Detected~the~"physics"~package: \\
        Omitting~definition~of~\token_to_str:N \qty.
      }
    \msg_warning:nn { siunitx } { physics-pkg }
    \use_none:nnnn
  }
  { }
\NewDocumentCommand \qty { O { } m > { \TrimSpaces } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \siunitx_unit_options_apply:n {#3}
      \keys_set:nn { siunitx } {#1}
      \siunitx_quantity:nn {#2} {#3}
    \group_end:
  }
\NewDocumentCommand \ang { O { } > { \SplitArgument { 2 } { ; } } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \keys_set:nn { siunitx } {#1}
      \__siunitx_angle:nnn #2
    \group_end:
  }
\NewDocumentCommand \num { O { } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \keys_set:nn { siunitx } {#1}
      \siunitx_number_format:nN {#2} \l__siunitx_tmp_tl
      \siunitx_print_number:V \l__siunitx_tmp_tl
    \group_end:
  }
\@ifpackageloaded { units }
  {
    \msg_new:nnn { siunitx } { units-pkg }
      {
        Detected~the~"units"~package: \\
        Omitting~definition~of~\token_to_str:N \unit.
      }
    \msg_warning:nn { siunitx } { units-pkg }
    \use_none:nnnn
  }
  { }
\NewDocumentCommand \unit { O { } > { \TrimSpaces } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \siunitx_unit_options_apply:n {#2}
      \keys_set:nn { siunitx } {#1}
      \siunitx_unit_format:nN {#2} \l__siunitx_tmp_tl
      \siunitx_print_unit:V \l__siunitx_tmp_tl
    \group_end:
  }
\NewDocumentCommand \qtylist
  { O { } > { \SplitList { ; } } m > { \TrimSpaces } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \siunitx_unit_options_apply:n {#3}
      \keys_set:nn { siunitx } {#1}
      \siunitx_quantity_list:nn {#2} {#3}
    \group_end:
  }
\NewDocumentCommand \numlist { O { } > { \SplitList { ; } } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \keys_set:nn { siunitx } {#1}
      \siunitx_number_list:nn {#2}
    \group_end:
  }
\NewDocumentCommand \qtyproduct
  { O { } > { \SplitList { x } } m > { \TrimSpaces } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \siunitx_unit_options_apply:n {#3}
      \keys_set:nn { siunitx } {#1}
      \siunitx_quantity_product:nn {#2} {#3}
    \group_end:
  }
\NewDocumentCommand \numproduct
  { O { } > { \SplitList { x } } > { \TrimSpaces } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \keys_set:nn { siunitx } {#1}
      \siunitx_number_product:n {#2}
    \group_end:
  }
\NewDocumentCommand \qtyrange { O { } m m > { \TrimSpaces } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \siunitx_unit_options_apply:n {#4}
      \keys_set:nn { siunitx } {#1}
      \siunitx_quantity_range:nnn {#2} {#3} {#4}
    \group_end:
  }
\NewDocumentCommand \numrange { O { } m m }
  {
    \mode_leave_vertical:
    \group_begin:
      \keys_set:nn { siunitx } {#1}
      \siunitx_number_range:nn {#2} {#3}
    \group_end:
  }
\NewDocumentCommand \complexnum { O { } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \keys_set:nn { siunitx } {#1}
      \siunitx_complex_number:n {#2} \l__siunitx_tmp_tl
    \group_end:
  }
\NewDocumentCommand \complexqty { O { } m  m }
  {
    \mode_leave_vertical:
    \group_begin:
      \siunitx_unit_options_apply:n {#3}
      \keys_set:nn { siunitx } {#1}
      \siunitx_complex_quantity:nn {#2} {#3}
    \group_end:
  }
\NewDocumentCommand \tablenum { O { } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \keys_set:nn { siunitx } {#1}
      \siunitx_cell_begin:w
        \ignorespaces #2
      \siunitx_cell_end:
    \group_end:
  }
\NewDocumentCommand \sisetup { m }
  { \keys_set:nn { siunitx } {#1} }
\cs_new_protected:Npn \__siunitx_angle:nnn #1#2#3
  {
    \tl_if_novalue:nTF {#2}
      { \siunitx_angle:n {#1} }
      {
        \tl_if_novalue:nTF {#3}
          { \siunitx_angle:nnn {#1} {#2} { } }
          { \siunitx_angle:nnn {#1} {#2} {#3} }
      }
  }
\RequirePackage { array }
\cs_new_protected:Npn \__siunitx_declare_column:Nnn #1#2#3
  {
    \cs_if_exist:cT { NC@find@ #1 }
      {
        \cs_undefine:c { NC@find@ #1 }
        \cs_set_protected:Npn \__siunitx_tmp:w ##1 \NC@do #1 ##2 \q_stop
          { \NC@list {##1##2} }
        \exp_after:wN \__siunitx_tmp:w \the \NC@list \q_stop
        \msg_warning:nnn { siunitx } { column-overwritten } {#1}
      }
    \newcolumntype {#1} { }
    \cs_set_protected:Npn \__siunitx_tmp:w \NC@do ##1##2 \NC@do #1
      { \NC@list { \NC@do ##1 \NC@do #1 ##2 } }
    \exp_after:wN \__siunitx_tmp:w \the \NC@list
    \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [ 1 ] [ ]
      {
        \@temptokena \expandafter
          {
            \the \@temptokena
            > {#2} c < {#3}
          }
        \NC@find
      }
  }
\msg_new:nnn { siunitx } { column-overwritten }
  { Tabular~column~type~"#1"~overwritten~with~siunitx~definition. }
\AtBeginDocument
  {
    \@ifpackageloaded { mdwtab }
      {
        \cs_set_protected:Npn \__siunitx_declare_column:Nnn #1#2#3
          {
            \cs_if_exist:cT { NC@find@ #1 }
               {
                 \cs_undefine:c { NC@find@ #1 }
                 \msg_warning:nnn { siunitx } { column-overwritten } {#1}
               }
            \newcolumntype {#1} [ 1 ] [ ]
              { > {#2} c < {#3} }
           }
      }
      { }
    \tl_map_inline:Nn \l__siunitx_column_type_tl
      {
        \__siunitx_declare_column:Nnn #1
          {
            \keys_set:nn { siunitx } {##1}
            \siunitx_cell_begin:w
          }
          { \siunitx_cell_end: }
      }
  }
\cs_new_protected:Npn \__siunitx_bookmark_cmd:Nnn #1#2#3
  {
    \exp_args:Nc \DeclareExpandableDocumentCommand
      { \cs_to_str:N #1 \c_space_tl ( pdfstring ~ context ) }
      {#2} {#3}
  }
\__siunitx_bookmark_cmd:Nnn \qty { o m m } { #2 ~ #3 }
\__siunitx_bookmark_cmd:Nnn \ang { m } { \__siunitx_angle:n {#1} }
\__siunitx_bookmark_cmd:Nnn \num { o m } { #2 }
\__siunitx_bookmark_cmd:Nnn \unit { o m } { #2 }
\__siunitx_bookmark_cmd:Nnn \numlist { o m }
  {
    \__siunitx_list_use:nnVVV {#2} { }
      \l_siunitx_list_separator_pair_tl
      \l_siunitx_list_separator_tl
      \l_siunitx_list_separator_final_tl
  }
\__siunitx_bookmark_cmd:Nnn \qtylist { o m m }
  {
    \__siunitx_list_use:nnVVV {#2} {#3}
      \l_siunitx_list_separator_pair_tl
      \l_siunitx_list_separator_tl
      \l_siunitx_list_separator_final_tl
  }
\__siunitx_bookmark_cmd:Nnn \numproduct { o m } { }
\__siunitx_bookmark_cmd:Nnn \qtyproduct { o m m } { }
\__siunitx_bookmark_cmd:Nnn \numrange { o m m }
  { #2 \tl_use:N \l_siunitx_range_phrase_tl #3 }
\__siunitx_bookmark_cmd:Nnn \qtyrange { o m m m }
  { #2 ~ #4 \tl_use:N \l_siunitx_range_phrase_tl #3 ~ #4 }
\__siunitx_bookmark_cmd:Nnn \si { o m } { #2 }
\__siunitx_bookmark_cmd:Nnn \SI { o m O { } m } { #3 #2 ~ #4 }
\__siunitx_bookmark_cmd:Nnn \SIlist { o m m }
  {
    \__siunitx_list_use:nnVVV {#2} {#3}
      \l_siunitx_list_separator_pair_tl
      \l_siunitx_list_separator_tl
      \l_siunitx_list_separator_final_tl
  }
\__siunitx_bookmark_cmd:Nnn \SIrange { o m m m }
  { #2 ~ #4 \tl_use:N \l_siunitx_range_phrase_tl #3 ~ #4 }
\seq_const_from_clist:Nn \c__siunitx_bookmark_seq
  {
    \ang , \qty , \num , \unit ,
    \numlist , \qtylist ,
    \numrange , \qtyrange ,
    \si , \SI , \SIlist , \SIrange
  }
\AtBeginDocument
  {
    \@ifpackageloaded { hyperref }
      {
        \pdfstringdefDisableCommands
          {
            \seq_map_inline:Nn \c__siunitx_bookmark_seq
              {
                \cs_set_eq:Nc #1
                  { \cs_to_str:N #1 \c_space_tl ( pdfstring ~ context ) }
              }
          }
        \pdfstringdefDisableCommands
          {
            \siunitx_unit_pdfstring_context:
            \cs_if_exist:NT \FB@fg { \def \fg { \FB@fg } }
            \edef \H
              {
                \exp_not:c { PU-cmd }
                \exp_not:N \H
                \exp_not:c { PU \token_to_str:N \H }
              }
          }
      }
      { }
  }
\cs_new:Npn \__siunitx_angle:n #1
  { \__siunitx_angle:w #1 ; ; ; \q_stop }
\cs_new:Npn \__siunitx_angle:w #1 ; #2 ; #3 ; #4 \q_stop
  {
    \tl_if_blank:nF {#1}
      { #1 \degree }
    \tl_if_blank:nF {#2}
      {
        \tl_if_blank:nF {#1} { \c_space_tl }
        #2 \arcminute
      }
    \tl_if_blank:nF {#3}
      {
        \tl_if_blank:nF {#1#2} { \c_space_tl }
        #3 \arcsecond
      }
  }
\cs_new:Npn \__siunitx_list_use:nnnnn #1#2#3#4#5
  {
    \tl_if_blank:nTF {#2}
      { \__siunitx_list_use_aux:nnnnn {#1} { } }
      { \__siunitx_list_use_aux:nnnnn {#1} { ~ #2 } }
        {#3} {#4} {#5}
  }
\cs_generate_variant:Nn \__siunitx_list_use:nnnnn { nnVVV }
\cs_new:Npn \__siunitx_list_use_aux:nnnnn #1#2#3#4#5
  {
    \int_case:nnF { \__siunitx_list_count:n {#1} }
      {
        { 0 } { }
        { 1 } { \__siunitx_list_use_auxi:nw {#2} #1 ; ; { } }
        { 2 } { \__siunitx_list_use_auxi:nw {#2} #1 ; {#3} }
      }
      {
        \__siunitx_list_use_auxii:nnw {#2} { } #1 ;
          \q_mark ; { \__siunitx_list_use_auxii:nnw {#2} {#4} }
          \q_mark ; { \__siunitx_list_use_auxiii:nnw {#2} {#5} }
          \q_stop { }
      }
  }
\cs_new:Npn \__siunitx_list_use_auxi:nw #1#2 ; #3 ; #4
  { #2 #1 #4 #3 \tl_if_blank:nF {#3} {#1} }
\cs_new:Npn \__siunitx_list_use_auxii:nnw
  #1#2#3 ; #4 ; #5 ; #6 \q_mark ; #7#8 \q_stop #9
  { #7 {#4} ; {#5} ; #6 \q_mark ; {#7} #8 \q_stop { #9 #2 #3 #1 } }
\cs_new:Npn \__siunitx_list_use_auxiii:nnw #1#2#3 ; #4 \q_stop #5
  { #5 #2 #3 #1 }
\cs_new:Npx \__siunitx_list_count:n #1
  {
    \exp_not:N \int_eval:n
      {
        0
        \exp_not:N \__siunitx_list_count:w \c_space_tl
        #1 \exp_not:n { ; \q_recursion_tail ; \q_recursion_stop }
      }
  }
\cs_new:Npx \__siunitx_list_count:w #1 ;
  {
    \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1}
    \exp_not:N \tl_if_blank:nF {#1} { + 1 }
    \exp_not:N \__siunitx_list_count:w \c_space_tl
  }
\NewDocumentCommand \DeclareBinaryPrefix { +m m m }
  {
    \siunitx_declare_prefix:Nn #1 {#2}
  }
\NewDocumentCommand \DeclareSIPrePower { +m m }
  {
    \siunitx_declare_power:NNn #1 \__siunitx_tmp:w {#2}
    \seq_remove_all:Nn \l_siunitx_unit_symbolic_seq { \__siunitx_tmp:w }
  }
\NewDocumentCommand \DeclareSIPostPower { +m m }
  {
    \siunitx_declare_power:NNn \__siunitx_tmp:w #1 {#2}
    \seq_remove_all:Nn \l_siunitx_unit_symbolic_seq { \__siunitx_tmp:w }
  }
\NewDocumentCommand \si { O { } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \keys_set:nn { siunitx } {#1}
      \siunitx_unit_format:nN {#2} \l__siunitx_tmp_tl
      \siunitx_print_unit:V \l__siunitx_tmp_tl
    \group_end:
  }
\NewDocumentCommand \SI { O { } m o m }
  {
    \mode_leave_vertical:
    \group_begin:
      \keys_set:nn { siunitx } {#1}
      \IfNoValueF {#3}
        {
          \siunitx_unit_format:nN {#3} \l__siunitx_tmp_tl
          \siunitx_print_unit:V \l__siunitx_tmp_tl
          \nobreak
        }
      \siunitx_quantity:nn {#2} {#4}
    \group_end:
  }
\NewDocumentCommand \SIlist
  { O { } > { \SplitList { ; } } m > { \TrimSpaces } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \siunitx_unit_options_apply:n {#3}
      \keys_set:nn { siunitx } {#1}
      \siunitx_quantity_list:nn {#2} {#3}
    \group_end:
  }
\NewDocumentCommand \SIrange { O { } m m > { \TrimSpaces } m }
  {
    \mode_leave_vertical:
    \group_begin:
      \siunitx_unit_options_apply:n {#4}
      \keys_set:nn { siunitx } {#1}
      \siunitx_quantity_range:nnn {#2} {#3} {#4}
    \group_end:
  }
\bool_lazy_or:nnTF
  { \sys_if_engine_luatex_p: }
  { \sys_if_engine_xetex_p: }
  {
    \cs_new:Npn \__siunitx_emulation_non_latin:n #1
      { \char_generate:nn {#1} { \char_value_catcode:n {#1} } }
  }
  {
    \cs_new:Npn \__siunitx_emulation_non_latin:n #1
      {
        \exp_last_unbraced:Nf \__siunitx_emulation_non_latin:nnnn
          { \char_to_utfviii_bytes:n {#1} }
      }
    \cs_new:Npn \__siunitx_emulation_non_latin:nnnn #1#2#3#4
      {
        \exp_after:wN \exp_after:wN \exp_after:wN
          \exp_not:N \char_generate:nn {#1} { 13 }
        \exp_after:wN \exp_after:wN \exp_after:wN
          \exp_not:N \char_generate:nn {#2} { 13 }
      }
  }
\AtBeginDocument
  {
    \cs_new_protected:Npn \SIUnitSymbolArcminute
       { \ensuremath { { } ' } }
    \cs_new_protected:Npn \SIUnitSymbolArcsecond
       { \ensuremath { { } '' } }
    \@ifpackageloaded { fontspec }
      {
        \cs_new_protected:Npx \SIUnitSymbolAngstrom
           { \__siunitx_emulation_non_latin:n { "00C5 } }
        \cs_new_protected:Npx \SIUnitSymbolDegree
           { \__siunitx_emulation_non_latin:n { "00B0 } }
        \cs_new_protected:Npx \SIUnitSymbolCelsius
           { \__siunitx_emulation_non_latin:n { "00B0 } C }
      }
      {
        \cs_new_protected:Npx \SIUnitSymbolAngstrom
          {
            \siunitx_print_text:n
              { \__siunitx_emulation_non_latin:n { "00C5 } }
          }
        \cs_new_protected:Npx \SIUnitSymbolCelsius
          {
            \siunitx_print_text:n
              { \__siunitx_emulation_non_latin:n { "00B0 } } C
          }
        \cs_new_protected:Npx \SIUnitSymbolDegree
          {
            \siunitx_print_text:n
              { \__siunitx_emulation_non_latin:n { "00B0 } }
          }
      }
    \cs_new_protected:Npx \SIUnitSymbolMicro
       {
          \siunitx_print_text:n
            {
              \bool_lazy_or:nnTF
                { \sys_if_engine_luatex_p: }
                { \sys_if_engine_xetex_p: }
                { \__siunitx_emulation_non_latin:n { "00B5 } }
                { \exp_not:N \textmu }
            }
       }
    \cs_new_protected:Npx \SIUnitSymbolOhm
       {
          \exp_not:N \ifmmode
            \cs_if_exist:NTF \upOmega
              { \exp_not:N \upOmega }
              { \exp_not:N \Omega }
          \exp_not:N \else
            \siunitx_print_text:n
              {
                \bool_lazy_or:nnTF
                  { \sys_if_engine_luatex_p: }
                  { \sys_if_engine_xetex_p: }
                  { \__siunitx_emulation_non_latin:n { "03A9 } }
                  { \exp_not:N \textohm }
              }
          \exp_not:N \fi
       }
  }
\siunitx_declare_unit:Nn \celsius { \degreeCelsius }
\msg_new:nnn { siunitx } { unit-deprecated }
  {
    Unit~macro~#1~has~been~deprecated~in~this~release. \\ \\
    The~BIPM~have~removed~this~unit~from~the~SI~Brochure.~
    You~should~define~it~yourself~using~\token_to_str:N \DeclareSIUnit\ %
    in~your~source.~The~current~definition~is\\ \\
    \token_to_str:N \DeclareSIUnit #1 \{ #2 \}
  }
\cs_gset_protected:Npn \__siunitx_emulation_tmp:w #1#2
  {
    \quark_if_recursion_tail_stop:N #1
    \bool_new:c { g__siunitx_emulation_unit_warning_ \token_to_str:N #1 _bool }
    \siunitx_declare_unit:Nx #1
      {
        \exp_not:N \bool_if:NF
          \exp_not:c { g__siunitx_emulation_unit_warning_ \token_to_str:N #1 _bool  }
          {
            \exp_not:N \bool_gset_true:N
              \exp_not:c { g__siunitx_emulation_unit_warning_ \token_to_str:N #1 _bool  }
            \msg_warning:nnnn { siunitx } { unit-deprecated }
              { \token_to_str:N #1 } {#2}
          }
        #2
      }
    \__siunitx_emulation_tmp:w
  }
\__siunitx_emulation_tmp:w
  \atomicmassunit   { u }
  \bar              { bar }
  \barn             { b }
  \bohr
    {
      \exp_not:N \text
        { \exp_not:N \ensuremath { a } } \char_generate:nn { `\_ } { 8 } { 0 }
    }
  \clight
    {
      \exp_not:N \text
        { \exp_not:N \ensuremath { c } } \char_generate:nn { `\_ } { 8 } { 0 }
    }
  \electronmass
    {
      \exp_not:N \text { \exp_not:N \ensuremath { m } }
      \char_generate:nn { `\_ } { 8 } { \exp_not:N \mathrm { e } }
    }
  \elementarycharge { \text { \ensuremath { e } } }
  \hartree
    {
      \exp_not:N \text { \exp_not:N \ensuremath { E } }
      \char_generate:nn { `\_ } { 8 } { \exp_not:N \mathrm { h } }
    }
  \knot             { kn }
  \mmHg             { mmHg }
  \nauticalmile     { M }
  \planckbar
    { \exp_not:N \text { \exp_not:N \ensuremath { \exp_not:N \hbar } } }
  \q_recursion_tail { }
  \q_recursion_stop
\@ifpackageloaded { fontspec }
  {
    \__siunitx_emulation_tmp:w \angstrom { \__siunitx_emulation_non_latin:n { "00C5 } }
  }
  {
    \__siunitx_emulation_tmp:w \angstrom
      { \exp_not:N \text { \__siunitx_emulation_non_latin:n { "00C5 } } }
  }
  \q_recursion_tail { }
  \q_recursion_stop
\NewDocumentCommand \SendSettingsToPgf { }
  {
    \use:x
      {
        \exp_not:N \pgfqkeys { /pgf/number~format }
          {
            \str_if_eq:VnT \l__siunitx_number_round_mode_tl { figures }
              {
                fixed ,
                fixed~zerofill = true ,
              }
            precision = \int_use:N \l__siunitx_number_round_precision_int ,
            set~decimal~separator =
              \str_if_eq:VnTF \l_siunitx_number_output_decimal_tl { , }
                { \exp_not:N \mathord }
                { \use:n }
                  { \exp_not:V \l_siunitx_number_output_decimal_tl } ,
            set~thousands~separator =
            set~decimal~separator =
              \str_if_eq:VnTF \l__siunitx_number_group_separator_tl { , }
                { \exp_not:N \mathord }
                { \use:n }
                  { \exp_not:V \l__siunitx_number_group_separator_tl } ,
            min~exponent~for~1000~sep =
              \int_eval:n { \l__siunitx_number_group_minimum_int - 1 } ,
            \bool_lazy_or:nnF
              { \l__siunitx_number_group_decimal_bool }
              { \l__siunitx_number_group_integer_bool }
              { min~exponent~for~1000~sep = 999 , }
            showpos =
              \bool_if:NTF \l__siunitx_number_implicit_plus_bool
                { true }
                { false }
          }
      }
  }
%% Copyright (C) 2008-2022 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:
%% 
%%    https://www.latex-project.org/lppl.txt
%% 
%% This work is "maintained" (as per LPPL maintenance status) by
%%   Joseph Wright.
%% 
%% This work consists of the files siunitx.dtx,
%%                                 siunitx.ins,
%%                                 siunitx.tex,
%%                                 siunitx-abbreviations.cfg,
%%                                 siunitx-abbreviation.dtx,
%%                                 siunitx-angle.dtx,
%%                                 siunitx-binary.cfg,
%%                                 siunitx-binary.dtx,
%%                                 siunitx-code.tex,
%%                                 siunitx-command.dtx,
%%                                 siunix-complex.dtx,
%%                                 siunitx-compound.dtx,
%%                                 siunitx-emulation.dtx,
%%                                 siunitx-locale.dtx,
%%                                 siunitx-number.dtx,
%%                                 siunitx-print.dtx,
%%                                 siunitx-quantity.dtx,
%%                                 siunitx-symbol.dtx,
%%                                 siunitx-table.dtx,
%%                                 siunitx-unit.dtx,
%%                                 siunitx-v2.sty and
%%                                 siunitx-version-1.cfg,
%%           and the derived files siunitx.pdf,
%%                                 siunitx.sty and
%%                                 siunitx-code.pdf.
%% 
%%
%% End of file `siunitx.sty'.
