
    guW                       d 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mZmZmZ ddlmZ ddlmZmZ ddlmZ dgZdZd	ZeZej6                  d
ej6                  ehZ ed      Z ed      Z  ed      Z!e e!k  rdndZ"d Z# e#d      Z$ e#d      Z% e#d      Z& e#d      Z' e#d      Z(djS                  d      Z* e+e*      Z,[*	 ddl-Z.e.j^                  Z0 e3ed      Z.e.r e#d      ndZ4[.dZ5dZ6 e7e7      Z8ddl9m:Z; ddl9m<Z= ej|                  d k(  re;Z?d! Z;ej                  ZAd" ZBd# ZCd$ ZD d% d      ZE e7eEj                  d         ZG[Edd'ZHdd(ZId) ZJed*defd+ZKd, ZLd- ZMd. ZNd/ ZOd0 ZPd1 ZQd2 ZRd3 ZSd4 ZTdd5ZUd6 ZVd7 ZWefd8ZXefd9ZYdd:ZZe[fd;Z\dd<Z]d= Z^d> Z_dd?Z`d@ ZadA ZbddBZcddDZddE ZedF ZfdG ZgdH ZhdI ZidJ ZjdK ZkdL ZldM ZmdN ZndO ZodP ZpdQ ZqdR ZrdS ZsdT ZtdU ZudV ZvdW ZwdX ZxdY ZydZ Zzd[ Z{defegeheiejekelemeneoepeqereseteuevewexeyeze{hZ|d\ Z}d] Z~d^ Zd_ Zd` Zda Zdb Zdc Zdd Zde Zdf Zdg Zdh Zde}e~eeeeeeeeeeehZ G di dje      Zi ZdkZdl Zdm Zdn Z G do dpe      Zej&                  Z edq       edr       eds       edt       edu      fxZ.\  ZZZZZ ee.      Z[[. G dv dwe      Zi Zdddded&efdxZdded&fdyZ ee        ee        eeez        eeevee!{        eeeve}e!{        eeeu|        e e7e              e e7d              eee'eei}      Z e e7ejP                        e'eei}        ed~d      Z	  eejT                  ejV                  ejX                  e&z   ees       ddlmZ d Zd Zejc                  e       	  ee       	  eeee~       	  e7e       e7e      ur eeee}       	  eeej|       	  eeek|       	  eee(eev}       	  eee(eev}       	  eejr                         	  eejt                         	  e e7e             	 ddlZ	 ej|                  Z	 ddlmZ edCk  re1	 d Zd Zd Zd Zd Zejc                  eī       ejc                  eū       e|jc                  eǫ       	  eeȫ       	  eeej|       	  eee!e       	 ddlmZ  e e7 ee            ew|       	 ddlmZ  e e7 ee            exe!e}       	 ddlmZ  eeee       	  eej                  ey|        eeee,       	  eej                  e{d       	  eej                         	  eej                  e{|        eee        eee        ee8e       	  eeep|       	  eeep|       	  eej                  ep|       	  eej                  eo|       	  eej                  e{|        eBi        eCi        eDi       gZ	 eؐj                   eg        ed*      g       	 ddlmZ eؐj                   eee             [ eDe      D ]?  Z.e.jn                  se.j                  s	 eؐj                   e.jn                                A eD ]  Z.	  ee.      Z e e7e      eerd        [[[.ddZ G d de      Z G d de      Z G d de      Z G d de      Z G d de      ZddZda e       Zd Zd Zd ZddZd ZddZd Zd Zd Zd Zy# e1e2f$ r  ed      dz
  Z. e#d      e.z   e. z  Z0Y nw xY w# e2$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e2$ r Y w xY w# e2$ r Y w xY w# e$ r Y w xY w# e2$ r dZY w xY w# e1$ r dZY w xY w# e1$ r dxZZd ZY Nw xY w# e$ r Y Qw xY w# e$ r Y Rw xY w# e$ r Y Rw xY w# e1$ r Y Aw xY w# e1$ r Y .w xY w# e1$ r Y (w xY w# e2$ r Y w xY w# e2$ r Y w xY w# e2$ r Y  w xY w# e2$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e$ r Y w xY w# e2$ r Y w xY w# e2$ r Y w xY w# e$ r Y w xY w# e1$ r Y {w xY w# e$ r Y w xY w# eef$ r Y Iw xY w)a  
This is a stripped-down of asizeof.py from the pympler module. It's vendored
because pympler is unmaintained, while having a critical vulnerability.

Differences from the original asizeof module:
- Removed code for running as __main__
- Removed `adict`
- `__all__` only includes `asizeof`

The *original* original copyright, license and disclaimer are at the end of this
file, exactly as they appeared in the pympler code. pympler itself is under the
Apache license, which appears in the project root.

The original module docstring that appears in pympler follows; note that some of
it no longer pertains here, but it's preserved to document implementation
details.
    N)	isbuiltinisclassiscodeisframe
isfunctionismethodismodule)log)curdirlinesep)calcsizeasizeofz22.06.30 typesclPLc                 @    t        | j                  dt                    S )z3Like struct.calcsize() but with 'z' for Py_ssize_t.z)r   replace_z_P_L)fmts    U/var/www/openai/venv/lib/python3.12/site-packages/streamlit/vendor/pympler/asizeof.py	_calcsizer      s    CKKV,--    	Pz10P5i0PPzz13P63i0PPzP0Pz2PlP zutf-82d   2Pzgettotalrefcount2zi   i @  )get_objects)get_referentsiosc                  6    t        d t               D              S )Nc              3   8   K   | ]  }t        |      r|  y wN)_isNULL).0os     r   	<genexpr>z_getobjects.<locals>.<genexpr>   s     C 01
Q 0s   )tuple_gc_getobjects r   r   _getobjectsr5      s    C 0CCCr   c                 `    t        | d| j                        }t        |      r |       S |xs dS )#Return iter-/generator, preferably.	iteritemsr4   )getattritemscallableobjr0   s     r   _itemsr>   	  s+    [#)),A1+13,AG,r   c                 `    t        | d| j                        }t        |      r |       S |xs dS )r7   iterkeysr4   )r9   keysr;   r<   s     r   _keysrB     s+    Z*A1+13,AG,r   c                 `    t        | d| j                        }t        |      r |       S |xs dS )r7   
itervaluesr4   )r9   valuesr;   r<   s     r   _valuesrF     s+    \3::.A1+13,AG,r   c                       fdS )Nc                       S r-   r4   unuseds   r   <lambda>z<lambda>.<locals>.<lambda>  s    Vr   r4   rI   s   `r   rK   rK     s    ^r   Fc                     t        t        | dd      |      }| t        k7  rt        | dd      t        z  }n|rd}nt        |dd      t        z  }|r	|t
        z  }|t        z   S )zDGet non-zero basicsize of type,
    including the header sizes.
    __basicsize__r   	__flags__T)maxr9   
_Type_type_Py_TPFLAGS_HAVE_GC_Py_TPFLAGS_HEAPTYPE_sizeof_CPyGC_Head_sizeof_Crefcounts)tbaseheapr=   shs         r   
_basicsizerZ   $  sj     	GA*D1AJA{A&)<<	Ca(+??	!!!r   c                     t        | d|      S )z!Return the object's class object.	__class__r9   r=   dflts     r   _classofr`   6  s    3T**r   c                     t        t              D cg c]  }t        | |j                        s| c}}t	        |      dk(  r|d   S dS c c}w )z3Return single, existing super type typedef or None.r$   r   N)rF   	_typedefs_issubclasstypelen)typvs     r   _derive_typedefrh   ;  sI    I&C&q+c166*B&CAq6Q;1Q4(D( 	Ds
   A
A
r4   c           	   #     K   |rt        | |      ri }t        |       j                         D ]a  }t        |      }t	        ||d      D ]D  }|j                  d      rd|z   |z   }t        | |      s)|j                  |t	        | |             F c t        |      D ]  }	|	  yy|r| D ]  }
||
f 
 yt        |       D ]6  }|j                  |      st        | |      s"||vs'|t	        | |      f 8 yw)zReturn an attribute name, object 2-tuple for certain
    attributes or for the ``__slots__`` attributes of the
    given object, but not both.  Any iterator referent
    objects are returned with the given name if the
    latter is non-empty.
    r4   ___N)	hasattrrd   mro_nameofr9   
startswith
setdefaultr>   dir)r=   prefexclslotsitorrX   r   narU   r0   s              r   _dir2rx   A  s      3 A#Y]]_AJ E2.A||D)!GaKsAQQ8	 / % AY  " 
A'M  SA||D!gc1o!4-a(( s   A-C;0A%C;C;#C;(C;c                 J     dD ]  }|dz  }t         fd|D              s y y)z3Return True for likely dict object via duck typing.))r:   rA   rE   )r8   r@   rD   )__len__gethas_keyc              3   J   K   | ]  }t        t        |d               y wr-   )r;   r9   )r/   rw   r=   s     r   r1   z_infer_dict.<locals>.<genexpr>g  s      >1xQ-.s    #TFall)r=   attrss   ` r   _infer_dictr   c  s/    W,,>>> X r   c                 ,    t        |       xs | t        u S )z.Return True for built-in types as in Python 2.)r   rangerf   s    r   _isbuiltin2r   l  s     S>+cUl+r   c                 "    t        | t              S )z2Return True if obj is a cell as used in a closure.)
isinstance
_cell_typer=   s    r   _iscellr   r  s    c:&&r   c                 x    t        |       }t        |      }|xr! |t        j                  t	        |      d      v S )z#Return True for known dict objects.r4   )r`   rn   _dict_typesr{   	_moduleof)r=   r   rv   s      r   
_isdictyper   w  s3    A
A7kooilB777r   c                 8    	 t        |       S # t        $ r Y yw xY w)z%Return True for a stack frame object.F)r   ReferenceErrorr   s    r   _isframer   ~  s#    s|    
 	c                 $    t        |       t        v S )z&Is this a type or class to be ignored?)r   _ignored_modulesr   s    r   
_isignoredr     s    S>---r   c                 >    t        | t              xr t        | d      S )zpNamed tuples are identified via duck typing:
    <http://www.Gossamer-Threads.com/lists/python/dev/1142178>
    _fields)r   r2   rl   r   s    r   _isnamedtupler     s     c5!=gc9&==r   c                 b    t        | t              xr t        |       dk(  xr t        |       dk(  S )zPrevent asizeof(all=True, ...) crash.

    Sizing gc.get_objects() crashes in Pythonista3 with
    Python 3.5.1 on iOS due to 1-tuple (<Null>,) object,
    see <http://forum.omz-software.com/user/mrjean1>.
    r$   z	(<NULL>,))r   r2   re   reprr   s    r   r.   r.     s,     c5!Pc#h!mPS	[8PPr   c                 L    |t         ur	 t        | |      S y# t        $ r Y yw xY w)zsSafe inspect.issubclass() returning None if Super is
    *object* or if obj and Super are not a class or type.
    N)object
issubclass	TypeError)r=   Supers     r   rc   rc     s:     F	c5))   		s    	##c                 $    t        | dd      xs |S )zGet non-zero itemsize of type.__itemsize__r   r]   )rU   items     r   	_itemsizer     s     1na(0D0r   c                  V    dj                  t        d t        |       D                    S )zKeyword arguments as a string., c              3   &   K   | ]	  }d |z    yw)z%s=%rNr4   )r/   kvs     r   r1   z_kwdstr.<locals>.<genexpr>  s     @<RGbL<s   )joinsortedr>   )kwdss    r   _kwdstrr     s     99V@6$<@@AAr   c                 j    t        |       }|t        }|S |t        |       kD  rdnt        }d||fz  }|S )zObject length as a string.!z
 leng %d%s)leng_NN_len)r=   rv   rxs       r   _lengstrr     sB    S	Ay H tCy=CcAq6!Hr   c                     t        | d|      S )z Return the object's module name.
__module__r]   r^   s     r   r   r     s    3d++r   c                     t        | d|      S )zReturn the name of an object.__name__r]   r^   s     r   rn   rn     s    3
D))r   c                 j    |r|d}}n(|dv rd\  }}n|du rt               d}}nt        | |      |||fS )zVReturn the given or 'all' objects plus
    the remaining options and exclude flag
    F)FN)r4   TTr~   )r5   _OptionError)whereobjsr   optsrU   r   s         r   _objs_opts_xr     sL     U1		1	}d15c**dA:r   c                 j    t        t        |            t        |       t        di |f} |d|z        S )z=Format an *Error* instance for invalid *option* or *options*.zinvalid option%s: %s(%s)r4   )_pluralre   rn   r   )r   ErroroptionsrU   s       r   r   r     s4    Gwu~w/A/AAA+a/00r   c                 L    t        |      }|dkD  r| dz  |z  }d||fz  }|S d}|S )zReturn percentage as string.r         Y@z%.*f%%n/a)float)parttotalprecrU   pr   s         r   _p100r     sA    eA1u5L1ay  H Hr   c                     | dk7  rdS t         S )zReturn 's' if *num* is not one.r$   rX   )r   )nums    r   r   r     s    (3##r   c                 V    dt        t        | d            z  }| |kD  r||z  }| |kD  r|S )zFind the next power of 2.   )intr
   )rv   p2s     r   _power_of_2r     s4    	
c#a)n	B
b&
b b&Ir   c                 b    t        | |      j                  d      j                  dt              S )z%Prettify and clip long repr() string.clipz<>')_reprstripr   r   )r=   r   s     r   _preprr     s'    4 &&t,44S#>>r   c                 j   |r|j                  dd      xs t        j                  }|r|j                  | |z         n|j                  |        |j                  |j                  dt                     |j                  dd      r|j                          yy|rt        | |z         yt        |        y)zyFormatted print to sys.stdout or given stream.

    *print3options* -- some keyword arguments, like Python 3+ print.
    fileNendflushF)r{   sysstdoutwriter   r   print)r   argsprint3optionsfs       r   _printfr     s    
 fd+9szzGGC$JGGCL	!!%12We,GGI -	cDjc
r   c              /      K   |rt         }nd }|D ]$  }t        | |      s ||t        | |             & |r t        | fi |D ]  \  }} |||        yyw)z/Return specific attribute objects of an object.c                     |S r-   r4   )rJ   r0   s     r   _Nz_refs.<locals>._N  s    Hr   N)	_NamedRefrl   r9   rx   )r=   namedr   r   r   rw   r0   s          r   _refsr     sh     	 3?QQ((  #&&DAqQ(N ' s
   A:Ac                     	 t        |       j                  t        d      }t	        |      |cxkD  rdkD  r n |S |dz  dz
  }|dkD  r|d| dz   || d z   }|S # t        $ r d}Y Cw xY w)zClip long repr() string.z\nzN/Ar   r   Nz....)r   r   r   	Exceptionre   )r=   r   r   rY   s       r   r   r     s    Igu- 1vq H QY!Oq5"1A23'AH  s   A A%$A%   c                     d|cxk  r| k  r7n t        S t        |       }t        d      D ]  }||z  }||k  sd|||fz  c S  t        S )zReturn size as SI string.r$   KMGPTEz or %.1f %s%sB)r   iterr   )sizeKir   sis        r   _SIr   ,  sU    1}} J $Kx.BFA1u'1b!*44 ! Jr   c                 2    t        |       t        | fi |z   S )z&Return size as regular plus SI string.)strr   )r   r   s     r   _SI2r   7  s    t9s4(4(((r   c              #   t   K   	 | j                   }|rt        d|      }| y # t        t        f$ r Y y w xY ww)Ncell_contents)r   r   AttributeError
ValueError)r=   r   r0   s      r   
_cell_refsr   ?  s@     /1-AJ' s   8# 85858c                 (    t        | |ddddddd	      S )z,Return specific referents of a class object.r\   __doc____mro__r   	__slots____weakref____dict__r   r=   r   s     r   _class_refsr  I  s*    
 
r   c                     t        | |d      S )z+Return specific referents of a code object.co_rr   r  r  s     r   _co_refsr
  X      e%((r   c              #   v  K   	 |rRt        |       D ]C  \  }}t        |      }t        d|z   |       |dt        |      z   z  }t        d|z   |       E yt        |       D ]  \  }}| |  y# t        t
        t        f$ r.}t        j                  dt        |       d|       Y d}~yd}~ww xY ww)z-Return key and value objects of a dict/proxy.z[K] : z[V] zIterating 'z': N)
r>   r   r   r   KeyErrorr   r   warningswarnr`   )r=   r   krg   rX   r   s         r   
_dict_refsr  ]  s     As1F
A..TE!H_$
A..	 $ s1 $ ni0 AhsmQ?@@As;   B9AA4 B9A4 3B94B6$B1,B91B66B9c                     t        | |d      S )z1Return specific referents of an enumerate object.r   r  r  s     r   
_enum_refsr  n  s    eY''r   c           	      $    t        | |ddddd      S )z1Return specific referents of an Exception object.r   filenamelinenomsgtextr  r  s     r   	_exc_refsr  s  s      UFJ% r   c                     t        | |dd      S )z+Return specific referents of a file object.modenamer  r  s     r   
_file_refsr  {  s    eVV,,r   c                     t        | |d      S )z,Return specific referents of a frame object.f_r	  r  r  s     r   _frame_refsr!        e$''r   c           
      (    t        | |dddddd      S )z9Return specific referents of a function or lambda object.r   r   __code____closure__func_)func_globals)rr   rs   r  r  s     r   
_func_refsr(    s'    	 	r   c                 8    t        | dd      }t        ||dd      S )z:Return the referent(s) of a generator (expression) object.gi_frameNf_localsf_code)r9   r   )r=   r   r   s      r   	_gen_refsr-    s#     	Z&AE:x00r   c                 $    t        | |dddd      S )z-Return specific referents of a method object.r   r   r$  im_r	  r  r  s     r   _im_refsr0    s    eY
JUKKr   c                 "    t        | |ddd      S )z.Return specific referents of a class instance.r  r\   r  rt   r  r  s     r   
_inst_refsr3    s    eZKHHr   c                 N    t        |       }t        ||t        |       xs d      S )z-Return the referent(s) of an iterator object.iteref)ru   )_getreferentsr   rn   r=   r   r   s      r   
_iter_refsr8    s$    cAE 899r   c                 Z    t        |       t        k(  }|rdS t        | j                  |      S )z-Return specific referents of a module object.r4   )rn   r   r  r  )r=   r   rv   s      r   _module_refsr:    s(     A27
3<<77r   c              #   R   K   t        | |dd      D ]  }|  | D ]  }|  yw)zHReturn specific referents of obj-as-sequence and slots but exclude dict.r\   r  r2  Nr  r7  s      r   _namedtuple_refsr<    s/     3{+> ? s   %'c                      t        | |dd      S )z/Return specific referents of a property object.r   r   r	  r  r  s     r   
_prop_refsr>    s    eYS11r   c                     | S )zIReturn specific referents of a frozen/set, list, tuple and xrange object.r4   r=   rJ   s     r   	_seq_refsrA    s    Jr   c                     t        | |d      S )z%Return referents of a os.stat object.st_r	  r  r  s     r   
_stat_refsrD    r  r   c                     t        | |d      S )z(Return referents of a os.statvfs object.r   r	  r  r  s     r   _statvfs_refsrF    r"  r   c                     t        | |d      S )z0Return specific referents of a traceback object.tb_r	  r  r  s     r   _tb_refsrI    r  r   c           
      &    t        | |dddddd      S )z+Return specific referents of a type object.r   r   r   r  r  r  r  r  s     r   
_type_refsrK    s'    	 	r   c                 2    	  |        fS # t         $ r Y yw xY w)zReturn weakly referent object.r4   )r   r@  s     r   
_weak_refsrM    s"    x s   
 	c                 8    	 t        |       S # t        $ r Y yw xY w)zSafe len().r   )re   r   r   s    r   r   r     s"    3x r   c                 "    | j                         S )zBytearray size.)	__alloc__r   s    r   _len_bytearrayrQ    s    ==?r   c                     t        | j                        | j                  z   t        | j                        z   | j                  z   dz
  S )z1Length of code object (stack and variables only).r$   )r   co_freevarsco_stacksizeco_cellvars
co_nlocalsr   s    r   	_len_coderW    sL     	S__


	
s
	  ..	 		r   c                 J    t        |       }|dk  rd}|S t        |dz         }|S )z Dict length in items (estimate).   r   r$   re   r   r=   rv   s     r   	_len_dictr\    s3    CA1u H AHr   c                 :    t        | dd      }|rt        |      S dS )zLength of a frame object.r,  Nr   )r9   rW  )r=   r   s     r   
_len_framer^  )  s!    Xt$A9Q<#!#r   c                 p    t        | d      t        j                  z
  }|dkD  r|t        j                  z  S dS )z<Length of *int* (multi-precision, formerly long) in Cdigits.r   )
_getsizeofr   rM   r   r[  s     r   _len_intra  5  s5    3S...A&'!eA!!!22r   c                 Z    t        | dd      }|rt        |      r |       S t        |       S )zLength (hint) of an iterator.__length_hint__N)r9   r;   r   r[  s     r   	_len_iterrd  ;  s*    &-A132c2r   c                 N    t        |       }|dkD  r|d|dz	  z   z  }|S |r|dz  }|S )zLength of list (estimate).   rY        re   r[  s     r   	_len_listrj  A  s>    CA1u	Q!q&\ H 
	QHr   c                 ,    t        | j                        S )zModule length.)r   r  r   s    r   _len_modulerl  L  s    r   c                 T    t        |       }|dkD  rt        ||z   dz
        }|S |rd}|S )z Length of frozen/set (estimate).rf  r   rZ  r[  s     r   _len_setrn  Q  s:    CA1uA	" H 
Hr   c                     	 | j                   | j                  z
  dz   | j                  z  S # t        t        f$ r Y yw xY w)zSlice length.r$   r   )stopstartstepr   r   r   s    r   
_len_slicers  [  s?    399$q(SXX55I& s   (+ ==c                 :    	 | j                   S # t        $ r Y yw xY w)zStruct length in bytes.r   )r   r   r   s    r   _len_structru  j  s"    xx s    	c                     t        |       dz   S )zUnicode size.r$   ri  r   s    r   _len_unicoderw  r  s    s8a<r   c                   $    e Zd ZdZdZd Zd ZeZy)_ClaskeyzWrapper for class objects._objc                     || _         y r-   rz  selfr=   s     r   __init__z_Claskey.__init__  s	    	r   c                 h    t        | j                        }|j                  d      r|d d dz   S |dz   S )N>z def>z def)r   r{  endswith)r~  r   s     r   __str__z_Claskey.__str__  s3    		N%&ZZ_#2 F1v:Fr   N)r   r   __qualname__r   r  r  r  __repr__r4   r   r   ry  ry    s    $I
G Hr   ry  )NNc                 x    t        |       }	 t        |   }|S # t        $ r t        |       xt        |<   }Y |S w xY w)zWrap a class object.)id	_claskeysr  ry  )r=   r   r  s      r   _claskeyr    sH    
3A)aL H  )#C=(	!qH)s   	 99c                 N    t        |       t        u }|rt        |       | fS t        S )z+Return class and instance keys for a class.)rd   rP   r  	_NoneNone)r=   rU   s     r   
_key2tupler    s&    S	ZA#$HSM33)3r   c                 B    t        |       }|t        u rt        |       }|S )zReturn the key for any object.)rd   rP   r  )r=   r  s     r   _objkeyr    s     S	AJSMHr   c                       e Zd ZdZdZd Zy)r   zCStore referred object along
    with the name of the referent.
    r  refc                      || _         || _        y r-   r  )r~  r  r  s      r   r  z_NamedRef.__init__  s    	r   N)r   r   r  r   r  r  r4   r   r   r   r     s      Ir   r   staticdynamicderivedignoredinferredc            	           e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZd Zd Zd Zd Zd Zdd	Zdd
Zd Zd Zdddddddedf	dZddZddZy)_TypedefzType definition class.r   Nc                 (     | j                   di | y )Nr4   )reset)r~  r   s     r   r  z_Typedef.__init__  s    

Tr   c                      y)NTr4   )r~  rJ   s     r   __lt__z_Typedef.__lt__  s    r   c                 4    t        | j                               S r-   )r   r   r~  s    r   r  z_Typedef.__repr__  s    DIIK  r   c                 ,   t        | j                        t        | j                        g}| j                  | j                  fD ]!  } |j
                  t        |      xs d       # | j                  s |j
                  d       dj                  |      S )Nr   z(code only)r   )	r   rV   r   r   refsappendrn   bothr   )r~  rU   r   s      r   r  z_Typedef.__str__  sm    ^S^,))TYY'AAHHWQZ(5) (yyAHH]#yy|r   c                     | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  fS )z)Return all attributes as arguments tuple.)rV   r   r   r  r  kindrd   xtypr  s    r   r   z_Typedef.args  sF     IIIIIIIIIIIIIIII	
 		
r   c                     |xs t         } |j                         }|j                  |        | j                  di | y)z.Duplicate attributes of dict or other typedef.Nr4   )_dict_typedefr   updater  )r~  otherr   rU   ds        r   dupz_Typedef.dup  s3    "]AFFH	

Qr   c                     | j                   }| j                  r0| j                  dkD  r!|| j                  |      | j                  z  z  }| j                  st	        ||      }|r	||z   | z  }|S )zReturn the aligned flat size.r   )rV   r   r   r  r`  )r~  r=   maskrX   s       r   flatz_Typedef.flat  sf    II99Q3$))++A yy3"ATdU"A r   c                     t        | j                        }t        |rd|dnt        | j                  rdn| j
                  | j                  rt        nd| j                  | j                        S )Return format dict.z ()varz (code only))r   r   coderV   r  )	rn   r   dictr   varir   r  rV   r  )r~  rw   s     r   formatz_Typedef.format*  sN    DII&'a>S))		~
 	
r   c                     t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  	      S )z'Return all attributes as keywords dict.)	rV   r  r   r  r   r  rd   r  r  )
r  rV   r  r   r  r   r  rd   r  r  r  s    r   r   z_Typedef.kwds5  sN    

 
	
r   TFc
                 .   |xs t         }|t        |      k7  rt        |      }n|dk  rt        |      }n|dvrt        |      }n|dk  rt        |      }n|t        vrt        |      }n|t        vrt        |      }nk|t
        vrt        |	      }nV|	dvrt        |	
      }nE|
ri }n@|| _        || _        || _        || _	        || _
        || _        || _        || _        |	| _        y|j                  |
       t!        | j"                  fi |)z'Reset all specified typedef attributes.)r  r   rV   )FTr  )r   r  r   r  )r  N)	_Not_varir   r  
_all_kinds	_all_lens	_all_refsrV   r  r   r  r   r  rd   r  r  r  r   r  )r~  rV   r   r   r  r  r  rd   r  r  extrarg   es                r   r  z_Typedef.resetC  s     IA;!AAX$A&$AAX$A#$A"$A"$A&$AADIDIDIDIDIDIDIDIDI	4::+++r   c                 :   t        |      \  }}|rm|t        vre| t        |<   |rY|t        vrPt        t        |      ||      }t	        |      rt
        n| j                  }t        |d||t              t        |<   y	y	y	|t        vrt        |      sedj                  | j                  t        |      t        |      f      }||fd| j                  d|j                         }t!        d| d|      t        t        ||      dt
        |      t        |<   y	y	)
z)Save this typedef plus its class typedef.rV   rW   F)rV   r  r  rd   r   ztypedef z bad: r  )rV   r  r  rd   N)r  rb   rZ   rd   r   _kind_ignoredr  r  rK  r   r   r  r   rn   r  r   r  )r~  rU   rV   rW   r   r  brX   s           r   savez_Typedef.saver  s    !}1)#IaLQi'tAwT=%/]M		'QQZ 	! (q iq>HHdii1wqzBC#$a&$))QWWY?tQ?@@#-ETUIaL  r   c                     |r3| j                         }|j                  |        | j                  di | |r| j                  rt        | _        yyy)zSet one or more attributes.Nr4   )r   r  r  r   r   r   )r~  safe_lenr   r  s       r   setz_Typedef.set  sA    		AHHTNDJJOO		DI "8r   r-   r   )r   FF)r   r   r  r   rV   r  r   r  r   r  rd   r  r  r  r  r  r  r   r  r  r  r   r  r  r  r  r4   r   r   r  r    s     DDDDDDDDD!
 	

  -,^*r   r  c           
      ~    t        t        | |      t        | |      ||d|| |      }|j                  | ||       |S )z'Add new typedef for both data and code.r  T)rV   r   r  r   r  r  rd   r  r  )r  rZ   r   r  )	rU   rV   r   r   r  r  rW   r  rg   s	            r   _typedef_bothr    sM     	%q$		A FF14dF#Hr   c                 d    t        t        | |      |d||       }|j                  | ||       |S )zAdd new typedef for code only.r  F)rV   r  r  r  rd   r  )r  rZ   r  )rU   rV   r  r  rW   rg   s         r   _typedef_coder    s7    %Du4a	A FF14dF#Hr   r  )r  r   r   r  r   r   r  )IterableUserDictUserDict)WeakKeyDictionaryWeakValueDictionary)r  weakrefrV   r   r   r  )arrayc                 2    t        |       | j                  z  S )zArray length (in bytes!).)re   itemsizer   s    r   
_len_arrayr    s    s8cll""r   c                 v    t        dt        | d      t        |       z
        }t        |t        t        dd      S )N8   r   r  T)rV   r   r   r  r  )rO   r`  r  r  _sizeof_Cbyte)r=   r  s     r   _array_kwdsr    s<     	B
3"Z_45A r   )r   r   )PAGESIZEi   c                    t        | d      rat        | d      rUt        | d      rI	 t        t        |             j                  d      xs# t        t	        |             j                  d      S y# t
        t        t        f$ r Y yw xY w)zNReturn True for a NumPy arange, array, matrix, memmap, ndarray, etc. instance.dtyper  nbytesnumpyF)rl   r   r`   ro   rd   r   OSErrorr   r   s    r   _isnumpyr  B  s     C!Z(X& #/::7C &yIH*W%&
  #GZ8 s   AA/ /BBc                     | j                   S )z-NumPy array, matrix, etc. length (in bytes!).)r  r   s    r   
_len_numpyr  R  s    zzr   c                 n    t        | j                  t        z        }|t        z   dz
  t        z  t        z  S )z4Approximate NumPy memmap in-memory size (in bytes!).r$   )r   r  _amapped	_PAGESIZE)r=   nbs     r   _len_numpy_memmapr  V  s.    h&'i!#	1Y>>r   c                     t        |       }|t        u rdt        d}}}ndt        | j                  }}}t        t        | |      |z
  t        |t        dd      S )N   r   `   r  T)rV   r   r   r  r  r  )	rd   _numpy_memmapr  r  r  r  r`  r  _numpy_refs)r=   rU   r  _len_r  s        r   _numpy_kwdsr  \  sa    I
  11buAz3::buA
 C#b(
 	
r   c                     t        | |d      S )z5Return the .base object for NumPy slices, views, etc.rV   r  r  s     r   r  r  s  s    S%((r   c                      y)zNot applicable, no NumPy.Fr4   rI   s    r   r  r  ~  s    r   )stat)statvfs)r  r   r   )Struct)r   r   T)r  rW   r  )finditer)r   r  r   c                    t        |       }t        t        ||       t        |      }t	        |       r3|j                  t        j                  t        z   t        t               |S t        |       rP|j                  t        |t        |       t        |      t        t                |s|j                  t"               |S t%        |       r4|j                  t        |t&        |       t(        t*        t,        d       |S t/        |       rt1        |       r:|j                  t2        d	       t5        |       r|j                  t"               |S t7        |       r|j                  dt"        
       |S t9        |       r|j                  t:        d	       |S t=        |       r|j                  t>        d	       |S t1        |      r#|j                  t        |      dt@               |S |j                  d       |S tC        |tD              r|j                  tF               |S tI        |       s|r#tK        |       r|j                  tL               |S tO        |       r"|j                  t        |      tP               |S tS        |       r|j                  tT               |S tV        r(tY        |       r |j                  di t[        |        |S t]        | t^              r |j                  di ta        |        |S t5        |       r|j                  t"               |S |r&tc        |      }|r|j                  |tF               |S tC        |td              r(|j                  t        |      dtf        tF               |S t]        | td              r#|j                  t        |      dtf               |S |j                  t        |      dt@               |S )z#Create a new typedef for an object.r   )rV   r  rd   r  )rV   r=   r  r  F)rV   r   r   r  r  )r  r  )r  r  T)r   r  r  r  )r   r  r  )r  r  )r   r  r  r  r4   )4rd   r  rZ   _kind_dynamicr	   r  r  r   _sizeof_CPyModuleObjectrl  r:  r   r  _sizeof_CPyFrameObjectr   r^  r!  r  r   _sizeof_CPyCodeObject_sizeof_CvoidprW  r
  r;   r   r  r   r   r   r(  r   r0  r3  rc   r  _kind_derivedr   r   _kind_inferredr   r   r   r<  _numpyr  r  r   _arrayr  rh   r   r  )r=   deriveframesinferrU   rg   r   s          r   _typedefr    sS   S	Aj,=qIA}	##&== 	 	
@ Hw 
#	A$:D1	 	 	
 EE}E%f He 
	A$9sC 	 	
b HU 
#3<EE{E/#=)L HK s^EEu=E1H HG _EEzE.D HC c]EExeE,@ H? QZEEy|dED: H7 EEuE6 H5 
Q		=!2 H1 
CU{3'7	>". H- 
	9Q<j1* H) 
s		#$& H% 
HSM!C !" H! 
C	 !C ! H 
C	=! H "AAM2q)$EEy|dEW
 H	 Y'EEy|dEC H EEy|dEDHr   c                   >    e Zd ZdZdZdZdZdZdZd Z	d Z
d	dZd Zy)
_ProfzInternal type profile class.r   NFc                     | j                   |j                   k  ry| j                   |j                   kD  ry| j                  |j                  k  ry| j                  |j                  kD  ryy)Nr  r$   r   )r   numberr~  r  s     r   __cmp__z_Prof.__cmp__P  sQ    ::#ZZ%++%[[5<<'[[5<<'r   c                 *    | j                  |      dk  S )Nr   )r  r  s     r   r  z_Prof.__lt__[  s    ||E"Q&&r   c           	         | j                   dkD  r%t        | j                  | j                   z        d}}n| j                  t        }}| j                  }| j
                  r |       }t        | j                        }|r|dt        | j                  |d      z  z  }t        t        |      t        | j                        t        |      t        ||      ||      S )r  r$   rX   z (%s)r   )r   r   )avghighlengstrr=   pluralr   )r  r   r   r   objrefweakr   r   r  r  r   r   )r~  r   grandrw   r   r0   rU   s          r   r  z_Prof.format^  s    ;;?tzzDKK/0#qA::sqAKK99A5U;;;AQdiiQKad#
 	
r   c                    | xj                   dz  c_         | xj                  |z  c_        | j                  |k  r+|| _        	 t        j                  |      dc| _        | _        yy# t        $ r |dc| _        | _        Y yw xY w)zUpdate this profile.r$   TFN)r  r   r  Weakrefr  r  r  r   )r~  r=   r   s      r   r  z_Prof.updates  su    q

d
99tDI4)0S)94&TY   4),e&TY4s   "A& &B Br   N)r   r   r  r   r  r  r  r   r  r  r  r  r  r4   r   r   r  r  G  s2    &DFFED	'
*	4r   r  c                   >    e Zd ZdZdZdZdZdZdZdZ	dZ
d Zdi fdZy)_RankzInternal largest object class.r   NFc                     || _         t        |      | _        || _        	 t        j                  |      dc| _        | _        || _        || _	        y # t        $ r |dc| _        | _        Y )w xY w)NTF)
deepr  keyr  r  r  r  r   pidr   )r~  r#  r=   r   r"  r$  s         r   r  z_Rank.__init__  sj    	S'	0%,[[%5t"DK 	  	0%(%"DK	0s   "A A,+A,c                    fd}| j                   r| j                         n| j                  }| j                  dkD  rd| j                  dnt        }| j                  rd || j                        nt        }t        | j                  |      dt        ||      t        |      d || j                        ||S )	zReturn this *rank* as string.c                 (    j                  | d      S )N?)r{   )_idid2xs    r   _ixz_Rank.format.<locals>._ix  s    88C%%r   r   z (at r  z, pix r   r  z, ix )
r  r  r"  r   r$  r   r#  r   r   r  )r~  r   r)  r*  r0   r  r   s     `    r   r  z_Rank.format  s    	& "YYDKKMDKK+/99q=499&c/3xx3txx=*S488$'!$QKL
 	
r   )r   r   r  r   r"  r  r#  r  r$  r   r  r  r  r4   r   r   r   r     s9    (D	
B
CF
CDD	 " 
r   r   c                       e Zd ZdZd Zy)_SeenzInternal obj visits counter.c                 N    	 | |   dz   }|dkD  r|| |<   y y # t         $ r d}Y w xY w)Nr$   r   )r  )r~  r#  rX   s      r   againz_Seen.again  sA    	S	AA q5DI   	A	s    $$N)r   r   r  r   r.  r4   r   r   r,  r,    s
    &r   r,  c                   :    e Zd ZdZdZddZd Zdddefd	Zdd
Z	y)Asizeda=  Stores the results of an **asized** object in the following
    4 attributes:

     *size* -- total size of the object (including referents)

     *flat* -- flat size of the object (in bytes)

     *name* -- name or ``repr`` of the object

     *refs* -- tuple containing an **Asized** instance for each referent
    )r  r  r  r   Nc                 N    || _         || _        || _        t        |      | _        y r-   )r   r  r  r2   r  )r~  r   r  r  r  s        r   r  zAsized.__init__  s"    			$K	r   c                 v    d| j                   | j                  t        | j                        | j                  fz  S )Nz#size %r, flat %r, refs[%d], name %r)r   r  re   r  r  r  s    r   r  zAsized.__str__  s4    4IIII		NII	8
 
 	
r   z$%(name)s size=%(size)d flat=%(flat)dr  r   c           
      F   ||t        | j                  | j                  | j                        z  z   }|rf| j                  rZt        | j                  fddv       }|D cg c]  }|j                  ||dz
  |dz          }}dj                  |g|z         }|S c c}w )	a  Format the size information of the object and of all
        sized referents as a string.

         *format* -- Specifies the format per instance (with 'name',
                     'size' and 'flat' as interpolation parameters)

         *depth* -- Recursion level up to which the referents are
                    printed (use -1 for unlimited)

         *order_by* -- Control sort order of referents, valid choices
                       are 'name', 'size' and 'flat'

         *indent* -- Optional indentation (default '')
        )r   r  r  c                     t        |       S r-   r]   )r   order_bys    r   rK   zAsized.format.<locals>.<lambda>  s    ga2r   )r   r  )r#  reverser$   z    )r  depthr5  indent
)r  r   r  r  r  r   r  r   )r~  r  r7  r5  r8  rU   rsr   s      `    r   r  zAsized.format  s    * ftSSTTYY		2 $44B  A !!)%!F?	      		1#(#As   #"Bc                 N    | j                   D ]  }||j                  k(  s|c S  |S )z3Return the named referent (or *dflt* if not found).)r  r  )r~  r  r_   r  s       r   r{   z
Asized.get  s(    99Csxx
  r   )r4   Nr-   )
r   r   r  r   r  r  r  r   r  r{   r4   r   r   r0  r0    s1    
 1I 
 6&Pr   r0  c                   t   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZeZeZd	ZdZdZdZdZg ZdZdZdZd
 Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd7dZ(e)d        Z*e)d        Z+d Z,d Z-d Z.e)d        Z/e)d        Z0e)d        Z1e)d        Z2e)d        Z3e)d        Z4d  Z5d! Z6d" Z7e)d#        Z8e)d$        Z9e)d%        Z:e)d&        Z;e)d'        Z<e)d(        Z=d8d)Z>d8d*Z?d+i d+d+d,fd-Z@d9d.ZAd:d/ZBe)d0        ZC	 	 	 	 	 	 	 	 	 	 	 	 	 d;d1ZDe)d2        ZE	 	 	 	 	 	 	 	 d<d3ZFe)d4        ZGe)d5        ZHe)d6        ZIy)=Asizerz,Sizer state and options to accumulate sizes.r   rf  P   Fr   d   N   c                 6    i | _          | j                  di | y)zNew **Asizer** accumulator.

        See this module documentation for more details.
        See method **reset** for all available options and defaults.
        Nr4   )_excl_dr  )r~  r   s     r   r  zAsizer.__init__!  s     

Tr   c                 d    t        |      }t        ||z
  dz  dz         xs | j                  }||fS )z1Cutoff as percentage (for backward compatibility)r   g      ?)r   cutoff)r~  statsrX   r   s       r   _c100zAsizer._c100*  s5    Je#c)*9dkk!tr   c                    d| _         t        | _        d| _        d| _        i | _        d| _        g | _        t               | _	        d| _
        t        | j                        D ]  }d| j                  |<    t        j                  t           }| j!                  | | j                  | j
                  | j                  | j                  ||j"                  |j$                  t&        	       y)zClear state.r   FN)_depthr   _incl_missed_profile_profs_ranked_ranksr,  _seen_totalrB   rB  r   modulesr   exclude_objsr  r   rb   )r~  r  ms      r   _clearzAsizer._clear0  s    
W
t||$ADLLO % KK!LLKKKKJJJJII
	
r   c                 H    t        |t              xs | j                  |      S )zReturn the object's name.)rn   r   r   r}  s     r   rn   zAsizer._nameofK  s    sC 3DJJsO3r   c                 0    t        || j                        S )zLike **prepr()**.r   )r   _clip_r}  s     r   r   zAsizer._preprO  s    c,,r   c                     | j                   r2|j                  dd      s |r||z  }t        |fd| j                   i| yt        |g|i | y)zPrint to sys.stdout or the configured stream if any is
        specified and if the file keyword argument is not already
        set in the **print3options** for this specific call.
        r   N)_streamr{   r   )r~  r   r   r   s       r   r   zAsizer._printfS  sN    
 << 1 1&$ ?DjC<dll<m<C0$0-0r   c                     | j                   j                  |d      }|s*t               x| j                   |<   }| j                  |       |S )zGet _Prof object.N)rL  r{   r  rR  )r~  r#  r   s      r   _profzAsizer._prof_  sA    KKOOC&#(7*DKKqa r   c                    | j                   }dt        |      }}||k  r(||z   dz  }	|||	   j                  k  r|	dz   }n|	}||k  r(|dk  r_t        |||||      }
|j	                  ||
       | j                  |
       t        |      dkD  r|j                          t        |      dkD  r| xj                  dz  c_        y)z!Rank 100 largest objects by size.r   r   r$   r?  N)rN  re   r   r   insertrR  poprM  )r~  r#  r=   r   r"  r$  r:  r   jrS  r   s              r   _rankzAsizer._rankg  s    [[#b'1!eQ1Abejj E !e s7c3dC0AIIaOa b'C- b'C- 	r   c                 0    t        || j                        S )zLike ``repr()``.r   )r   rW  r}  s     r   r   zAsizer._repr{  s    St{{++r   c                    ddt        |      }}}|| j                  vrd| j                  |<   nv|s| j                  |   rJ| j                  j                  |       |r+ |||| j                  |            }| j	                  |       |S | j                  j                  |       	 t        |      g }	}|| j                  v r| j                  |xx   dz  cc<   n,t        j                  |d      }
|
s6t        || j                  | j                  | j                        xt        |<   }
|
j                  s| j                  r|
j                  | j                   urs|
j#                  || j$                        x}}| j&                  r!| j)                  |      j+                  ||       |
j,                  r|| j.                  k  r|rt1        |      s| j2                  |dz   }}|r|| j4                  k  r| j	                  |	       |
j-                  |d      D ]z  }t7        |t8              r' ||j:                  |||      }|j<                  |_        n! |||||      }| j                  |      |_        |	j?                  |       ||j@                  z  }| n%|
j-                  |d      D ]  }| ||||d      z  } | jB                  |k  r|| _!        | jD                  r-|| jF                  cxkD  rdkD  rn n| jI                  |||||       |s| xjN                  |z  c_'        |r, |||| j                  |      	      }| j	                  |       |S # tJ        $ r | xjL                  dz  c_&        Y gw xY w)	zSize an object, recursively.r   r$   )r  N)r	  r
  r  TF)r  r  )(r  rO  r.  rn   rR  r  rB  rb   r{   r  _derive__frames__infer_r  _code_r  _ign_dr  _maskrK  r[  r  r  _limit_r	   _sizer_detail_r   r   r  r  r  r   rH  _stats__above_r`  RuntimeErrorrJ  rP  )r~  r=   r$  r"  sizedrX   r   r   r  r:  rg   r   r  r0   r   s                  r   rj  zAsizer._sizer  s   Q3a1DJJDJJqMTZZ] JJQ!QT\\#%67!!!$HJJQ,	CL"rADLL Q1$MM!T*'/#}}#}}"ll	( IaL1 FFdkkqvvT[[/HFF3

33A}}

1,,S!4vv$"5tQT#{{D1H1 TDMM%9 --b1%&VVC%6#-a#;()!%%Au(=A-.VVAF()!Q5(9A-1\\!_AF "		! !QVV &7 &'VVC%7 !Qq!Q%5 5 &8  ;;?*+DK<<A$8q$8JJq#q$4 KK1Kac!2<Aa   	LLAL	s   %I M M-,M-c                     | j                   |  i g }}| j                  ||       |D ]Y  }t        |      }||v r| j                  j	                  |       n| j                  |dd|      ||<    |j                  ||          [ t        |      S )zReturn the size or an **Asized** instance for each
        given object plus the total size.  The total includes
        the size of duplicates only once.
        r   )exclude_refsrR  r  rO  r.  rj  r  r2   )r~  r   ro  rX   rU   r0   r   s          r   _sizeszAsizer._sizes  s    
 	4 21!QA1AAv

  #{{1aE2!AHHQqTN  Qxr   c                     | j                   S )z*Get the large object size threshold (int).)rm  r  s    r   abovezAsizer.above       ||r   c                     | j                   S )zGet the size alignment (int).)_align_r  s    r   alignzAsizer.align  ru  r   c                     |r | j                   di | | j                  |t              }t        |      dk(  r|d   S |S )at  Size each object and return an **Asized** instance with
        size information and referents up to the given detail
        level (and with modified options, see method **set**).

        If only one object is given, the return value is the
        **Asized** instance for that object.  The **Asized** size
        of duplicate and ignored objects will be zero.
        r$   r   r4   )r  rr  r0  re   )r~  r   r   rU   s       r   asizedzAsizer.asized  sA     DHHtKKf%1v{qt))r   c                 r     |r  j                   di |   j                  |  t         fd|D              S )zkReturn the combined size of the given objects
        (with modified options, see method **set**).
        c              3   F   K   | ]  }j                  |d d d        ywr  )rj  )r/   r0   r~  s     r   r1   z!Asizer.asizeof.<locals>.<genexpr>  s!     <t!4;;q!Q-ts   !r4   )r  rq  sumr~  r   r   s   `  r   r   zAsizer.asizeof  s:     DHHt4 <t<<<r   c                 N    |r | j                   di | | j                  |d      S )zReturn the individual sizes of the given objects
        (with modified options, see method  **set**).

        The size of duplicate and ignored objects will be zero.
        Nr4   )r  rr  r~  s      r   asizesofzAsizer.asizesof  s)     DHHt{{4&&r   c                     | j                   S )z$Get the clipped string length (int).)rW  r  s    r   r   zAsizer.clip       {{r   c                     | j                   S )zSize (byte) code (bool).)rf  r  s    r   r  zAsizer.code  r  r   c                     | j                   S )zStats cutoff (int).)_cutoff_r  s    r   rD  zAsizer.cutoff       }}r   c                     | j                   S )zDerive types (bool).)rc  r  s    r   r	  zAsizer.derive  r  r   c                     | j                   S )z/Get the detail level for **Asized** refs (int).)rk  r  s    r   detailzAsizer.detail  r  r   c                 L    t        d t        | j                        D              S )z6Get the number of duplicate objects seen so far (int).c              3   ,   K   | ]  }|d kD  s	d   yw)r$   Nr4   r/   rg   s     r   r1   z#Asizer.duplicate.<locals>.<genexpr>       ;1QU11   
r}  rF   rO  r  s    r   	duplicatezAsizer.duplicate       ;gdjj1;;;r   c                 \    |D ]'  }| j                   j                  t        |      d       ) y)zAExclude the specified objects from sizing, profiling and ranking.r  NrO  rp   r  r~  r   r0   s      r   rR  zAsizer.exclude_objs  s$    AJJ!!"Q%, r   c                 \    |D ]'  }| j                   j                  t        |      d       ) y)a  Exclude any references to the specified objects from sizing.

        While any references to the given objects are excluded, the
        objects will be sized if specified as positional arguments
        in subsequent calls to methods **asizeof** and **asizesof**.
        r   Nr  r  s      r   rq  zAsizer.exclude_refs!  s&     AJJ!!"Q%+ r   c                 t    |D ]3  }t        |      D ]#  }|s|| j                  vsd| j                  |<   % 5 y)a  Exclude the specified object instances and types from sizing.

        All instances and types of the given objects are excluded,
        even objects specified as positional arguments in subsequent
        calls to methods **asizeof** and **asizesof**.
        r   N)r  rB  )r~  r   r0   rU   s       r   exclude_typeszAsizer.exclude_types+  s7     A]$,,.&'DLLO # r   c                 >    t        t        | j                              S )z%Get the types being excluded (tuple).)r2   rB   rB  r  s    r   excludedzAsizer.excluded7  s     U4<<())r   c                     | j                   S )zIgnore stack frames (bool).)rd  r  s    r   r
  zAsizer.frames<  r  r   c                 "    | j                   rdS dS )zIgnore certain types (bool).TF)rg  r  s    r   r  zAsizer.ignoredA  s     {{t--r   c                     | j                   S )zInfer types (bool).)re  r  s    r   r  zAsizer.inferF  ru  r   c                     | j                   S )zGet the recursion limit (int).)ri  r  s    r   limitzAsizer.limitK  ru  r   c                     | j                   S )z5Get the number of objects missed due to errors (int).)rJ  r  s    r   missedzAsizer.missedP  ru  r   c                 .   |rt        |      n| j                  }t        t        | j                        t        |d            }| j                  }|dkD  r|dkD  r | j                  dt        ||t        |      | j                  |t        |      fi | t        d t        | j                        D              }| j                  d| D ]J  }|j                  |j                  | j                   |      }	} | j                  d||t        |      |	fi | L yyy)a  Print the largest objects.

        The available options and defaults are:

         *w=0*           -- indentation for each line

         *cutoff=100*    -- number of largest objects to print

         *print3options* -- some keyword arguments, like Python 3+ print
        r   z.%s%*d largest object%s (of %d over %d bytes%s)c              3   >   K   | ]  \  }}|j                   |f  y wr-   )r  )r/   r   r   s      r   r1   z'Asizer.print_largest.<locals>.<genexpr>o  s     E.Ddaq	.Ds   Nz%*d bytes%s: %s)r   r  minre   rN  rO   rm  r   r   r   rM  r   r  	enumerater   r  rW  )
r~  wrD  r   r   rv   rX   r)  r   rU   s
             r   print_largestzAsizer.print_largestU  s     "CKt}}DKK #a),LLq5QUDLL@
A
  
 Ei.DEED[[!_vvqxxT:1.1c!faQ=Q % 5r   c                    t        | j                        D cg c](  \  }}|j                  dkD  s|j                  dkD  s%||f* }}}t	        | j                        t	        |      z
  dk  r)t        | j                        D cg c]	  \  }}||f }}}|rt
        }| j                  r7d}|rt        |      n| j                  }t        |dz  | j                  z        }	ndx}	} | j                  dt        |t	        |      t        t	        |            || j                  fi | t	        |      }
|D cg c]  \  }}|| j                  |      f }}}t        |d      D ]  \  }}d	|j                  | j                   | j                        z  } | j                  d
||j                  ||fi | |
dz  }
|
dkD  s[|j                  |	k  sk| j                  d||
|        n t	        | j                        t	        |      z
  }|dkD  r! | j                  d||dt        |      fi | yyyc c}}w c c}}w c c}}w )a,  Print the profiles above *cutoff* percentage.

        The available options and defaults are:

             *w=0*           -- indentation for each line

             *cutoff=0*      -- minimum percentage printed

             *print3options* -- some keyword arguments, like Python 3+ print
        r   r$   	   z (% of grand total){Gz?zL%s%*d profile%s:  total%s, average, and largest flat size%s:  largest objectT)r6  zDobject%(plural)s:  %(total)s, %(avg)s, %(high)s:  %(obj)s%(lengstr)sz	%*d %s %sz#%+*d profiles below cutoff (%.0f%%)z%+*d %r object%szeroN)r>   rL  r   r  re   r   rP  r   r  r   r   r   rI  r   r   r  rW  )r~  r  rD  r   r  rg   rU   rX   r   Cr   r   s               r   print_profileszAsizer.print_profilest  s$    !'t{{ 3S 31qww{ahhQRlaV 3Ss1v%*$*4;;$78$7DAq!Q$7A8A{{)#)CKt}}D4;;./	ADLL^AA

	  	 AA01011DKKN#   q$/1Zhht{{DKK89  [!QXXq!M}MQq5QWWq[LL!F1aP 0 DKK 3q6)A1u&1fgajDQ C  T8(s   &H0 H0H68H<r4   rg  c                 $   t        |j                  d|      xs d| j                        }|dkD  rt        t	        | j
                  | j                  z   | j                  z               dz   }t        x}	}
t        di |}|r|rd}
|rt|rrt        |      }|dkD  rG | j                  dt        |
|fi | t        |      D ]  } | j                  d|dz
  |||   fi |   n | j                  dt        ||fi | n|rk|ri | j                  dt        |
|fi | t        ||      D ]?  \  }} | j                  d	||t        |      | j                  | j!                  |      fi | A n.|r| j!                  |      }	 | j                  d
t        |	|
|fi |  | j"                  d||d| | j%                  |      \  }}
 | j&                  d||dk  r|
ndd| |dkD  r0 | j(                  d||
d| |dkD  r | j*                  dd|i| yyyy)a0  Prints the statistics.

        The available options and defaults are:

             *w=0*           -- indentation for each line

             *objs=()*       -- optional, list of objects

             *opts={}*       -- optional, dict of options used

             *sized=()*      -- optional, tuple of **Asized** instances returned

             *sizes=()*      -- optional, tuple of sizes returned

             *stats=3*       -- print stats, see function **asizeof**

             *print3options* -- some keyword arguments, like Python 3+ print
        rE  r   r$   r   z%sasized(...%s%s) ...z%*d: %sz%sasized(%s): %sz%sasizesof(...%s%s) ...z%*d bytes%s%s:  %sz%sasizeof(%s%s%s) ...)r  r   r   
   )r  rD  r  Nr4   )r  r{   rE  re   r   r  seenr   r   r   r   r   r   zipr   rI  r   print_summaryrF  r  r  print_typedefs)r~  r   r   ro  sizesrE  r   rX   r  rU   r   r0   rv   r   r   s                  r   print_statszAsizer.print_stats  s.   * %(-Atzz:q5Cdii/$**<=>BAKA$ATIq5 DLL/!QBO #1X$YAq%(TmT & !DLL!3WaX-X46AWWt,DAq DLL,A



1 ( - 

4(A4gq!QX-XD???::a=DAqDOA12OO1u###CaC]Cq5'D''=!=}=  M r   c                     | j                   d|| j                  t        | j                        | j                  fi | | j                  r" | j                   d|| j                  dz   fi |  | j                   d|t
        fi | t        |xs d      } | j                   d||t        |      dfi | | j                  } | j                   d||t        |      dfi | | j                  r>t        t        | j                              } | j                   d||t        |      d	fi | | j                  } | j                   d||t        |      d
fi | | j                  }|dkD  r  | j                   d||t        |      dfi | | j                  } | j                   d||t        |      dfi | | j                  } | j                   d||t        |      fi | | j                   dkD  r  | j                   d|| j                   fi | yy)a  Print the summary statistics.

        The available options and defaults are:

             *w=0*           -- indentation for each line

             *objs=()*       -- optional, list of objects

             *print3options* -- some keyword arguments, like Python 3+ print
        z%*d bytes%s%sz%*d byte alignedr$   z%*d byte sizeof(void*)r4   z%*d object%s %sgivenro  r  r  r   rankedr  z%*d duplicate%sz%*d deepest recursionN)r   rP  r   rI  rh  r  re   r   ro  rB  r}  rF   r  r  r  r  rH  )r~  r  r   r   rv   s        r   r  zAsizer.print_summary  s    	KKJJ	
 	
 ::DLL+Q

QP-P-q.RMR
O&1gaj'S]SJJ&1gaj'S]S<<GDLL)*ADLL!1aZCP II&1gaj&RMRKKq5DLL*Aq'!*hX-XKK&1gaj(TmTNN&1gajJMJ;;?DLL0!T[[RMR r   c                    t         D ]  }t        t              D cg c]?  \  }}|j                  |k(  r+|j                  s| j
                  r| j                  |      |fA }}}|s_ | j                  dt        |t        |      |t        t        |            fi | t        |      D ]   \  }} | j                  d|t        ||fi | "  t        d t        t              D              }|r\ | j                  dt        ||fi | t        t              D ]/  \  }} | j                  d|t        || j                  |      fi | 1 yyc c}}w )zPrint the types and dict tables.

        The available options and defaults are:

             *w=0*           -- indentation for each line

             *print3options* -- some keyword arguments, like Python 3+ print
        z7%s%*d %s type%s:  basicsize, itemsize, _len_(), _refs()z%*s %s:  %sc              3   2   K   | ]  }t        |        y wr-   ri  r  s     r   r1   z(Asizer.print_typedefs.<locals>.<genexpr>2	  s     5 41A 4s   z%s%*d dict/-like classes:N)r  r>   rb   r  r  rf  r   r   r   re   r   r   r   r}  rF   r   )r~  r  r   r  rw   rg   rU   rS  s           r   r  zAsizer.print_typedefs	  s;    A #9--DAq66Q;AFFdkk Q#-  
 MFCFO $ #1IDAq DLL31NN &# ( 5 455DLL4gq!U}U{+1]AsAt{{1~WW , 's   AEc                     | j                   S )z3Get the number objects ranked by size so far (int).)rM  r  s    r   r  zAsizer.ranked8	  ru  r   c                 \   |rt        | j                  fdt        i||| _        || _        || _        || _        || _        || _        || _	        || _
        |
| _        || _        || _        || _        |	rt        | _        nd| _        | j#                          | j%                  ||||       y)aa  Reset sizing options, state, etc. to defaults.

        The available options and default values are:

             *above=0*      -- threshold for largest objects stats

             *align=8*      -- size alignment

             *code=False*   -- incl. (byte)code size

             *cutoff=10*    -- limit large objects or profiles stats

             *derive=False* -- derive from super type

             *detail=0*     -- **Asized** refs level

             *frames=False* -- ignore frame objects

             *ignored=True* -- ignore certain types

             *infer=False*  -- try to infer types

             *limit=100*    -- recursion limit

             *stats=0*      -- print statistics, see function **asizeof**

             *stream=None*  -- output stream for printing

        See function **asizeof** for a description of the options.
        r   N)rx  r  rD  rE  )r   r  r  rm  rw  rW  rf  r  rc  rk  rd  re  ri  rl  rY  r  rg  rT  r  )r~  rt  rx  r   r  rD  r	  r  r
  r  r  r  rE  streamr  s                  r   r  zAsizer.reset=	  s    ^ tzzCCUCC'DKDKu4eDr   c                 L    t        d t        | j                        D              S )z)Get the number objects seen so far (int).c              3   ,   K   | ]  }|d kD  s	|  ywr  r4   r  s     r   r1   zAsizer.seen.<locals>.<genexpr>	  r  r  r  r  s    r   r  zAsizer.seen	  r  r   c	                    |t        |      | _        |6|dkD  r!|dz
  }	|	|z  rt        | j                  |      d}	|| _        |	| _        ||| _        |rd| _        ||| _        ||| _	        ||| _
        |V|dk  rt        | j                  |      | j                  |      \  }
}|rt        |      n|| _        |
| _        |
dkD  | _        yy)aP  Set some sizing options.  See also **reset**.

        The available options are:

             *above*  -- threshold for largest objects stats

             *align*  -- size alignment

             *code*   -- incl. (byte)code size

             *cutoff* -- limit large objects or profiles stats

             *detail* -- **Asized** refs level

             *frames* -- size or ignore frame objects

             *limit*  -- recursion limit

             *stats*  -- print statistics, see function **asizeof**

        Any options not set remain unchanged from the previous setting.
        Nr$   rx  r   z (incl. code))rE  )r   rm  r   r  rw  rh  rf  rI  rk  rd  ri  rF  r  rl  rK  )r~  rt  rx  r  rD  r
  r  r  rE  rS  rX   r   s               r   r  z
Asizer.set	  s    D u:DLqyAIu9&txxu== DLDJDK,
"DM"DM DLqy"488599::e$DAq+1CKqDMDLEDM r   c                 L    t        d t        | j                        D              S )z*Get the number objects sized so far (int).c              3   ,   K   | ]  }|d kD  s	d  yw)r   r$   Nr4   r  s     r   r1   zAsizer.sized.<locals>.<genexpr>	  r  r  r  r  s    r   ro  zAsizer.sized	  r  r   c                     | j                   S )z)Get the stats and cutoff setting (float).)rl  r  s    r   rE  zAsizer.stats	  ru  r   c                     | j                   S )z1Get the total size (in bytes) accumulated so far.)rP  r  s    r   r   zAsizer.total	  r  r   r-   )r   r   )r   r4   r  )r   rf  r>  Fr  Fr   FTFr?  r   N)NNNNNNNN)Jr   r   r  r   rm  rw  rW  rf  r  rc  rk  rd  re  ri  rl  rH  rB  r  rg  r   rI  rh  rJ  rK  rL  rM  rN  rO  rY  rP  r  rF  rT  rn   r   r   r[  r`  r   rj  rr  propertyrt  rx  rz  r   r  r   r  rD  r	  r  r  rR  rq  r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  ro  rE  r   r4   r   r   r=  r=    s   6GGFFHHHHGGGFGFEEGHFGFEGF
64-
1(,AF"    *='           < <-
,
( * *   . .      R>3l Bb!?>B)SV!XF   DEL < < >"@ < <    r   r=  c                 N    t         dz  }| t        dt        d| dz              a |S )zSet/get approximate mapped memory usage as a percentage
    of the mapped file size.

    Sets the new percentage if not None and returns the
    previously set percentage.

    Applies only to *numpy.memmap* objects.
    r   r   r$   r  )r  rO   r  )
percentager   s     r   amappedr  	  s1     	5Aq#ad!234Hr   r  c                      t        j                  di | | r@t        j                  |  }t         j                  | ||       t         j	                          |S d}|S )al  Return a tuple containing an **Asized** instance for each
    object passed as positional argument.

    The available options and defaults are:

         *above=0*      -- threshold for largest objects stats

         *align=8*      -- size alignment

         *code=False*   -- incl. (byte)code size

         *cutoff=10*    -- limit large objects or profiles stats

         *derive=False* -- derive from super type

         *detail=0*     -- Asized refs level

         *frames=False* -- ignore stack frame objects

         *ignored=True* -- ignore certain types

         *infer=False*  -- try to infer types

         *limit=100*    -- recursion limit

         *stats=0*      -- print statistics

    If only one object is given, the return value is the **Asized**
    instance for that object.  Otherwise, the length of the returned
    tuple matches the number of given objects.

    The **Asized** size of duplicate and ignored objects will be zero.

    Set *detail* to the desired referents level and *limit* to the
    maximum recursion depth.

    See function **asizeof** for descriptions of the other options.
    )r   ro  r4   )_asizerr  rz  r  rT  r   r   rU   s      r   rz  rz  	  sW    N MMDNND!Dt15 H Hr   c                     t        t        | fi |\  }}}t        j                  di | |rV|rt        j	                  |       t        j                  | }t        j                  ||       t        j                          |S d}|S )a&
  Return the combined size (in bytes) of all objects passed
    as positional arguments.

    The available options and defaults are:

         *above=0*      -- threshold for largest objects stats

         *align=8*      -- size alignment

         *clip=80*      -- clip ``repr()`` strings

         *code=False*   -- incl. (byte)code size

         *cutoff=10*    -- limit large objects or profiles stats

         *derive=False* -- derive from super type

         *frames=False* -- ignore stack frame objects

         *ignored=True* -- ignore certain types

         *infer=False*  -- try to infer types

         *limit=100*    -- recursion limit

         *stats=0*      -- print statistics

    Set *align* to a power of 2 to align sizes.  Any value less
    than 2 avoids size alignment.

    If *all* is True and if no positional arguments are supplied.
    size all current gc objects, including module, global and stack
    frame objects.

    A positive *clip* value truncates all repr() strings to at
    most *clip* characters.

    The (byte)code size of callable objects like functions,
    methods, classes, etc. is included only if *code* is True.

    If *derive* is True, new types are handled like an existing
    (super) type provided there is one and only of those.

    By default certain base types like object, super, etc. are
    ignored.  Set *ignored* to False to include those.

    If *infer* is True, new types are inferred from attributes
    (only implemented for dict types on callable attributes
    as get, has_key, items, keys and values).

    Set *limit* to a positive value to accumulate the sizes of
    the referents of each object, recursively up to the limit.
    Using *limit=0* returns the sum of the flat sizes of the
    given objects.  High *limit* values may cause runtime errors
    and miss objects for sizing.

    A positive value for *stats* prints up to 9 statistics, (1)
    a summary of the number of objects sized and seen and a list
    of the largests objects with size over *above* bytes, (2) a
    simple profile of the sized objects by type and (3+) up to 6
    tables showing the static, dynamic, derived, ignored, inferred
    and dict types used, found respectively installed.
    The fractional part of the *stats* value (x 100) is the number
    of largest objects shown for (*stats*1.+) or the cutoff
    percentage for simple profiles for (*stats*=2.+).  For example,
    *stats=1.10* shows the summary and the 10 largest objects,
    also the default.

    See this module documentation for the definition of flat size.
    )r   r   r   r4   )r   r   r  r  rR  r  rT  )r   r   rU   r   r   rX   s         r   r   r   
  s}    N 7D1D1GAq!MMA  #OOQ. H Hr   c                      t        j                  di | | r@t        j                  |  }t         j                  | ||       t         j	                          |S d}|S )a  Return a tuple containing the size (in bytes) of all objects
    passed as positional arguments.

    The available options and defaults are:

         *above=1024*   -- threshold for largest objects stats

         *align=8*      -- size alignment

         *clip=80*      -- clip ``repr()`` strings

         *code=False*   -- incl. (byte)code size

         *cutoff=10*    -- limit large objects or profiles stats

         *derive=False* -- derive from super type

         *frames=False* -- ignore stack frame objects

         *ignored=True* -- ignore certain types

         *infer=False*  -- try to infer types

         *limit=100*    -- recursion limit

         *stats=0*      -- print statistics

    See function **asizeof** for a description of the options.

    The length of the returned tuple equals the number of given
    objects.

    The size of duplicate and ignored objects will be zero.
    )r   r  r4   )r  r  r  r  rT  r  s      r   r  r  q
  sY    F MMDd#Dt15 H Hr   c                 z    t        |       }t        j                  |d      }|st        | fi |}|r	|t        |<   |S )zGet the typedef for an object.N)r  rb   r{   r  )r=   r  r   r  rg   s        r   
_typedefofr  
  s>    AaAS!D!IaLHr   c                 >    t        | fi |x}}|r|j                  }|S )aP  Return the basic size of an object (in bytes).

    The available options and defaults are:

        *derive=False* -- derive type from super type

        *infer=False*  -- try to infer types

        *save=False*   -- save the object's type definition if new

    See this module documentation for the definition of *basic size*.
    )r  rV   )r=   r   r  rU   s       r   	basicsizer  
  s)     s#d##AFFHr   c                     t        | fi |x}}|r6|dkD  r|dz
  }||z  rt        t        |      d} |j                  | |      }|S )zReturn the flat size of an object (in bytes), optionally aligned
    to the given power-of-2.

    See function **basicsize** for a description of other available options.

    See this module documentation for the definition of *flat size*.
    r$   r  r   )r  )r  r   flatsizer  )r=   rx  r   r   rU   rS  s         r   r  r  
  s[     s#d##A19	A5y"8599AAFF3QHr   c                     t        | fi |x}}|r0|j                  |j                  }}|r|t        k(  rt	        | ||      }|S )zReturn the item size of an object (in bytes).

    See function **basicsize** for a description of the available options.

    See this module documentation for the definition of *item size*.
    )r  r   r  r  r9   )r=   r   r   rU   rg   s        r   r  r  
  sI     s#d##Avvqvv1m#Q"AHr   c                     t        | fi |x}}|r_|j                  }|rQt        |      rF|j                  |j                   ||       }}}|r$|t
        k(  rt        | ||      }|t
        kD  r||z  }|S )zReturn the length of an object, in number of *items*.

    See function **basicsize** for a description of the available options.
    )r  r   r;   r   r  r  r9   )r=   r   rv   rU   r   rg   s         r   r   r   
  st    
 s#d##AFF!ffaffaf!qAQ-'CA&}$QAHr   c                     g }t        | fi |}|rO|j                  }|rAt        |      r6 || d      D ]*  }	 |j                  |j                  |j
                  f       , |S # t        $ r Y :w xY w)zReturn all named **referents** of an object (re-using
    functionality from **asizeof**).

    Does not return un-named *referents*, e.g. objects in a list.

    See function **basicsize** for a description of the available options.
    T)r  r  r;   r  r  r  r   )r=   r   r:  rg   r   s        r   
named_refsr  
  su     
B3$AFF!sD\IIqvvquuo. "
 I & s   'A""	A.-A.c                 f    t        | fi |}|r"|j                  }|rt        |      r	 || d      }|S )zReturn (a generator for) specific *referents* of an object.

    See function **basicsize** for a description of the available options.
    F)r  r  r;   )r=   r   rg   s      r   r  r    s8    
 	3$AFF!#uAHr   )r   FNr-   r  )r$   )r>  )r   r   )FFFr  )r   r   r   Typesr  r  r  inspectr   r   r   r   r   r   r	   mathr
   osr   r   structr   __all____version__r   r  r   r   r   r   r   r  _sizeof_Clongr  r   r   r  r  r  _sizeof_CPyDictEntry_sizeof_Csetentryencodeure   _sizeof_Cunicode	_testcapirU   SIZEOF_PYGC_HEADrS   ImportErrorr   rl   rT   rR   rQ   rd   rP   gcr(   r5   r)   r6  platformr3   	getsizeofr`  r>   rB   rF   r   r%  r   rZ   r`   rh   rx   r   r   r   r   r   r   r   r.   rc   r   r   r   r   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r!  r(  r-  r0  r3  r8  r:  r<  r>  rA  rD  rF  rI  rK  rM  r  r   rQ  rW  r\  r^  ra  rd  rj  rl  rn  rs  ru  rw  r  r   ry  r  r  r  r  r  r   internr   _kind_staticr   r  r  r  r  r  r  rb   r  r  complexr   listr2   r  Ellipsisr  r  r  r   
ModuleTyperV   r   r  r  r  r  addbool	NameError	bytearraybytesr   r  	frozensetGetSetDescriptorTypeMemberDescriptorTypeNotImplementedr  r  memmapr  mmapr  r  r  r  r  r  r  r   reversedslicer  r  r  TracebackTypeKeyedRef	ProxyTypeReferenceTypesuperclassmethodstaticmethod
MethodTypeGeneratorTypeCallableProxyTyperX   extendrer  r  r   r   r   r  r  r  r   r,  r0  r=  r  r  r  rz  r   r  r  r  r  r  r  r  r4   r   r   <module>r     s  $Vp     W W W   +	
 NN	  # .C. "+. "=1 #G,  !' dO  	KKq6 5++ C#$()Yt_q    $Z
 ) -<<5 ND
 ]]
--- %d+!--"#
"$+
) b3 )D,'
8.
>Q	1B
  ,
  *
 ) 1$
?
("
))
A"(
-
(
1L
I
:82

)
(
)
 	/	<
$33
 		0v 2 		4	 	0 JJhKiLiLiLjMS O\=- V
qfv fR 	
 
	
					2 $\  g  e  c ! yy~ 		> hZ ( d8n  d4j  #)* 		"6YZ -8		"99 "#
 
j 	$	)-nE	E{$s)#e-d;	)*-	)),	)"3(S	#-H9M	%,,-	%,,-	$~&'M.t 
 ?
.) MM*MM#$MM+	%	(,	N	$tF|$:6
	WV_		&};?	%%%H5 c+; <	'""$?	'##$	'''j9
 f= ) e- ( j} -	+H-	,X.	%""2	%%%I6	'++*=
 BZrGBK(	HHhrlHRL)*	HHXc3  
	Avv!&&	HHVQVVX 
 
AGd1gIJQG 
 q!FR54F 54p&
F &
R	D 	JV JZQV Qh  
(.bQh*Z&("*
P 	^$ 5 	A#E*Q.1"4	5v  		>  		
  		
  		  		
  		
  		  		
  		
  		
  		    	x  F[  		
  		  		  		  		  		
  		  		
  		
  		  		  		  		
  		
  		  		  		  		 i  s  \ 1] )] 2] >]* 
]6 %
^ 0^ =^ 
^& ^2 2^> _& _
 _ !A_& (_9 1
` <` ` %`) `5 a 7a a "a% 
a1 !
a= ,b	 b b!  b- & b9 -!cc!]]]]]]]'&]'*]32]36]?>]?^
^^^^#"^#&^/.^/2^;:^;>__
__& __& _#_& "_##_& &_65_69```````&%`&)`21`25`>=`>a
	a
aaa"!a"%a.-a.1a:9a:=bb	bbbb!b*)b*-b65b69cccccc