
    %jW^                    f   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl	m
Z
mZmZm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 d d
lmZ d dlmZmZmZm Z  d dl!m"Z" d dl#m$Z$ dZ% ejL                  e'      Z( G d d      Z) G d d      Z*y# e$ r	 d dlmZ Y uw xY w)    )annotationsN)ListOptionalUnionoverload)Literal)ImageUnidentifiedImageError)
deprecated)ShellReturnRaw)AdbConnection
BaseClient)*)StrOrPathLike)	StopEventadb_pathget_free_portlist2cmdline)__version__)AdbErroriX  c                     e Zd ZdZ	 d5	 	 	 	 	 d6dZd Zed7d       Zdef	 	 	 	 	 d8dZ	d9dZ
d:dZd:d	Zd:d
Zd:dZed;d       Zd Zed<d       Zd Zd=dZeeddf	 	 	 	 	 	 	 	 	 d>d       Zededd	 	 	 	 	 	 	 	 	 d?d       Zedefdd	 	 	 	 	 	 	 	 	 d@d       Zededf	 	 	 	 	 	 	 dAd       Zdeddf	 	 	 	 	 	 	 	 	 dBdZeefddd	 	 	 	 	 	 	 dCd       Zeefddd	 	 	 	 	 	 	 dDd       Zeeddf	 	 	 	 	 dEd       Zedddf	 	 	 	 	 	 	 dFdZefdGd ZefdGd!ZdHdId"ZdJd#ZdKd$ZdLdMd%ZdNd&ZdHdOd'ZdNd(ZdPd)Z dQd*Z!dRd+Z" e#d,d-e$d./      dSd0       Z%	 	 	 	 	 	 dTd1Z&d2 Z'dUd3Z(	 	 	 	 dV	 	 	 	 	 	 	 	 	 dWd4Z)y)X
BaseDevicezBasic operation for a deviceNc                    || _         || _        || _        i | _        i | _        |s|st        d      | j                          y)z
        Args:
            client (BaseClient): AdbClient instance
            serial (str): device serial
            transport_id (int): transport_id
        z)serial, transport_id must set atleast oneN)_client_serial_transport_id_properties	_featuresr   _prepare)selfclientserialtransport_ids       Y/var/www/oz-panel.ru/ozpay-pub/venv/lib/python3.12/site-packages/adbutils/_device_base.py__init__zBaseDevice.__init__)   sC     )lFGG    c                     y)zrewrite in sub classN r    s    r$   r   zBaseDevice._prepare=   s    r&   c                    | j                   S N)r   r)   s    r$   r"   zBaseDevice.serial@   s    ||r&   c                   | j                   j                  |      }|r| j                  r3|j                  d| j                   d|        |j	                          |S | j
                  r3|j                  d| j
                   d|        |j	                          |S t        d      | j                  r0|j                  d| j                          |j	                          |S | j
                  r| j                   j                         dk\  rA|j                  d| j
                          |j	                          |j                  d	       |S |j                  d
| j
                  z          |j	                          |S t        d      )Ntimeoutzhost-transport-id::zhost-serial:zshould not reach herezhost:transport-id:)   zhost:tport:serial:   zhost:transport:)	r   make_connectionr   send_command
check_okayr   RuntimeErrorserver_versionread)r    commandr.   cs       r$   open_transportzBaseDevice.open_transportD   sY    LL(((9!!!3D4F4F3Gq	RS0 / dll^1WIFG* ' ##:;;!!!3D4F4F3GHI   <<..0B6NN%7~#FGLLNFF1I 	 NN#4t||#CDLLN  ##:;;r&   c                p    | j                  |      5 }|j                         cd d d        S # 1 sw Y   y xY wr+   )r:   read_string_block)r    cmdr9   s      r$   _get_with_commandzBaseDevice._get_with_commandg   s3      % 	)&&(	) 	) 	)s   ,5c                $    | j                  d      S )z/return device state {offline,bootloader,device}z	get-stater>   r)   s    r$   	get_statezBaseDevice.get_statek   s    %%k22r&   c                $    | j                  d      S )z1return the real device id, not the connect serialzget-serialnor@   r)   s    r$   get_serialnozBaseDevice.get_serialnoo   s    %%n55r&   c                $    | j                  d      S )zexample return: usb:12345678Yzget-devpathr@   r)   s    r$   get_devpathzBaseDevice.get_devpaths   s    %%m44r&   c                f    | j                  d      }t        |j                  d            | _        |S )z
        Return example:
            'abb_exec,fixed_push_symlink_timestamp,abb,stat_v2,apex,shell_v2,fixed_push_mkdir,cmd'
        features,)r>   setsplitr   )r    rG   s     r$   get_featureszBaseDevice.get_featuresw   s.    
 ))*5X^^C01r&   c                b    | j                         | j                         | j                         dS )N)serialnodevpathstate)rC   rE   rA   r)   s    r$   infozBaseDevice.info   s0     ))+'')^^%
 	
r&   c                8    dj                  | j                        S )NzAdbDevice(serial={}))formatr"   r)   s    r$   __repr__zBaseDevice.__repr__   s    %,,T[[99r&   c                    t        |       S r+   )Propertyr)   s    r$   propzBaseDevice.prop   s    ~r&   c           	        | j                   rt               d| j                   gn
t               g}|j                  |       	 t        j                  |t        j
                  t        j                        j                  d      S # t        j                  $ rD}|j                  dd      r(t        d||j                  j                  dd            Y d	}~y	d	}~ww xY w)
zRun adb command use subprocess and get its content

        Returns:
            string of output

        Raises:
            EnvironmentError
        z-s)stdinstderrutf-8raise_errorT
subprocessignoreerrorsN)r   r   extendr\   check_outputDEVNULLSTDOUTdecodeCalledProcessErrorgetEnvironmentErroroutput)r    argskwargscmdses        r$   
adb_outputzBaseDevice.adb_output   s     48<<
D$,,/hj\D	**J..z7H7HfWo ,, 	zz-.& $(Q  /	s   AB C:CCc                    t        |t        t        f      rt        |      }| j	                         }|j                  d|z          |j                          |S )zOpen a shell connection to the device

        Args:
            cmdargs (str | list | tuple): command args

        Returns:
            AdbConnection: shell connection object
        zshell:)
isinstancelisttupler   r:   r3   r4   )r    cmdargsr9   s      r$   
open_shellzBaseDevice.open_shell   sI     ge}-"7+G!	x')*	r&   rZ   Tc                     y r+   r(   r    rr   streamr.   encodingrstrips         r$   shellzBaseDevice.shell   s     r&   F)rv   r.   rx   c                    y r+   r(   ru   s         r$   ry   zBaseDevice.shell   s     r&   )rx   c                    y r+   r(   ru   s         r$   ry   zBaseDevice.shell   s     r&   c                     y r+   r(   )r    rr   rv   r.   rx   s        r$   ry   zBaseDevice.shell   s     r&   c                H   t        |t        t        f      rt        |      }| j	                  |      }|r|S |r|j
                  j                  |       	 |j                  |      }|j                          |r|r|j                         S |S |S # |j                          w xY w)a  Run shell inside device and get it's content

        Args:
            rstrip (bool): strip the last empty line (Default: True)
            stream (bool): return stream instead of string output (Default: False)
            timeout (float): set shell timeout
            encoding (str): set output encoding (Default: utf-8), set None to make return bytes
            rstrip (bool): strip the last empty line, only work when encoding is set

        Returns:
            string of output when stream is False
            AdbConnection when stream is True

        Raises:
            AdbTimeout

        Examples:
            shell("ls -l")
            shell(["ls", "-l"])
            shell("ls | grep data")
        rw   )
ro   rp   rq   r   rs   conn
settimeoutread_until_closecloserx   )r    rr   rv   r.   rw   rx   r9   rh   s           r$   ry   zBaseDevice.shell   s    : ge}-"7+GOOG$HFFg&	''':F GGI&,6==?8&8 GGIs   B B!)rx   v2c                    y r+   r(   r    rr   r.   rw   rx   r   s         r$   shell2zBaseDevice.shell2  s     r&   c                    y r+   r(   r   s         r$   r   zBaseDevice.shell2  s     r&   c                     y r+   r(   )r    rr   r.   rx   r   s        r$   r   zBaseDevice.shell2!  s     r&   c           
        t        |t        t        f      rt        |      }|r^| j                  s-t        | j                         j                  d            | _        d| j                  vrd}t        j                  d       |r| j                  ||      }n| j                  ||      }|rt        |j                  |j                  |j                  j!                  |d      |j"                  j!                  |d      |j$                  j!                  |d            }|r]|j                  j'                         |_        |j"                  j'                         |_        |j$                  j'                         |_        |S )a"  
        Run shell command with detail output
        Args:
            cmdargs (str | list | tuple): command args
            timeout (float): set shell timeout, seconds
            encoding (str): set output encoding (Default: utf-8), set None to make return bytes
            rstrip (bool): strip the last empty line, only work when encoding is set
            shell_v2 (bool): attempt to use the shell_v2 protocol (and fail if not supported by device)

        Returns:
            ShellOutput

        Raises:
            AdbTimeout
        rH   shell_v2Fz.shell_v2 specified but not supported by devicereplacer^   r8   
returncoderh   rY   stdout)ro   rp   rq   r   r   rI   rK   rJ   loggerwarning	_shell_v2	_shell_v1ShellReturnr8   r   rh   rd   rY   r   rx   )r    rr   r.   rw   rx   r   results          r$   r   zBaseDevice.shell2*  s/   . ge}-"7+G>>!$T%6%6%8%>%>s%C!D/OP^^GW5F^^GW5F !,,}}++HY+G}}++HY+G}}++HY+GF  & 4 4 6 & 4 4 6 & 4 4 6r&   c                "   t        |t              sJ d}|d| dz   }| j                  ||d d      }|j                  |j	                               }|dk(  rt        d||      t        ||t        |      z   d        }|d | }t        |||      S )	NzX4EXIT:z; echo z$?F)r.   rw   rx   zshell output invalid)r8   r   rh   )	ro   strry   rfindencoder   intlenr   )r    rr   r.   MAGICnewcmdrh   rindexr   s           r$   r   zBaseDevice._shell_v1^  s    '3'''WUG2..

67TRW
Xelln-R<166BBU 3 567
g*VTTr&   c                   | j                  |      }	 |j                  d|        |j                          t        j                         }t        j                         }t        j                         }d}	 |j                  d      }|d   }	t        j                  |dd d      }
|
dk(  r7|j                  |
      }|	dk(  r#|j                  |       |j                  |       n3|	d	k(  r#|j                  |       |j                  |       n|	d
k(  r|d   }nt        |||j                         |j                         |j                               |j                          S # |j                          w xY w)Nr-   z	shell,v2:      r      little)	byteorder      r   )r:   r3   r4   ioBytesIO
read_exactr   
from_byteswriter   getvaluer   )r    rr   r.   r9   stdout_bufferstderr_bufferoutput_buffer	exit_codeheadermsg_idlengthdatas               r$   r   zBaseDevice._shell_v2j  sL   0!	NNYwi01LLNJJLMJJLMJJLMIaqxHQ;||F+Q;!''-!''-q[!''-!''-q[ $QI! " "$$--/$--/$--/ GGIAGGIs   D?E$ $E6c                n    d}|r|dz  }|d| d| z  }| j                  |      }|j                          y )Nforwardz	:norebindr/   ;r:   r   )r    localremotenorebindr=   r9   s         r$   r   zBaseDevice.forward  sD    ;C5'6(##$		r&   c                   t        |t              rdt        |      z   }| j                         D ]j  }|j                  | j
                  k(  s|j                  |k(  s-|j                  j                  d      sIt        |j                  t        d      d       c S  t               }| j                  dt        |      z   |       |S )z(forward remote port to local random porttcp:N)ro   r   r   forward_listr"   r   r   r   
startswithr   r   r   )r    r   f
local_ports       r$   forward_portzBaseDevice.forward_port  s    fc"c&k)F""$ 	3ADLL(HH&GG&&v.1773v;=122	3 #_
Vc*o-v6r&   c                   d}| j                  |      5 }|j                         }g }|j                         D ]8  }|j                         }t	        |      dk7  r"|j                  t        |        : |cd d d        S # 1 sw Y   nxY w| j                  j                         }|D cg c]  }|j                  | j                  k(  s|  c}S c c}w )Nzlist-forwardr   )r:   r<   
splitlinesrJ   r   appendForwardItemr   r   r"   r   )r    r=   r9   contentitemslinepartsitems           r$   r   zBaseDevice.forward_list  s      % 	))+GE**, 2

u:?[%01	2
 	 	 	 ))+!&F$++*EFFFs   AA==B'CCc                    d}	 | j                  d|       }|r|j                          yy# t        $ r |r Y "w xY w# |r|j                          w w xY w)a1  
        Remove existing forward local connection.

        Args:
            local (str): Local address of the forward to close, for example tcp:<port>
            raise_non_found (bool): Whether to raise an `AdbError` if the local forward address
                doesn't exist, default is True.
        Nzkillforward:)r:   r   r   )r    r   raise_non_foundr9   s       r$   forward_removezBaseDevice.forward_remove  sh     #'	##l5'$:;A
 	 	  	 	 	 s   , ;> ;> Ac                B    | j                  d      j                          y)z)Remove all forwarded network connections.zkillforward-allNr   r)   s    r$   forward_remove_allzBaseDevice.forward_remove_all  s    -.446r&   c                (   | j                         5 }dg}|r|j                  d       |j                  |dz   |z          |j                  dj                  |             |j	                          |j	                          ddd       y# 1 sw Y   yxY w)a  
        Args:
            serial (str): device serial
            remote, local (str):
                - tcp:<port>
                - localabstract:<unix domain socket name>
                - localreserved:<unix domain socket name>
                - localfilesystem:<unix domain socket name>
            norebind (bool): fail if already reversed when set to true

        Raises:
            AdbError
        zreverse:forwardr   r   r/   N)r:   r   r3   joinr4   )r    r   r   r   r9   ri   s         r$   reversezBaseDevice.reverse  sy       " 	a%&DJ'KKu,-NN388D>*LLNLLN	 	 	s   A.BBc                    | j                         5 }|j                  d       |j                          |j                          ddd       y# 1 sw Y   yxY w)z'Remove all reverse network connections.zreverse:killforward-allNr:   r3   r4   r    r9   s     r$   reverse_remove_allzBaseDevice.reverse_remove_all  sD      " 	aNN45LLNLLN	 	 	s   2AAc                    | j                         5 }|j                  d|        |j                          |j                          ddd       y# 1 sw Y   yxY w)a  
        Remove existing reverse remote connection.

        Args:
            serial (str): device serial
            remote (str):
                - tcp:<port>
                - localabstract:<unix domain socket name>
                - localreserved:<unix domain socket name>
                - localfilesystem:<unix domain socket name>

        Raises:
            AdbError
        zreverse:killforward:Nr   )r    r   r9   s      r$   reverse_removezBaseDevice.reverse_remove  sM       " 	aNN1&:;LLNLLN	 	 	s   5AAc           	     V   | j                         5 }|j                  d       |j                          |j                         }g }|j	                         D ];  }|j                         }t        |      dk7  r"|j                  t        |dd          = 	 d d d        |S # 1 sw Y   S xY w)Nzreverse:list-forwardr   r   )	r:   r3   r4   r<   r   rJ   r   r   ReverseItem)r    r9   r   r   r   r   s         r$   reverse_listzBaseDevice.reverse_list  s      " 		6aNN12LLN))+GE**, 6

u:?[%)45	6		6 		6 s   BBB(c                n   | j                         }|j                  d       |j                          |j                         }|dk(  rt	        d      |j                         }|dk7  r|dk7  rt	        d|      |j                         }|dk(  r|j                         }|j                         }|j                         }|j                         }|j                         }|j                         }	|j                         }
|j                         }|j                         }|j                         }|j                         }d}|	d	k(  rd
}|dk(  s|r|dz  }|dk7  r|dk7  rt	        d      |j                  |      }t        |      |k7  rt        d|t        |            t        j                  |||f|      }|S )z}Capture device screen and return PIL.Image object (Not very stable)

        Raises:
            NotImplementedError
        zframebuffer:   zUnsupported version 16       zUnsupported bpp(bits per pixel)r   RGBr   BGRARGBAzUnsupported color formatzframebuffer size not match)
r:   r3   r4   read_uint32NotImplementedErrorr7   r   r
   r	   	frombytes)r    r9   versionbppsizewidthheight
red_offset
red_lengthblue_offsetblue_lengthgreen_offsetgreen_lengthalpha_offsetalpha_lengthcolor_formatbufferimages                     r$   framebufferzBaseDevice.framebuffer  s    !	~&	--/b=%&>??mmo"9%&GMM}}19==?D]]_
]]_
mmommo}}}}}}}}! L"9CL6!le&;%&@AAv;$()EtSQW[YYufovFr&   z2.6.0z3.0.0zuse sync.push instead)deprecated_in
removed_incurrent_versiondetailsc                :    | j                   j                  ||      S )z alias for sync.push )syncpush)r    r   r   s      r$   r   zBaseDevice.push:  s     yy~~eV,,r&   c                r    dfd}| j                         }	  ||      S #  |j                           xY w)z
        Used to connect a socket (unix of tcp) on the device

        Returns:
            socket object

        Raises:
            AdbError, ValueError
        c                   t         j                  k(  rKt        t              sJ | j	                  dt              z          | j                          | j                  S t         j                  t         j                  fv rBt        t
              sJ | j	                  dz          | j                          | j                  S t         j                  t         j                  t         j                  t         j                  fv r<| j	                  dz   t              z          | j                          | j                  S t        d      )Nr   zlocalabstract:r/   zUnsupported network type)NetworkTCPro   r   r3   r   r4   UNIXLOCAL_ABSTRACTLOCAL_FILESYSTEMLOCALDEVLOCAL_RESERVED
ValueErrorr   )r9   addressnetworks    r$   _connectz.BaseDevice.create_connection.<locals>._connectK  s   '++%!'3///vG45 66M W\\7+A+ABB!'3////'9: 66M ((&&	  w}s7|;< 66M !!;WEEr&   )r9   r   returnsocket.socketr   )r    r  r  r  r9   s    ``  r$   create_connectionzBaseDevice.create_connection?  s:    	* !	A;	GGIs   # 6c                    | j                         5 }|j                  d       |j                          |j                         cddd       S # 1 sw Y   yxY w)zjrestart adbd as root

        Return example:
            cannot run as root in production builds
        zroot:N)r:   r3   r4   r   r   s     r$   rootzBaseDevice.rootg  sH       " 	(aNN7#LLN%%'	( 	( 	(s   1AAc                    | j                         5 }|j                  dt        |      z          |j                          |j	                         cddd       S # 1 sw Y   yxY w)zurestart adbd listening on TCP on PORT

        Return example:
            restarting in TCP mode port: 5555
        ztcpip:N)r:   r3   r   r4   r   )r    portr9   s      r$   tcpipzBaseDevice.tcpips  sQ       " 	(aNN8c$i/0LLN%%'	( 	( 	(s   =AA!c                   rAt        t              rt        j                        t        t        j                        sJ |r| j                  d       dfd}	 	 	 	 	 	 	 	 dd}t               }| j                  |d      }t        j                  |      j                  dd      }	t        j                  d	|||	||fd
      j                          |S )a  
        Args:
            file (str): file path to save logcat
            clear (bool): clear logcat before start
            re_filter (str | re.Pattern): regex pattern to filter logcat
            command (str): logcat command, default is "logcat -v time"

        Example usage:
            >>> evt = device.logcat("logcat.txt", clear=True, re_filter=".*python.*")
            >>> time.sleep(10)
            >>> evt.stop()
        zlogcat --clearc                0    yj                  |       d uS )NT)search)r   	re_filters    r$   _filter_funcz'BaseDevice.logcat.<locals>._filter_func  s"     ##D)55r&   c                   	 | j                   j                  ddd      }|j                         sM|j                         }|sn: ||      r!|j	                  |       |j                          |j                         sM|j                          | j                          |j                          y # j                          | j                          |j                          w xY w)NrUTF-8r   )rw   r_   )r   makefile
is_stoppedreadliner   flushr   done)rv   fdsteventfilter_funcfsrcr   s         r$   
_copy2filez%BaseDevice.logcat.<locals>._copy2file  s    {{++C')+T**,==?D"4(

4(

  **, 



 



s   A:B. .2C T)rv   wr  r~   logcat)nametargetri   daemon)r   r   r  bool)rv   r   r#  ztyping.TextIOr$  r   r%  ztyping.Callable[[str], bool])ro   r   recompilePatternry   r   pathlibPathopen	threadingThreadstart)
r    fileclearr  r8   r  r'  r$  rv   r#  s
      `      r$   r)  zBaseDevice.logcat~  s    & )S)JJy1	i444JJ'(	6
	!		 	 6		( GD1||D!&&sW&=$|4		

 %'r&   )NN)r!   r   r"   Optional[str]r#   zOptional[int])r  r9  )r8   r9  r.   Optional[float]r  r   )r=   r   r  r   )r  r   )r  dict)r  z
'Property')rr   Union[str, list, tuple]r  r   )
rr   r<  rv   zLiteral[True]r.   r:  rw   
str | Noner  r   )
rr   r<  rv   Literal[False]r.   r:  rw   Literal[None]r  bytes)
rr   r<  rv   r>  r.   r:  rw   r   r  r   )rr   r<  rv   r>  r.   r:  r  r   )
rr   r<  rv   r-  r.   r:  rw   r=  r  z'typing.Union[AdbConnection, str, bytes])rr   r<  r.   r:  rw   r?  r  r   )rr   r<  r.   r:  rw   r   r  r   )rr   r<  r.   r:  r  r   )rr   r<  r.   r:  rw   r=  r  z"Union[ShellReturn, ShellReturnRaw])rr   r   r.   r:  r  r   )F)r   r   r   r   r   r-  )r   Union[int, str]r  r   )r  zList[ForwardItem]T)r   r   r   r-  r  None)r  rC  )r   r   r   r   r   r-  )r   r   )r  zList[ReverseItem])r  zImage.Image)r   r   r   r   )r  r  r  rA  r  r  )r  r   )NFNzlogcat -v time)
r7  zOptional[StrOrPathLike]r8  r-  r  z Optional[Union[str, re.Pattern]]r8   r   r  r   )*__name__
__module____qualname____doc__r%   r   propertyr"   _DEFAULT_SOCKET_TIMEOUTr:   r>   rA   rC   rE   rK   rP   rS   rV   rm   rs   r   ry   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   &   s   & _c *7N[(#   (,H_!$!6E!	!F)365 
 
:  *  
 $;&(  !	
  
  
 "'#:( 	
 !   
   "'#:	 (  !	  
   "'#:(  !	 
  #:&,(, , !	,
 , 
1,\  $; ( !
   
   $; ( !
  
   $;( ! 
  $;&2(2 !2 	2 
,2h BY 
U BY #JG&7.(-^ g';`wx- y-&&)8&	&P
(	( )-6:'=%= = 4	=
 = 
=r&   r   c                  T    e Zd ZddZd Zd	d
dZed        Zed        Zed        Z	y)rU   c                    || _         y r+   )_d)r    ds     r$   r%   zProperty.__init__  s	    r&   c                T    d| j                    d| j                   d| j                   S )Nzproduct:z model:z device:)r*  modeldevicer)   s    r$   __str__zProperty.__str__  s'    $))GDJJ<x}MMr&   c                    |r1|| j                   j                  v r| j                   j                  |   S | j                   j                  d|g      j                         x}| j                   j                  |<   |S )Ngetprop)rL  r   ry   strip)r    r*  cachevalues       r$   rf   zProperty.get  sd    TTWW00077&&t,,,0GGMM9d:K,L,R,R,TT##D)r&   c                (    | j                  dd      S )Nzro.product.nameTrU  rf   r)   s    r$   r*  zProperty.name  s    xx)x66r&   c                (    | j                  dd      S )Nzro.product.modelTrX  rY  r)   s    r$   rO  zProperty.model  s    xx*$x77r&   c                (    | j                  dd      S )Nzro.product.deviceTrX  rY  r)   s    r$   rP  zProperty.device  s    xx+4x88r&   N)rM  r   rB  )r*  r   r  r   )
rD  rE  rF  r%   rQ  rf   rH  r*  rO  rP  r(   r&   r$   rU   rU     sN    N 7 7 8 8 9 9r&   rU   )+
__future__r   r   loggingr1  r.  socketr\   r4  typingr   r   r   r   r   ImportErrortyping_extensionsPILr	   r
   deprecationr   adbutils._protor   adbutils._adbr   r   r   adbutils._utilsr   r   r   r   adbutils._versionr   adbutils.errorsr   rI  	getLoggerrD  r   r   rU   r(   r&   r$   <module>rj     s    # 	   	     2 2* . " * 3  ) L L ) $  			8	$U
 U
p9 9Y  *)*s   B" "B0/B0