
    9i[                        S r SSKrSSKJr  SSKJr  SSKJ	r	  SSK
Jr  SS	KJrJrJr  SS
.S jrS rS r\R&                  " / SQ\S9r\R&                  " / SQ\S9rSS jr\R0                  " SS5      qSSS.S jjrS rS rS rg)z9
Algorithms for computing the skeleton of a binary image
    N)ndimage   )check_nD)crop   )_compute_thin_image)_fast_skeletonize_skeletonize_loop_table_lookup_index)methodc                |   U R                  [        SSS9n US;  a  [        SU S35      eU R                  S:X  a  Ub  US:X  a  [	        U 5      nU$ U R                  S	:X  a  US:X  a  [        S
5      eU R                  S	:X  d  U R                  S:X  a  US:X  a  [        U 5      nU$ [        SU R                   S35      e)a3  Compute the skeleton of the input image via thinning.

Parameters
----------
image : (M, N[, P]) ndarray of bool or int
    The image containing the objects to be skeletonized. Each connected component
    in the image is reduced to a single-pixel wide skeleton. The image is binarized
    prior to thinning; thus, adjacent objects of different intensities are
    considered as one. Zero or ``False`` values represent the background, nonzero
    or ``True`` values -- foreground.
method : {'zhang', 'lee'}, optional
    Which algorithm to use. Zhang's algorithm [Zha84]_ only works for
    2D images, and is the default for 2D. Lee's algorithm [Lee94]_
    works for 2D or 3D images and is the default for 3D.

Returns
-------
skeleton : (M, N[, P]) ndarray of bool
    The thinned image.

See Also
--------
medial_axis

References
----------
.. [Lee94] T.-C. Lee, R.L. Kashyap and C.-N. Chu, Building skeleton models
       via 3-D medial surface/axis thinning algorithms.
       Computer Vision, Graphics, and Image Processing, 56(6):462-478, 1994.

.. [Zha84] A fast parallel algorithm for thinning digital patterns,
       T. Y. Zhang and C. Y. Suen, Communications of the ACM,
       March 1984, Volume 27, Number 3.

Examples
--------
>>> X, Y = np.ogrid[0:9, 0:9]
>>> ellipse = (1./3 * (X - 4)**2 + (Y - 4)**2 < 3**2).astype(bool)
>>> ellipse.view(np.uint8)
array([[0, 0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0]], dtype=uint8)
>>> skel = skeletonize(ellipse)
>>> skel.view(np.uint8)
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)

CFordercopy>   Nleezhangz:skeletonize method should be either "lee" or "zhang", got .r   r      z4skeletonize method "zhang" only works for 2D images.r   z4skeletonize requires a 2D or 3D image as input, got zD.)astypebool
ValueErrorndim_skeletonize_zhang_skeletonize_lee)imager   skeletons      _/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/skimage/morphology/_skeletonize.pyskeletonizer      s    | LLSuL5E++LVHTUV
 	
 zzQFNf.?%e, O 
qVw.RSS	qUZZ1_5#E*
 O FuzzlRTU
 	
    c                 N    U R                   S:w  a  [        S5      e[        U 5      $ )aS  Return the skeleton of a 2D binary image.

Thinning is used to reduce each connected component in a binary image
to a single-pixel wide skeleton.

Parameters
----------
image : numpy.ndarray
    An image containing the objects to be skeletonized. Zeros or ``False``
    represent background, nonzero values or ``True`` are foreground.

Returns
-------
skeleton : ndarray
    A matrix containing the thinned image.

See Also
--------
medial_axis, skeletonize, thin

Notes
-----
The algorithm [Zha84]_ works by making successive passes of the image,
removing pixels on object borders. This continues until no
more pixels can be removed.  The image is correlated with a
mask that assigns each pixel a number in the range [0...255]
corresponding to each possible pattern of its 8 neighboring
pixels. A look up table is then used to assign the pixels a
value of 0, 1, 2 or 3, which are selectively removed during
the iterations.

Note that this algorithm will give different results than a
medial axis transform, which is also often referred to as
"skeletonization".

References
----------
.. [Zha84] A fast parallel algorithm for thinning digital patterns,
       T. Y. Zhang and C. Y. Suen, Communications of the ACM,
       March 1984, Volume 27, Number 3.

Examples
--------
>>> X, Y = np.ogrid[0:9, 0:9]
>>> ellipse = (1./3 * (X - 4)**2 + (Y - 4)**2 < 3**2).astype(bool)
>>> ellipse.view(np.uint8)
array([[0, 0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0]], dtype=uint8)
>>> skel = skeletonize(ellipse)
>>> skel.view(np.uint8)
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)

r   z.Zhang's skeletonize method requires a 2D array)r   r   r	   )r   s    r   r   r   c   s'    J zzQIJJU##r    c                  (  ^ S mU4S jn [         R                  " [        S5       Vs/ s H
  o" U5      PM     sn5      nU4S jn[         R                  " [        S5       Vs/ s H
  o" U5      PM     sn5      nX$-  nU4S jnU4S jn[         R                  " [        S5       Vs/ s H
  o" U5      PM     sn5      n[         R                  " [        S5       Vs/ s H
  o" U5      PM     sn5      n	XX-  n
XY-  nX4$ s  snf s  snf s  snf s  snf )z4generate LUTs for thinning algorithm (for reference)c                     [         R                  " [        SS5       Vs/ s H
  oU-	  S-  PM     sn5      R                  [        5      $ s  snf )Nr   	   r   )nparrayranger   r   )nis     r   nabe!_generate_thin_luts.<locals>.nabe   s:    xxU1a[9[a![9:AA$GG9s   A
c                    > SnT" U 5      nS H0  nX#   (       a  M  X#S-      (       d  X#S-   S-     (       d  M+  US-  nM2     US:H  $ )Nr   )r   r         r   r       )r(   sbitsr)   r*   s       r   G1_generate_thin_luts.<locals>.G1   sN    AwAGG$1u+1uk1B1BQ  Avr       c                    > Su  pT" U 5      nS H<  nX4   (       d  X4S-
     (       a  US-  nX4   (       d  X4S-   S-     (       d  M7  US-  nM>     [        X5      S;   $ )N)r   r   )r   r         r   r/   )r   r   )min)r(   n1n2r2   kr*   s        r   G2_generate_thin_luts.<locals>.G2   sb    AwAw$1u+aw$A{++a	 
 2{f$$r    c                 z   > T" U 5      nUS   =(       d    US   =(       d
    US   (       + =(       a    US   (       + $ )Nr   r   r8   r   r0   r(   r2   r*   s     r   G3_generate_thin_luts.<locals>.G3   6    Aw!W8Q8Q=Ed1gFFr    c                 z   > T" U 5      nUS   =(       d    US   =(       d
    US   (       + =(       a    US   (       + $ )Nr7   r.   r   r-   r0   r@   s     r   G3p _generate_thin_luts.<locals>.G3p   rC   r    )r%   r&   r'   )r3   r(   g1_lutr=   g2_lutg12_lutrA   rE   g3_lutg3p_lutg123_lut	g123p_lutr*   s               @r   _generate_thin_lutsrN      s    H XXeCj1jr!uj12F% XXeCj1jr!uj12FoGGG XXeCj1jr!uj12Fhhc
3
1A
34GH!I= 2 2 23s   D #D(D
D(   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   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   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   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   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   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   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   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   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   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   r   r   r   r   r   r   dtype(   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   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   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   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   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   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   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   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   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   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   r   r   r   r   r   r   c                    [        U S5        [        R                  " U [        S9R	                  5       R                  [        R                  5      n[        R                  " / SQ/ SQ/ SQ/[        R                  S9nU=(       d    [        R                  nSn[        R                  [        R                  " U5      peXV:w  ap  XA:  ak  Un[        [        4 H2  n[        R                  " X#SS9n[        R                  " Xx5      n	SX)'   M4     [        R                  " U5      nUS	-  nXV:w  a  XA:  a  Mk  UR                  [        5      $ )
a  
Perform morphological thinning of a binary image.

Parameters
----------
image : binary (M, N) ndarray
    The image to thin. If this input isn't already a binary image,
    it gets converted into one: In this case, zero values are considered
    background (False), nonzero values are considered foreground (True).
max_num_iter : int, number of iterations, optional
    Regardless of the value of this parameter, the thinned image
    is returned immediately if an iteration produces no change.
    If this parameter is specified it thus sets an upper bound on
    the number of iterations performed.

Returns
-------
out : ndarray of bool
    Thinned image.

See Also
--------
skeletonize, medial_axis

Notes
-----
This algorithm [1]_ works by making multiple passes over the image,
removing pixels matching a set of criteria designed to thin
connected regions while preserving eight-connected components and
2 x 2 squares [2]_. In each of the two sub-iterations the algorithm
correlates the intermediate skeleton image with a neighborhood mask,
then looks up each neighborhood in a lookup table indicating whether
the central pixel should be deleted in that sub-iteration.

References
----------
.. [1] Z. Guo and R. W. Hall, "Parallel thinning with
       two-subiteration algorithms," Comm. ACM, vol. 32, no. 3,
       pp. 359-373, 1989. :DOI:`10.1145/62065.62074`
.. [2] Lam, L., Seong-Whan Lee, and Ching Y. Suen, "Thinning
       Methodologies-A Comprehensive Survey," IEEE Transactions on
       Pattern Analysis and Machine Intelligence, Vol 14, No. 9,
       p. 879, 1992. :DOI:`10.1109/34.161346`

Examples
--------
>>> square = np.zeros((7, 7), dtype=bool)
>>> square[1:-1, 2:-2] = 1
>>> square[0, 1] =  1
>>> square.view(np.uint8)
array([[0, 1, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
>>> skel = thin(square)
>>> skel.view(np.uint8)
array([[0, 1, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
r   rO   )r/   r-   r   )   r   r   )    @      r   constant)moder   )r   r%   
asanyarrayr   r   viewuint8r&   infsumG123_LUT	G123P_LUTndi	correlatetaker   )
r   max_num_iterskelmasknum_iter	n_pts_old	n_pts_newlutNDs
             r   thinrk      s    J UA ==d+00277AD 88Y
M:"((KD  )266LH66266$<y

 X%<	 i(Cdz:AADG ) FF4L	A 
 X%< ;;tr    )rngc                   Uc  U R                  [        5      nO(U R                  [        5      R                  5       nSXA) '   [        R                  " S5      S-  R                  [        5      nU[        R
                  " [        S5       Vs/ s HU  n[        R                  " [        U5      [        5      S   [        R                  " [        US-  5      [        5      S   :g  PMW     sn5      [        R
                  " [        S5       Vs/ s H%  n[        R                  " [        U5      5      S:  PM'     sn5      -  -  n[        R                  " U5      nU(       a  UR                  5       n	[        R
                  " [        S5       Vs/ s H%  nS[        R                  " [        U5      5      -
  PM'     sn5      n
[        XJ5      n[        R                  SU R                  S   2SU R                  S   24   u  pUR                  5       nX   n[        R                   " X   [        R"                  S	9n[        R                   " X   [        R"                  S	9n[        R                   " U[        R$                  5      n[        R&                  R)                  U5      nUR+                  [        R                  " UR                  5       5      5      n[        R,                  " UX   U45      n[        R                   " U[        R.                  S	9n[        R                   " U[        R$                  S	9n[1        XUUU5        UR                  [        5      nUb  X)    X) '   U(       a  UW	4$ U$ s  snf s  snf s  snf )
a
  Compute the medial axis transform of a binary image.

Parameters
----------
image : binary ndarray, shape (M, N)
    The image of the shape to skeletonize. If this input isn't already a
    binary image, it gets converted into one: In this case, zero values are
    considered background (False), nonzero values are considered
    foreground (True).
mask : binary ndarray, shape (M, N), optional
    If a mask is given, only those elements in `image` with a true
    value in `mask` are used for computing the medial axis.
return_distance : bool, optional
    If true, the distance transform is returned as well as the skeleton.
rng : {`numpy.random.Generator`, int}, optional
    Pseudo-random number generator.
    By default, a PCG64 generator is used (see :func:`numpy.random.default_rng`).
    If `rng` is an int, it is used to seed the generator.

    The PRNG determines the order in which pixels are processed for
    tiebreaking.

    .. versionadded:: 0.19

Returns
-------
out : ndarray of bools
    Medial axis transform of the image
dist : ndarray of ints, optional
    Distance transform of the image (only returned if `return_distance`
    is True)

See Also
--------
skeletonize, thin

Notes
-----
This algorithm computes the medial axis transform of an image
as the ridges of its distance transform.

The different steps of the algorithm are as follows
 * A lookup table is used, that assigns 0 or 1 to each configuration of
   the 3x3 binary square, whether the central pixel should be removed
   or kept. We want a point to be removed if it has more than one neighbor
   and if removing it does not change the number of connected components.

 * The distance transform to the background is computed, as well as
   the cornerness of the pixel.

 * The foreground (value of 1) points are ordered by
   the distance transform, then the cornerness.

 * A cython function is called to reduce the image to its skeleton. It
   processes pixels in the order determined at the previous step, and
   removes or maintains a pixel according to the lookup table. Because
   of the ordering, it is possible to process all pixels in only one
   pass.

Examples
--------
>>> square = np.zeros((7, 7), dtype=bool)
>>> square[1:-1, 2:-2] = 1
>>> square.view(np.uint8)
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
>>> medial_axis(square).view(np.uint8)
array([[0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 1, 0, 0],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0]], dtype=uint8)

Fi   rR   r   ir   r$   r   rO   )r   r   r   r%   aranger&   r'   r_   label_pattern_of_eight_connectr\   distance_transform_edt_table_lookupmgridshapeascontiguousarrayintprZ   randomdefault_rngpermutationlexsortint32r
   )r   rd   return_distancerl   masked_imagecenter_is_foregroundindextabledistancestore_distancecornerness_tablecorner_scorer)   jresult	generator
tiebreakerr   s                     r   medial_axisr   h  s   f |||D)||D)..0#U IIcNT199$?HH "'s ", IIk%0.A!DyyUW_!=~NqQR!+ hhE#JOJ5{512Q6JOPQ
	
 
  )),7H! xx5:3Z@ZERVVK&'	'Z@ !@L 88AA&EKKN(::;DA FH
QYbgg6A
QYbgg6A!!&"((3F 		%%c*I&&ryy1A1A1C'DEJJJ
L$>IJE  bhh7E  bhh7EfE51]]4 Feu~%%s P& 	As   AM0
,M5,M:c                     [         R                  " U S-  U S-  U S-  /U S-  U S-  U S-  /U S-  U S-  U S	-  //[        5      $ )
zN
Return the pattern represented by an index value
Byte decomposition of index
r   r   r-   r/   rR   rS   rT   rU   r5   )r%   r&   r   )r   s    r   rp   rp     sa    
 88T\54<6T\54<6T\54<6	

 	 r    c                 \   U R                   S   S:  d  U R                   S   S:  GaR  U R                  [        5      n [        R                  " U R                   [
        5      nUSS2SS24==   U SS2SS24   S-  -  ss'   USS2SS24==   U SS2SS24   S-  -  ss'   USS2SS24==   U SS2SS24   S-  -  ss'   USS2SS24==   U SS2SS24   S-  -  ss'   USS2SS24==   U SS2SS24   S	-  -  ss'   USS2SS24==   U SS2SS24   S
-  -  ss'   USS2SS24==   U SS2SS24   S-  -  ss'   USS2SS24==   U SS2SS24   S-  -  ss'   USS2SS24==   U SS2SS24   S-  -  ss'   O.[        [        R                  " U [        R                  5      5      nX   n U $ )a  
Perform a morphological transform on an image, directed by its
neighbors

Parameters
----------
image : ndarray
    A binary image
table : ndarray
    A 512-element table giving the transform of each pixel given
    the values of that pixel and its 8-connected neighbors.

Returns
-------
result : ndarray of same shape as `image`
    Transformed image

Notes
-----
The pixels are numbered like this::

  0 1 2
  3 4 5
  6 7 8

The index at a pixel is the sum of 2**<pixel-number> for pixels
that evaluate to true.
r   r   r   Nr   r-   r/   rR   rS   rT   rU   r5   )	ru   r   r   r%   zerosintr   rv   rZ   )r   r   indexers      r   rs   rs     s   B {{1~U[[^a/T"((5;;,AB5"crc?T11A%Q-$..CRCE#2#qr'NT1112%3B3-$..1q!tt++3B35AB<$..QRE!"crc'NT11Q5Q<$..SbSU12qr6]T11%b&:&:5"((&KLNELr    c                 l   U R                   S:  d  U R                   S:  a  [        SU R                    S35      eU R                  [        SSS9nU R                   S:X  a  U[        R
                  S4   n[        R                  " US	S
S9n[        U5      n[        US	S9nU R                   S:X  a  US   nU$ )a&  Compute the skeleton of a binary image.

Thinning is used to reduce each connected component in a binary image
to a single-pixel wide skeleton.

Parameters
----------
image : ndarray, 2D or 3D
    An image containing the objects to be skeletonized. Zeros or ``False``
    represent background, nonzero values or ``True`` are foreground.

Returns
-------
skeleton : ndarray of bool
    The thinned image.

See Also
--------
skeletonize, medial_axis

Notes
-----
The method of [Lee94]_ uses an octree data structure to examine a 3x3x3
neighborhood of a pixel. The algorithm proceeds by iteratively sweeping
over the image, and removing pixels at each iteration until the image
stops changing. Each iteration consists of two steps: first, a list of
candidates for removal is assembled; then pixels from this list are
rechecked sequentially, to better preserve connectivity of the image.

The algorithm this function implements is different from the algorithms
used by either `skeletonize` or `medial_axis`, thus for 2D images the
results produced by this function are generally different.

References
----------
.. [Lee94] T.-C. Lee, R.L. Kashyap and C.-N. Chu, Building skeleton models
       via 3-D medial surface/axis thinning algorithms.
       Computer Vision, Graphics, and Image Processing, 56(6):462-478, 1994.

r   r   z>skeletonize can only handle 2D or 3D images; got image.ndim = z	 instead.r   Fr   .r   rV   )	pad_widthrW   )
crop_widthr   )	r   r   r   r   r%   newaxispadr   r   )r   image_os     r   r   r   O  s    T zzA~a  %

|96
 	

 ll4sl7G zzQ"**c/*ffW
;G "'*G 7q)GzzQ!*Nr    )N)NF)__doc__numpyr%   scipyr   r_   _shared.utilsr   utilr   _skeletonize_lee_cyr   _skeletonize_various_cyr	   r
   r   r   r   rN   r&   r   r]   r^   rk   generate_binary_structurerq   r   rp   rs   r   r0   r    r   <module>r      s       $  4  "& NbG$Z,` 88 0 8<= HH 1 9=>	"`J ..q!4` `F2j@r    