§
    ›Çj¿‡  ã                  ó  — d Z ddlmZ ddlZddlZddlmZ ddlmZ g d¢Z	dZ
dZd	Zd
ZdZdZdXd„ZdYd„Z ed¬¦  «         G d„ d¦  «        ¦   «         ZdZd„Zd[d!„Zd\d$„Zd]d)„Zd^d_d-„Zd`d0„Z ed¬¦  «         G d1„ d2¦  «        ¦   «         Z ed¬¦  «         G d3„ d4¦  «        ¦   «         Z ed¬¦  «         G d5„ d6¦  «        ¦   «         Zdad;„Zdbd>„Zdcd@„ZdddA„ZdedF„Z dfdI„Z!dgdK„Z"dddLœdhdS„Z# G dT„ dU¦  «        Z$didW„Z%dS )ja€  Cursor motion planning - per-session mouse trajectories, in pure Python.

Why this lives here and not in the engine
-----------------------------------------
The trajectory the cursor follows between two points is a *shape*, and a shape
built out of hardcoded constants is an invariant: it is byte-for-byte the same
curve family for every movement, of every session, of every install of this
package. Anything that can be measured once can then be recognised forever, and
worse, it links every account a single user runs. So every number that decides
what a path looks like is drawn from the session seed instead of being written
in the source: the arm geometry, the number of control knots, the easing, the
duration law, the sampling interval, the tremor and its anisotropy, how often a
movement overshoots and how often two events land on the same device pixel.

Two seeds therefore produce measurably different *families* of paths, not just
different samples from one family. The same seed reproduces byte-identical
paths, because seed-reproducibility is a documented property of this package
and callers rely on it (``InvisiblePlaywright(seed=42)``).

Design notes worth keeping
--------------------------
* **Noise is zero-mean.** Tremor is drawn from ``gauss(0, sigma)``. A non-zero
  mean puts a systematic drift on every waypoint of every path ever produced,
  which is both a bug and a signature.
* **Noise is genuinely two-dimensional.** Tremor has an *along-travel* and an
  *across-travel* component with independent draws and their own scales, so the
  displacement covariance of a movement has two non-negligible eigenvalues. A
  tremor applied on a single direction is rank-1: every displacement in the
  movement is parallel to one vector, which is a one-line test to detect. It
  also leaves a whole screen axis noiseless whenever the movement happens to be
  horizontal or vertical, and an exactly noiseless axis lies on an analytic
  curve that can be solved from a handful of samples and used to predict the
  rest of the stream.
* **Every interior waypoint is displaced.** Not a random subset: a subset means
  a knowable fraction of the emitted points sit *exactly* on the underlying
  analytic curve, which is the same break in a slower form.
* **The speed profile is bell-shaped and drawn per movement.** Speed is zero at
  both ends, peaks somewhere near the middle, and the peak position is random
  per movement inside a per-seed sub-range. A single fixed easing is an
  invariant even when the positions differ; an easing that starts at maximum
  speed also implies infinite initial acceleration, which no hand does.
* **Duration follows a Fitts-style law**, so a long movement takes longer than a
  short one. A constant duration makes implied speed scale with distance, which
  is backwards.
* **Aiming overshoots, sometimes.** A ballistic reach lands past its target and
  is pulled back by a corrective submovement. A generator whose axial progress
  is monotone in 100.000% of its paths is as recognisable as one that always
  drifts the same way: "exactly zero, always" is a signature too. The overshoot
  here is bounded and its rate is per-seed.
* **Two consecutive events may share a device pixel.** Reported coordinates are
  integers, so a pointer crawling through the slow ends of a movement really
  does repeat one. A duplicate rate of exactly zero on every path is, again, an
  exact invariant. The rate is per-seed and bounded, and never becomes the long
  run of identical tail events that a fixed ease-out produces.
* **The per-seed difference lives in the SHAPE.** Fine timing does not survive
  dispatch (a scheduler quantises short sleeps), so a generator whose sessions
  differ only in tempo differs in nothing observable. The arm geometry below -
  a per-seed pivot direction that decides which way a stroke bows, given its
  direction on screen - is what makes two seeds trace visibly different curves
  between the same two points.

The module is pure: no Playwright, no network, no filesystem, no clock. Every
property it claims is verifiable with arithmetic alone - which is exactly what
lets ``tests/test_motion.py`` check its statistics without launching a browser.
é    )ÚannotationsN)Úbisect_left)Ú	dataclass)	ÚMotionStyleÚWaypointÚCursorMotionÚstyle_for_seedÚ	MIN_STEPSÚ	MAX_STEPSÚMIN_DURATION_MSÚMAX_DURATION_MSÚSAMPLE_FLOOR_MSé   é    ç      D@g     @Ÿ@ç       @g•Ö&è.>ÚseedÚintÚtagÚstrÚreturnc                ó€   — dt          | ¦  «        dz  z  }|                     d¦  «        D ]}||z  }|dz  dz  }Œ|dz  S )zíFNV-1a mix -> independent PRNG streams per logical bucket from one seed.

    Same convention used elsewhere in the package for deriving sub-streams; kept
    local so this module stays importable on its own with nothing but stdlib.
    l   %#D’s”_ l   ÿÿÿÿ zutf-8l   ³   iÿÿÿ)r   Úencode)r   r   ÚhÚchs       úMC:\Projects\Historical\venv\Lib\site-packages\invisible_playwright/_motion.pyÚ_mixr   i   sZ   € ð 	�c $™iœiÐ*<Ñ<Ñ=€AØ�jŠj˜Ñ!Ô!ð 5ð 5ˆØ	ˆR‰ˆØ�ÑÐ"4Ñ4ˆˆØˆz‰>Ðó    ÚvÚfloatÚloÚhic                ó&   — | |k     r|n	| |k    r|n| S ©N© )r   r!   r"   s      r   Ú_clampr&   v   s    € Ø�R’�ˆ2ˆ2 A¨¢F F˜b˜b°Ð2r   T)Úfrozenc                  ó†  — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded <   ded!<   ded"<   ded#<   ded$<   ded%<   ded&<   ded'<   ded(<   ded)<   d*S )+r   a'  The shape parameters of one session. All of it is drawn from the seed.

    Every field below replaces something that used to be a literal. The ranges
    are picked so that two installs are very unlikely to share a shape, while
    every single sample still reads as a hand moving a mouse.
    r   Úknotsztuple[float, ...]Ú	knot_baser    Úknot_wobbleÚbow_baseÚbow_fracÚ
bow_abs_pxÚbow_knee_pxÚpivot_angleÚpivot_strengthÚbow_biasÚ
bow_cap_pxÚshort_move_pxÚtarget_w_pxÚ
fitts_a_msÚ
fitts_b_msÚ
dur_jitterÚstep_msÚstep_jitterÚ	ease_a_loÚ	ease_a_hiÚ	ease_r_loÚ	ease_r_hiÚtremor_across_pxÚtremor_anisoÚtremor_full_pxÚtremor_burst_pÚtremor_burst_multÚtremor_shapeÚovershoot_pÚovershoot_fracÚovershoot_cap_pxÚovershoot_min_pxÚover_start_loÚover_start_hiÚ
over_shapeÚ
dup_keep_pÚdup_run_maxN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r%   r   r   r   r   }   sð  € € € € € € ðð ð €J€J�Jð !Ð Ð Ñ ØÐÐÑð  ÐÐÑð €O€O�OØÐÐÑØÐÐÑð ÐÐÑØÐÐÑð €O€O�Oð ÐÐÑàÐÐÑð ÐÐÑØÐÐÑØÐÐÑð ÐÐÑð €N€N�NàÐÐÑð ÐÐÑØÐÐÑØÐÐÑØÐÐÑð
 ÐÐÑØÐÐÑð ÐÐÑð ÐÐÑØÐÐÑð ÐÐÑð ÐÐÑØÐÐÑØÐÐÑØÐÐÑð ÐÐÑØÐÐÑØÐÐÑð
 ÐÐÑØÐÐÑÐÐr   r   c           
     ób  — t          j        t          | d¦  «        ¦  «        }|                     dd¦  «        |                     dd¦  «        |                     dd¦  «        f}|                     dd¦  «        |                     dd¦  «        |                     dd¦  «        f}|                     d	d
¦  «        }t	          ||                     dd¦  «        z   d¦  «        }||k    r|dz   }|                     dd¦  «        }t	          ||                     dd¦  «        z   d¦  «        }|                     dd¦  «        }t	          ||                     dd¦  «        z   d¦  «        }	t          ddi d|                     dd¦  «        “d|“d|                     dd¦  «        “d|“d|                     dd ¦  «        “d!|                     d"d#¦  «        “d$|                     d%d&¦  «        “d'|                     d(d)t          j        z  ¦  «        “d*|                     dd+¦  «        “d,|                     d-d.¦  «        “d/|                     d0d1¦  «        “d2|                     d0d&¦  «        “d3|                     d4d5¦  «        “d6|                     d&d7¦  «        “d8|                     d&d9¦  «        “d:|                     d;d<¦  «        “d=|                     d>d?¦  «        “d@|                     d;d.¦  «        “dA|“dB|“dC|“dD|“dE|                     dFdG¦  «        “dH|                     d.dI¦  «        “dJ|                     dKd7¦  «        “dL|                     dMd¦  «        “dN|                     dOdP¦  «        “dQ|                     ddR¦  «        “dS|                     dTd¦  «        “dU|                     dVdW¦  «        “dX|                     d?dY¦  «        “dZ|                     d[d\¦  «        “d]|“d^|	“d_|                     d`dR¦  «        “da|                     d;db¦  «        “dc|                     dd¦  «        “ŽS )ez:Draw one session's shape parameters from the session seed.zmotion:styleg¸…ëQ¸¾?gR¸…ëQØ?g×£p=
×ã?g)\�Âõ(ì?gš™™™™™á?g333333÷?gffffffæ¿g333333û?gÍÌÌÌÌÌ@g333333ã?gffffffö?gÍÌÌÌÌÌ@gš™™™™™É?gö(\�Âõè?g333333ó?g      Ð?gÍÌÌÌÌÌä?gš™™™™™ý?g¸…ëQ¸Þ?g¤p=
×£Ð?r)   é   é   r*   r+   g{®Gáz”?gìQ¸…ë±?r,   r-   gü©ñÒMb€?g/Ý$�¥?r.   ç      ð?gÍÌÌÌÌÌ@r/   g      >@g     €V@r0   ç        g       @r1   ç¸…ëQ¸î?r2   gffffffÖ¿çffffffÖ?r3   r   g     €[@r4   r5   g      <@g      L@r6   g     Àg@r7   g      d@r8   gš™™™™™¹?gìQ¸…ëÑ?r9   r   g      2@r:   r;   r<   r=   r>   r?   g{®GázÄ?g�Âõ(\�â?r@   gffffffî?rA   g     €Q@rB   gš™™™™™©?rC   g      ø?gffffff@rD   gš™™™™™ù?rE   gìQ¸…ëÁ?rF   g{®Gáz„?ç{®Gáz¤?rG   g     €F@rH   g      $@g      A@rI   rJ   rK   gš™™™™™é?rL   çš™™™™™Ù?rM   r%   )	ÚrandomÚRandomr   ÚuniformÚminr   ÚrandintÚmathÚpi)
r   Úrr*   r,   Úa_loÚa_hiÚr_loÚr_hiÚover_loÚover_his
             r   r	   r	   ö   sÔ  € åŒ•d˜4 Ñ0Ô0Ñ1Ô1€Að 	
�	Š	�$˜ÑÔØ	�	Š	�$˜ÑÔØ	�	Š	�$˜ÑÔð€Ið 	
�	Š	�$˜ÑÔØ	�	Š	�%˜ÑÔØ	�	Š	�%˜ÑÔð€Hð �9Š9�T˜4Ñ Ô €DÝˆt�a—i’i  dÑ+Ô+Ñ+¨TÑ2Ô2€DØˆt‚|€|Ø�d‰{ˆØ�9Š9�T˜4Ñ Ô €DÝˆt�a—i’i  dÑ+Ô+Ñ+¨TÑ2Ô2€Dà�iŠi˜˜dÑ#Ô#€GÝ�'˜AŸIšI d¨DÑ1Ô1Ñ1°4Ñ8Ô8€Gåð &ð &ð &Ø�iŠi˜˜1‰oŒoˆoð&à�)ð&ð —I’I˜d DÑ)Ô)Ð)ð&ð �ð	&ð
 —’˜5 %Ñ(Ô(Ð(ð&ð —9’9˜S #Ñ&Ô&Ð&ð&ð —I’I˜d DÑ)Ô)Ð)ð&ð —I’I˜c 3­¬¡=Ñ1Ô1Ð1ð&ð —y’y  tÑ,Ô,Ð,ð&ð —’˜5 $Ñ'Ô'Ð'ð&ð —9’9˜T 5Ñ)Ô)Ð)ð&ð —i’i  dÑ+Ô+Ð+ð&ð —I’I˜d DÑ)Ô)Ð)ð&ð —9’9˜T 5Ñ)Ô)Ð)ð&ð —9’9˜T 5Ñ)Ô)Ð)ð&ð  —9’9˜T 4Ñ(Ô(Ð(ð!&ð" —	’	˜#˜tÑ$Ô$Ð$ð#&ð$ —I’I˜d DÑ)Ô)Ð)ð%&ð& �$ð'&ð( �$ð)&ð* �$ð+&ð, �$ð-&ð. Ÿš 4¨Ñ.Ô.Ð.ð/&ð0 —Y’Y˜t TÑ*Ô*Ð*ð1&ð2 —y’y  uÑ-Ô-Ð-ð3&ð4 —y’y  tÑ,Ô,Ð,ð5&ð6 Ÿ)š) C¨Ñ-Ô-Ð-ð7&ð8 —Y’Y˜t TÑ*Ô*Ð*ð9&ð: —I’I˜d DÑ)Ô)Ð)ð;&ð< —y’y ¨Ñ.Ô.Ð.ð=&ð> Ÿš 4¨Ñ.Ô.Ð.ð?&ð@ Ÿš 4¨Ñ.Ô.Ð.ðA&ðB �gðC&ðD �gðE&ðF —9’9˜T 4Ñ(Ô(Ð(ðG&ðH —9’9˜T 4Ñ(Ô(Ð(ðI&ðJ —I’I˜a ‘O”O�OðK&ð &r   Úctrlúlist[tuple[float, float]]Útútuple[float, float]c                ó¾   ‡‡— | Št          ‰¦  «        dk    r?ˆˆfd„t          t          ‰¦  «        dz
  ¦  «        D ¦   «         Št          ‰¦  «        dk    °?‰d         S )z>De Casteljau. Degree is 2..4 here, so the O(n^2) form is free.rU   c                óØ   •— g | ]f}‰|         d          ‰|dz            d          ‰|         d          z
  ‰z  z   ‰|         d         ‰|dz            d         ‰|         d         z
  ‰z  z   f‘ŒgS )r   rU   r%   )Ú.0ÚiÚptsrm   s     €€r   ú
<listcomp>z!_bezier_point.<locals>.<listcomp>G  s‰   ø€ ð 
ð 
ð 
ð
 ð �A”�q”	˜S  Q¡œZ¨œ]¨S°¬V°A¬YÑ6¸!Ñ;Ñ;Ø�A”�q”	˜S  Q¡œZ¨œ]¨S°¬V°A¬YÑ6¸!Ñ;Ñ;ðð
ð 
ð 
r   r   )ÚlenÚrange)rk   rm   rs   s    `@r   Ú_bezier_pointrw   C  su   øø€ à
€CÝ
ˆc‰(Œ(�QŠ,ˆ,ð
ð 
ð 
ð 
ð 
õ
 �3˜s™8œ8 a™<Ñ(Ô(ð
ñ 
ô 
ˆõ ˆc‰(Œ(�QŠ,ˆ,ð ˆqŒ6€Mr   Únútuple[list[float], list[float]]c                óf  ‡ ‡— ˆfd„t          ‰¦  «        D ¦   «         }ˆ fd„|D ¦   «         }dg}t          d‰¦  «        D ]o}|                     |d         t          j        ||         d         ||dz
           d         z
  ||         d         ||dz
           d         z
  ¦  «        z   ¦  «         Œp||fS )zISample the curve uniformly in t and return (t values, cumulative length).c                ó    •— g | ]
}|‰d z
  z  ‘ŒS ©rU   r%   ©rq   rr   rx   s     €r   rt   z_arc_table.<locals>.<listcomp>U  ó!   ø€ Ð	(Ð	(Ð	(˜!ˆ!ˆq�1‰u‰+Ð	(Ð	(Ð	(r   c                ó0   •— g | ]}t          ‰|¦  «        ‘ŒS r%   )rw   )rq   rm   rk   s     €r   rt   z_arc_table.<locals>.<listcomp>V  s#   ø€ Ð
.Ð
.Ð
. a�=˜˜qÑ!Ô!Ð
.Ð
.Ð
.r   rX   rU   éÿÿÿÿr   )rv   Úappendrb   Úhypot)rk   rx   Útsrs   Úcumrr   s   ``    r   Ú
_arc_tabler…   Q  sÇ   øø€ ð 
)Ð	(Ð	(Ð	(�u Q™xœxÐ	(Ñ	(Ô	(€BØ
.Ð
.Ð
.Ð
.¨2Ð
.Ñ
.Ô
.€CØˆ%€CÝ�1�a‰[Œ[ð _ð _ˆØ�
Š
�3�r”7�TœZ¨¨A¬¨q¬	°C¸¸A¹´J¸q´MÑ(AÀ3ÀqÄ6È!Ä9ÈsÐSTÐWXÑSXÌzÐZ[Ì}ÑC\Ñ]Ô]Ñ]Ñ^Ô^Ð^Ð^Øˆsˆ7€Nr   rƒ   úlist[float]r„   Úsc                ój  — |d         }|t           k    rdS t          |d|¦  «        }t          ||¦  «        }|dk    r| d         S |t          |¦  «        k    r| d         S ||         ||dz
           z
  }|t           k    rdn|||dz
           z
  |z  }| |dz
           | |         | |dz
           z
  |z  z   S )zBInvert the arc-length table: linear interpolation between samples.r€   rX   r   rU   )Ú_EPSr&   r   ru   )rƒ   r„   r‡   ÚtotalÚjÚspanÚfs          r   Ú_t_at_arclenrŽ   ]  sÄ   € à�ŒG€EØ•‚}€}ØˆsÝˆq�#�uÑÔ€AÝ�C˜ÑÔ€AØˆA‚v€vØ�!ŒuˆØ�C�‰HŒH‚}€}Ø�"ŒvˆØˆqŒ6�C˜˜A™”JÑ€DØ•tŠ|ˆ|ˆˆ ! c¨!¨a©%¤j¡.°DÑ!8€AØˆa�!‰eŒ9˜˜1œ  1 q¡5¤	Ñ)¨QÑ.Ñ.Ð.r   éA   ÚaÚbc           	     ó   ‡ ‡‡‡— ˆfd„t          ‰¦  «        D ¦   «         }ˆ ˆfd„|D ¦   «         }dg}t          d‰¦  «        D ]J}|                     |d         d||         ||dz
           z   z  ||         ||dz
           z
  z  z   ¦  «         ŒK|d         Š‰t          k    rˆfd„t          ‰¦  «        D ¦   «         S ˆfd„|D ¦   «         }d	|d<   |S )
a  Cumulative (normalised) distance profile for a Beta-shaped speed density.

    Speed density  v(t) = t^(a-1) * (1-t)^(b-1)  with a, b > 1: zero at both
    ends, single interior peak at (a-1)/(a+b-2). Integrating gives a monotone
    S(t) with S(0)=0 and S(1)=1 exactly.
    c                ó    •— g | ]
}|‰d z
  z  ‘ŒS r|   r%   r}   s     €r   rt   z"_profile_table.<locals>.<listcomp>t  r~   r   c                ó8   •— g | ]}|‰d z
  z  d |z
  ‰d z
  z  z  ‘ŒS )rW   r%   )rq   rm   r�   r‘   s     €€r   rt   z"_profile_table.<locals>.<listcomp>u  s3   ø€ ÐDÐDÐD¸AˆQ�1�s‘7‰^  q¡¨a°#©gÑ 6Ñ7ÐDÐDÐDr   rX   rU   r€   g      à?c                ó    •— g | ]
}|‰d z
  z  ‘ŒS r|   r%   r}   s     €r   rt   z"_profile_table.<locals>.<listcomp>{  s!   ø€ Ð.Ð.Ð. ��Q˜‘U‘Ð.Ð.Ð.r   c                ó   •— g | ]}|‰z  ‘ŒS r%   r%   )rq   ÚcrŠ   s     €r   rt   z"_profile_table.<locals>.<listcomp>|  s   ø€ Ð
"Ð
"Ð
"˜ˆ1ˆu‰9Ð
"Ð
"Ð
"r   rW   )rv   r�   r‰   )	r�   r‘   rx   rƒ   Údensr„   rr   ÚoutrŠ   s	   ```     @r   Ú_profile_tablerš   m  s  øøøø€ ð 
)Ð	(Ð	(Ð	(�u Q™xœxÐ	(Ñ	(Ô	(€BØDÐDÐDÐDÐDÀÐDÑDÔD€DØˆ%€CÝ�1�a‰[Œ[ð Rð RˆØ�
Š
�3�r”7˜S D¨¤G¨d°1°q±5¬kÑ$9Ñ:¸bÀ¼eÀbÈÈQÉÄiÑ>OÑPÑPÑQÔQÐQÐQØ�ŒG€EØ•‚}€}Ø.Ð.Ð.Ð.¥U¨1¡X¤XÐ.Ñ.Ô.Ð.Ø
"Ð
"Ð
"Ð
"˜cÐ
"Ñ
"Ô
"€CØ€Cˆ�GØ€Jr   ÚtableÚuc                óì   — |dk    rdS |dk    rdS |t          | ¦  «        dz
  z  }t          |¦  «        }|t          | ¦  «        dz
  k    r| d         S | |         | |dz            | |         z
  ||z
  z  z   S )z2Interpolate the cumulative profile at u in [0, 1].rX   rW   rU   r€   )ru   r   )r›   rœ   Úxrr   s       r   Ú_profile_atrŸ   �  s…   € àˆC‚x€xØˆsØˆC‚x€xØˆsØ	�S�‰ZŒZ˜!‰^Ñ€AÝˆA‰Œ€AØ�C�‰JŒJ˜‰NÒÐØ�RŒyÐØ�Œ8�u˜Q ™U”| e¨A¤hÑ.°1°q±5Ñ9Ñ9Ð9r   c                  ó<   — e Zd ZU dZded<   ded<   ded<   ded<   dS )r   a  One synthetic mousemove.

    ``dt_ms`` is how long to wait *before* dispatching this point (0 for the
    first); ``t_ms`` is the same schedule expressed as elapsed time from the
    start of the movement, for callers that prefer to correct their own drift.
    r    rž   ÚyÚdt_msÚt_msNrN   r%   r   r   r   r   ‘  s@   € € € € € € ðð ð €H€H�HØ€H€H�HØ€L€L�LØ€K€K�K€K€Kr   r   c                  óŽ   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   edd„¦   «         Zdd„ZdS )Ú_Axisa'  The straight line from start to end, and the frame built on it.

    Every stage below places points as "so far along the travel, so far to the
    side of it", so the unit tangent and normal are computed once here rather
    than being threaded through six signatures as four loose floats.
    r    Úfrom_xÚfrom_yÚto_xÚto_yÚdistÚuxÚuyÚnxÚnyr   ú'_Axis'c                óä   — ||z
  ||z
  }}t          j        ||¦  «        }||z  ||z  }	} | t          |¦  «        t          |¦  «        t          |¦  «        t          |¦  «        |||	|	 |¦	  «	        S r$   )rb   r‚   r    )
Úclsr¦   r§   r¨   r©   ÚdxÚdyrª   r«   r¬   s
             r   Úbetweenz_Axis.between³  sx   € ð ˜‘  v¡ˆBˆÝŒz˜"˜bÑ!Ô!ˆØ�d‘˜B ™IˆBˆØˆs•5˜‘=”=¥%¨¡-¤-µ°t±´½eÀD¹k¼kØ˜˜R "  bñ*ô *ð 	*r   ÚalongÚacrossrn   c                óv   — | j         | j        |z  z   | j        |z  z   | j        | j        |z  z   | j        |z  z   fS r$   )r¦   r«   r­   r§   r¬   r®   )Úselfrµ   r¶   s      r   Úatz_Axis.at¼  sF   € Ø”˜dœg¨™oÑ-°´¸&Ñ0@Ñ@Ø”˜dœg¨™oÑ-°´¸&Ñ0@Ñ@ðBð 	Br   N)
r¦   r    r§   r    r¨   r    r©   r    r   r¯   )rµ   r    r¶   r    r   rn   )rO   rP   rQ   rR   rS   Úclassmethodr´   r¹   r%   r   r   r¥   r¥      s«   € € € € € € ðð ð €M€M�MØ€M€M�MØ€K€K�KØ€K€K�KØ€K€K�KØ€I€I�IØ€I€I�IØ€I€I�IØ€I€I�Iàð*ð *ð *ñ „[ð*ðBð Bð Bð Bð Bð Br   r¥   c                  óT   — e Zd ZU dZdZded<   dZded<   dZded<   dZded<   dd„Z	dS )Ú
_Overshootab  A reach that lands past its target and is pulled back.

    A hump added to the position, mostly along the travel: it rises after
    ``u0``, peaks past the target, and returns to zero at u = 1, so the
    endpoint stays exact while the axial coordinate genuinely goes backwards on
    the way in. ``amp == 0`` means this movement did not overshoot.
    rX   r    ÚampÚperprW   Úu0Úshaperœ   r   c                óª   — | j         dk    s|| j        k    rdS t          j        t          j        || j        z
  z  d| j        z
  z  ¦  «        | j        z  S )a©  How much of the hump applies at fraction ``u``; 0 outside it.

        The WEIGHT, not the displacement. The caller multiplies in the same
        grouping the original expression used - see the note in
        ``_control_polygon`` about float multiplication not being associative;
        returning ``amp * w`` here and multiplying by the unit vector there
        regroups it and shifts the result in the last bit.
        rX   rW   )r½   r¿   rb   Úsinrc   rÀ   )r¸   rœ   s     r   Ú	weight_atz_Overshoot.weight_atÐ  sM   € ð Œ8�sŠ?ˆ?˜a 4¤7šl˜lØ�3ÝŒx�œ 1 t¤w¡;Ñ/°3¸¼±=ÑAÑBÔBÀdÄjÑPÐPr   N)rœ   r    r   r    )
rO   rP   rQ   rR   r½   rS   r¾   r¿   rÀ   rÃ   r%   r   r   r¼   r¼   Á  s|   € € € € € € ðð ð €CÐÐÐÑØ€DÐÐÐÑØ€B€O€O€O�OØ€EÐÐÐÑðQð Qð Qð Qð Qð Qr   r¼   Úrngúrandom.RandomÚaxisÚstc                ó~  ‡ ‡— t          j        ‰j        ¦  «        |j        z  t          j        ‰j        ¦  «        |j        z  z    }‰j        |j        z  ‰j        |j        z  |j        ‰j	        z   z  z   }|j        ‰j
        k     rdn‰j        }t          ˆ ˆfd„t          |¦  «        D ¦   «         ¦  «        }|j        |j        fg}t!          |¦  «        D ]Å\  }}	‰j        |         }
|‰j        |z  |
z  d‰j        z
  ‰                      ‰j        d¦  «        z  |
z  z   z  }t+          |‰j         ‰j        ¦  «        }|                     |j        |j        |j        z  |	z  z   |j        |z  z   |j        |j        |j        z  |	z  z   |j        |z  z   f¦  «         ŒÆ|                     |j        |j        f¦  «         |S )aâ  Knots near their per-seed axial positions, displaced across the travel.

    How far, and on which side, is mostly decided by the session's arm
    geometry: a stroke swinging about a joint at ``pivot_angle`` bows away from
    that joint, so the same two endpoints give one session a left-hand arc and
    another a right-hand one. That is deterministic given the direction of
    travel, which is exactly why it separates sessions instead of averaging out
    over movements.
    rU   c              3  óˆ   •K  — | ]<}t          ‰j        |         ‰                     d ‰j        ¦  «        z   dd¦  «        V — Œ=dS )rX   r[   rY   N)r&   r*   Úgaussr+   )rq   r‹   rÄ   rÇ   s     €€r   ú	<genexpr>z#_control_polygon.<locals>.<genexpr>÷  s^   øè è € ð ð àõ 	ˆrŒ|˜AŒ §¢¨3°´Ñ!?Ô!?Ñ?ÀÀtÑLÔLðð ð ð ð ð r   rW   )rb   Úcosr0   r­   rÂ   r®   r-   rª   r.   r/   r4   r)   Úsortedrv   r¦   r§   Ú	enumerater,   r1   rÊ   r2   r&   r3   r�   r«   r¬   r¨   r©   )rÄ   rÆ   rÇ   ÚswingÚ	amp_scaleÚn_knotsÚaxialrk   r‹   rœ   Úmagr½   s   ` `         r   Ú_control_polygonrÔ   ç  sè  øø€ õ Œh�r”~Ñ&Ô&¨¬Ñ0µ4´8¸B¼NÑ3KÔ3KÈdÌgÑ3UÑUÐV€EØ”˜tœyÑ(Ø”= 4¤9Ñ,°´	¸B¼NÑ0JÑKñL€Ið ”9˜rÔ/Ò/Ð/ˆaˆa°R´X€GÝð ð ð ð ð å�w‘”ðñ ô ñ ô €Eð Œ[˜$œ+Ð&Ð'€DÝ˜%Ñ Ô ð Mð M‰ˆˆ1ØŒk˜!ŒnˆØØÔ Ñ%¨Ñ+Ø�RÔ&Ñ&¨#¯)ª)°B´KÀÑ*EÔ*EÑEÈÑKñLñ
ˆõ �S˜2œ=˜.¨"¬-Ñ8Ô8ˆð 	�Š�T”[ 4¤7¨T¬YÑ#6¸Ñ#:Ñ:¸T¼WÀs¹]ÑJØ”[ 4¤7¨T¬YÑ#6¸Ñ#:Ñ:¸T¼WÀs¹]ÑJðLñ 	Mô 	Mð 	Mð 	Mà‡K‚K�”˜DœIÐ&Ñ'Ô'Ð'Ø€Kr   Útarget_wúfloat | Nonec                ó2  — |r|dk    rt          |¦  «        n|j        }t          j        |j        |z  dz   ¦  «        }|j        |j        |z  z   t          j        |                      d|j	        ¦  «        ¦  «        z  }t          |t          t          ¦  «        S )a“  Fitts, fed the WIDTH of the thing being hit.

    The generator cannot derive that width from two points. Until 2026-07-26 it
    always used the per-seed default, so a stroke to a 20 px control and one to
    a 200 px control took the same time - the law was implemented and then fed
    a constant. The planner knows the box; passing it is giving the model a
    fact, not taking over its pacing.
    r   rW   rX   )r    r5   rb   Úlog2rª   r6   r7   ÚexprÊ   r8   r&   r   r   )rÄ   rÆ   rÇ   rÕ   ÚwÚbitsÚdurations          r   Ú_movement_durationrÝ     s‰   € ð $ÐH¨°1ª¨�ˆh‰Œˆ¸"¼.€AÝŒ9�T”Y ‘] SÑ(Ñ)Ô)€Dð ” ¤°Ñ 4Ñ4½¼Ø�	Š	�#�r”}Ñ%Ô%ñ9'ô 9'ñ '€Hå�(�O­_Ñ=Ô=Ð=r   rÜ   c                óž  ‡ ‡— t          t          |‰j        z  ¦  «        ¦  «        }t          t          t          t          |¦  «        ¦  «        }ˆ ˆfd„t          |¦  «        D ¦   «         }t          |¦  «        }dg}d}|D ]"}||z  }| 	                    ||z  |z  ¦  «         Œ#||d<   t          |¦  «        dk    r|S |d         g}	|dd…         D ]+}
|
|	d         z
  t          k    r|	 	                    |
¦  «         Œ,t          |	¦  «        dk    r(||	d         z
  t          k     r|	                     ¦   «          |	 	                    |¦  «         |	S )a‚  When each sample is taken, never closer together than a device can report.

    PHYSICAL FLOOR. The increments are log-normal with no lower bound, so the
    tail lands under any real sampling interval: measured 2026-07-26, 8.64% of
    emitted gaps were below 8 ms and the smallest was 3.52 ms, i.e. 284 Hz,
    while the per-seed nominal interval was a sane 9.7-17.9 ms. A mouse reports
    at 125 Hz (8 ms) and the browser coalesces on top of that, so a gap under
    that is not fast sampling - it is a rate no device produces, and it is
    measurable on the wire without any statistics.

    DROPPED, not compressed. Squeezing the gap back up would move every later
    point and change the movement's duration; dropping the offending sample
    keeps the schedule and the endpoint exactly as drawn. Same choice the
    dispatcher makes for the time cap: fewer events, never faster ones.
    c                ój   •— g | ]/}t          j        ‰                     d ‰j        ¦  «        ¦  «        ‘Œ0S )rX   )rb   rÙ   rÊ   r:   )rq   Ú_rÄ   rÇ   s     €€r   rt   z!_sample_times.<locals>.<listcomp>8  s3   ø€ ÐMÐMÐM¸�DŒH�S—Y’Y˜s B¤NÑ3Ô3Ñ4Ô4ÐMÐMÐMr   rX   r€   r   r   rU   )r   Úroundr9   Úmaxr
   r`   r   rv   Úsumr�   ru   r   Úpop)rÄ   rÜ   rÇ   Ún_stepsÚincsÚ	total_incÚtimesÚaccr—   ÚkeptÚtms   ` `        r   Ú_sample_timesrì   #  sW  øø€ õ" •%˜ 2¤:Ñ-Ñ.Ô.Ñ/Ô/€GÝ•)�S¥¨GÑ4Ô4Ñ5Ô5€Gð NÐMÐMÐMÐM½eÀG¹n¼nÐMÑMÔM€DÝ�D‘	”	€IØˆE€EØ
€CØð 1ð 1ˆØˆq‰ˆØ�Š�X ‘^ iÑ/Ñ0Ô0Ð0Ð0Ø€Eˆ"�Iå
ˆ5�z„z�Q‚€ØˆØ�!ŒHˆ:€DØ�A�b�DŒkð ð ˆØ��R”‰=�OÒ+Ð+Ø�KŠK˜‰OŒOˆOøõ ˆ4�y„y�1‚}€}˜ D¨¤HÑ,­Ò>Ð>Ø�Š‰
Œ
ˆ
Ø‡K‚K�ÑÔÐØ€Kr   c           	     óª  — |j         |j        k     s|                      ¦   «         |j        k    rt	          ¦   «         S t          |j        |j         z  t          j        |  	                    dd¦  «        ¦  «        z  d|j
        ¦  «        }t	          |||  	                    dd¦  «        z  |                      |j        |j        ¦  «        |j        ¬¦  «        S )NrX   rZ   r\   )r½   r¾   r¿   rÀ   )rª   rH   r]   rE   r¼   r&   rF   rb   rÙ   rÊ   rG   r_   rI   rJ   rK   )rÄ   rÆ   rÇ   r½   s       r   Ú_draw_overshootrî   P  s»   € à„y�2Ô&Ò&Ð&¨#¯*ª*©,¬,¸"¼.Ò*HÐ*HÝ‰|Œ|ÐÝ
�Ô" T¤YÑ.µ´¸#¿)º)ÀCÈÑ:NÔ:NÑ1OÔ1OÑOØ�bÔ)ñ+ô +€Cå˜#Ø §¢¨3°Ñ!5Ô!5Ñ5ØŸš RÔ%5°rÔ7GÑHÔHØœMð+ñ +ô +ð +r   rè   ÚprofÚoverú list[tuple[float, float, float]]c                ó  — t          dt          dt          |j        dz  ¦  «        dz   ¦  «        ¦  «        }t	          | |¦  «        \  }}|d         }	g }
t          |¦  «        dz
  }t          |¦  «        D �]\  }}|dk    r#|
                     |j        |j	        df¦  «         Œ/||k    r#|
                     |j
        |j        |f¦  «         ŒX||z  }t          | t          ||t          ||¦  «        |	z  ¦  «        ¦  «        \  }}|                     |¦  «        }|rP||j        |j        z  |z  |j        |j        z  |z  z   z  }||j        |j        z  |z  |j        |j        z  |z  z   z  }|
                     |||f¦  «         �Œ|
S )	zñWalk the curve by ARC LENGTH, not by parameter.

    Sampling a Bezier at even parameter steps clusters points where the curve
    is tightly wound; the velocity profile is only a velocity profile if the
    distance covered follows it.
    é   éð   g      @é   r€   rU   r   rX   )râ   r`   r   rª   r…   ru   rÎ   r�   r¦   r§   r¨   r©   rw   rŽ   rŸ   rÃ   r«   r½   r­   r¾   r¬   r®   )rk   rè   rÜ   rÆ   rï   rð   Ún_arcrƒ   r„   ÚlengthÚrawÚlastrr   rë   rœ   ÚpxÚpyrÚ   s                     r   Ú_sample_curverü   \  s¡  € õ �•C˜�S ¤¨S¡Ñ1Ô1°AÑ5Ñ6Ô6Ñ7Ô7€EÝ˜˜uÑ%Ô%�G€BˆØ�ŒW€Fà,.€CÝˆu‰:Œ:˜‰>€DÝ˜5Ñ!Ô!ð !ñ !‰ˆˆ2Ø�Š6ˆ6Ø�JŠJ˜œ T¤[°#Ð6Ñ7Ô7Ð7ØØ�Š9ˆ9Ø�JŠJ˜œ	 4¤9¨bÐ1Ñ2Ô2Ð2ØØ�‰MˆÝ˜t¥\°"°cÝ2=¸dÀAÑ2FÔ2FÈÑ2Oñ&Qô &Qñ Rô R‰ˆˆBà�NŠN˜1ÑÔˆØð 	CØ�$”'˜DœHÑ$ qÑ(¨4¬7°T´YÑ+>ÀÑ+BÑBÑBˆBØ�$”'˜DœHÑ$ qÑ(¨4¬7°T´YÑ+>ÀÑ+BÑBÑBˆBØ�
Š
�B˜˜B�<Ñ Ô Ð Ñ Ø€Jr   rø   ÚNonec                óØ  — t          dt          j        |j        |j        z  ¦  «        ¦  «        }|j        |z  }||j        z  }t          dt          |¦  «        dz
  ¦  «        D �]}||         \  }	}
}t          j	        t          j
        ||z  z  ¦  «        |j        z  }|                      d|¦  «        }|                      d|¦  «        }|                      ¦   «         |j        k     rB||                      d||j        z  ¦  «        z  }||                      d||j        z  ¦  «        z  }||z  }||z  }|	|j        |z  z   |j        |z  z   |
|j        |z  z   |j        |z  z   |f||<   �ŒdS )aM  Two independent components on every interior waypoint, in place.

    LAST among the drawing stages, deliberately: `with_jitter=False` skips only
    this, so both runs share an rng stream up to here and can be differenced
    point by point. That is how the zero-mean property and the tremor
    covariance are measured at all.
    rW   rU   rX   N)r`   rb   Úsqrtrª   rA   r?   r@   rv   ru   rÂ   rc   rD   rÊ   r]   rB   rC   r«   r­   r¬   r®   )rÄ   rø   rÆ   rÇ   rÜ   ÚgainÚ	across_pxÚalong_pxrr   rú   rû   rë   rÚ   Úa_offÚc_offs                  r   Ú_apply_tremorr  }  sl  € õ ˆs•D”I˜dœi¨"Ô*;Ñ;Ñ<Ô<Ñ=Ô=€DØÔ# dÑ*€IØ˜2œ?Ñ*€HÝ�1•c˜#‘h”h ‘lÑ#Ô#ð >ñ >ˆØ˜”V‰
ˆˆB�ÝŒH•T”W  X¡Ñ.Ñ/Ô/°2´?ÑBˆØ—	’	˜#˜xÑ(Ô(ˆØ—	’	˜#˜yÑ)Ô)ˆØ�:Š:‰<Œ<˜"Ô+Ò+Ð+Ø�S—Y’Y˜s H¨rÔ/CÑ$CÑDÔDÑDˆEØ�S—Y’Y˜s I°Ô0DÑ$DÑEÔEÑEˆEØ�‰
ˆØ�‰
ˆØ�t”w ‘Ñ&¨¬°5©Ñ8Ø�t”w ‘Ñ&¨¬°5©Ñ8¸"ð>ˆˆA‰‰ð>ð >r   úlist[Waypoint]c           	     ó&  — g }g }d}d}t          |¦  «        D ]ø\  }\  }}	}
t          |¦  «        t          |	¦  «        f}|t          |¦  «        dz
  k    }|rx||d         k    rl|dz  }||j        k    r|                      ¦   «         |j        k     s>|sŒ{|                     ¦   «          |                     ¦   «          |r|d         j        nd}d}nd}|                     t          ||	|
|z
  |
¦  «        ¦  «         |                     |¦  «         |
}Œù|S )az  Bounded runs of repeated device pixels.

    Keeping a repeat sometimes is the point (see the module docstring); what
    must not happen is the long run of identical tail events a fixed ease-out
    produces, so a run is cut at ``dup_run_max``. The final waypoint always
    carries the exact endpoint, whether it repeats a pixel or replaces the
    point that would have.
    rX   r   rU   r€   )
rÎ   rá   ru   rM   r]   rL   rä   r£   r�   r   )rÄ   rø   rÇ   r™   ÚkeysÚprev_tÚrunrr   rú   rû   rë   Úkeyrù   s                r   Ú_collapse_duplicate_pixelsr  —  s%  € ð €CØ"$€DØ€FØ
€CÝ$ S™>œ>ð ð ‰ˆ‰<ˆB��BÝ�R‰yŒy�% ™)œ)Ð$ˆØ•C˜‘H”H˜q‘LÒ ˆØð 	�C˜4 œ8’O�OØ�1‰HˆCØ˜2œ>Ò)Ð)¨c¯jªj©l¬l¸R¼]Ò.JÐ.JØð Øà—’‘	”	�	Ø—’‘
”
�
Ø),Ð5˜˜Rœœ˜°#�Ø�øàˆCØ�
Š
•8˜B  B¨¡K°Ñ4Ô4Ñ5Ô5Ð5Ø�Š�CÑÔÐØˆˆØ€Jr   )Úwith_jitterrÕ   r¦   r§   r¨   r©   r  Úboolc               óþ  — t          j        ||z
  ||z
  ¦  «        t          k     s@t          |¦  «        t          |¦  «        k    rMt          |¦  «        t          |¦  «        k    r-t	          t          |¦  «        t          |¦  «        dd¦  «        gS t                               ||||¦  «        }t          | ||¦  «        }	t          | |||¦  «        }
t          | |
|¦  «        }|                      |j        |j        ¦  «        }t          |||                      |j        |j        ¦  «        z  ¦  «        }t#          | ||¦  «        }t%          |	||
|||¦  «        }|rt'          | ||||
¦  «         t)          | ||¦  «        S )aq  Build one path, as a pipeline of the stages above.

    ``rng`` supplies every per-movement draw, and the stage order is the draw
    order - see the note above the stages before reordering anything.

    ``with_jitter=False`` returns the same path with the tremor switched off
    and nothing else changed: same control polygon, same schedule, same
    overshoot.
    rX   )rb   r‚   r‰   rá   r   r    r¥   r´   rÔ   rÝ   rì   r_   r;   r<   rš   r=   r>   rî   rü   r  r  )rÄ   r¦   r§   r¨   r©   rÇ   r  rÕ   rÆ   rk   rÜ   rè   Úease_arï   rð   rø   s                   r   Ú_planr  »  sT  € õ, 	Œ
�4˜&‘= $¨¡-Ñ0Ô0µ4Ò7Ð7Ý�f‘”¥ t¡¤Ò,Ð,µ°v±´Å%ÈÁ+Ä+Ò1MÐ1MÝ�˜t™œ¥e¨D¡k¤k°3¸Ñ<Ô<Ð=Ð=å�=Š=˜ ¨¨tÑ4Ô4€Då˜C  rÑ*Ô*€DÝ! # t¨R°Ñ:Ô:€HÝ˜#˜x¨Ñ,Ô,€EØ�[Š[˜œ r¤|Ñ4Ô4€FÝ˜& &¨3¯;ª;°r´|ÀRÄ\Ñ+RÔ+RÑ"RÑSÔS€DÝ˜3  bÑ)Ô)€Då
˜˜e X¨t°T¸4Ñ
@Ô
@€CØð 4Ý�c˜3  b¨(Ñ3Ô3Ð3Ý% c¨3°Ñ3Ô3Ð3r   c                  ó„   — e Zd ZdZdZddœdd„Zedd„¦   «         Zedd„¦   «         Zedd„¦   «         Z	d d„Z
dddœd!d„ZdS )"r   aZ  Per-session cursor path generator.

    ``CursorMotion(seed)`` fixes the session's shape family; each call to
    :meth:`path` draws one movement from it. The n-th movement of a given seed
    is always the same path, and each movement has its own independent PRNG
    stream, so inserting or removing a movement does not perturb the others.
    )Ú_seedÚ_styleÚ_countN)Ústyler   r   r  úMotionStyle | Noner   rý   c               óv   — t          |¦  «        | _        |�|nt          | j        ¦  «        | _        d| _        d S )Nr   )r   r  r	   r  r  )r¸   r   r  s      r   Ú__init__zCursorMotion.__init__ï  s4   € Ý˜‘Y”YˆŒ
Ø$Ð0�e�eµnÀTÄZÑ6PÔ6PˆŒØˆŒˆˆr   c                ó   — | j         S r$   )r  ©r¸   s    r   r   zCursorMotion.seedô  s
   € àŒzÐr   r   c                ó   — | j         S r$   )r  r  s    r   r  zCursorMotion.styleø  s
   € àŒ{Ðr   c                ó   — | j         S )z8How many movements have been generated on this instance.©r  r  s    r   ÚcountzCursorMotion.countü  s   € ð Œ{Ðr   c                ó   — d| _         dS )z?Rewind the movement counter (a fresh page/context starts over).r   Nr  r  s    r   ÚresetzCursorMotion.reset  s   € àˆŒˆˆr   )ÚindexrÕ   r¦   r    r§   r¨   r©   r"  ú
int | NonerÕ   rÖ   r  c          	     óØ   — |€| j         }| xj         dz  c_         t          j        t          | j        dt          |¦  «        z  ¦  «        ¦  «        }t          |||||| j        |¬¦  «        S )zäWaypoints from (from_x, from_y) to (to_x, to_y), inclusive of both.

        Pass ``index`` to address a specific movement of the session without
        advancing the counter (used by the tests; also handy for replay).
        NrU   zmotion:move:%d)rÕ   )r  r]   r^   r   r  r   r  r  )r¸   r¦   r§   r¨   r©   r"  rÕ   rÄ   s           r   ÚpathzCursorMotion.path  so   € ð ˆ=Ø”KˆEØˆKŒK˜1ÑˆKŒKÝŒm�D ¤Ð-=ÅÀEÁ
Ä
Ñ-JÑKÔKÑLÔLˆÝ�S˜& &¨$°°d´kØ&ð(ñ (ô (ð 	(r   )r   r   r  r  r   rý   )r   r   )r   r   )r   rý   )r¦   r    r§   r    r¨   r    r©   r    r"  r#  rÕ   rÖ   r   r  )rO   rP   rQ   rR   Ú	__slots__r  Úpropertyr   r  r  r!  r%  r%   r   r   r   r   ä  sà   € € € € € ðð ð .€IàAEð ð ð ð ð ð ð
 ðð ð ñ „Xðð ðð ð ñ „Xðð ðð ð ñ „Xððð ð ð ð !Ø!%ð(ð (ð (ð (ð (ð (ð (ð (r   r   r%  c                ó$   — | r| d         j         ndS )z2Wall time the whole movement is scheduled to take.r€   rX   )r£   )r%  s    r   Útotal_msr)    s   € à Ð)ˆ4�Œ8Œ=ˆ= cÐ)r   )r   r   r   r   r   r   )r   r    r!   r    r"   r    r   r    )r   r   r   r   )rk   rl   rm   r    r   rn   )rk   rl   rx   r   r   ry   )rƒ   r†   r„   r†   r‡   r    r   r    )r�   )r�   r    r‘   r    rx   r   r   r†   )r›   r†   rœ   r    r   r    )rÄ   rÅ   rÆ   r¥   rÇ   r   r   rl   )
rÄ   rÅ   rÆ   r¥   rÇ   r   rÕ   rÖ   r   r    )rÄ   rÅ   rÜ   r    rÇ   r   r   r†   )rÄ   rÅ   rÆ   r¥   rÇ   r   r   r¼   )rk   rl   rè   r†   rÜ   r    rÆ   r¥   rï   r†   rð   r¼   r   rñ   )rÄ   rÅ   rø   rñ   rÆ   r¥   rÇ   r   rÜ   r    r   rý   )rÄ   rÅ   rø   rñ   rÇ   r   r   r  )rÄ   rÅ   r¦   r    r§   r    r¨   r    r©   r    rÇ   r   r  r  rÕ   rÖ   r   r  )r%  r  r   r    )&rR   Ú
__future__r   rb   r]   Úbisectr   Údataclassesr   Ú__all__r
   r   r   r   r   r‰   r   r&   r   r	   rw   r…   rŽ   rš   rŸ   r   r¥   r¼   rÔ   rÝ   rì   rî   rü   r  r  r  r   r)  r%   r   r   ú<module>r.     s\  ðð@ð @ðD #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !ð
ð 
ð 
€ð" €	Ø€	Ø€Ø€ð
 €ð €ð
ð 
ð 
ð 
ð3ð 3ð 3ð 3ð €�$ÐÑÔðuð uð uð uð uñ uô uñ ÔðuðpGð Gð Gð GðZð ð ð ð	ð 	ð 	ð 	ð/ð /ð /ð /ð ð ð ð ð ð(
:ð 
:ð 
:ð 
:ð  €�$ÐÑÔðð ð ð ð ñ ô ñ Ôðð €�$ÐÑÔðBð Bð Bð Bð Bñ Bô Bñ ÔðBð@ €�$ÐÑÔðQð Qð Qð Qð Qñ Qô Qñ ÔðQðJ%ð %ð %ð %ðP>ð >ð >ð >ð(*ð *ð *ð *ðZ	+ð 	+ð 	+ð 	+ðð ð ð ðB>ð >ð >ð >ð4!ð !ð !ð !ðX Ø!ð&4ð &4ð &4ð &4ð &4ð &4ðR5(ð 5(ð 5(ð 5(ð 5(ñ 5(ô 5(ð 5(ðp*ð *ð *ð *ð *ð *r   