U
    bX                    @   s  d dl mZmZmZmZ d dlmZmZmZ d dl	Z	d dl
mZ d dlmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZmZ ddlmZ ddlm Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ee>Z?edZ@e1ZAe0Z0ejBe&ejCe'ejDe(iZEeddejBfddZFdd ZGG dd deHZIdS )    )absolute_importdivisionprint_functionunicode_literals)defaultdictOrderedDictdequeN)	lru_cache)DEBUG	getLogger   memoizemethod)FrozenOrderedDict)concatgroupby)tqdm)ChannelPriorityMAX_CHANNEL_PRIORITYSatSolverChoice)context)on_win)dashlisttime_recorder)ClausesPycoSatSolverPyCryptoSatSolverPySatSolverTRUEminimal_unsatisfiable_subset)toposort)CondaDependencyErrorInvalidSpecResolvePackageNotFoundUnsatisfiableError)ChannelMultiChannel)
NoarchTypePackageType	MatchSpec)PackageRecord)VersionOrderzconda.stdoutlog)maxsizec                 C   s   dd }t |  }z|| W n> tk
rZ } z td|  tjd|dd W 5 d }~X Y nX td|  |S t  D ]Z\}}z|| W n0 tk
r } ztd| | W 5 d }~X Y qtX td	|  |  S qttd
d S )Nc                 S   sV   t | d}| | h}|j|jf|  t| }||sRtd||d S )N
sat_solverz$Wrong SAT solution: {}. Required: {})	r   new_varRequireAndsetsatissubsetRuntimeErrorformat)r/   cZrequiredsolution r:   ,lib/python3.8/site-packages/conda/resolve.pytry_out_solver.   s    

z+_get_sat_solver_cls.<locals>.try_out_solverz0Could not run SAT solver through interface '%s'.zSAT interface error due to: %sT)exc_infoz Using SAT solver interface '%s'.z7Attempted SAT interface '%s' but unavailable due to: %sz*Falling back to SAT solver interface '%s'.z@Cannot run solver. No functioning SAT implementations available.)_sat_solvers	ExceptionlogZwarningdebugitemsr!   )Zsat_solver_choicer<   r/   eZsolver_choicer:   r:   r;   _get_sat_solver_cls,   s(    " 
rD   c                 C   sF   |j dkr<| |}d}|rB|d jD ]}|t|j 7 }q&n|j }|S )zSorting key to emphasize packages that have more strict
    requirements. More strict means the reduced index can be reduced
    more, so we want to consider these more constrained deps earlier in
    reducing the index.   r   )
strictnessfind_matchesdependsr*   )Zresolve_objmsprecvaluedepr:   r:   r;   exactness_and_number_of_depsK   s    

rM   c                       s  e Zd ZdaddZ fddZdbdd	ZdcddZddddZdeddZdd Z	dd Z
dd ZdfddZdgddZdd ZdhddZd d! Zed"d# Zd$d% Zee d&did'd(Zd)d* Zd+d, Zd-d. Zdjd/d0Zed1d2 Zdkd3d4Zed5d6 Zed7d8 Zd9d: Zee d&d;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dldKdLZ(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dmdWdXZ.dndYdZZ/d[d\ Z0d]d^ Z1ee d&dod_d`Z2  Z3S )pResolveFr:   c                 C   s  || _ || _|r| |ni | _tj| _tj| _t	d|
 }tt}|D ]d}dd || D }|rxtd| |||< dd || D }|D ]}	|	jD ]}
||
 |	 qqqJ|| _|| _i | _i | _i | _i | _i | _dd |D | _| j D ]\}}t|| jd	d
| j|< qd S )Nnamec                 S   s   g | ]}|j r|qS r:   )Zis_unmanageable.0rJ   r:   r:   r;   
<listcomp>i   s      z$Resolve.__init__.<locals>.<listcomp>z(restricting to unmanageable packages: %sc                 s   s   | ]}|j r|V  qd S Ntrack_featuresrP   r:   r:   r;   	<genexpr>m   s      z#Resolve.__init__.<locals>.<genexpr>c                 S   s&   h | ]}t |d r|jtjkr|qS )package_type)hasattrrW   r(   ZVIRTUAL_SYSTEMrQ   _r:   r:   r;   	<setcomp>z   s    
 z#Resolve.__init__.<locals>.<setcomp>Tkeyreverse)indexchannels_make_channel_priorities_channel_priorities_mapr   channel_priority_channel_priorityZsolver_ignore_timestamps_solver_ignore_timestampsr   valuesr   listr@   rA   rU   appendgroupstrackers_cached_find_matchesms_depends__reduced_index_cache_pool_cache_strict_channel_cache_system_precsrB   sortedversion_key)selfr_   Z	processedr`   ri   rj   rO   Zunmanageable_precsZtf_precsrJ   feature_namegroupr:   r:   r;   __init__]   s4    
zResolve.__init__c                    s   t t|  tt| jA tt| jA t| jA t| j	A ttdd | j
 D A ttdd | j D A ttdd | j D A S )Nc                 s   s   | ]\}}|t |fV  qd S rS   tuplerQ   kvr:   r:   r;   rV      s     z#Resolve.__hash__.<locals>.<genexpr>c                 s   s   | ]\}}|t |fV  qd S rS   rw   ry   r:   r:   r;   rV      s     c                 s   s   | ]\}}|t |fV  qd S rS   rw   ry   r:   r:   r;   rV      s     )superrN   __hash__hash	frozensetr`   
frozendictrb   rd   re   ri   rB   rj   rl   rs   	__class__r:   r;   r}      s    zResolve.__hash__Nc                    s`   ddl m  |d kri }n|  | fdd| j D  |r\| fdd|D  |S )Nr   make_feature_recordc                    s   i | ]} |d qS )Fr:   rQ   Zfstrr   r:   r;   
<dictcomp>   s      z*Resolve.default_filter.<locals>.<dictcomp>c                    s   i | ]} |d qS )Tr:   r   r   r:   r;   r      s      )core.subdir_datar   clearupdaterj   keys)rs   featuresfilterr:   r   r;   default_filter   s    zResolve.default_filterTc                    s:   fdd}fdd fdd||}|S )a  Tests if a package, MatchSpec, or a list of both has satisfiable
        dependencies, assuming cyclic dependencies are always valid.

        Args:
            spec_or_prec: a package record, a MatchSpec, or an iterable of these.
            filter: a dictionary of (fkey,valid) pairs, used to consider a subset
                of dependencies, and to eliminate repeated searches.
            optional: if True (default), do not enforce optional specifications
                when considering validity. If False, enforce them.

        Returns:
            True if the full set of dependencies can be satisfied; False otherwise.
            If filter is supplied and update is True, it will be updated with the
            search results.
        c                    s   t | tr| S  | S rS   
isinstancer*   spec)v_fkey_v_ms_r:   r;   v_   s    zResolve.valid.<locals>.v_c                    s&    r
| j p$tfdd| D S )Nc                 3   s   | ]} |V  qd S rS   r:   rQ   Zfkey)r   r:   r;   rV      s     z/Resolve.valid.<locals>.v_ms_.<locals>.<genexpr>optionalanyrG   )rI   )r   rs   r   r:   r;   r      s    
zResolve.valid.<locals>.v_ms_c                    sl     | }|d krhd | < z| }W n  tk
rH   d } | < Y n X tfdd|D  } | < |S )NTFc                 3   s   | ]} |V  qd S rS   r:   rQ   rI   )r   r:   r;   rV      s     z1Resolve.valid.<locals>.v_fkey_.<locals>.<genexpr>)get
ms_dependsr"   all)rJ   valrH   )r   rs   r   r:   r;   r      s    
zResolve.valid.<locals>.v_fkey_r:   )rs   spec_or_precr   r   r   resultr:   )r   r   rs   r   r   r;   valid   s
    zResolve.validc                    s:   fdd}t fdd fdd||S )Nc                    s   t | tr| S  | S d S rS   r   )Z_spec_or_prec)is_valid_precis_valid_specr:   r;   is_valid   s    
z Resolve.valid2.<locals>.is_validc                    s&   r
| j p$t fdd| D S )Nc                 3   s   | ]} |V  qd S rS   r:   )rQ   Z_prec)r   r:   r;   rV      s    z8Resolve.valid2.<locals>.is_valid_spec.<locals>.<genexpr>r   )Z_spec)r   r   rs   r:   r;   r      s    z%Resolve.valid2.<locals>.is_valid_specc                    sv     | }|d krpd | < z tfdd| D }W n  tk
rZ   d } | < Y nX |rddnd } | < | S )NFc                 3   s   | ]} |V  qd S rS   r:   r   )r   r:   r;   rV      s     z8Resolve.valid2.<locals>.is_valid_prec.<locals>.<genexpr>zinvalid dep specszinvalid depends specs)r   r   r   r"   )rJ   r   Zhas_valid_deps)
filter_outr   rs   r:   r;   r      s    
 z%Resolve.valid2.<locals>.is_valid_precr   )rs   r   r   r   r   r:   )r   r   r   r   rs   r;   valid2   s
    zResolve.valid2c                    s    fdd  |t  S )a  Constructs a set of 'dependency chains' for invalid specs.

        A dependency chain is a tuple of MatchSpec objects, starting with
        the requested spec, proceeding down the dependency tree, ending at
        a specification that cannot be satisfied.

        Args:
            spec: a package key or MatchSpec
            filter: a dictionary of (prec, valid) pairs to be used when
                testing for package validity.

        Returns:
            A tuple of tuples, empty if the MatchSpec is valid.
        c           
      3   s   | j |krd S || j  | r,d S | }d}t }|D ]>}|D ].} ||D ]}d}| f| V  q`|| qRqD|stdd |}| D ]}	| ft	|	 V  qd S )NFTc                 S   s   | j S rS   rO   xr:   r:   r;   <lambda>       z9Resolve.invalid_chains.<locals>.chains_.<locals>.<lambda>)
rO   addr   rG   r3   r   r   rf   r*   union)
r   namesprecsfoundZconflict_depsrJ   Zm2r   Zconflict_groupsru   chains_r   r   rs   r:   r;   r      s$    

z'Resolve.invalid_chains.<locals>.chains_r3   )rs   r   r   r   r:   r   r;   invalid_chains   s    zResolve.invalid_chainsc                    sl   g }g }t  }|D ](}|d}|r0|| q|| q| fdd|D  |r`t|t||fS )aO  Perform a quick verification that specs and dependencies are reasonable.

        Args:
            specs: An iterable of strings or MatchSpec objects to be tested.

        Returns:
            Nothing, but if there is a conflict, an error is thrown.

        Note that this does not attempt to resolve circular dependencies.
        rU   c                 3   s$   | ]}|j s |s|fV  qd S rS   )r   rG   rQ   r   r   r:   r;   rV     s     
z'Resolve.verify_specs.<locals>.<genexpr>)r3   get_exact_valuer   rh   extendr#   rx   )rs   specsZnon_tf_specsbad_depsfeature_namesrI   Z_feature_namesr:   r   r;   verify_specs  s    
zResolve.verify_specsc              
      s:  t  t  t  t  d}t dd |p$g D }t dd |p:g D }|D ]̉ t dkr d jdkrtdd |D std	d |D rd
d |D }|r|d }t | |t |  d @ s|d t d  d gtt|d df qF d j	drF fdd| j
D }|r*|d jnd}	|d t |	f qF d |krd}
|D ]>}|j d jkr\|d t tt|d df d}
q\|
s|d t tt d d df qFt dkst fdd|D rF|d t tt d d df qF|d r6dd |d D |d< |S )N)pythonrequest_conflict_with_historydirectvirtual_packagec                 s   s   | ]}t |V  qd S rS   r)   rY   r:   r:   r;   rV   &  s     z-Resolve._classify_bad_deps.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S rS   r)   rY   r:   r:   r;   rV   '  s     r   r   c                 s   s   | ]}|j d kV  qdS )r   Nr   rY   r:   r:   r;   rV   +  s     c                 s   s$   | ]}|d  j dkr|d  V  qdS )r   r   Nr   rY   r:   r:   r;   rV   ,  s      c                 S   s"   g | ]}|d  j dkr|d  qS )r   r   r   rY   r:   r:   r;   rR   -  s      z.Resolve._classify_bad_deps.<locals>.<listcomp>r   )target__c                    s    g | ]}|j  d  j kr|qS )r   r   rY   chainr:   r;   rR   5  s      znot availabler   Fr   Tr   c                 3   s*   | ]"}t |d ko |d  d kV  qdS )r   r   NlenrQ   r8   r   r:   r;   rV   C  s     c                 S   s.   g | ]&}|d   ds&t|d d kr|qS )r   zpython r   )
startswithr   rY   r:   r:   r;   rR   I  s     )r3   r   rO   r   rG   r   rx   strr*   r   rp   version)rs   r   specs_to_addhistory_specsstrict_channel_priorityclassesZpython_first_specsZpython_specr   Zvirtual_package_versionmatchr   r:   r   r;   _classify_bad_deps   sX    
 ($
zResolve._classify_bad_depsc                    s4   |  |}|s|S | |j t fdd|D S )Nc                 3   s   | ]}|j j kr|V  qd S rS   channelrO   rQ   fsole_source_channel_namer:   r;   rV   R  s      z3Resolve.find_matches_with_strict.<locals>.<genexpr>)rG   _get_strict_channelrO   rx   )rs   rI   r   matchesr:   r   r;   find_matches_with_strictM  s
    
z Resolve.find_matches_with_strictc                 C   sD   t jr$t jstd | |||}ni }t jtjk}t||dd S )Nzk
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.)strict)	r   unsatisfiable_hintsjsonprintbuild_conflict_maprc   r   STRICTr$   )rs   r   r   r   r   r   r:   r:   r;   find_conflictsT  s    zResolve.find_conflictsr   c                    s`  g }| |g g }g }|r\|d  d }||kr:q| | |j|krt|dkrd|   t|d t krt d |d d fd }	|	|d d< n
|   t||kot fdd|D }
t|dks|
r|S |} dd D ]}|| }qdd ||i D }|dkr$q|D ]0}t||k r(t }| | | | q(q|S )z1Return shorted path from root_spec to target_namer   r   c                 3   s   | ]}t |t  kV  qd S rS   r   rY   pathr:   r;   rV   u  s     z=Resolve.breadth_first_search_for_dep_graph.<locals>.<genexpr>c                 S   s   g | ]}|qS r:   r:   rY   r:   r:   r;   rR   {  s     z>Resolve.breadth_first_search_for_dep_graph.<locals>.<listcomp>N)	rh   poprO   r   r*   r   r   r   rg   )rs   Z	root_specZtarget_name	dep_graphZnum_targetsqueueZvisitedZtarget_pathsnodeZ	last_specZfound_all_targets	sub_graphpZchildrenZadjnew_pathr:   r   r;   "breadth_first_search_for_dep_graph_  sD    







z*Resolve.breadth_first_search_for_dep_graphc                 C   s   |i i}t  }|gg}|r|d}|}|D ]}|| }q,|d }| |}	|	D ]h}
t|
jdkrP|
jD ]N}t|}||i i || t|}|	| t|t
jkrh|	| qhqPq||fS )Nr   r   )r3   r   rG   r   rH   r*   r   r   rg   rh   r   Zunsatisfiable_hints_check_depth)rs   r   r   Zall_depsr   r   r   r   Zparent_noder   ZmatiZnew_noder   r:   r:   r;   build_graph_of_deps  s*    





zResolve.build_graph_of_depsc              
      s  t jtjk}t||pt B }tdd |D }t|dkrl| tt|}t|dkrlt| 	|d }|
dd | jD  |D ]}| |f qi }i }tt|ddt jd	}	|D ]}|	d
| |	
  | |\}
}|
|
 ||jr||j | n|g||j< |D ]2}||jrD||j | n|g||j< q qW 5 Q R X g }i }| D ]z\ }t|}t|dkr||dkr g||< n||   n. drpt fdd|D rp g||< qptt|ddt jd	}	| D ]|\}}|	dddd |D  |	
  dd |D }g }d}t|tdd |D r|fdd|D  |d d }|D ]F}||d d kr|j}|| |}| ||||}|| qn|D ]^}|| |d }| |d |||}|| t|dksBt|t|k r|}|}q|dd D ].}|| |}| ||||}|| qZqW 5 Q R X | ||||}|S )aU  Perform a deeper analysis on conflicting specifications, by attempting
        to find the common dependencies that might be the cause of conflicts.

        Args:
            specs: An iterable of strings or MatchSpec objects to be tested.
            It is assumed that the specs conflict.

        Returns:
            bad_deps: A list of lists of bad deps

        Strategy:
            If we're here, we know that the specs conflict. This could be because:
            - One spec conflicts with another; e.g.
                  ['numpy 1.5*', 'numpy >=1.6']
            - One spec conflicts with a dependency of another; e.g.
                  ['numpy 1.5*', 'scipy 0.12.0b1']
            - Each spec depends on *the same package* but in a different way; e.g.,
                  ['A', 'B'] where A depends on numpy 1.5, and B on numpy 1.6.
            Technically, all three of these cases can be boiled down to the last
            one if we treat the spec itself as one of the "dependencies". There
            might be more complex reasons for a conflict, but this code only
            considers the ones above.

            The purpose of this code, then, is to identify packages (like numpy
            above) that all of the specs depend on *but in different ways*. We
            then identify the dependency chains that lead to those packages.
        c                 S   s   g | ]}|j d s|qS )r   )rO   r   r   r:   r:   r;   rR     s      z.Resolve.build_conflict_map.<locals>.<listcomp>r   r   c                 S   s   h | ]}|  qS r:   )Zto_match_specrY   r:   r:   r;   r[     s     z-Resolve.build_conflict_map.<locals>.<setcomp>zBuilding graph of depsF)ZtotalZdescZleavedisablezExamining {}Nr   c                 3   s   | ]}|j  kr|V  qd S rS   r   rQ   s)rz   r:   r;   rV     s     
 z-Resolve.build_conflict_map.<locals>.<genexpr>zDetermining conflictszExamining conflict for {} c                 s   s   | ]}|j V  qd S rS   r   rY   r:   r:   r;   rV     s     c                 S   s   g | ]}|qS r:   r:   rY   r:   r:   r;   rR     s     c                 s   s   | ]}|j V  qd S rS   r   rY   r:   r:   r;   rV     s     c                    s   g | ]}|j  kr|qS r:   r   rY   )requested_spec_unsatr:   r;   rR     s     
 r   )r   rc   r   r   r3   r   rG   nextiterr   r   rp   _get_package_poolr   r   Zset_descriptionr7   r   r   rO   rh   rB   r   r   r   joinintersectioncountr   r   r   )rs   r   r   r   r   r   r   r   Zdep_listtZdep_graph_for_specZall_deps_for_specrL   chainsZconflicting_pkgs_pkgsr{   Zset_vrootsZnodesZlrootsZcurrent_shortest_chainZshortest_noderootZsearch_nodeZnum_occurancesr8   r   r   r   r:   )rz   r   r;   r     s    
 
$
       
   
zResolve.build_conflict_mapc                    s~   d }z j | }W nf tk
rx   | jkrttdd  j| D } fdd|D }t|d }||  } j |< Y nX |S )Nc                 s   s   | ]}|j jV  qd S rS   r   rP   r:   r:   r;   rV     s     z.Resolve._get_strict_channel.<locals>.<genexpr>c                    s   i | ]} j |d |qS r   )rb   r   )rQ   Zcnr   r:   r;   r     s      z/Resolve._get_strict_channel.<locals>.<dictcomp>r   )ro   KeyErrorri   r3   rq   )rs   package_namechannel_nameZall_channel_namesZby_cpZhighest_priorityr:   r   r;   r     s    
zResolve._get_strict_channelc                 C   s   |sdS |j |d j k S )zHprevent introduction of matchspecs that broaden our selection of choicesFr   )rF   )rs   rI   specs_by_namer:   r:   r;   _broader  s    zResolve._broaderc                 C   sV   t |}|| jkr| j| }n4| |}tdd |}dd | D }|| j|< |S )Nc                 S   s   | j S rS   r   r   r:   r:   r;   r   )  r   z+Resolve._get_package_pool.<locals>.<lambda>c                 S   s   i | ]\}}|t |qS r:   r   ry   r:   r:   r;   r   *  s      z-Resolve._get_package_pool.<locals>.<dictcomp>)r   rn   get_reduced_indexr   rB   )rs   r   ZpoolZgrouped_poolr:   r:   r;   r   #  s    


zResolve._get_package_pool)Zmodule_namec                    s  ddl m tjtjk		t|f}|jkr8j| S t	t
r`tdttdd |D  |\}}dd | D t d 
t  |rtt|fdd	d
d}t|}i |D ](}|jt t|B |j< qć 	
fddt }tdD ]J}  t|}	|	r|	 }|grP|	| n
|| q*q|rr|rri S dd fdd|D D t }
|D ]"}|
|jt |g |
|j< q|D ]}tfdd|D }	r|r|d jtfdd|D }dd |D  |D ]F}t }t |
}t!|}|D ]N}||jt }||kr|r|j"|d j"kr|#d| |||j< qX|r0|$ }|| fdd|D D ]}%|sq؈	r
|j|j&jkr||< t!|| }|D ]D}d|kr`'|t||jt s`|| n
|| q(qؐqq0qt(j|< S )Nr   r   zRetrieving packages for: %sc                 s   s   | ]}t |V  qd S rS   r   r   r:   r:   r;   rV   ;  s     z,Resolve.get_reduced_index.<locals>.<genexpr>c                 S   s   i | ]\}}||rd ndqS )Fzfeature not enabledr:   )rQ   rJ   r   r:   r:   r;   r   >  s    z-Resolve.get_reduced_index.<locals>.<dictcomp>c                    s   t  | |  fS rS   )rM   dist_strr   r   r:   r;   r   F  s     z+Resolve.get_reduced_index.<locals>.<lambda>Tr\   c                    s  t t| j}j|d}|r^r^| kr^|}|D ]}|jj|kr:d|< q: | d }}|D ]}|dsj|d7 }	| |r|r|| krd |< qjt
 }|D ]0}|jstfdd|D s|| q|rd	d
dd |D  |< qjd|< |d7 }qj||k }	|	rLtd|||f  tdd | D rd|	S |dkrrd S |	s|kr| tdd fdd|D }
|
dd  t|
 dd dD ]@\}}t||krʈt
|}|rd}	n|d kr d S q|	S )Nr:   z&removed due to strict channel priorityr   Fr   z"incompatible with required spec %sc                 3   s   | ]}  |d s|V  qdS FN)r   )rQ   rec)r   r:   r;   rV   j  s   zBResolve.get_reduced_index.<locals>.filter_group.<locals>.<genexpr>zunsatisfiable dependencies %sr   c                 s   s   | ]}t |V  qd S rS   r  r   r:   r:   r;   rV   o  s    z%s: pruned from %d -> %dc                 s   s   | ]}|j V  qd S rS   r   r   r:   r:   r;   rV   y  s     c                 S   s   | j S rS   r   )r   r:   r:   r;   r     r   zAResolve.get_reduced_index.<locals>.filter_group.<locals>.<lambda>c                 3   s4   | ],}  |d s|D ]}|js|V  qqdS r  )r   r   r   )rQ   rJ   Zdep_spec)r   rs   r:   r;   rV     s      *c                 S   s   t dd | d D S )Nc                 s   s   | ]}|j V  qd S rS   r  rY   r:   r:   r;   rV     s     zTResolve.get_reduced_index.<locals>.filter_group.<locals>.<lambda>.<locals>.<genexpr>r   r   r   r:   r:   r;   r     r   r]   T)r   r   rO   ri   r   r   r   r   
setdefault	match_anyr3   r   r   r   rG   r   r@   rA   r   r   rq   rB   r   )Z_specsrO   ru   r   rJ   ZnoldZnnewZunsatisfiable_dep_specsrI   ZreducedZ
_dep_specsZ	deps_namedepsres)cp_filter_appliedexplicit_spec_package_poolfilter_groupr   rs   snamesr   top_level_specr:   r;   r  P  sn    








z/Resolve.get_reduced_index.<locals>.filter_group   c                 S   s   i | ]
}||qS r:   r:   rP   r:   r:   r;   r     s      c                 3   s   | ]} |V  qd S rS   r:   r   r   r:   r;   rV     s     c                 3   s&   | ]}|kr | r|V  qd S rS   )r   rP   )r   reduced_index2rs   r:   r;   rV     s    r   c                 3   s   | ]}|j j kr|V  qd S rS   r   rP   )strict_channel_namer:   r;   rV     s     c                 s   s   | ]}||fV  qd S rS   r:   rP   r:   r:   r;   rV     s     c                 3   s   | ]}| kr|V  qd S rS   r:   rY   )r  r:   r;   rV     s      rU   ))r   r   r   rc   r   r   rx   rm   r@   isEnabledForr
   rA   r   rq   r   r   rB   r3   rg   r   rO   rG   ranger   r   popleftrh   r   r   r   r   copydeepcopyr   rF   insertr   r   r   r  r   )rs   explicit_specsZsort_by_exactnessexit_on_conflictZ	cache_keyr   r   Zpruned_to_zerorZ   ZslistZspecs_by_name_seedZexplicit_specZadd_these_precs2pkgZ
seen_specsr   Z	dep_specsrL   r   rI   Zdep_pkg	new_specsZnew_msr:   )r  r  r  r   r   r  rs   r  r  r   r  r;   r  .  s    


 O 


"

	 	
zResolve.get_reduced_indexc                    s   t  fdd|D S )Nc                 3   s   | ]}|  V  qd S rS   r   r   rJ   r:   r;   rV     s     z$Resolve.match_any.<locals>.<genexpr>r	  )rs   ZmssrJ   r:   r"  r;   r    s    zResolve.match_anyc                    s    j d }|d k	r|S d}|r8 j|d}n6drdd}t fdd|D }n
 j }tfdd|D }| j < |S )NrO   r:   rU   c                 3   s   | ]} j |d V  qdS )r:   N)rj   r   )rQ   rt   r   r:   r;   rV     s    z'Resolve.find_matches.<locals>.<genexpr>c                 3   s   | ]}  |r|V  qd S rS   r!  rQ   r   r   r:   r;   rV     s     
 )rk   r   r   ri   r   r_   rf   rx   )rs   r   r  Z	spec_nameZcandidate_precsr   r:   rs   r   r;   rG      s    





zResolve.find_matchesc                 C   sH   | j |}|d krDdd |jD }|dd |jD  || j |< |S )Nc                 S   s   g | ]}t |qS r:   r)   rQ   dr:   r:   r;   rR     s     z&Resolve.ms_depends.<locals>.<listcomp>c                 s   s   | ]}t |d V  qdS )rT   Nr)   )rQ   featr:   r:   r;   rV     s     z%Resolve.ms_depends.<locals>.<genexpr>)rl   r   Zcombined_dependsr   r   )rs   rJ   r  r:   r:   r;   r     s    
zResolve.ms_dependsc                 C   s   |j }| j|jd}|tk r"dnd}t|dd}|dd}|d}t|jdk }	| jt	j
krz|| |||	g}
n||| ||	g}
| jr|
| n|
|dd|f |
S )	Nr   r   r    build_numberbuildnoarchZ	timestamp)r   rb   r   rO   r   r,   intZsubdirrd   r   ZDISABLEDre   rh   r   )rs   rJ   Zvtyper   rc   r   Zversion_comparatorr)  Zbuild_stringr+  Zvkeyr:   r:   r;   rr     s    
zResolve.version_keyc                 C   sT   i }t tdd dd | D D D ]*\}}|j}||kr<q$t|td ||< q$|S )Nc                 s   s.   | ]&}t |tr d d |jD n|fV  qdS )c                 s   s   | ]}t |V  qd S rS   r%   )rQ   Zccr:   r:   r;   rV   4  s     z=Resolve._make_channel_priorities.<locals>.<genexpr>.<genexpr>N)r   r&   Z	_channelsr   r:   r:   r;   rV   3  s   z3Resolve._make_channel_priorities.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S rS   r-  r   r:   r:   r;   rV   5  s     r   )	enumerater   rO   minr   )r`   Zpriorities_mapZpriority_counterZchnr   r:   r:   r;   ra   0  s    
z Resolve._make_channel_prioritiesc                 C   s4   t |}| |}|s&|s&t|fgt|| jdS )Nr
  )r*   rG   r#   rq   rr   )rs   rI   Zemptyokr   r:   r:   r;   get_pkgs=  s
    
zResolve.get_pkgsc                 C   s@   t | tr|  S t | tr6dt|  | jr0dnd S t d S )Nz@s@?r(  )r   r+   r  r*   r   r   NotImplementedError)r   r:   r:   r;   to_sat_nameE  s
    

zResolve.to_sat_namec                 C   s   d| |f S )Nz	@fm@%s@%sr:   )Zprec_dist_strr'  r:   r:   r;   to_feature_metric_idO  s    zResolve.to_feature_metric_idc                    s  t  }||}|d k	r(|S  }d}tdd dd dpTdD D }|rx j|g  }}	nF|rt|dkst	t
t|}
 j|
g  }}	n j  }}	d}|sԇfd	d
|D }	t|	t|kr"jrt}n0|s"|rt |dnt |}| ||}|d kr| fdd
|	D }jrr|rVt |dnt |}|d |  ||}||| |S )NrO   c                 s   s   | ]}|r|V  qd S rS   r:   )rQ   Z_tfr:   r:   r;   rV   ]  s    z)Resolve.push_MatchSpec.<locals>.<genexpr>c                 s   s   | ]}|  V  qd S rS   )stripr   r:   r:   r;   rV   ]  s    rU   r:   r   Fc                    s   g | ]}  |r|qS r:   r!  r   r   r:   r;   rR   k  s     
 z*Resolve.push_MatchSpec.<locals>.<listcomp>rT   c                    s   g | ]}  |qS r:   r3  rP   r   r:   r;   rR   s  s     !)r*   r3  	from_name
_is_singler   r   ri   r   r   AssertionErrorr   r   rj   r_   r   r   r   push_MatchSpecrh   ZAnyname_var)rs   Cr   sat_namemZsimplenmZtfZtgroupZlibsrz   Zms2Z	sat_namesr:   r$  r;   r;  S  sD    




zResolve.push_MatchSpecc           	   
      s   t ttjd} j D ]\\}} fdd|D }|D ]}|| q8| t|}|	|j
|||g  q j D ]H}| |} |D ](}|jds|	|j| || qqttrtd|  |S )Nr.   c                    s   g | ]}  |qS r:   r6  rP   r   r:   r;   rR     s     z'Resolve.gen_clauses.<locals>.<listcomp>r   z+gen_clauses returning with clause count: %d)r   rD   r   r/   ri   rB   r0   r3  r*   r1   Z
ExactlyOneNotr_   rf   r   rO   r   ZOrr;  r@   r  r
   rA   get_clause_count)	rs   r=  rO   ru   r>  r?  rJ   ZnkeyrI   r:   r   r;   gen_clauses{  s    
zResolve.gen_clausesc                    s2    fdd|D }t tr.t d   |S )Nc                    s   g | ]}  |fqS r:   r;  r   r=  rs   r:   r;   rR     s     z5Resolve.generate_spec_constraints.<locals>.<listcomp>z9generate_spec_constraints returning with clause count: %d)r@   r  r
   rA   rB  )rs   r=  r   r   r:   rE  r;   generate_spec_constraints  s    
z!Resolve.generate_spec_constraintsc                    s8    fddj  D }ttr4td   |S )Nc                    s    i | ]}  t|d dqS )rT   r   )r;  r*   )rQ   rO   rE  r:   r;   r     s    z2Resolve.generate_feature_count.<locals>.<dictcomp>z6generate_feature_count returning with clause count: %d)rj   r   r@   r  r
   rA   rB  )rs   r=  r   r:   rE  r;   generate_feature_count  s    
 zResolve.generate_feature_countc                    s    fdd|D S )Nc                    s*   i | ]"}|j r |j rd |j  dqS r7  r   )r   r8  r   r=  r:   r;   r     s
        z1Resolve.generate_update_count.<locals>.<dictcomp>r:   rs   r=  r   r:   rI  r;   generate_update_count  s    zResolve.generate_update_countc              	      s   i } j  D ]\}} fdd|D }tj|   j}|D ]X} |t|d}| D ]8\}	}
||
kr` 	|	|}|
||	|| d||< q`qBq|S )Nc                    s   i | ]}  |t|jqS r:   )r3  r3   r   rP   r   r:   r;   r     s      z3Resolve.generate_feature_metric.<locals>.<dictcomp>rT   r   )ri   rB   r3   r   rf   r   rj   r;  r*   r4  r<  r2   )rs   r=  eqrO   ru   Z
prec_featsZactive_featsr'  Zclause_id_for_featureprec_sat_namer   Zfeature_metric_idr:   r   r;   generate_feature_metric  s    zResolve.generate_feature_metricc                    s    fdd|D S )Nc                    s    i | ]}d   |j dqS rH  )r;  rO   r   rE  r:   r;   r     s      z2Resolve.generate_removal_count.<locals>.<dictcomp>r:   rJ  r:   rE  r;   generate_removal_count  s    zResolve.generate_removal_countc                    s    fdd|D S )Nc                    s"   i | ]}|j r |jd qS r   )r   r;  rO   r   rE  r:   r;   r     s       z2Resolve.generate_install_count.<locals>.<dictcomp>r:   rJ  r:   rE  r;   generate_install_count  s    zResolve.generate_install_countc                    s    fdd|D S )Nc                    s   i | ]}  |d qS r   rD  )rQ   r@  rE  r:   r;   r     s     
 z2Resolve.generate_package_count.<locals>.<dictcomp>r:   )rs   r=  Zmissingr:   rE  r;   generate_package_count  s    zResolve.generate_package_countc                    s  i }i }i }i }i }i }	|D ]}
t |
}
|	|
jg  q|	 D ]\}}fddj|g D }d }|D ]|\} |rt fdd|D rqn|d krd } } } }}n|d |d ks|d |d kr|d7 }d } } }}n|d |d kr|d7 }d } }}nf|d |d kr8|d7 }d }}nB|d	 |d	 krX|d7 }d}n"jsz|d
 |d
 krz|d7 } }|s|r|||< |s|r|||< |s|r|||< |s|r|||< |s|r|||< |}qnq@|||||fS )Nc                    s   g | ]}  ||fqS r:   )rr   r#  r   r:   r;   rR     s     z4Resolve.generate_version_metrics.<locals>.<listcomp>c                 3   s   | ]} |kV  qd S rS   r:   )rQ   r   r"  r:   r;   rV     s     z3Resolve.generate_version_metrics.<locals>.<genexpr>r   r   r  rE         )	r*   r  rO   rB   ri   r   r   re   r3  )rs   r=  r   Zinclude0ZeqcZeqvZeqbZeqaZeqtsdictr   rO   ZtargetspkgsZpkeyrr   ZicZivZibitZiarM  r:   )rJ   rs   r;   generate_version_metrics  sX    	 

z Resolve.generate_version_metricsc           	         s   t  tsti }  D ].\}}|| jkrtdd | |D ||< qtrd|kr  D ]8\}}| j|}t	|dr^|j
tjkr^|| d q^t|}    fdd|D }|   |S )Nc                 s   s   | ]}|j V  qd S rS   r   r   r:   r:   r;   rV     s     z*Resolve.dependency_sort.<locals>.<genexpr>Zcondar+  c                    s   g | ]}| kr  |qS r:   )r   )rQ   r]   	must_haver:   r;   rR   '  s      z+Resolve.dependency_sort.<locals>.<listcomp>)r   dictr:  rB   r_   r3   r   r   r   rX   r+  r'   r   r   r    r  r   rf   )	rs   rY  Zdigraphr   rJ   ZdistrecordZsorted_keysr   r:   rX  r;   dependency_sort  s    
zResolve.dependency_sortc           	      C   s   t d |sd g fS i }g }|D ]0}||| |< |td|j|j|jf  q"tt	dd |D d| j
d}| }|||}||}t|S )N1Checking if the current environment is consistent%s %s %sc                 s   s   | ]}||fV  qd S rS   r:   rP   r:   r:   r;   rV   5  s     z4Resolve.environment_is_consistent.<locals>.<genexpr>Tr`   )r@   rA   r3  rh   r*   rO   r   r*  rN   r   r`   rC  rF  r4   bool)	rs   	installedsat_name_mapr   rJ   r2r=  constraintsr9   r:   r:   r;   environment_is_consistent,  s    
 
z!Resolve.environment_is_consistentc                    s   |sdS t |t |B }| |}d fdd	}|rZt|d| jd  ||d}nd }|rhd}n8tjrt| jd| jd  tt	|||d}nd }|S )	Nr:   Fc                    s     | } ||S rS   rF  r4   r   Zadd_ifrd  r=  rc  r:   r;   mysatC  s    z,Resolve.get_conflicting_specs.<locals>.mysatTr_  )r4   r  )F)
r3   r  rN   r`   rC  r   r   r_   rx   r   )rs   r   r  Z	all_specsreduced_indexri  r9   Zfinal_unsat_specsr:   rh  r;   get_conflicting_specs;  s(    

zResolve.get_conflicting_specsc                    s  t d |sd g fS i g }|D ]0}||< |td|j|j|jf  q"dd  D }dd |D }d|krd|kr||d  }d|j	krdd	 |j	D }||_	t
|d
jd}	|	  |	 |}
 |
}d  }}|r|rfddt |	 |} |  \}}fdd fdd|D D  |D ]}t|j qNttk r}fdd	 D }t dd| |rt d| ||fS )Nr]  r^  c                 S   s   i | ]
}||qS r:   r:   rP   r:   r:   r;   r   c  s      z)Resolve.bad_installed.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r:   r   r#  r:   r:   r;   r   d  s      r   pipc                 S   s   g | ]}|d kr|qS )rl  r:   r%  r:   r:   r;   rR   i  s      z)Resolve.bad_installed.<locals>.<listcomp>Tr_  c                    sF   | |krB| |  j| g D ] }|D ]} |j| q.q d S rS   )r   ri   r   r   rO   )rO   r  fnrI   )get_rs   r:   r;   rn  q  s
    
z#Resolve.bad_installed.<locals>.get_c                 3   s2   | ]*}|r|d  dkrd|kr | d V  qdS )r   r7  @rO   Nr:   rQ   r>  )rb  r:   r;   rV   }  s
     z(Resolve.bad_installed.<locals>.<genexpr>c                 3   s   | ]}  |V  qd S rS   Z
from_indexr   rI  r:   r;   rV   ~  s     c                    s    g | ]\}}|d   kr|qS r   r:   )rQ   r>  r  )r  r:   r;   rR     s    z-Limiting solver to the following packages: %s, zPackages to be preserved: %s)r@   rA   r3  rh   r*   rO   r   r*  rf   rH   rN   r`   rC  rF  r4   r3   rO  minimizer   r   rB   r   )rs   ra  r   r   rJ   	new_indexZname_mapZpython_precZnew_depsrc  rd  r9   limitZxtraeq_optional_crZ   r   r:   )r=  rn  rb  rs   r  r;   bad_installedZ  sJ    
 


	zResolve.bad_installedc                    s.   |r*dd |D  |  fdd|D  d S )Nc                 S   s   i | ]}|j |qS r:   r   rP   r:   r:   r;   r     s      z'Resolve.restore_bad.<locals>.<dictcomp>c                 3   s   | ]}|j  kr|V  qd S rS   r   r#  rT  r:   r;   rV     s     
 z&Resolve.restore_bad.<locals>.<genexpr>)r   )rs   rU  preserver:   rx  r;   restore_bad  s    zResolve.restore_badc                 C   s   t tt|}dd |D }td | ||\}}|D ]z}|| jkrJq:|j|j|j	  }}	}
|j
j}||ks:|d k	r||krq:|rt|| d}nt||	|
|d}|d| q:t||fS )Nc                 S   s   h | ]
}|j qS r:   r   r   r:   r:   r;   r[     s     z(Resolve.install_specs.<locals>.<setcomp>z*Checking satisfiability of current install)rO   r   )rO   r   r*  r   r   )rg   mapr*   r@   rA   rw  r_   rO   r   r*  r   Zcanonical_namer  r  rx   )rs   r   ra  update_depsr  ru  ry  rJ   rO   r   r*  Zschannelr   r:   r:   r;   install_specs  s&    

 zResolve.install_specsc                 C   s>   |  ||pg |\}}g }|r.| j||dd}| || |S )NF)	returnall_remove)r}  solverz  )rs   r   ra  r|  r~  ry  rU  r:   r:   r;   install  s    zResolve.installc              	   C   s   g }t t|D ]4}| r0|t|ddd q|t|dd qtdd |D }| ||\}}g }|D ]X}	|	j|	j }
}|
|krqnqn|d k	r||	 qn|t|
|rd| nd d|	 d qn||fS )	Nro  T)r   r   r  c                 s   s   | ]}|j r|j V  qd S rS   r   r   r:   r:   r;   rV     s      z'Resolve.remove_specs.<locals>.<genexpr>z>=)rO   r   r   r   )	r{  r*   r9  rh   r3   rw  rO   r   r  )rs   r   ra  Znspecsr   r  ru  rZ   ry  rJ   r@  Zverr:   r:   r;   remove_specs  s(    
zResolve.remove_specsc                 C   s.   |  ||\}}| j|dd}| || |S )NT)r  )r  r  rz  )rs   r   ra  ry  rU  r:   r:   r;   remove  s    zResolve.removec           8         s  |r$t |d ts$tdd |D }t|}ttrXtdd t|D }t	d| |sbt S t	d t
|}j|tj d}	|	st }
t }|D ]0}|s|jjkr|| q|
| q|
rt|
n|rtdd	 |D d
d|rti n||| t	d dE fdd	} fdd fdd}t|	djd  ||d}|s|rti n||| g }g }g }tj}t|D ]\}}|j|kr||j |js|js||kr|n|| n6t|rt|jd|jd}|| || q|dd |D  ttrt	dttdd |D  t	dttdd |D  t	dttdd |D  t	dttdd |D  t	d |r  |}  ||\}}t	d | t	d! ! |\}}}}}  ||\}}  ||\}}t	d"|| t	d# " }  ||\}}t	d$| # }   | |\}}!t	d%|! t	d&   ||\}}"t	d'|" t	d(   ||\}}#t	d)|# |s(t	d* $ |}$  |$|\}}%t	d+|% t	d, % |}&  |&|\}}'t	d-|' t	d. ! |\}(})}*}+},  |(|\}}-  |)|\}}.  |*|\}}/  |+|\}}0t	d/|-|.|/|0 t	d0 & |}( j |(|dd1\}}t	d2| ||s2|,'|   |,|\}}1t	d3|1 t	d4 d5}2g }3|}4|3|4 t fd6d|4D }5 (|5fd}|d krq|2d57 }2|2d7krt	d8 q|}4|3|4 qV|2d5kr8t)t*t|3}6tj+|6 fd9d	|6D }7tj,s8t-.d:|2d7krd;n|2td<d |7D |2d7kr.d=nd>f  fd?d@j/0 D |rjt
|3d5krjt1 tfdAd|3d D dBdC dDS )FNr   c                 s   s   | ]}t |V  qd S rS   r)   rY   r:   r:   r;   rV     s     z Resolve.solve.<locals>.<genexpr>c                 s   s*   | ]"\}}t d |||j|jf V  qdS )z%i: %s target=%s optional=%sN)r   r   r   )rQ   r   r   r:   r:   r;   rV     s   zSolving for: %sz2Solve: Getting reduced index of compliant packages)r  c                 S   s   g | ]
}|gqS r:   r:   r%  r:   r:   r;   rR     s     z!Resolve.solve.<locals>.<listcomp>F)r   z!Solve: determining satisfiabilityc                    s     | } ||S rS   rf  rg  rh  r:   r;   ri  	  s    zResolve.solve.<locals>.mysatc                    s   dd  fdd| D D S )Nc                 S   s(   g | ] }|r|d  dkrd|kr|qS )r   r7  ro  r:   rQ   qr:   r:   r;   rR     s
      z0Resolve.solve.<locals>.clean.<locals>.<listcomp>c                 3   s   | ]}  |V  qd S rS   rq  r   rI  r:   r;   rV     s     z/Resolve.solve.<locals>.clean.<locals>.<genexpr>r:   )solrI  r:   r;   clean  s    zResolve.solve.<locals>.cleanc                    s:   | }t  fdd|D } j|fdddkr6dS dS )az   Determine if the SAT problem has converged to a single solution.

            This is determined by testing for a SAT solution with the current
            clause set and a clause in which at least one of the packages in
            the current solution is excluded. If a solution exists the problem
            has not converged as multiple solutions still exist.
            c                 3   s   | ]}   |V  qd S rS   rA  r8  r  rI  r:   r;   rV     s     z6Resolve.solve.<locals>.is_converged.<locals>.<genexpr>F)Z	includeIfNT)rx   r4   )r9   	psolutionnclause)r=  r  r:   r;   is_converged  s
    z#Resolve.solve.<locals>.is_convergedTr_  )r   r   c                 s   s   | ]}t |V  qd S rS   r)   r   r:   r:   r;   rV   7  s     zRequested specs: %sc                 s   s   | ]}t |V  qd S rS   r  r   r:   r:   r;   rV   :  s     zOptional specs: %sc                 s   s   | ]}t |V  qd S rS   r  r   r:   r:   r;   rV   ;  s     zAll other specs: %sc                 s   s   | ]}t |V  qd S rS   r  r   r:   r:   r;   rV   <  s     zmissing specs: %sc                 s   s   | ]}t |V  qd S rS   r  r   r:   r:   r;   rV   =  s     z Solve: minimize removed packageszPackage removal metric: %dz.Solve: maximize versions of requested packagesz-Initial package channel/version metric: %d/%dz#Solve: minimize track_feature countzTrack feature count: %dzPackage misfeature count: %dz3Solve: maximize build numbers of requested packagesz Initial package build metric: %dz5Solve: prefer arch over noarch for requested packageszNoarch metric: %dz0Solve: minimize number of optional installationsz#Optional package install metric: %dz,Solve: minimize number of necessary upgradeszDependency update count: %dzhSolve: maximize versions and builds of indirect dependencies.  Prefer arch over noarch where equivalent.zDAdditional package channel/version/build/noarch metrics: %d/%d/%d/%dz!Solve: prune unnecessary packages)ZtrymaxzWeak dependency count: %dzTimestamp metric: %dzLooking for alternate solutionsr   c                 3   s   | ]}   |V  qd S rS   r  r  rI  r:   r;   rV     s     
   zToo many solutions; terminatingc                    s   g | ]}t t|  qS r:   )rq   r3   )rQ   r  )commonr:   r;   rR     s     zP
Warning: %s possible package resolutions (only showing differing packages):%s%sz>10c                 s   s   | ]}d  |V  qdS )rr  N)r   )rQ   Zdiffr:   r:   r;   rV     s     z
  ... and othersr(  c                    s   i | ]}  ||qS r:   r6  rP   r   r:   r;   r     s      z!Resolve.solve.<locals>.<dictcomp>c                 3   s   | ]} | V  qd S rS   r:   rp  )rt  r:   r;   rV     s     c                 S   s   | j S rS   r   r   r:   r:   r;   r     r   zResolve.solve.<locals>.<lambda>r
  )F)2r   r*   rx   r3   r@   r  r
   r   r.  rA   r   r  r   r   rG   rO   ri   r   r#   r$   r   rN   r`   rC  r  r   r   rh   r   r   rq   rO  rs  rW  rG  rN  rP  rK  rQ  r   r4   rg   r{  r   r   	stdoutloginfor_   rf   r6   )8rs   r   r~  r  r   r   Zshould_retry_solveZdlistZlen0rj  Znot_found_packagesZwrong_version_packagesr   ri  r  r9   ZspecoZspecrZspecaZspecmrz   rv  Zobj7Zeq_req_cZeq_req_vZeq_req_bZeq_req_aZeq_req_tZobj3aZobj3Zeq_feature_countZobj1Zeq_feature_metricZobj2Zobj4Z
noarch_objZeq_optional_installZobj49Zeq_uZobj50Zeq_cZeq_vZeq_bZeq_aZeq_tZobj5aZobj5Zobj6Zobj6aZobj6tZnsolZ
psolutionsr  r  Zpsols2Zdiffsr:   )r=  r  r  rt  rc  rs   r;   r    s$   

 






"




	





   










zResolve.solve)Fr:   )NN)T)T)T)NN)r   )NN)TF)N)F)F)T)NTF)FFNNF)4__name__
__module____qualname__rv   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  rG   r   rr   staticmethodra   r0  r3  r4  r;  rC  rF  rG  rK  rN  rO  rP  rQ  rW  r\  re  rk  rw  rz  r}  r  r  r  r  __classcell__r:   r:   r   r;   rN   [   sn   
(

&

'-

&
t
 O	



	
(

C$2

   rN   )JZ
__future__r   r   r   r   collectionsr   r   r   r  	functoolsr	   Zloggingr
   r   Zauxlib.decoratorsr   Z_vendor.frozendictr   r   Z_vendor.toolzr   r   Z_vendor.tqdmr   Zbase.constantsr   r   r   Zbase.contextr   Zcommon.compatr   Z	common.ior   r   Zcommon.logicr   r   r   r   r   r   Zcommon.toposortr    
exceptionsr!   r"   r#   r$   Zmodels.channelr%   r&   Zmodels.enumsr'   r(   Zmodels.match_specr*   Zmodels.recordsr+   Zmodels.versionr,   r  r@   r  ZUnsatisfiableZPYCOSATZPYCRYPTOSATZPYSATr>   rD   rM   objectrN   r:   r:   r:   r;   <module>   sF       