+
    4j             (        a 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHtHt ^ RIHt ^ RIHtHt ^ RIt^ R	IHt ^ R
IHt ^RIHt ^RIHtHt ^RIHtH t H!t! ^RI"H#t#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+ ]'       d   ^ RI,H-t-H.t.H/t/H0t0H1t1 ]Pd                  ! ]34      t4. ER>Ot5]
! RRR7      t6R]7R&   ]
! RRR7      t8R]7R&   ]
! R RR7      t9R]7R &   R! R" lt:]R# R$ l4       t;]R% R& l4       t< ! R' R]=4      t> ! R( R]>4      t? ! R) R]P                  4      tA ! R* R]P                  4      tB]BP                  ^ ]BP                  ^]BP                  ^]BP                  ^]BP                  ^]BP                  ^]BP                  ^/tJR+]7R,&   ]AP                  ]L! ]BP                  ]BP                  04      ]AP                  ]L! ]BP                  ]BP                  ]BP                  04      /tNR-]7R.&   ]! R/R/R07       ! R1 R4      4       tOR2 R3 ltPR4 R5 ltQR6 R7 ltRER?tSR9 R: ltTR; R< ltUR= R> ltVR? R@ ltWRA RB ltXRC RD ltYRE RF ltZRG RH lt[RI RJ lt\RK RL lt]RM RN lt^RO RP lt_RQ RR lt`RS RT ltaRU RV ltbRW RX ltcRY RZ ltdR[ R\ lteR] R^ ltfR_ R` ltgRa Rb lthRc Rd ltiRe Rf ltjRg Rh ltkRi Rj ltlRk Rl ltmRm Rn ltnRo Rp ltoRq Rr ltpRs Rt ltqRu Rv ltrRw Rx ltsRy Rz lttR{ R| ltuR} R~ ltvR R ltwR R ltxR R ltyR R ltzR R lt{R R lt|R R lt}R R lt~R R ltR R ltR R ltR R lt]EP                  ! / 4      tR]7R&   ]O! R]AP                  RREP                  R ]( 4       4       R2](EP                  RRR]RR R7	      ]O! R]AP                  RREP                  R ]% 4       4       R2]%EP                  RRR]\R R7	      ]O! R]AP                  RREP                  R ]) 4       4       R2])EP                  RRR]WR R7	      ]O! R]AP                  RER@RRR]b]{R7	      ]O! R]AP                  RER@RRR]c]{R7	      ]O! R]AP                  RRRRR]dR R7	      ]O! R]AP                  RRRRR]eR R7	      ]O! R]AP                  RRRRR]XR R7	      ]O! R]AP                  RRRRR]]]R7	      ]O! R]AP                  RREP                  R ]& 4       4       R2]&EP                  R3RRR]Y]R7	      ]O! R]AP                  RREP                  R ]$ 4       4       R2]$EP                  RRR][R R7	      ]O! R]AP                  R^ RRR]Z]R7	      ]O! R]AP                  R]RRR]_]}R7	      ]O! R]AP                  R]RRR]^]|R7	      ]O! R]AP                  R]*! 4       RRR]`]R7	      ]O! R]AP                  RRRRR]a]R7	      ]O! R]AP                  R]! ]]4      3RRR]f]vR7	      ]O! R]AP                  RER@RRR]g]xR7	      ]O! R]AP                  RER@RRR]i]yR7	      ]O! R]AP                  RER@RRR]j]zR7	      ]O! R]AP                  RER@RRR]l]tR7	      ]O! R]AP                  RER@RRR]m]tR7	      ]O! R]AP                  R]RRR]o]uR7	      ]O! R]AP                  RER@RRR]p]rR7	      ]O! R]AP                  RRRRR]q]sR7	      ]O! R]AP                  RRRRR]PR R7	      ]O! R]AP                  RRRRR]QR R7	      ]O! R]AP                  RREP                  ]S4       R2R8RRR]T]R7	      ]O! R]AP                  R^RRR]U]R7	      3tER ]7R&   ] U u/ uF  q EP                  V bK  	  up tER]7ER&   ER ER ltER ER lt]! R/R/R07       ! ER R4      4       tER ER	 lt]! R/R/R07       ! ER
 R4      4       t]! R/R/R07       ! ER R4      4       t]! R/R/R07       ! ER R4      4       t]! R/R/R07       ! ER R4      4       tERR/ER ER lltER ER ltER ER ltERER@ERR/ER ER lltERER@ERR/ER ER lltER ER ltERR/ER ER lltERRERR//ER ER  lltER!ER@/ER" ER# lltER$ ER% ltER& ER' ltER( ER) lt^t^t^	t^	tER* ER+ ltER!ER@/ER, ER- lltER. ER/ ltER0R/ER1 ER2 lltER3 ER4 ltER5 ER6 ltER7 ER8 ltER9 ER: ltER;R//ER< ER= lltR# u up i (A  a  Registry of layered nab options and the helpers that read them.

Every layered option is one :class:`OptionSpec` row in :data:`OPTIONS`.
A row names the option, its scope (``PROJECT`` or ``USER``), its value
type, its default, the env var (or ``None``), the CLI flag spelling,
and (via the scope) the set of source kinds it is allowed to come
from.

Everything else is derived by iterating :data:`OPTIONS`:

* :func:`discover_layers` reads each ``nab.toml`` / ``[tool.nab]``
  table against the registry, raising on any key that names an option
  not allowed in that source kind (the category gate).
* :func:`read_env_layer` reads ``NAB_*`` for the rows that declare an
  env var, and warns on any ``NAB_*`` name it does not recognize.
* :func:`resolve_config` ranks the discovered layers low-to-high, takes
  each option's whole value from the highest source that bound it, and
  attaches ``(scope, origin)`` provenance to it.
* :func:`render_list` / :func:`render_get` / :func:`render_explain`
  back ``nab config``.

Adding an option is one new row in :data:`OPTIONS` plus, for the
CLI, one tyro flag.  A conformance test asserts the tyro surface matches
the registry so the one place the CLI surface is not registry-derived
(tyro reads flags from a function signature) cannot silently drift.
)annotationsN)contextmanager)
ContextVar)	dataclass)datetimetimezone)Path)TYPE_CHECKINGAny)IndexConfig)SimpleSerialization)tool_nab_section)DEFAULT_INDEX_NAMEDEFAULT_INDEX_URL)	PathStateis_usable_path_name
path_state)	ArchiveSourceBuildPolicyDecisionOrder
DistPolicyLocalSourceResolutionStrategyResolveMode	VcsConfig	VcsSource)CallableIterableIteratorMappingSequenceOPTIONSConfigErrorEffectiveValueLayer
OptionSpecOriginRejectedLayerScopeSourceConfigError
SourceKindSourceRoots_RESOLVE_ANCHOR)defaultzContextVar[datetime | None]_DECLARING_DIRzContextVar[Path | None]_INSPECTOR_ANCHORc                   V ^8  d   QhRR/#    returnr    )formats   "k/home/user/pdf2html-billing-ledger-validate/.venv/lib/python3.14/site-packages/nab_python/config_sources.py__annotate__r7   ~   s     H H H    c                 ~    \         P                  4       p V e   V # \        P                  ! \        P
                  4      # )zReturn the active ``P<n>D`` anchor: the resolve anchor or ``now``.

The resolve path sets :data:`_RESOLVE_ANCHOR` so relative durations
resolve against the lockfile anchor; the inspector leaves it unset and
anchors at the current time (display only).
)r,   getr   nowr   utcanchors    r6   _current_anchorr?   ~   s/       "F'6GX\\(,,-GGr8   c                    V ^8  d   QhRRRR/# )r2   r>   zdatetime | Noner3   Iterator[None]r4   )r5   s   "r6   r7   r7      s     % %? %~ %r8   c              #     "   \         P                  V 4      p Rx  \         P                  V4       R#   \         P                  T4       i ; i5i)aD  Bind the ``P<n>D`` resolve anchor for the duration of a merge.

The resolve path wraps its :func:`resolve_config` call in this so the
effective override / ``uploaded-prior-to`` values it consumes resolve
relative durations against the lockfile anchor.  A ``None`` anchor is a
no-op (the inspector's current-time behaviour).
N)r,   setreset)r>   tokens   & r6   resolve_anchorrF      s;      'E%e$e$s   A4 AAAc                   V ^8  d   QhRR/# )r2   r3   rA   r4   )r5   s   "r6   r7   r7      s     ' '. 'r8   c               #     "   \         P                  \        P                  ! \        P
                  4      4      p  Rx  \         P                  V 4       R#   \         P                  T 4       i ; i5i)a  Pin one ``now`` for an inspector discover+merge pass.

The inspector (``nab config``) leaves :data:`_RESOLVE_ANCHOR` unset, so
each override-body ``P<n>D`` duration would otherwise anchor against a
fresh :func:`datetime.now` per layer.  Binding a single instant here
makes an identical relative duration in pyproject ``[tool.nab]`` and the
project ``nab.toml`` resolve to the same datetime, so the cross-file
equality check does not see a spurious conflict.  A no-op on the resolve
path (the resolve anchor takes precedence).
N)r/   rC   r   r;   r   r<   rD   )rE   s    r6   inspector_anchorrI      sI      !!(,,x||"<=E'&&s   8A0A A0A--A0c                      ] tR t^tRtRtR# )r"   aa  Raised when ``[tool.nab]`` configuration is invalid.

The base for every config-parse error.  Lives here (the lowest config
layer) so :class:`SourceConfigError` can subclass it without an import
cycle; :mod:`nab_python.config` re-exports it as its public name and
hangs its own subclasses (``ConflictSelectionError``,
``OverrideConflictError``) off it.
r4   N__name__
__module____qualname____firstlineno____doc____static_attributes__r4   r8   r6   r"   r"      s    r8   c                      ] tR t^tRtRtR# )r)   a  A layered source set a value it is not allowed to set.

Raised by the category gate: e.g. a PROJECT option appearing in a
user ``nab.toml`` or env var, or a USER option appearing in
``pyproject.toml`` ``[tool.nab]``.  A subclass of :class:`ConfigError`
so a caller catching the broad config error also catches a layered
gate or cross-file conflict failure, while ``except SourceConfigError``
still narrows to the layered cases.
r4   NrK   r4   r8   r6   r)   r)      s    r8   c                  "    ] tR t^tRtRtRtRtR# )r(   zAWhether an option configures the project or the user/environment.projectuserr4   N)rL   rM   rN   rO   rP   PROJECTUSERrQ   r4   r8   r6   r(   r(      s    KGDr8   c                  6    ] tR t^tRtRtRtRtRtRt	Rt
RtR	tR
# )r*   zOne discoverable configuration source, low precedence to high.

The two project-level TOML sources (``PYPROJECT`` and
``PROJECT_TOML``) share a precedence rank; the rest are totally
ordered by :data:`_PRECEDENCE`.
r-   systemrU   	pyprojectrT   envclir4   N)rL   rM   rN   rO   rP   DEFAULTSYSTEM_TOML	USER_TOML	PYPROJECTPROJECT_TOMLENVCLIrQ   r4   r8   r6   r*   r*      s,     GKIIL
C
Cr8   zdict[SourceKind, int]_PRECEDENCEz"dict[Scope, frozenset[SourceKind]]_ALLOWED_TOML_SOURCEST)frozenslotsc                      ] tR t^t$ RtR]R&   R]R&   R]R&   R]R&   R	]R
&   R	]R&   R	]R&   R]R&   R]R&   R R ltRtR# )r%   a  One row of the registry: the full definition of a layered option.

``key`` is the TOML/`nab config` key.  ``scope`` gates which sources
may set it.  ``parse`` turns a raw TOML/string value into the typed
value (and raises :class:`SourceConfigError` on a bad value).
``env_var`` is the ``NAB_*`` name or ``None`` (not env-settable).
``cli_flag`` is the tyro flag spelling the conformance test checks,
or ``None`` for a file-only row (a structured PROJECT table with no
bare CLI flag, e.g. ``vcs``/``workspace``/``environment``);
``cli_param`` is the tyro function-parameter name backing the flag,
also ``None`` for a file-only row.  ``type_label`` is shown by
``nab config``.
strkeyr(   scope
type_labelr
   r-   
str | Noneenv_varcli_flag	cli_paramzCallable[[Any, str], Any]parsezCallable[[Any], str]renderc                    V ^8  d   QhRRRR/# )r2   kindr*   r3   boolr4   )r5   s   "r6   r7   OptionSpec.__annotate__  s     9 9J 94 9r8   c                6    V\         V P                  ,          9   # )zWhether a TOML source of ``kind`` may set this option.

The category gate.  ``kind`` is always one of the four TOML
source kinds; env (``NAB_*``) gating is the ``env_var`` field and
is handled in :func:`read_env_layer`, CLI is always allowed.
)re   rk   )selfrt   s   &&r6   allowed_in_tomlOptionSpec.allowed_in_toml  s     ,TZZ888r8   r4   N)rL   rM   rN   rO   rP   __annotations__ry   rQ   r4   r8   r6   r%   r%      sE     
HLOL$$  9 9r8   c               $    V ^8  d   QhRRRRRR/# )r2   valuer
   whereri   r3   ru   r4   )r5   s   "r6   r7   r7     s!     ! !s !3 !4 !r8   c                .   \        V \        4      '       d   V # \        V \        4      '       dD   V P                  4       P	                  4       pVR9   d   R# VR9   d   R# V RV : 2p\        V4      hV R\        V 4      P                   2p\        V4      h)zlParse a TOML/env boolean.

Accepts a real bool (TOML) or one of ``1/0/true/false`` (env,
case-insensitive).
TFz$ must be one of 1/0/true/false, got z must be a boolean, got >   1true>   0false)
isinstanceru   ri   striplowerr)   typerL   )r}   r~   loweredmsgs   &&  r6   _parse_boolr     s     %%++-%%'m#n$;E9E$$G+DK,@,@+A
BC
C
  r8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   r   r4   )r5   s   "r6   r7   r7   .  s!      s 3 4 r8   c                T   \        V \        4      '       d   V # \        V \        4      '       g&   V R \        V 4      P                   2p\        V4      hV P                  4       '       g   V R2p\        V4      h\        V 4      '       g   V RV : R2p\        V4      h\        V 4      # )z must be a string path, got z must be a non-empty path z  is not a usable filesystem path)r   r   ri   r   rL   r)   r   r   r}   r~   r   s   && r6   _parse_pathr   .  s    %eS!!3DK4H4H3IJ$$;;== 01$$u%%q	!AB$$;r8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   r   r4   )r5   s   "r6   r7   r7   @  s"     
. 
.S 
. 
.1C 
.r8   c                   \        V \        4      '       g&   V R \        V 4      P                   2p\	        V4      h \        V 4      #   \         d4   p\        R \
         4       4      pT RT: RT : 2p\	        T4      ThRp?ii ; i) must be a string, got c              3  8   "   T F  qP                   x  K  	  R # 5iNr}   .0ss   & r6   	<genexpr>$_parse_resolution.<locals>.<genexpr>H  s     ;(:1ww(:    must be one of , got N)r   ri   r   rL   r)   r   
ValueErrorsorted)r}   r~   r   excvalids   &&   r6   _parse_resolutionr   @  s    eS!!.tE{/C/C.DE$$.!%(( .;(:;;'yui@$#-.s   
A B.BBurllib3c               $    V ^8  d   QhRRRRRR/# r2   r}   r
   r~   ri   r3   r4   )r5   s   "r6   r7   r7   P  s!      s 3 3 r8   c                    \        V \        4      '       g&   V R \        V 4      P                   2p\	        V4      hV P                  4       pV\        9  d%   V R\        \        4      : RV : 2p\	        V4      hV# )r   r   r   )r   ri   r   rL   r)   r   _HTTP_BACKENDSlist)r}   r~   r   r   s   &&  r6   _parse_http_backendr   P  sv    eS!!.tE{/C/C.DE$$kkmGn$'^(<'?veYO$$Nr8   c               $    V ^8  d   QhRRRRRR/# r2   r}   r
   r~   ri   r3   intr4   )r5   s   "r6   r7   r7   [  s!      # c c r8   c                   \        V \        4      '       d&   V R \        V 4      P                   2p\	        V4      h\        V \
        4      '       d   T pMH\        V \        4      '       d    \        V 4      pM%V R \        V 4      P                   2p\	        V4      hV^8  d   V RV 2p\	        V4      hV#   \         d   pT R T : 2p\	        T4      ThRp?ii ; i)z must be an integer, got Nz must be at least 1, got )r   ru   r   rL   r)   r   ri   r   )r}   r~   r   resultr   s   &&   r6   _parse_max_concurrencyr   [  s     %0e1E1E0FG$$%	E3			2ZF
 0e1E1E0FG$$z09$$M  	2G4UI>C#C(c1	2s   ,B8 8CCCc                    V ^8  d   QhRRRR/# )r2   callzCallable[[], Any]r3   r
   r4   )r5   s   "r6   r7   r7   r  s     3 3% 3# 3r8   c                b     V ! 4       #   \          d   p\        \        T4      4      ThRp?ii ; i)a  Run a ``config.py`` parse helper, re-typing its error for the registry.

The registry rows reuse the single-environment parsers in
:mod:`nab_python.config` verbatim, so the value and every validation
message are identical to the pyproject parse path.  Those helpers raise
:class:`config.ConfigError`; the registry contract is
:class:`SourceConfigError`, and the CLI and loader catch only the latter.
Re-raise with the same message so behaviour is preserved and the error is
caught by the ladder.
N)r"   r)   ri   )r   r   s   & r6   	_delegater   r  s/    3v 3C)s23s   	 .).c               $    V ^8  d   QhRRRRRR/# r   r4   )r5   s   "r6   r7   r7     s!     + +s +3 +3 +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )   )_parse_modec                    < S ! S4      # r   r4   _implr}   s   r6   <lambda>_parse_mode.<locals>.<lambda>  	    U5\r8   )configr   r   r}   r~   r   s   f&@r6   r   r     s     	,)**r8   c               $    V ^8  d   QhRRRRRR/# r2   r}   r
   r~   ri   r3   rm   r4   )r5   s   "r6   r7   r7     s!     + +# +c +j +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_requires_pythonc                    < S ! S4      # r   r4   r   s   r6   r   (_parse_requires_python.<locals>.<lambda>  r   r8   )r   r   r   r   s   f&@r6   r   r          )**r8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   ztuple[DistPolicy, bool]r4   )r5   s   "r6   r7   r7     s"     + +c +# +2I +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_dist_policy_globalc                    < S ! S4      # r   r4   r   s   r6   r   $_parse_dist_policy.<locals>.<lambda>  r   r8   )r   r   r   r   s   f&@r6   _parse_dist_policyr     s     	 )**r8   c               $    V ^8  d   QhRRRRRR/# r   r4   )r5   s   "r6   r7   r7     s!      s 3 3 r8   c                    \        V \        4      '       g   \        V \        4      '       d   V ^ 8  d   V RV : 2p\        V4      hV # )    zI must be a non-negative integer number of nested build environments, got )r   ru   r   r)   r   s   && r6   _parse_build_requires_depthr     sL    %j&<&<	g ""', 	  $$Lr8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   r   r4   )r5   s   "r6   r7   r7     s!     	 	s 	3 	; 	r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   _parse_enumc                 >   < S ! R S\         \         P                  4      # )build-policy)r   BUILD_LOCALr   s   r6   r   %_parse_build_policy.<locals>.<lambda>  s    ne[+:Q:QRr8   r   r   r   r   s   f&@r6   _parse_build_policyr     s     	,R r8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   r   r4   )r5   s   "r6   r7   r7     s!       S ] r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   r   c                 >   < S ! R S\         \         P                  4      # )decision-order)r   ARRIVALr   s   r6   r   '_parse_decision_order.<locals>.<lambda>  s    &}m>S>STr8   r   r   s   f&@r6   _parse_decision_orderr     s    ,T r8   c               $    V ^8  d   QhRRRRRR/# r   r4   )r5   s   "r6   r7   r7     s&     E EC E E Er8   c                   a a ?^RI Hp ^RI Ho \        S \        4      '       d@   VP                  S 4      '       d)   \        P                  4       e   \        VV 3R l4      # S # \        VV 3R l4      # )ag  Parse ``uploaded-prior-to`` without re-anchoring relative durations.

A ``P<n>D`` duration anchors to the lock at resolve time
(config._parse_uploaded_prior_to threads the lockfile anchor); the
registry merely gates/displays the key and must not silently
re-anchor it to ``now``.  So a relative duration is carried as its
raw string (the cross-file conflict check compares the raw strings, so
identical durations match and different ones conflict), and only an
absolute datetime is normalised through the shared parser.  The real
resolve still parses the value with the proper anchor via
``read_pyproject_config``.
)_DURATION_PATTERN)_parse_uploaded_prior_toc                 (   < S ! S\        4       R 7      # r=   r?   r   s   r6   r   *_parse_uploaded_prior_to.<locals>.<lambda>  s    U59J%Kr8   c                 (   < S ! S\        4       R 7      # r   r   r   s   r6   r   r     s    U51BCr8   )	r   r   r   r   ri   matchr,   r:   r   )r}   r~   r   r   s   f& @r6   r   r     s`     	) %"3"9"9%"@"@
  ,KLL CDDr8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   Mapping[str, str]r4   )r5   s   "r6   r7   r7     s"     	+ 	+S 	+ 	+9J 	+r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_marker_environmentc                    < S ! S4      # r   r4   r   s   r6   r   +_parse_marker_environment.<locals>.<lambda>  r   r8   )r   r   r   r   s   f&@r6   r   r          	 )**r8   c               $    V ^8  d   QhRRRRRR/# r2   r}   r
   r~   ri   r3   Mapping[str, Any]r4   )r5   s   "r6   r7   r7     s"     
+ 
+c 
+# 
+2C 
+r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_environmentc                    < S ! S4      # r   r4   r   s   r6   r   $_parse_environment.<locals>.<lambda>  r   r8   )r   r   r   r   s   f&@r6   r   r     s    
 	 )**r8   c               $    V ^8  d   QhRRRRRR/# r   r4   )r5   s   "r6   r7   r7     s!     + +c +# +# +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )
_parse_vcsc                    < S ! S4      # r   r4   r   s   r6   r   _parse_vcs.<locals>.<lambda>   r   r8   )r   r   r   r   s   f&@r6   r   r     s     	+)**r8   c               $    V ^8  d   QhRRRRRR/# r   r4   )r5   s   "r6   r7   r7     s!     + +C + + +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_workspacec                    < S ! S4      # r   r4   r   s   r6   r   "_parse_workspace.<locals>.<lambda>  r   r8   )r   r  r   r   s   f&@r6   r  r        
 	1)**r8   c               $    V ^8  d   QhRRRRRR/# r2   r}   r
   r~   ri   r3   ztuple[str, ...]r4   )r5   s   "r6   r7   r7     s!     	+ 	+c 	+# 	+/ 	+r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_constraintsc                    < S ! S4      # r   r4   r   s   r6   r   $_parse_constraints.<locals>.<lambda>  r   r8   )r   r  r   r   s   f&@r6   r  r    r   r8   c               $    V ^8  d   QhRRRRRR/# r  r4   )r5   s   "r6   r7   r7     s!     = = =S =_ =r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_string_listc                    < S ! R S4      # )default-groupsr4   r   s   r6   r   '_parse_default_groups.<locals>.<lambda>%  s    U#3U;r8   )r   r  r   r   s   f&@r6   _parse_default_groupsr    s     	 ;<<r8   c               $    V ^8  d   QhRRRRRR/# r   r4   )r5   s   "r6   r7   r7   (  s!     + +S + + +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_base_groupc                    < S ! S4      # r   r4   r   s   r6   r   #_parse_base_group.<locals>.<lambda>.  r   r8   )r   r  r   r   s   f&@r6   r  r  (  r   r8   c               $    V ^8  d   QhRRRRRR/# r   r4   )r5   s   "r6   r7   r7   1  s!     + +c +# +* +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_build_groupc                    < S ! S4      # r   r4   r   s   r6   r   $_parse_build_group.<locals>.<lambda>7  r   r8   )r   r  r   r   s   f&@r6   r  r  1  r   r8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   ztuple[IndexConfig, ...]r4   )r5   s   "r6   r7   r7   :  s"     + +# +c +.E +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_indexesc                    < S ! S4      # r   r4   r   s   r6   r    _parse_indexes.<locals>.<lambda>@  r   r8   )r   r  r   r   s   f&@r6   r  r  :  s     	/)**r8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   ztuple[LocalSource, ...]r4   )r5   s   "r6   r7   r7   C  s'     C C CC C4K Cr8   c                L   a aa ?^RI Ho \        4       o\        VVV 3R l4      # )r   )_parse_local_sourcesc                    < S ! SSR 7      # ))pyproject_dirr4   )r   base_dirr}   s   r6   r   &_parse_local_sources.<locals>.<lambda>N  s    U5Ar8   )r   r#  _declaring_dirr   )r}   r~   r   r&  s   f&@@r6   r#  r#  C  s#    
 	 HABBr8   c                   V ^8  d   QhRR/# )r2   r3   r   r4   )r5   s   "r6   r7   r7   Q  s       r8   c                 P    \         P                  4       p V f   Rp\        V4      hV # )Nz2local-sources parsed without a declaring directory)r.   r:   r)   )baser   s     r6   r(  r(  Q  s,     D|B$$Kr8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   ztuple[VcsSource, ...]r4   )r5   s   "r6   r7   r7   \  s"     + +c +# +2G +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_vcs_sourcesc                    < S ! S4      # r   r4   r   s   r6   r   $_parse_vcs_sources.<locals>.<lambda>c  r   r8   )r   r.  r   r   s   f&@r6   r.  r.  \       )**r8   c               $    V ^8  d   QhRRRRRR/# )r2   r}   r
   r~   ri   r3   ztuple[ArchiveSource, ...]r4   )r5   s   "r6   r7   r7   f  s"     + +# +c +6O +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_archive_sourcesc                    < S ! S4      # r   r4   r   s   r6   r   (_parse_archive_sources.<locals>.<lambda>m  r   r8   )r   r4  r   r   s   f&@r6   r4  r4  f  r1  r8   c                   V ^8  d   QhRR/# r1   r4   )r5   s   "r6   r7   r7   p  s     & &( &r8   c                     \         P                  4       p V e   V # \        P                  4       pVe   V# \        P                  ! \
        P                  4      # r   )r,   r:   r/   r   r;   r   r<   )resolve	inspectors     r6   _override_anchorr;  p  sJ     !!#G!%%'I<<%%r8   c               $    V ^8  d   QhRRRRRR/# r2   r}   r
   r~   ri   r3   tuple[Any, ...]r4   )r5   s   "r6   r7   r7     s!      3 s  r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_packages_sugarc                 :   < \        S ! S\        4       R 7      4      # r   _checked_overridesr;  r   s   r6   r   !_parse_packages.<locals>.<lambda>      "57G7I#JKr8   )r   r@  r   r   s   f&@r6   _parse_packagesrF         K r8   c               $    V ^8  d   QhRRRRRR/# r=  r4   )r5   s   "r6   r7   r7     s!       C O r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_package_rulesc                 :   < \        S ! S\        4       R 7      4      # r   rB  r   s   r6   r   &_parse_package_rules.<locals>.<lambda>  rE  r8   )r   rJ  r   r   s   f&@r6   rJ  rJ    rG  r8   c                    V ^8  d   QhRRRR/# )r2   	overrideszIterable[Any]r3   r>  r4   )r5   s   "r6   r7   r7     s      - O r8   c                8    ^RI Hp \        V 4      pV! V4       V# )a  Reject a same-field overlap among one surface's desugared overrides.

The cross-surface packages-vs-package-rules overlap needs both rows
merged, so it runs on the resolve path; this is the within-surface half,
run here so ``nab config`` refuses the same file the resolve refuses.
)_check_package_override_overlap)r   rP  tuple)rN  _checkbuilts   &  r6   rC  rC    s     )E
5MLr8   c               $    V ^8  d   QhRRRRRR/# r   r4   )r5   s   "r6   r7   r7     s'     
F 
F# 
Fc 
F6G 
Fr8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_index_overridesc                 (   < S ! S\        4       R 7      # r   )r;  r   s   r6   r   (_parse_index_overrides.<locals>.<lambda>  s    U51A1CDr8   )r   rV  r   r   s   f&@r6   rV  rV    s    
 	 DEEr8   c               $    V ^8  d   QhRRRRRR/# r=  r4   )r5   s   "r6   r7   r7     s!     + +C + + +r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_conflictsc                    < S ! S4      # r   r4   r   s   r6   r   "_parse_conflicts.<locals>.<lambda>  r   r8   )r   r[  r   r   s   f&@r6   r[  r[    r  r8   c               $    V ^8  d   QhRRRRRR/# r   r4   )r5   s   "r6   r7   r7     s!     	+ 	+ 	+S 	+S 	+r8   c                4   a a ?^RI Ho \        VV 3R l4      # )r   )_parse_matrixc                    < S ! S4      # r   r4   r   s   r6   r   _parse_matrix.<locals>.<lambda>  r   r8   )r   r`  r   r   s   f&@r6   r`  r`    s     	.)**r8   c                    V ^8  d   QhRRRR/# r2   r}   zSequence[Any]r3   ri   r4   )r5   s   "r6   r7   r7     s     . .] .s .r8   c                F    V '       g   R # RP                  R V  4       4      # )<none>z; c              3  8   "   T F  p\        V4      x  K  	  R # 5ir   ri   )r   css   & r6   r   $_render_conflicts.<locals>.<genexpr>  s     -uSWWur   joinr   s   &r6   _render_conflictsrm    s    99-u---r8   c                    V ^8  d   QhRRRR/# r2   r}   r
   r3   ri   r4   )r5   s   "r6   r7   r7     s     ; ;# ;# ;r8   c                    V f   R# V P                    Uu. uF  qP                  NK  	  ppRV P                   RV 2# u upi )Nrf  zpython=z, platforms=)	platformslabelpython)r}   prq  s   &  r6   _render_matrixru    s@    }"'//2/Q/I2U\\N,yk:: 3s   =c                    V ^8  d   QhRRRR/# rd  r4   )r5   s   "r6   r7   r7     s     8 8] 8s 8r8   c                F    V '       g   R # RP                  R V  4       4      # )rf  , c              3  L   "   T F  p\        VP                  4      x  K  	  R # 5ir   )ri   requirementr   os   & r6   r   ,_render_package_overrides.<locals>.<genexpr>  s     7AS''s   "$rk  r   s   &r6   _render_package_overridesr~    s    997777r8   c                    V ^8  d   QhRRRR/# r2   r}   r   r3   ri   r4   )r5   s   "r6   r7   r7     s     $ $#4 $ $r8   c                J    V '       g   R # RP                  \        V 4      4      # rf  rx  )rl  r   r   s   &r6   _render_index_overridesr    s    99VE]##r8   c                    V ^8  d   QhRRRR/# )r2   r}   zSequence[IndexConfig]r3   ri   r4   )r5   s   "r6   r7   r7     s     O O3 O Or8   c                F    V '       g   R # RP                  R V  4       4      # )rf  rx  c              3  l   "   T F*  qP                    R VP                   \        V4       2x  K,  	  R# 5i=N)nameurl_render_index_pin)r   is   & r6   r   %_render_index_list.<locals>.<genexpr>  s,     N1xq(9!(<'=>s   24rk  r   s   &r6   _render_index_listr    s    99NNNNr8   c                    V ^8  d   QhRRRR/# )r2   indexr   r3   ri   r4   )r5   s   "r6   r7   r7     s     9 9[ 9S 9r8   c                t    V P                   \        P                  J d   R # RV P                   P                   2# ) z serialization=)serializationr   	NEGOTIATEr}   )r  s   &r6   r  r    s4    1;;;U0066788r8   c                    V ^8  d   QhRRRR/# )r2   r}   zSequence[LocalSource]r3   ri   r4   )r5   s   "r6   r7   r7     s     : :!6 :3 :r8   c                F    V '       g   R # RP                  R V  4       4      # )rf  rx  c              3  V   "   T F  qP                    R VP                   2x  K!  	  R# 5i@N)r  pathr   s   & r6   r   (_render_local_sources.<locals>.<genexpr>  s!     95axq)5   ')rk  r   s   &r6   _render_local_sourcesr    s    9995999r8   c                    V ^8  d   QhRRRR/# )r2   r}   zSequence[VcsSource]r3   ri   r4   )r5   s   "r6   r7   r7     s     9 92 9s 9r8   c                F    V '       g   R # RP                  R V  4       4      # )rf  rx  c              3  V   "   T F  qP                    R VP                   2x  K!  	  R# 5ir  r  r  r   s   & r6   r   &_render_vcs_sources.<locals>.<genexpr>   !     8%Qxq(%r  rk  r   s   &r6   _render_vcs_sourcesr        998%888r8   c                    V ^8  d   QhRRRR/# )r2   r}   zSequence[ArchiveSource]r3   ri   r4   )r5   s   "r6   r7   r7     s     9 9#: 9s 9r8   c                F    V '       g   R # RP                  R V  4       4      # )rf  rx  c              3  V   "   T F  qP                    R VP                   2x  K!  	  R# 5ir  r  r   s   & r6   r   *_render_archive_sources.<locals>.<genexpr>  r  r  rk  r   s   &r6   _render_archive_sourcesr    r  r8   c                    V ^8  d   QhRRRR/# )r2   r}   zSequence[str]r3   ri   r4   )r5   s   "r6   r7   r7   	  s     7 7 7# 7r8   c                8    V '       g   R # RP                  V 4      # r  rk  r   s   &r6   _render_string_tupler  	  s     86dii&66r8   c                    V ^8  d   QhRRRR/# )r2   r}   r   r3   ri   r4   )r5   s   "r6   r7   r7     s     C C&7 CC Cr8   c                t    V '       g   R # RP                  R \        V P                  4       4       4       4      # )rf  rx  c              3  4   "   T F  w  rV R V 2x  K  	  R# 5ir  r4   r   kvs   &  r6   r   -_render_marker_environment.<locals>.<genexpr>  s     B,ADAs!A3Z,As   rl  r   itemsr   s   &r6   _render_marker_environmentr    s(    99BF5;;=,ABBBr8   c                    V ^8  d   QhRRRR/# r  r4   )r5   s   "r6   r7   r7     s      0 S r8   c                t    V '       g   R # RP                  R \        V P                  4       4       4       4      # )z<host>rx  c              3  F   "   T F  w  rV R \        V4       2x  K  	  R# 5ir  )_render_environment_axisr  s   &  r6   r   &_render_environment.<locals>.<genexpr>  s(      9N1#Q'*+,9Ns   !r  r   s   &r6   _render_environmentr    s1    99 9?9N  r8   c                    V ^8  d   QhRRRR/# ro  r4   )r5   s   "r6   r7   r7     s     D DC DC Dr8   c                    \        V \        4      '       g   \        V 4      # RP                  R \	        V P                  4       4       4       4      pV R,          pV'       d	   V RV R2# \        V4      # )z?Render one axis, the platform table as ``id[knob=value, ...]``.rx  c              3  F   "   T F  w  rVR 8w  g   K  V RV 2x  K  	  R# 5i)idr  Nr4   r  s   &  r6   r   +_render_environment_axis.<locals>.<genexpr>  s&     P-BTQa4ij1QCj-Bs   !!r  [])r   dictri   rl  r   r  )r}   knobsplatform_ids   &  r6   r  r    s`    eT""5zIIPVEKKM-BPPE+K(-k]!E7!$C3{3CCr8   c                    V ^8  d   QhRRRR/# ro  r4   )r5   s   "r6   r7   r7   $  s      s s r8   c                   R V P                   P                   2.pV P                  '       d(   VP                  R\	        V P                  4       24       V P
                  '       d(   VP                  R\        V P
                  4       24       V P                  '       g   VP                  R4       RP                  V4      # )zpolicy=zallowed-schemes=zallowed-repos=zrequire-pin=falserx  )	policyr}   allowed_schemesappendr   allowed_reposr   require_pinrl  )r}   partss   & r6   _render_vcsr  $  s    u||))*+,E'u/D/D(E'FGH~d5+>+>&?%@AB()99Ur8   c                    V ^8  d   QhRRRR/# ro  r4   )r5   s   "r6   r7   r7   /  s     , ,S ,S ,r8   c                >    V f   R# R\        V P                  4       2# )Nrf  zmembers=)r   membersr   s   &r6   _render_workspacer  /  s!    }d5==)*++r8   c                    V ^8  d   QhRRRR/# ro  r4   )r5   s   "r6   r7   r7   5  s     5 5S 5S 5r8   c                $    V f   R# \        V 4      # Nrf  rh  r   s   &r6   _render_uploaded_prior_tor  5  s    }84#e*4r8   c                    V ^8  d   QhRRRR/# ro  r4   )r5   s   "r6   r7   r7   9  s     P Ps Ps Pr8   c                P    V w  rV'       d   VP                    R 2# VP                   # )z (trust-unverified-deps)r   )r}   r  trusts   &  r6   _render_dist_policyr  9  s(     MF8=fll^34O6<<Or8   r   _EMPTY_MAPPING
resolutionzenum(|c              #  8   "   T F  qP                   x  K  	  R # 5ir   r   r   s   & r6   r   r   J  s     #H5GGG5Gr   )z--project-resolutionproject_resolutionc                    V P                   # r   r   r  s   &r6   r   r   P      r8   )	rj   rk   rl   r-   rn   ro   rp   rq   rr   r   c              #  8   "   T F  qP                   x  K  	  R # 5ir   r   r{  s   & r6   r   r   U  s     #C]GG]r   z--project-decision-orderproject_decision_orderc                    V P                   # r   r   r  s   &r6   r   r   [  r  r8   modec              #  8   "   T F  qP                   x  K  	  R # 5ir   r   )r   ms   & r6   r   r   `       #A[GG[r   z--project-modeproject_modec                    V P                   # r   r   r  s   &r6   r   r   f  r  r8   constraintszlist(requirement)z--project-constraintproject_constraintr  zlist(group)z--project-default-groupproject_default_groupz
base-groupgroupz--project-base-groupproject_base_groupc                    V f   R# T # r  r4   r  s   &r6   r   r         QY5A5r8   zbuild-groupz--project-build-groupproject_build_groupc                    V f   R# T # r  r4   r  s   &r6   r   r     r  r8   zrequires-python	specifierz--project-requires-pythonproject_requires_pythonc                    V f   R# T # r  r4   r  s   &r6   r   r     r  r8   zuploaded-prior-tozdatetime|PnDz--project-uploaded-prior-toproject_uploaded_prior_tozdist-policyc              #  8   "   T F  qP                   x  K  	  R # 5ir   r   r   rt  s   & r6   r   r     s     #@ZGGZr   Fz--project-dist-policyproject_dist_policyr   c              #  8   "   T F  qP                   x  K  	  R # 5ir   r   r  s   & r6   r   r     r  r   z--project-build-policyproject_build_policyc                    V P                   # r   r   r  s   &r6   r   r     r  r8   zbuild-requires-depthr   z--project-build-requires-depthproject_build_requires_depthenvironmentz-table(python,platform[,knobs],implementation)zmarker-environmentz"table(marker-var=str) [deprecated]vcsztable(vcs-policy)	workspaceztable(members)indexesz'array-of-tables(name,url,serialization)zlocal-sourceszarray-of-tables(name,path)zvcs-sourceszarray-of-tables(name,url)zarchive-sourcespackagesztable(package-override)zpackage-ruleszarray-of-tables(match,policy)r  ztable(index-override)	conflictszarray-of-tables(members,policy)matrixztable(python,platforms)offlineru   NAB_OFFLINEz	--offlinec                    V '       d   R # R# )r   r   r4   r  s   &r6   r   r   c  s    11'1r8   z	cache-dirr  NAB_CACHE_DIRz--cache-dir	cache_dirc                $    V f   R# \        V 4      # )Nz
<computed>rh  r  s   &r6   r   r   n  s    >A>r8   zhttp-backendNAB_HTTP_BACKENDz--http-backendhttp_backendzmax-concurrencyNAB_MAX_CONCURRENCYz--max-concurrencymax_concurrencyztuple[OptionSpec, ...]dict[str, OptionSpec]_BY_KEYc                   V ^8  d   QhRR/# )r2   r3   zfrozenset[str]r4   )r5   s   "r6   r7   r7     s     
 
 
r8   c                 .    \        R \         4       4      # )a1  Registry keys a pyproject ``[tool.nab]`` table may legitimately carry.

Only PROJECT-scope registry options are allowed in pyproject; the
single-environment parser (:mod:`nab_python.config`) folds this set
into its own known-keys so a registry key is not double-reported as
an unknown ``[tool.nab]`` key.
c              3     "   T F7  qP                  \        P                  4      '       g   K)  VP                  x  K9  	  R # 5ir   )ry   r*   r`   rj   )r   specs   & r6   r   *pyproject_registry_keys.<locals>.<genexpr>  s*      $T(<(<Z=Q=Q(RWs
   &AA)	frozensetr!   r4   r8   r6   pyproject_registry_keysr    s      $  r8   c                    V ^8  d   QhRRRR/# )r2   rawr   r3   Noner4   )r5   s   "r6   r7   r7     s     ) )'8 )T )r8   c                    V  Fo  p\         P                  V4      pVf   K  VP                  \        P                  4      '       d   KE  \        V\        P                  4      pV RV 2p\        V4      h	  R# )au  Raise the category error for any USER registry key in ``[tool.nab]``.

The parser fold: a USER-scope option (e.g. ``offline``,
``cache-dir``) set in pyproject ``[tool.nab]`` must surface the
registry category error (``pyproject [tool.nab]`` is project-scope
only) rather than the generic unknown-key error the pyproject
parser would otherwise raise.  PROJECT keys and keys the registry
does not own are left for the pyproject parser to handle.

The message carries no ``[tool.nab]:`` prefix: the only caller is the
pyproject parser, whose ``error: in [tool.nab]:`` wrapper already
supplies it, so prefixing here would double it.
N: )r  r:   ry   r*   r`   _gate_reasonr)   )r  rj   r  reasonr   s   &    r6   reject_user_keys_in_pyprojectr$    sh     {{3<##J$8$899!$
(<(<=FEF8$C#C(( r8   c                  R    ] tR tRt$ RtR]R&   R]R&   ]R R l4       tR	 R
 ltRt	R# )r&   i  z<Where a value came from: a source kind plus a display label.r*   rt   ri   rr  c                   V ^8  d   QhRR/# )r2   r3   ri   r4   )r5   s   "r6   r7   Origin.__annotate__  s     ' 's 'r8   c                ,    \        V P                  4      # )zThe provenance scope name shown by ``nab config``.

Mirrors the source kind's value for every kind except
``PYPROJECT``, which reports "project" (it sits at the project
precedence level alongside the project-dir nab.toml).
)_scope_labelrt   )rx   s   &r6   rk   Origin.scope  s     DII&&r8   c                    V ^8  d   QhRRRR/# )r2   otherr&   r3   ru   r4   )r5   s   "r6   r7   r'    s     @ @f @ @r8   c                `    \         V P                  ,          \         VP                  ,          8  # )zWhether this origin sits at a strictly higher precedence level.

A tie is not an outranking: ``PYPROJECT`` and ``PROJECT_TOML``
share a rank, so neither overrides the other here.
)rd   rt   )rx   r,  s   &&r6   outranksOrigin.outranks  s!     499%EJJ(???r8   r4   N)
rL   rM   rN   rO   rP   r{   propertyrk   r.  rQ   r4   r8   r6   r&   r&     s.    F
J' '@ @r8   c                    V ^8  d   QhRRRR/# )r2   rt   r*   r3   ri   r4   )r5   s   "r6   r7   r7     s     E Ez Ec Er8   c                F    V \         P                  J d   R# V P                  # )aL  Return the scope name ``nab config`` reports for a source kind.

Distinct from Scope (PROJECT/USER, the gate axis): provenance reports
the source, so a project nab.toml reports "project", env reports
"env", etc.  Every kind reports its own value except PYPROJECT, which
shares the project precedence level and so reports "project".
rT   )r*   r`   r}   )rt   s   &r6   r)  r)    s      
 4 449D$**Dr8   c                  0    ] tR tRt$ RtR]R&   R]R&   RtR# )	r$   i  z<A set of (key -> value) bindings discovered from one source.r&   originr   valuesr4   NrL   rM   rN   rO   rP   r{   rQ   r4   r8   r6   r$   r$     s    FNr8   c                  :    ] tR tRt$ RtR]R&   R]R&   R]R&   RtR	# )
r'   i  al  A source refused by the registry: a key outside its scope, or unknown.

Captured (not raised) by :func:`discover_layers` for the TOML sources and
:func:`read_env_layer` for the ``NAB_*`` ones, only when the caller asks
to collect rejections for ``nab config --include-rejected``.  The normal
load path raises :class:`SourceConfigError` for TOML and warns for env.
r&   r4  ri   rj   r#  r4   Nr6  r4   r8   r6   r'   r'     s     N	HKr8   c                  R    ] tR tRt$ RtR]R&   R]R&   R]R&   R	]R
&   RtR]R&   RtR# )r#   i  z8One option's winning value plus its full shadowed stack.r%   r  r
   r}   r&   r4  ztuple[tuple[Origin, Any], ...]stacktuple[RejectedLayer, ...]rejectedr4   N)rL   rM   rN   rO   rP   r{   r;  rQ   r4   r8   r6   r#   r#     s(    B
JN *)*,H',r8   c                  T    ] tR tRt$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R&   R	t
R# )
r+   i  aQ  Injectable search roots so config discovery is hermetic in tests.

``system_toml`` and ``user_toml`` point at the system/user
``nab.toml`` files.  ``project_dir`` is the directory holding the
pyproject; the project ``nab.toml`` is looked up beside it.
``pyproject`` names the pyproject file itself when the user pointed at
a non-default name; left ``None`` it defaults to
``project_dir / "pyproject.toml"`` so the registry reads the same file
the rest of nab does.  Any field may be ``None`` to skip that source.
There is no walk-up: the project source is the directory of the
pyproject only.
NzPath | Nonesystem_toml	user_tomlproject_dirrZ   r4   )rL   rM   rN   rO   rP   r=  r{   r>  r?  rZ   rQ   r4   r8   r6   r+   r+     s1      $K#!I{!#K#!I{!r8   
rejectionsc               (    V ^8  d   QhRRRRRRRR/# )	r2   r  r   rt   r*   r@  list[RejectedLayer] | Noner3   r$   r4   )r5   s   "r6   r7   r7     s0     3! 3!
3!
3! +	3!
 3!r8   c                  \        W4      p\        V\        V 4      4      p/ p\        P	                  V P
                  4      p VP                  4        F  w  rx\        P                  V4      p	V	fI   \        \        4      p
V  RV: RV
: R2pVe   VP                  \        WGV4      4       K[  \        V4      hV  RV 2pV	P                  V4      '       g?   \        W4      pVe   VP                  \        WGV4      4       K  V RV 2p\        V4      hV	P                  W4      WW&   K  	  \        P!                  V4       \#        WE4      #   \        P!                  T4       i ; i)a  Read one TOML source into a :class:`Layer`, gating by category.

``kind`` selects how the file is read: a ``PYPROJECT`` source reads
``[tool.nab]``; the standalone ``nab.toml`` sources read top-level
keys.  Every registry key is parsed by its row.  A key that names an
option not allowed in ``kind`` (the category gate) raises
:class:`SourceConfigError`, unless ``rejections`` is supplied, in which
case it is appended there and skipped (for ``--include-rejected``).
r!  z0 is not a valid nab setting; the known keys are .)_read_raw_tabler&   ri   r.   rC   parentr  r  r:   r   r  r'   r)   ry   r"  rq   rD   r$   )r  rt   r@  r  r4  r5  rE   rj   r}   r  r   r   r~   r#  s   &&$           r6   _load_toml_layerrG    s[    $
%CD#d)$FF t{{+E$))+JC;;s#D| wfBsg &!!&	,  )%%mF&EF',,fBse$E''--%d1)%%mF&HIr&*',,**U2FK5 &8 	U#   	U#s   BE AE E#c               $    V ^8  d   QhRRRRRR/# )r2   r  r%   rt   r*   r3   ri   r4   )r5   s   "r6   r7   r7   D  s!      z   r8   c                    V\         P                  J d   R pMR\        V4       R2pV P                  : RV P                  P
                   RV 2# )z)pyproject [tool.nab] (project-scope only)za z	 nab.toml is a z#-scope option and cannot be set in )r*   r`   r)  rj   rk   r}   )r  rt   r~   s   && r6   r"  r"  D  sW    z###;\$'(	288,fTZZ--. /g	r8   c               $    V ^8  d   QhRRRRRR/# )r2   r  r   rt   r*   r3   r   r4   )r5   s   "r6   r7   r7   O  s"      $ j 5F r8   c                    V P                  R 4      ;_uu_ 4       p\        P                  ! V4      pRRR4       T\        P                  J dI   \        X4      p\        T\        4      '       g&   T  R\        T4      P                   2p\        T4      hT# X#   + '       g   i     Ln; i  \        \        P                  3 d   pT  RT 2p\        T4      ThRp?i\         d   pRT  RT 2p\        T4      ThRp?ii ; i)rbNz is not valid TOML: zcannot read r!  z": [tool.nab] must be a table, got )opentomliloadUnicodeDecodeErrorTOMLDecodeErrorr)   OSErrorr*   r`   r   r   r  r   rL   )r  rt   fdatar   r   sections   &&     r6   rE  rE  O  s    .YYt__::a=D  z###"4('4((F<T']=S=S<TUC#C((K _ 5 56 .*3%0$#- .TF"SE*$#-.sE   B+ BB+ B(	#B+ (B+ +D CD &D 'C;;D reserved_envc               (    V ^8  d   QhRRRRRRRR/# )	r2   environr   rW  Iterable[str]r@  rB  r3   r$   r4   )r5   s   "r6   r7   r7   d  s2     8 88  8 +	8
 8r8   c               Z   \        WR7       \        WVR7       / p\         Fc  pVP                  f   K  VP                  V 9  d   K&  RVP                   2pVP	                  WP                  ,          V4      W4P
                  &   Ke  	  \        \        \        P                  R4      V4      # )a  Read ``NAB_*`` for every registry row that declares an env var.

PROJECT options never declare an env var, so the env layer carries
USER options only.  A ``NAB_<KEY>`` naming a PROJECT option (e.g.
``NAB_RESOLUTION``) draws a warning from :func:`_warn_renamed_env`;
any other unknown ``NAB_*`` name (e.g. a typo) one from
:func:`_warn_unknown_env`.  Neither is applied, and neither is fatal.
``reserved_env`` names the ``NAB_*`` vars other layers own (nab's
output layer consumes ``NAB_VERBOSITY`` and ``NAB_NO_PROGRESS``), so
the guard skips them silently.  When ``rejections`` is supplied
(``nab config --include-rejected``) those env casualties are recorded
there instead of warned, mirroring the TOML loader.
r@  )rW  r@  zenv:r[   )
_warn_renamed_env_warn_unknown_envr!   rn   rq   rj   r$   r&   r*   rb   )rY  rW  r@  r5  r  r~   s   &$$   r6   read_env_layerr_  d  s    & g5gZPF<<<<w&t||n%::gll&;UCxx  
.77r8   c               (    V ^8  d   QhRRRRRRRR/# )	r2   rY  r   rW  rZ  r@  rB  r3   r  r4   )r5   s   "r6   r7   r7     s2     $# $#$#  $# +	$#
 
$#r8   c          	        \          Uu0 uF  q3P                  f   K  VP                  kK   	  pp\        \        4       4      p\        V4      pV  F  pVP	                  R4      '       d   Wt9   g   Wu9   g   Wv9   d   K.  \        V4      pV RV: R2p	Ve6   VP                  \        \        \        P                  V4      Wy4      4       K{  \        P                  RV	4       K  	  R# u upi )aO  Warn about any ``NAB_*`` var that is neither a known nor renamed name.

The env half of the category gate: a typo'd or made-up ``NAB_<KEY>``
(e.g. ``NAB_OFLINE``) is ignored with a warning naming the variable,
never applied and never fatal.  Renamed PROJECT names are left for
:func:`_warn_renamed_env`, which gives the more specific
not-env-settable message.  ``reserved_env`` names ``NAB_*`` vars owned
by other layers (the output layer's ``NAB_VERBOSITY`` and
``NAB_NO_PROGRESS``); those are skipped silently.  When ``rejections``
is supplied the var is recorded there instead of warned.
NNAB_zP is not a recognized nab setting and was ignored; the known NAB_* variables are rD  %s)r!   rn   rC   _renamed_env_names
startswithr   r  r'   r&   r*   rb   _loggerwarning)
rY  rW  r@  r  knownrenamedreservedr  r   r   s
   &$$       r6   r^  r^    s    " '.Jgd\T\\gEJ$&'G< H''}uf **/!5 	 !mF:>>4,H$TUc"!  Ks
   C&C&c                   V ^8  d   QhRR/# )r2   r3   r  r4   )r5   s   "r6   r7   r7     s      1 r8   c                     / p \          FX  pVP                  \        P                  J g   K#  RVP                  P                  4       P                  RR4      ,           pWV&   KZ  	  V # )z@Map every PROJECT row's would-be ``NAB_<KEY>`` name to its spec.rb  -_)r!   rk   r(   rV   rj   upperreplace)namesr  env_names      r6   rd  rd    sQ    #%E::& 0 8 8c BBH"(O  Lr8   c               $    V ^8  d   QhRRRRRR/# )r2   rY  r   r@  rB  r3   r  r4   )r5   s   "r6   r7   r7     s(      '  ' ' + ' 
	 'r8   c                  \        4       P                  4        F  w  r#W 9   g   K  VP                  f   RMRVP                   2pV RVP                  : RVP                  P
                   RVP                   RV R2
pVeA   VP                  \        \        \        P                  V4      VP                  V4      4       K  \        P                  R	V4       K  	  R# )
a  Warn about a ``NAB_<KEY>`` naming a PROJECT (non-env-settable) option.

The variable is ignored, never applied and never fatal.  When
``rejections`` is supplied the var is recorded there under the spec's
key (so ``explain <key> --include-rejected`` lists it) instead of
warned.
Nr  z, or override per-run with z was ignored: rJ  zG-scope option and is not env-settable.  Set it in pyproject [tool.nab].z or a project-dir nab.tomlrD  rc  )rd  r  ro   rj   rk   r}   r  r'   r&   r*   rb   rf  rg  )rY  r@  rr  r  overrider   s   &$    r6   r]  r]    s     -.446
 ==( 24==/B  *N488, 7JJ$$% &448HH: >$:Q(  %!!!&"BDHHcR OOD#&) 7r8   read_pyprojectc               (    V ^8  d   QhRRRRRRRR/# )	r2   rootsr+   r@  rB  rv  ru   r3   zlist[Layer]r4   )r5   s   "r6   r7   r7     s2     1 11 +1 	1
 1r8   c          	     n   V P                   e	   V'       g   RpM.V P                  e   V P                  pMV P                   R,          p. pV P                  \        P                  3V P
                  \        P                  3V\        P                  3V P                   f   RMV P                   R,          \        P                  3.pV Fj  w  rgVf   K  \        V4      pV\        P                  J d   K,  VP                  '       g   V R2p	\        V	4      hVP                  \        WgVR7      4       Kl  	  V# )a'  Read every present TOML source into ordered layers (low -> high).

Reads system, user, pyproject, and project-dir ``nab.toml`` in
precedence order, skipping any root that is ``None`` or whose file is
absent.  Hermetic: the caller supplies the roots, so nothing touches
the real ``~/.config``.  There is no walk-up: the project source is
the pyproject directory only.

``read_pyproject=False`` drops the pyproject layer while keeping the
project-dir ``nab.toml``, for a caller reading a USER-scope option
the category gate bars pyproject from setting.
Nzpyproject.tomlznab.tomlz! exists but is not a regular filer\  )r?  rZ   r=  r*   r^   r>  r_   r`   ra   r   r   ABSENTshould_readr)   r  rG  )
rx  r@  rv  pyproject_pathlayersplanr  rt   stater   s
   &$$       r6   discover_layersr    s   $  		$**-==F			J223	*../	--.%%-D53D3Dz3Q##	
	2D 
<4 I$$$    F;<C#C((&tjIJ  Mr8   r;  c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r2   r}  zSequence[Layer]	env_layerr$   	cli_layerr;  zSequence[RejectedLayer]r3   zdict[str, EffectiveValue]r4   )r5   s   "r6   r7   r7     s:     $ $$$ $
 &$ $r8   c          	       a
 . V OVNVNp/ p\          F  o
\        S
V4      p\        ;QJ d    . V
3R lV 4       F  NK  	  5M! V
3R lV 4       4      pV'       d   VR,          w  rM%\        \        P
                  R4      S
P                  r\        S
T	TV'       d   \        V4      MW33VR7      VS
P                  &   K  	  V# )av  Merge all layers into one effective value per registry option.

``layers`` are the discovered TOML layers (any order; ranked by
:data:`_PRECEDENCE`).  ``env_layer`` and ``cli_layer`` are the env
and CLI bindings.  Returns a ``key -> EffectiveValue`` map covering
every registry row, each carrying its winner ``(scope, origin)`` and
the full shadowed stack.  ``rejected`` (category-gate casualties) is
attached per key for ``explain --include-rejected``.

Whatever the row's type, the highest source that binds the key
supplies the whole value: a list or table from a higher source
replaces the one below rather than adding to it.
c              3  `   <"   T F#  qP                   SP                   8X  g   K  Vx  K%  	  R # 5ir   rj   )r   rr  s   & r6   r   !resolve_config.<locals>.<genexpr>$  s       JHq8IHs   .
.zbuiltin-default)r  r}   r4  r9  r;  )	r!   
_stack_forrQ  r&   r*   r]   r-   r#   rj   )r}  r  r  r;  
all_layersoutr9  rejected_for_keyr4  r}   r  s   &&&$      @r6   resolve_configr    s    ( 16090i0J%'C4, 5 JH J55 JH JJ!"IMFE":#5#57HI4<<E&"'%,vo-?%
DHH  Jr8   c               $    V ^8  d   QhRRRRRR/# )r2   r  r%   r  zIterable[Layer]r3   zlist[tuple[Origin, Any]]r4   )r5   s   "r6   r7   r7   3  s$      
"1r8   c                    V Uu. uFI  pV P                   VP                  9   g   K   VP                  VP                  V P                   ,          3NKK  	  ppVP                  R R7       \	        W4       V# u upi )a  Bindings for one option across layers, sorted low -> high.

Sorted by source precedence; the pyproject/project-dir tie is broken
so the project-dir nab.toml sorts last (wins).  Co-presence in both
project files with conflicting values is a hard error; identical
values pass.
c                    \         V ^ ,          P                  ,          V ^ ,          P                  \        P                  J 3# )r   )rd   rt   r*   ra   )items   &r6   r   _stack_for.<locals>.<lambda>E  s-    Q%GLLJ333
r8   r  )rj   r5  r4  sort_check_project_file_conflict)r  r  layerfounds   &&  r6   r  r  3  sx      E88u||# 	/u||DHH-. 
  
JJ
   !-Ls
   A6-A6c               $    V ^8  d   QhRRRRRR/# )r2   r  r%   r  zSequence[tuple[Origin, Any]]r3   r  r4   )r5   s   "r6   r7   r7   N  s$     ! !
!9!	!r8   c                   V UUu/ uF  w  r#VP                   VbK  	  ppp\        P                  V9  g   \        P                  V9  d   R# V\        P                  ,          pV\        P                  ,          pWV8X  d   R# RV P                  : RV P                  V4      : RV P                  V4      : R2p\        V4      hu uppi )a  Reject one key set differently in pyproject and the project nab.toml.

Co-presence is allowed; setting the same key to different values
across the two same-precedence project files is a hard
:class:`SourceConfigError`, not a silent last-wins.  Identical values
are fine.

Every row is compared as one whole value, lists and tables included,
so two project files declaring different constraints or different
sub-keys of one table conflict rather than combining.
Nzconfig z7 is set to conflicting values in pyproject [tool.nab] (z) and project-dir nab.toml (zh).  Both files sit at the same precedence level; set the key in only one, or set them to the same value.)rt   r*   r`   ra   rj   rr   r)   )r  r  r4  r}   by_kindpyproject_valueproject_valuer   s   &&      r6   r  r  N  s     8==umfv{{E!uG=7*j.E.EW.Tj223OJ334M'
$(( O47 8kk-03 4	  C
   >s   Cc                    V ^8  d   QhRRRR/# )r2   	effectiveMapping[str, EffectiveValue]r3   zlist[EffectiveValue]r4   )r5   s   "r6   r7   r7   p  s     5 54 59M 5r8   c                X    \          Uu. uF  qVP                  ,          NK  	  up# u upi r   )r!   rj   )r  r  s   & r6   _orderedr  p  s$    ,34GDdhhG444s   'c                    V ^8  d   QhRRRR/# )r2   r;  Iterable[RejectedLayer]r3   r:  r4   )r5   s   "r6   r7   r7   ~  s      D D%DDr8   c                Z    \         ;QJ d    . R V  4       F  NK  	  5# ! R V  4       4      # )az  Rejections that name no registry option, so attach to no key.

An unknown standalone ``nab.toml`` key or an unknown ``NAB_*`` var is
recorded with ``key`` set to the offending name, which matches no
registry key, so :func:`resolve_config` attaches it to no
:class:`EffectiveValue` and no ``explain <key>`` reaches it.  These
orphans are surfaced by :func:`render_list` instead.
c              3  R   "   T F  qP                   \        9  g   K  Vx  K  	  R # 5ir   )rj   r  r   rejs   & r6   r   $orphan_rejections.<locals>.<genexpr>  s     CGG7,Bs   '
')rQ  )r;  s   &r6   orphan_rejectionsr  ~  s&     5CC5C5CCCCr8   c               $    V ^8  d   QhRRRRRR/# )r2   r  r  r;  r  r3   ri   r4   )r5   s   "r6   r7   r7     s(     !# !#+!# &!# 		!#r8   c          
     f   RR\          2 RRR\         2 RRR\         2 R2pV.p\        V 4       F  pVP                  P                  VP                  4      pVP                  VP                  P                  R\          2 RVR\         2 RVP                  P                  R\         2 RVP                  P                   24       K  	  \        V4      pV'       d;   VP                  R4       VP                  R4       VP                  R	 V 4       4       R
P                  V4      R
,           # )a  Render every effective option: value, scope, origin.

``rejected`` (when collecting for ``--include-rejected``) adds a
trailing section listing every rejected source: a key set outside its
scope, and an unknown key or ``NAB_*`` var.  ``explain`` reaches the
former (it attaches to the named option) but not the latter (it names
no option), so ``list`` is the one place that shows both together.
rj   <r   r}   rk   z originr  z	rejected:c           	   3     "   T FW  pR VP                   P                  R\         2 RVP                   P                   R VP                   RVP
                   2x  KY  	  R# 5i)  r  r   r!  N)r4  rk   _LIST_SCOPE_Wrr  rj   r#  r  s   & r6   r   render_list.<locals>.<genexpr>  s\      
   !!!M?!231SZZ5E5E4F	CJJ<)s   AA!
)_LIST_KEY_W_LIST_VALUE_Wr  r  r  rr   r}   r  rj   r4  rk   rr  rQ  extendrl  )r  r;  headerlinesevrendereds   &$    r6   render_listr    s$    ;-
 '!M?):!;
GAm_$%W	.  HEy!77>>"((+ww{{1[M/*!HQ}o4E+F		-01299??2CE	
 " XHR[! 
  
 	

 99Ud""r8   c               $    V ^8  d   QhRRRRRR/# )r2   r  r  rj   ri   r3   r4   )r5   s   "r6   r7   r7     s"     + +6 +S +S +r8   c                p    \        W4      pVP                  P                  VP                  4      R,           # )z+Render only the effective value of ``key``.r  )_require_keyr  rr   r}   )r  rj   r  s   && r6   
render_getr    s(    	i	%B77>>"((#d**r8   include_rejectedc               (    V ^8  d   QhRRRRRRRR/# )r2   r  r  rj   ri   r  ru   r3   r4   )r5   s   "r6   r7   r7     s0     # #+#	# 	#
 	#r8   c                  \        W4      pV RVP                  P                  P                   RVP                  P                   R2.p\        VP                  4      ^,
          p\        VP                  4       F  w  pw  rxWe8X  d   RMRp	We8X  d   RMRp
VP                  P                  V4      pVP                  V	 RVP                  R\         2 RVR\         2 RV
R\         2 RVP                   2	4       K  	  V'       d#   VP                  R	 VP                   4       4       R
P!                  V4      R
,           # )a.  Render the full shadowed stack for ``key``.

The highest source is the ``winner`` and carries a ``>`` gutter;
every source it beats is ``shadowed``.  With ``include_rejected`` the
category-rejected sources (a source that tried to set ``key`` but was
not allowed) are listed too, labelled ``rejected``.
 (rx  r  >r   winnershadowedr  c              3     "   T Fa  pR VP                   P                  R\         2 RRR\         2 RRR\         2 RVP                   P
                   RVP                   R2x  Kc  	  R# 5i)r  r  r   rm  r;  r  r  N)r4  rk   r  r  _EXPLAIN_STATUS_Wrr  r#  r  s   & r6   r   !render_explain.<locals>.<genexpr>  sx      
 # !!!M?!231S=/8I4J
1.//0#**2B2B1C2cjj\QRT"s   A)A+r  )r  r  rk   r}   rl   lenr9  	enumeraterr   r  r  r  r  rr  r  r;  rl  )r  rj   r  r  r  winner_indexr  r4  r}   gutterstatusr  s   &&$         r6   render_explainr    s*    
i	%BuBrww}}**+2bgg.@.@-ACDErxx=1$L'1?F)s.J77>>%(haQ}o$56a=/@Q7Rq*++,Afll^=	
	 2  
 {{
 	

 99Ud""r8   c               $    V ^8  d   QhRRRRRR/# )r2   r  r  rj   ri   r3   r#   r4   )r5   s   "r6   r7   r7     s"      8 s ~ r8   c                x    V P                  V4      pVf%   \        \        4      pRV: RV: 2p\        V4      hV# )Nzunknown config key z; known keys are )r:   r   r  r)   )r  rj   r  r   r   s   &&   r6   r  r    sA    	s	B	zw#C7*;E9E$$Ir8   c                    V ^8  d   QhRRRR/# )r2   locals_by_paramr   r3   zdict[str, Any]r4   )r5   s   "r6   r7   r7     s      ): ~ r8   c                    / p\          FW  pVP                  f   K  WP                  ,          pVe   \        V\        4      '       d   V'       g   KI  W1VP                  &   KY  	  V# )a^  Map ``{cli_param: value}`` to a registry-keyed override dict.

Iterates :data:`OPTIONS`, reads each row's ``cli_param`` out of
``locals_by_param``, and keeps only the keys the user actually set.
An unset scalar flag is ``None`` and an unset repeatable flag is an
empty tuple (the append-action default); both are omitted so they do not
shadow the file ladder.  A file-only row (``cli_param`` is ``None``)
has no CLI flag, so it is skipped entirely.  Both the run subcommands
and ``nab config`` build their override dict through this single
helper, keyed off the registry rather than a per-option if-chain.
)r!   rp   r   rQ  rj   )r  r  r  r}   s   &   r6   build_cli_overridesr    sT     C>>!/=Zu55eDHH  Jr8   c                    V ^8  d   QhRRRR/# )r2   r5  r   r3   r$   r4   )r5   s   "r6   r7   r7     s     8 8- 8% 8r8   c                "   / pV P                  4        FV  w  r#\        V,          p\        V\        4      '       d   \	        V4      MTpVP                  VRVP                   24      W&   KX  	  \        \        \        P                  R4      V4      # )aH  Build the CLI layer from a ``{key: value}`` map of set overrides.

``values`` holds only keys the user actually set on the CLI (an
unset flag is omitted, so it does not shadow lower layers).  Each
value is normalised through its registry row so the effective value
carries the typed form regardless of how the flag was spelled.
zcli:r\   )r  r  r   rQ  r   rq   ro   r$   r&   r*   rc   )r5  parsedrj   r}   r  r  s   &     r6   build_cli_layerr    st      Flln
s| (u55d5k5jjT]]O&<= % 
.77r8   c                    V ^8  d   QhRRRR/# )r2   r  r  r3   ztuple[tuple[str, str], ...]r4   )r5   s   "r6   r7   r7   	  s      + r8   c                v   . p\          F  pVP                  \        P                  Jd   K#  WP                  ,          pVP
                  P                  \        P                  Jg   VP                  f   Km  VP                  VP                  VP                  VP                  4      34       K  	  \        V4      # )a  Return the ``(flag, value)`` pairs for PROJECT options set on the CLI.

A PROJECT option changes the resolved set, so a CLI override means the
result no longer derives from the committed files alone.  These pairs
drive both the reproducibility notice and the auditable record written
into the lockfile provenance.  A file-only row (``cli_flag`` is ``None``)
is never CLI-settable, so it cannot appear.
)r!   rk   r(   rV   rj   r4  rt   r*   rc   ro   r  rr   r}   rQ  )r  recordsr  r  s   &   r6   project_cli_override_recordsr  	  s     &(G::U]]*xx 99>>/4==3Ht{{288'<=>  >r8   produces_lockc               $    V ^8  d   QhRRRRRR/# )r2   r  r  r  ru   r3   rm   r4   )r5   s   "r6   r7   r7     s(      #  #+ #  # 	 #r8   c                   \        V 4      pV'       g   R# V'       d   RpMRpV.pVP                  R V 4       4       RP                  V4      R,           # )a  Reproducibility notice for any PROJECT option set on the CLI.

Returns a notice listing every PROJECT override that came from the CLI
rung; ``None`` when no PROJECT option was set on the CLI.

``produces_lock`` tailors the wording: ``nab lock`` produces a lock, so
the notice warns the lock will not derive from the committed files; the
read-only ``nab config`` inspector produces no lock, so it warns only
that the displayed values reflect a CLI override.
Nznotice: project-scope overrides were applied from the CLI; the lock they produce does not derive from the committed pyproject/nab.toml alone:znotice: project-scope overrides were applied from the CLI; the values below reflect that override, not the committed pyproject/nab.toml alone:c              3  6   "   T F  w  rR V RV 2x  K  	  R# 5i)r  z -> Nr4   )r   flagr  s   &  r6   r   .project_cli_override_notice.<locals>.<genexpr>>  s     I~t2dV4z*s   r  )r  r  rl  )r  r  r  r  r  s   &$   r6   project_cli_override_noticer    sZ     +95G 	) 	
 HE	LLIII99Ud""r8   )r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r  r  r  rI   r  r  r  r  r_  r$  r  r  r  rF   r  )httpxr   r4   )__conditional_annotations__rP   
__future__r   enumloggingtypes
contextlibr   contextvarsr   dataclassesr   r   r   pathlibr   typingr	   r
   rO  nab_index.multi_indexr   nab_index.serializationr   _tomlr   fetchr   r   pathsr   r   r   providerr   r   r   r   r   r   r   r   r   collections.abcr   r   r   r   r    	getLoggerrL   rf  __all__r,   r{   r.   r/   r?   rF   rI   r   r"   r)   Enumr(   r*   r]   r^   r_   r`   ra   rb   rc   rd   rV   r  rW   re   r%   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r#  r(  r.  r4  r;  rF  rJ  rC  rV  r[  r`  rm  ru  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  MappingProxyTyper  rl  HIGHESTr   SPECIFICWHEEL_OR_SDISTr   ri   r!   rj   r  r  r$  r&   r)  r$   r'   r#   r+   rG  r"  rE  r_  r^  rd  r]  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r  r  s   0@r6   <module>r     s
  6 #    % " ! '  %  - 7 # 8 = =
 
 
 OO


H
%J 0:t0,  +55Et*T' T 2<2 . 
H % % ' '$* 	 	DII  * A!!QNNANNA&" " 
MM9j22J4K4KLM	JJ				!5!5z7N7NO= 9  $d# 9  9 $ 9F!($
. &.3"+++	E@	+
+++	+=+++C++&0 
F+	+.;8$O9:997CD,5P %*$:$:2$>! > mm388#H5G#HHIK"**'& 
 mm388#C]#CCDAF%%+*# 
 mm388#A[#AAB!D$$!  
 mm&'& #
 mm *)##
 mm'&5
 mm(' 5
 mm,+$5
 mm!.-&(
 mm388#@Z#@@AC**E2(' "
 mm388#A[#AAB!D'')(! 
 "mm10)
 mmB "
  mm7')
 mm&
 mm# 
 mm</1BCE!
 mm/"$
 mm. "
 mm.$&
 mm,(
 mm2"(
 mm*$&
 mm4 
 mm,
 jj1
 jj>
 jj388N34A6"! !
 jj%$#$
k	@#	 @D
 >E!EWT((D.W!E	 E
)0 $d#@ @ $@2E $d#  $ $d#  $ $d#	- 	- $	- $d#" " $"(3! .2	3! 3!l*8 #%8 .2	8 8@$# #%$# .2	$# $#N ' .2 '  'F1 .21  	1 1h$
 )+$ $N6!D5  D!# )+!# !#H+# #	# #B.8$, #  #  #o "Fs    c