
    Ngf                        d dl mZ d Zd Z G d d          Z G d d          Z G d d	          Z G d
 d          Z G d d          Z G d d          Z	dS )    )annotationsc                .   | sg S t          | d                   dk    r(t          | ||                                          j        S g }| D ]}|\  }}}||k    s||k    rd}t	          |          ||k    r|dk    rd}t	          |          ||k    r|dk    rd}t	          |          |dk    rf|                    t          |||                     t          t          |          dz
            D ]}	||	dz            j        ||	         j        k     s||	dz            j	        ||	         j	        k     rd}t	          |          ||	dz            j        ||	         j        k    r0||	dz            j	        ||	         j	        k    rd	}t	          |          |S )
Nr      List of edit operations invalidinsertdeleteequal   z$List of edit operations out of orderzDuplicated edit operation)
lenOpcodes
as_editops_editops
ValueErrorappendEditoprangesrc_posdest_pos)
opssrc_lendest_lenblocksop	edit_typer   r   msgis
             ]/var/www/html/ai-engine/env/lib/python3.11/site-packages/rapidfuzz/distance/_initialize_py.py_list_to_editopsr      s   
  	
3q6{{asGX..99;;DDF < <')$	7HW8 3 33CS//!g)x"7"73CS//!xI$9$93CS//! fY::;;;; 3v;;?## " "!a%= 6!9#444q1u8NQWXYQZQc8c8c8CS//!!a%= F1I$555&Q-:PTZ[\T]Tf:f:f-CS//!M    c           
        | rt          | d                   dk    r(t          | ||                                          j        S g }| D ])}|\  }}}}}	||k    s|	|k    rd}
t	          |
          ||k     s|	|k     rd}
t	          |
          |dv r#||z
  |	|z
  k    s||k    rd}
t	          |
          |dk    r||k    s||	k    rd}
t	          |
          |dk    r||k    s||	k    rd}
t	          |
          |rO|d         j        |k    r>|d         j        |k    r-|d         j        |k    r||d         _        |	|d         _        |                    t          |||||	                     +|d         j
        dk    s|d         j        dk    rd}
t	          |
          |d         j        |k    s|d         j        |k    rd	}
t	          |
          t          t          |          d
z
            D ]Q}||d
z            j
        ||         j        k    s||d
z            j        ||         j        k    rd}
t	          |
          R|S )Nr      r   >   r	   replacer   r   z4List of edit operations does not start at position 0z7List of edit operations does not end at the string endsr
   z)List of edit operations is not continuous)r   Editops
as_opcodes_opcodesr   tagsrc_enddest_endr   Opcode	src_start
dest_startr   )r   r   r   r   r   r   r+   r(   r,   r)   r   r   s               r   _list_to_opcodesr-   2   s   
  E#c!f++""sGX..99;;DDF S S>@;	9gz8W8 3 33CS//!Y(Z"7"73CS//!,,,'I2ET^I^2^2^bkovbvbv3CS//!  i7&:&:jH>T>T3CS//!  i7&:&:jH>T>T3CS//!  	2JNi''F2J,>),K,KPVWYPZPcgqPqPq!(F2J"*F2JfY	7JQQRRRR aya6!9#71#<#<DoobzW$$r
(;x(G(GGoo3v;;?## " "!a%="fQi&7776!a%=;SW]^_W`Wi;i;i=CS//! <j Mr   c                  6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	MatchingBlockz1
    Triple describing matching subsequences
    c                0    || _         || _        || _        d S Nabsize)selfr3   r4   r5   s       r   __init__zMatchingBlock.__init__m   s    			r   c                    dS Nr!    r6   s    r   __len__zMatchingBlock.__len__r       qr   c                    	 t          |          dk    rdS t          |d         | j        k    o!|d         | j        k    o|d         | j        k              S # t
          $ r Y dS w xY wNr!   Fr   r
      )r   boolr3   r4   r5   	TypeErrorr6   others     r   __eq__zMatchingBlock.__eq__u   sx    	5zzQuaDF*[uQx46/A[eAhRVR[F[\\\ 	 	 	55	   A ?A 
A%$A%c                f    |dv r| j         S |dv r| j        S |dv r| j        S d}t          |          )N   r      r
      r@   r#   z MatchingBlock index out of range)r3   r4   r5   
IndexErrorr6   r   r   s      r   __getitem__zMatchingBlock.__getitem__~   sD    <<6M<<6M<<90oor   c              #  B   K   t          d          D ]}| |         V  d S r9   r   r6   r   s     r   __iter__zMatchingBlock.__iter__   4      q 	 	Aq'MMMM	 	r   c                8    d| j          d| j         d| j         dS )NzMatchingBlock(a=z, b=z, size=)r2   r;   s    r   __repr__zMatchingBlock.__repr__   s)    I$&IIdfIITYIIIIr   N
__name__
__module____qualname____doc__r7   r<   rE   rO   rS   rW   r:   r   r   r/   r/   h   s}           
    	 	 	  J J J J Jr   r/   c                  6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	r   a  
    Tuple like object describing an edit operation.
    It is in the form (tag, src_pos, dest_pos)

    The tags are strings, with these meanings:

    +-----------+---------------------------------------------------+
    | tag       | explanation                                       |
    +===========+===================================================+
    | 'replace' | src[src_pos] should be replaced by dest[dest_pos] |
    +-----------+---------------------------------------------------+
    | 'delete'  | src[src_pos] should be deleted                    |
    +-----------+---------------------------------------------------+
    | 'insert'  | dest[dest_pos] should be inserted at src[src_pos] |
    +-----------+---------------------------------------------------+
    c                0    || _         || _        || _        d S r1   r'   r   r   )r6   r'   r   r   s       r   r7   zEditop.__init__   s     r   c                    dS r9   r:   r;   s    r   r<   zEditop.__len__   r=   r   c                    	 t          |          dk    rdS t          |d         | j        k    o!|d         | j        k    o|d         | j        k              S # t
          $ r Y dS w xY wr?   )r   rA   r'   r   r   rB   rC   s     r   rE   zEditop.__eq__   sy    	5zzQuaDH,gqT\1IgeTUhZ^ZgNghhh 	 	 	55	rF   c                f    |dv r| j         S |dv r| j        S |dv r| j        S d}t          |          )NrH   rJ   rL   zEditop index out of range)r'   r   r   rM   rN   s      r   rO   zEditop.__getitem__   sE    <<8O<<<<<= )oor   c              #  B   K   t          d          D ]}| |         V  d S r9   rQ   rR   s     r   rS   zEditop.__iter__   rT   r   c                8    d| j         d| j         d| j         dS )NzEditop(tag=z
, src_pos=z, dest_pos=rV   r_   r;   s    r   rW   zEditop.__repr__   s)    \TX\\4<\\DM\\\\r   NrX   r:   r   r   r   r      s}         "! ! !
    	 	 	  ] ] ] ] ]r   r   c                      e Zd ZdZ	 	 	 ddZed             Zd Zd Zd Z	d	 Z
d
 Zd Zd Zed             Zej        d             Zed             Zej        d             Zd Zd Zd Zd Zd Zd ZdS )r$   zH
    List like object of Editops describing how to turn s1 into s2.
    Nr   c                N    || _         || _        t          |||          | _        d S r1   )_src_len	_dest_lenr   r   )r6   editopsr   r   s       r   r7   zEditops.__init__   )      !('8DDr   c                *    |                                 S )z
        Create Editops from Opcodes

        Parameters
        ----------
        opcodes : Opcodes
            opcodes to convert to editops

        Returns
        -------
        editops : Editops
            Opcodes converted to Editops
        )r   )clsopcodess     r   from_opcodeszEditops.from_opcodes        !!###r   c           
        t                               t                     }| j        |_        | j        |_        g }d}d}d}|t	          | j                  k     r|| j        |         j        k     s|| j        |         j        k     rj|                    t          d|| j        |         j        || j        |         j                             | j        |         j        }| j        |         j        }|}|}| j        |         j
        }|t	          | j                  k     r| j        |         j
        |k    r|| j        |         j        k    r|| j        |         j        k    r|dk    r|dz  }|dz  }n|dk    r|dz  }n|dk    r|dz  }|dz  }|t	          | j                  k     rB| j        |         j
        |k    r,|| j        |         j        k    r|| j        |         j        k    |                    t          |||||                     |t	          | j                  k     || j        k     s|| j        k     r0|                    t          d|| j        || j                             ||_        |S )z
        Convert to Opcodes

        Returns
        -------
        opcodes : Opcodes
            Editops converted to Opcodes
        r   r	   r"   r
   r   r   )r   __new__rg   rh   r   r   r   r   r   r*   r'   r   r   r&   )	r6   xr   r   r   r   	src_begin
dest_beginr'   s	            r   r%   zEditops.as_opcodes   sz    OOG$$]
n#dm$$$$q)111Xa@P@Y5Y5Ya(0 a(1    -*2=+4I!J-"&CC&&&&M!$(C//t}Q/777a 0 999)##qLGMHHH__MHHH__qLGQ C&&&&M!$(C//t}Q/777a 0 999 MM&i*hOOPPPC #dm$$$$F T\!!X%=%=MM&'4<4=YYZZZ
r   c                   g }d}d}| D ]}||j         k     s||j        k     rXt          |j         |z
  |j        |z
            }|dk    r$|                    t	          |||                     |j         }|j        }|j        dk    r|dz  }|dz  }|j        dk    r|dz  }|j        dk    r|dz  }|| j        k     s|| j        k     rJt          | j        |z
  | j        |z
            }|dk    r$|                    t	          |||                     |                    t	          | j        | j        d                     |S )z
        Convert to matching blocks

        Returns
        -------
        matching blocks : list[MatchingBlock]
            Editops converted to matching blocks
        r   r"   r
   r   r   )r   r   minr   r/   r'   r   r   )r6   r   r   r   r   lengths         r   as_matching_blockszEditops.as_matching_blocks   sa     	 	B##x"+'='=RZ'12;3IJJA::MM-6"J"JKKK*;v""1A8##18##AT\!!X%=%=/1IJJFzzmGXvFFGGGmDL$-CCDDDr   c                $    d | j         D             S )zr
        Convert Editops to a list of tuples.

        This is the equivalent of ``[x for x in editops]``
        c                ,    g | ]}t          |          S r:   tuple.0r   s     r   
<listcomp>z#Editops.as_list.<locals>.<listcomp>J      222bb		222r   r   r;   s    r   as_listzEditops.as_listD  s     32DM2222r   c                    t                               t                     }| j        |_        | j        |_        | j        dd         |_        |S )z*
        performs copy of Editops
        N)r$   rq   rg   rh   r   r6   rr   s     r   copyzEditops.copyL  >     OOG$$]
n]222&
r   c                   g }| D ]H}|j         }|dk    rd}n|dk    rd}|                    t          ||j        |j                             It
                              t
                    }| j        |_        | j	        |_
        ||_        |S )a  
        Invert Editops, so it describes how to transform the destination string to
        the source string.

        Returns
        -------
        editops : Editops
            inverted Editops

        Examples
        --------
        >>> from rapidfuzz.distance import Levenshtein
        >>> Levenshtein.editops('spam', 'park')
        [Editop(tag=delete, src_pos=0, dest_pos=0),
         Editop(tag=replace, src_pos=3, dest_pos=2),
         Editop(tag=insert, src_pos=4, dest_pos=3)]

        >>> Levenshtein.editops('spam', 'park').inverse()
        [Editop(tag=insert, src_pos=0, dest_pos=0),
         Editop(tag=replace, src_pos=2, dest_pos=3),
         Editop(tag=delete, src_pos=3, dest_pos=4)]
        r   r   )r'   r   r   r   r   r$   rq   r   rg   r   rh   r   r6   r   r   r'   rr   s        r   inversezEditops.inverseV  s    .  	@ 	@B&ChMM&bk2:>>????OOG$$]
l
r   c                l   t                               t                     }| j        |_        | j        |_        t	          |          t	          |           k    rd}t          |          dgt	          |           t	          |          z
  z  |_        d}d}d}|D ]}|t	          |           k    re|| j        |         k    rT| j        |         ||<   ||         xj        |z  c_        |dz  }|dz  }|t	          |           k    r|| j        |         k    T|t	          |           k    rd}t          |          |j        dk    r|dz  }n|j        dk    r|dz  }|dz  }|t	          |           k    rC| j        |         ||<   ||         xj        |z  c_        |dz  }|dz  }|t	          |           k    C|S )a#  
        remove a subsequence

        Parameters
        ----------
        subsequence : Editops
            subsequence to remove (has to be a subset of editops)

        Returns
        -------
        sequence : Editops
            a copy of the editops without the subsequence
        z subsequence is not a subsequenceNr   r
   r   r   )	r$   rq   rg   rh   r   r   r   r   r'   )r6   subsequenceresultr   offsetop_pos
result_possops           r   remove_subsequencezEditops.remove_subsequence}  s    ))->{c$ii''4CS//!&CIIK0@0@$@A 
 	 	CCII%%#v1F*F*F%)]6%:z"z"**f4**a
!	 CII%%#v1F*F*F T""8 oo%w(""!H$$!aKFF D		!!!%v!6F::&&&0&&!OJaKF	 D		!! r   c                t   d}d}| j         D ]u}||j        k     r|||         z  }|dz  }||j        k     |j        dk    r|||j                 z  }|dz  }I|j        dk    r|||j                 z  }e|j        dk    r|dz  }v|t	          |          k     r#|||         z  }|dz  }|t	          |          k     #|S )at  
        apply editops to source_string

        Parameters
        ----------
        source_string : str | bytes
            string to apply editops to
        destination_string : str | bytes
            string to use for replacements / insertions into source_string

        Returns
        -------
        mod_string : str
            modified source_string

         r   r
   r"   r   r   )r   r   r'   r   r   )r6   source_stringdestination_stringres_strr   r   s         r   applyzEditops.apply  s    " - 	 	BBJ&&=111 BJ&& v""-bk::18##-bk::8##1 M****}W--GqLG M**** r   c                    | j         S r1   rg   r;   s    r   r   zEditops.src_len  
    }r   c                    || _         d S r1   r   r6   values     r   r   zEditops.src_len      r   c                    | j         S r1   rh   r;   s    r   r   zEditops.dest_len  
    ~r   c                    || _         d S r1   r   r   s     r   r   zEditops.dest_len      r   c                    t          |t                    sdS | j        |j        k    o| j        |j        k    o| j        |j        k    S NF)
isinstancer$   r   r   r   rC   s     r   rE   zEditops.__eq__  H    %)) 	5}.t4<5=3PtUYUbfkftUttr   c                *    t          | j                  S r1   )r   r   r;   s    r   r<   zEditops.__len__      4=!!!r   c                    | j         |= d S r1   r   )r6   keys     r   __delitem__zEditops.__delitem__  s    M#r   c                f   t          |t                    r| j        |         S |                    t	          | j                            \  }}}|dk     rd}t          |          t                              t                    }| j        |_        | j	        |_	        | j        |||         |_        |S )Nr   z6step sizes below 0 lead to an invalid order of editops)
r   intr   indicesr   r   r$   rq   rg   rh   )r6   r   startstopstepr   rr   s          r   rO   zEditops.__getitem__  s    c3 	&=%%KKDM(:(:;;tT!88JCS//!OOG$$]
n]5d?3
r   c              #  $   K   | j         E d {V  d S r1   r   r;   s    r   rS   zEditops.__iter__
  &      =         r   c                n    dd                     d | D                       z   d| j         d| j         dz   S )Nz	Editops([, c              3  4   K   | ]}t          |          V  d S r1   reprr}   s     r   	<genexpr>z#Editops.__repr__.<locals>.<genexpr>  (      #<#<DHH#<#<#<#<#<#<r   ], src_len=, dest_len=rV   joinr   r   r;   s    r   rW   zEditops.__repr__  I    $))#<#<t#<#<#<<<<?vT\?v?vfjfs?v?v?vv	
r   Nr   r   )rY   rZ   r[   r\   r7   classmethodrn   r%   rx   r   r   r   r   r   propertyr   setterr   rE   r<   r   rO   rS   rW   r:   r   r   r$   r$      s         	E E E E $ $ [$ 7 7 7r" " "H3 3 3  % % %N7 7 7r' ' 'R   X ^  ^   X _  _u u u" " "    ! ! !
 
 
 
 
r   r$   c                  6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	r*   ai  
    Tuple like object describing an edit operation.
    It is in the form (tag, src_start, src_end, dest_start, dest_end)

    The tags are strings, with these meanings:

    +-----------+-----------------------------------------------------+
    | tag       | explanation                                         |
    +===========+=====================================================+
    | 'replace' | src[src_start:src_end] should be                    |
    |           | replaced by dest[dest_start:dest_end]               |
    +-----------+-----------------------------------------------------+
    | 'delete'  | src[src_start:src_end] should be deleted.           |
    |           | Note that dest_start==dest_end in this case.        |
    +-----------+-----------------------------------------------------+
    | 'insert'  | dest[dest_start:dest_end] should be inserted        |
    |           | at src[src_start:src_start].                        |
    |           | Note that src_start==src_end in this case.          |
    +-----------+-----------------------------------------------------+
    | 'equal'   | src[src_start:src_end] == dest[dest_start:dest_end] |
    +-----------+-----------------------------------------------------+

    Note
    ----
    Opcode is compatible with the tuples returned by difflib's SequenceMatcher to make them
    interoperable
    c                L    || _         || _        || _        || _        || _        d S r1   r'   r+   r(   r,   r)   )r6   r'   r+   r(   r,   r)   s         r   r7   zOpcode.__init__0  s)    "$ r   c                    dS Nr   r:   r;   s    r   r<   zOpcode.__len__7  r=   r   c                   	 t          |          dk    rdS t          |d         | j        k    oC|d         | j        k    o2|d         | j        k    o!|d         | j        k    o|d         | j        k              S # t          $ r Y dS w xY wNr   Fr   r
   r@   r!      )r   rA   r'   r+   r(   r,   r)   rB   rC   s     r   rE   zOpcode.__eq__:  s    	5zzQuaDH$ .!H..!H,. !H/. !H-    	 	 	55	   A9 A!A9 9
BBc                    |dv r| j         S |dv r| j        S |dv r| j        S |dv r| j        S |dv r| j        S d}t          |          N>   r   >   r
   >   r@   rI   >   r!   rK   >   r   r#   zOpcode index out of range)r'   r+   r(   r,   r)   rM   rN   s      r   rO   zOpcode.__getitem__I  sg    <<8O<<>!<<<<<?"<<= )oor   c              #  B   K   t          d          D ]}| |         V  d S r   rQ   rR   s     r   rS   zOpcode.__iter__X  rT   r   c                X    d| j         d| j         d| j         d| j         d| j         dS )NzOpcode(tag=, src_start=
, src_end=, dest_start=, dest_end=rV   r   r;   s    r   rW   zOpcode.__repr__\  se    G$( G G$. G GDL G G/G G6:mG G G	
r   NrX   r:   r   r   r*   r*     sx         8! ! !        
 
 
 
 
r   r*   c                      e Zd ZdZ	 	 	 ddZed             Zd Zd Zd Z	d	 Z
d
 Zd Zed             Zej        d             Zed             Zej        d             Zd Zd Zd Zd Zd ZdS )r   a  
    List like object of Opcodes describing how to turn s1 into s2.
    The first Opcode has src_start == dest_start == 0, and remaining tuples
    have src_start == the src_end from the tuple preceding it,
    and likewise for dest_start == the previous dest_end.
    Nr   c                N    || _         || _        t          |||          | _        d S r1   )rg   rh   r-   r&   )r6   rm   r   r   s       r   r7   zOpcodes.__init__k  rj   r   c                *    |                                 S )z
        Create Opcodes from Editops

        Parameters
        ----------
        editops : Editops
            editops to convert to opcodes

        Returns
        -------
        opcodes : Opcodes
            Editops converted to Opcodes
        )r%   )rl   ri   s     r   from_editopszOpcodes.from_editopsu  ro   r   c           
        t                               t                     }| j        |_        | j        |_        g }| D ]}|j        dk    rTt          |j        |j        z
            D ]6}|                    t          d|j        |z   |j
        |z                        7b|j        dk    rQt          |j        |j
        z
            D ]3}|                    t          d|j        |j
        |z                        4|j        dk    rPt          |j        |j        z
            D ]3}|                    t          d|j        |z   |j
                             4||_        |S )z
        Convert Opcodes to Editops

        Returns
        -------
        editops : Editops
            Opcodes converted to Editops
        r"   r   r   )r$   rq   rg   rh   r'   r   r(   r+   r   r   r,   r)   r   )r6   rr   r   r   js        r   r   zOpcodes.as_editops  sh    OOG$$]
n 		U 		UBv""rzBL899 Z ZAMM&BL14DbmVWFW"X"XYYYYZ8##r{R]:;; U UAMM&2<QRAR"S"STTTTU8##rzBL899 U UAMM&2<!3CR]"S"STTTT
r   c                B   g }| D ]k}|j         dk    r^t          |j        |j        z
  |j        |j        z
            }|dk    r.|                    t          |j        |j        |                     l|                    t          | j        | j	        d                     |S )z
        Convert to matching blocks

        Returns
        -------
        matching blocks : list[MatchingBlock]
            Opcodes converted to matching blocks
        r	   r   )
r'   rv   r(   r+   r)   r,   r   r/   r   r   )r6   r   r   rw   s       r   rx   zOpcodes.as_matching_blocks  s      	V 	VBv  RZ",6bm8STTA::MM-bmV"T"TUUUmDL$-CCDDDr   c                $    d | j         D             S )z
        Convert Opcodes to a list of tuples, which is compatible
        with the opcodes of difflibs SequenceMatcher.

        This is the equivalent of ``[x for x in opcodes]``
        c                ,    g | ]}t          |          S r:   r{   r}   s     r   r   z#Opcodes.as_list.<locals>.<listcomp>  r   r   r&   r;   s    r   r   zOpcodes.as_list  s     32DM2222r   c                    t                               t                     }| j        |_        | j        |_        | j        dd         |_        |S )z*
        performs copy of Opcodes
        N)r   rq   rg   rh   r&   r   s     r   r   zOpcodes.copy  r   r   c           
     4   g }| D ]T}|j         }|dk    rd}n|dk    rd}|                    t          ||j        |j        |j        |j                             Ut                              t                    }| j	        |_
        | j        |_        ||_        |S )a  
        Invert Opcodes, so it describes how to transform the destination string to
        the source string.

        Returns
        -------
        opcodes : Opcodes
            inverted Opcodes

        Examples
        --------
        >>> from rapidfuzz.distance import Levenshtein
        >>> Levenshtein.opcodes('spam', 'park')
        [Opcode(tag=delete, src_start=0, src_end=1, dest_start=0, dest_end=0),
         Opcode(tag=equal, src_start=1, src_end=3, dest_start=0, dest_end=2),
         Opcode(tag=replace, src_start=3, src_end=4, dest_start=2, dest_end=3),
         Opcode(tag=insert, src_start=4, src_end=4, dest_start=3, dest_end=4)]

        >>> Levenshtein.opcodes('spam', 'park').inverse()
        [Opcode(tag=insert, src_start=0, src_end=0, dest_start=0, dest_end=1),
         Opcode(tag=equal, src_start=0, src_end=2, dest_start=1, dest_end=3),
         Opcode(tag=replace, src_start=2, src_end=3, dest_start=3, dest_end=4),
         Opcode(tag=delete, src_start=3, src_end=4, dest_start=4, dest_end=4)]
        r   r   )r'   r   r*   r,   r)   r+   r(   r   rq   r   rg   r   rh   r&   r   s        r   r   zOpcodes.inverse  s    2  	] 	]B&ChMM&bmR[",PRPZ[[\\\\OOG$$]
l
r   c                    d}| j         D ]E}|j        dk    r|||j        |j                 z  }%|j        dv r|||j        |j                 z  }F|S )at  
        apply opcodes to source_string

        Parameters
        ----------
        source_string : str | bytes
            string to apply opcodes to
        destination_string : str | bytes
            string to use for replacements / insertions into source_string

        Returns
        -------
        mod_string : str
            modified source_string

        r   r	   >   r   r"   )r&   r'   r+   r(   r,   r)   )r6   r   r   r   r   s        r   r   zOpcodes.apply  sp    " - 	K 	KBv  =
)BCC000-bmbk.IJJr   c                    | j         S r1   r   r;   s    r   r   zOpcodes.src_len  r   r   c                    || _         d S r1   r   r   s     r   r   zOpcodes.src_len  r   r   c                    | j         S r1   r   r;   s    r   r   zOpcodes.dest_len  r   r   c                    || _         d S r1   r   r   s     r   r   zOpcodes.dest_len  r   r   c                    t          |t                    sdS | j        |j        k    o| j        |j        k    o| j        |j        k    S r   )r   r   r   r   r&   rC   s     r   rE   zOpcodes.__eq__  r   r   c                *    t          | j                  S r1   )r   r&   r;   s    r   r<   zOpcodes.__len__!  r   r   c                h    t          |t                    r| j        |         S d}t          |          )NzExpected index)r   r   r&   rB   )r6   r   r   s      r   rO   zOpcodes.__getitem__$  s2    c3 	&=%%nnr   c              #  $   K   | j         E d {V  d S r1   r   r;   s    r   rS   zOpcodes.__iter__+  r   r   c                n    dd                     d | D                       z   d| j         d| j         dz   S )Nz	Opcodes([r   c              3  4   K   | ]}t          |          V  d S r1   r   r}   s     r   r   z#Opcodes.__repr__.<locals>.<genexpr>0  r   r   r   r   rV   r   r;   s    r   rW   zOpcodes.__repr__.  r   r   r   )rY   rZ   r[   r\   r7   r   r   r   rx   r   r   r   r   r   r   r   r   rE   r<   rO   rS   rW   r:   r   r   r   r   c  su         	E E E E $ $ [$   6  &3 3 3  ' ' 'R  6   X ^  ^   X _  _u u u" " "  ! ! !
 
 
 
 
r   r   c                  6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	ScoreAlignmentz
    Tuple like object describing the position of the compared strings in
    src and dest.

    It indicates that the score has been calculated between
    src[src_start:src_end] and dest[dest_start:dest_end]
    c                L    || _         || _        || _        || _        || _        d S r1   scorer+   r(   r,   r)   )r6   r   r+   r(   r,   r)   s         r   r7   zScoreAlignment.__init__=  s+     
"$ r   c                    dS r   r:   r;   s    r   r<   zScoreAlignment.__len__K  r=   r   c                   	 t          |          dk    rdS t          |d         | j        k    oC|d         | j        k    o2|d         | j        k    o!|d         | j        k    o|d         | j        k              S # t          $ r Y dS w xY wr   )r   rA   r   r+   r(   r,   r)   rB   rC   s     r   rE   zScoreAlignment.__eq__N  s    	5zzQuaDJ& .!H..!H,. !H/. !H-    	 	 	55	r   c                    |dv r| j         S |dv r| j        S |dv r| j        S |dv r| j        S |dv r| j        S d}t          |          r   )r   r+   r(   r,   r)   rM   rN   s      r   rO   zScoreAlignment.__getitem__]  sh    <<:<<>!<<<<<?"<<= )oor   c              #  B   K   t          d          D ]}| |         V  d S r   rQ   rR   s     r   rS   zScoreAlignment.__iter__l  rT   r   c                X    d| j          d| j         d| j         d| j         d| j         dS )NzScoreAlignment(score=r   r   r   r   rV   r   r;   s    r   rW   zScoreAlignment.__repr__p  sf    _DJ _ _DN _ _|_ _26/_ _NRm_ _ _	
r   NrX   r:   r   r   r   r   4  sx         ! ! !        
 
 
 
 
r   r   N)

__future__r   r   r-   r/   r   r$   r*   r   r   r:   r   r   <module>r      sj   # " " " " ") ) )X3 3 3l&J &J &J &J &J &J &J &JR3] 3] 3] 3] 3] 3] 3] 3]lI
 I
 I
 I
 I
 I
 I
 I
X
M
 M
 M
 M
 M
 M
 M
 M
`N
 N
 N
 N
 N
 N
 N
 N
b@
 @
 @
 @
 @
 @
 @
 @
 @
 @
r   