
    <i                         S SK r S SKJr  S SKJrJr  S SKJrJrJ	r	J
r
Jr  S SKr SqS r\ R                  4S jr\ R                  4S jrg)    N)observation_expression_cmp)ChainTransformerSettleTransformer)AbsorptionTransformer,CanonicalizeComparisonExpressionsTransformerDNFTransformerFlattenTransformerOrderDedupeTransformerc                      [         (       dV  [        5       n [        5       n[        5       n[	        5       n[        XU5      n[        U5      n[        5       n[        U XVU5      q [         $ )zQ
Get a canonicalization transformer for STIX patterns.

:return: The transformer
)_pattern_canonicalizerr   r	   r
   r   r   r   r   )canonicalize_comp_exprobs_expr_flattenobs_expr_orderobs_expr_absorbobs_simplifyobs_settle_simplifyobs_dnfs          ]/home/james-whalen/.local/lib/python3.13/site-packages/stix2/equivalence/patterns/__init__.py_get_pattern_canonicalizerr      sp     "!8: 	 .//1/1'o
 0= "!1"*="

 "!    c                     [         R                  R                  XS9n[         R                  R                  XS9n[        5       nUR	                  U5      u  pgUR	                  U5      u  p[        Xh5      n	U	S:H  $ )an  
Determine whether two STIX patterns are semantically equivalent.

:param pattern1: The first STIX pattern
:param pattern2: The second STIX pattern
:param stix_version: The STIX version to use for pattern parsing, as a
    string ("2.0", "2.1", etc).  Defaults to library-wide default version.
:return: True if the patterns are semantically equivalent; False if not
versionr   stix2pattern_visitorcreate_pattern_objectr   	transformr   )
pattern1pattern2stix_version	patt_ast1	patt_ast2pattern_canonicalizercanon_patt1_canon_patt2results
             r   equivalent_patternsr)   4   s     %%;; < I %%;; < I 78*44Y?NK*44Y?NK'AFQ;r   c              #      #    [         R                  R                  XS9n[        5       nUR	                  U5      u  pVU HJ  n[         R                  R                  XrS9nUR	                  U5      u  p[        XY5      n
U
S:X  d  MF  Uv   ML     g7f)a  
Find patterns from a sequence which are equivalent to a given pattern.
This is more efficient than using equivalent_patterns() in a loop, because
it doesn't re-canonicalize the search pattern over and over.  This works
on an input iterable and is implemented as a generator of matches.  So you
can "stream" patterns in and matching patterns will be streamed out.

:param search_pattern: A search pattern as a string
:param patterns: An iterable over patterns as strings
:param stix_version: The STIX version to use for pattern parsing, as a
    string ("2.0", "2.1", etc).  Defaults to library-wide default version.
:return: A generator iterator producing the semantically equivalent
    patterns
r   r   Nr   )search_patternpatternsr!   search_pattern_astr$   canon_search_pattern_astr&   patternpattern_astcanon_pattern_astr(   s              r   find_equivalent_patternsr2   N   s     " ..DD E  78"7"A"A# ++AA B 
  5>>{K+$
 Q;M s   A?B	B)r   .stix2.equivalence.patterns.compare.observationr   $stix2.equivalence.patterns.transformr   r   0stix2.equivalence.patterns.transform.observationr   r   r   r	   r
   stix2.pattern_visitorr   r   DEFAULT_VERSIONr)   r2    r   r   <module>r9      sO        "D :?9N9N 6 ,1+@+@%r   