§
    ›Ç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m	Z	m
Z
mZ ddlmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZmZ ddlmZmZ ddlmZ  ddl!m"Z"m#Z# ej$        Z$ej%        Z& G d„ dej'        ¦  «        Z(dS )z2Sync Playwright launcher for invisible_playwright.é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚOptionalÚUnion)ÚBrowserÚBrowserContextÚ
PlaywrightÚsync_playwrighté   )Ú_session)Úresolve_cursor_engine)ÚProfileÚgenerate_profile)ÚSessionLocaleÚpersona_cookiesÚprepare_session_geo)Úassert_wire_versionÚresolve_executable)Úconfigure_proxy)ÚSessionTokenÚ	guard_forc                  ór   — e Zd ZdZ	 d0dddddddddddddœd1d!„Zd2d#„Zd3d%„Zd&Zd'Zd4d(„Z	d5d+„Z
d6d.„Zd4d/„ZdS )7ÚInvisiblePlaywrightuV  Context manager launching a patched Firefox with a deterministic profile.

    Usage:

        from invisible_playwright import InvisiblePlaywright

        # random seed (different fingerprint each call)
        with InvisiblePlaywright() as browser:
            page = browser.new_page()
            page.goto("https://example.com")

        # explicit seed â†’ same profile every time
        with InvisiblePlaywright(seed=42) as browser:
            ...

        # human-like cursor motion, on by default: the ordinary Playwright
        # pointer calls move the cursor along a path drawn from `seed`
        with InvisiblePlaywright(humanize=True) as browser:
            page = browser.new_page()
            page.click("#submit")   # the pointer travels there, it does not jump

    Optional ``pin`` forces specific fingerprint fields while the rest still
    varies with ``seed``::

        with InvisiblePlaywright(seed=42, pin={"screen.width": 2560}) as browser:
            ...

    After construction, the chosen seed is available as ``self.seed`` - useful
    to reproduce a random run later.
    NFTÚautoÚ )ÚpinÚheadlessÚproxyÚ
extra_argsÚhumanizeÚlocaleÚtimezoneÚextra_prefsÚbinary_pathÚprofile_dirÚprep_recaptchaÚshow_cursorÚseedúOptional[int]r   úOptional[Dict[str, Any]]r   Úboolr    úOptional[Dict[str, str]]r!   úOptional[list[str]]r"   úUnion[bool, float]r#   Ústrr$   r%   r&   úOptional[str]r'   úOptional[Union[str, Path]]r(   r)   úOptional[bool]ÚreturnÚNonec               óÂ  — |�t          |¦  «        nt          j        d¦  «        | _        || _        || _        || _        t          |pg ¦  «        | _        || _	        t          |¦  «        | _        |€dnt          |¦  «        | _        || _        d| _        || _        |	| _        |
| _        |rt'          |¦  «        nd| _        t          |¦  «        o| j        du | _        t-          | j        | j        ¬¦  «        | _        d| _        d| _        d| _        d| _        t9          ¦   «         | _        t=          ¦   «         | _        d| _         d| _!        d| _"        d| _#        dS )uŽ  
        Args:
            seed: Integer seed driving the Bayesian fingerprint sampler.
                Same seed â†’ same fingerprint. ``None`` = fresh random.
            pin: Force specific fingerprint fields (see docs/pinning.md).
            headless: When ``True``, browser renders on a hidden virtual
                display (Xvfb on Linux, ``CreateDesktop`` on Windows) so
                Firefox stays in *headed* mode (real rendering pipeline,
                coherent fingerprint) without showing windows.
            proxy: ``{"server": "...", "username": "...", "password": "..."}``.
                ``socks5://`` / ``socks4://`` go through the patched
                ``nsProtocolProxyService``; ``http(s)://`` go through
                Playwright's own ``proxy=`` kwarg.
            extra_args: Extra command-line args forwarded to Firefox.
            humanize: Move the pointer along a curved, paced path instead of
                teleporting it. Applies to ``page.click`` / ``page.hover`` /
                ``locator.click`` / ``page.mouse.move`` and the rest of the
                ordinary Playwright pointer API - there is nothing new to
                call. Default ``True`` (~1.5 s cap per movement); ``False``
                disables; a float caps a movement in seconds. The path is
                drawn from ``seed``, so the same seed replays the same motion.
                Set ``INVPW_CURSOR_ENGINE=binary`` to go back to letting the
                browser draw it, or ``=off`` to disable motion process-wide.
            locale: BCP-47 tag (e.g. ``"en-US"``) or ``"auto"`` (default).
                ``"auto"`` derives the locale from the egress country - the proxy
                egress IP, or the host's public IP without a proxy - exactly like
                ``timezone="auto"``, keeping the browser language consistent with the
                exit country (a French proxy â†’ ``fr``). invisible_core makes the
                decision (``prepare_session_geo``) and turns the tag into the
                language list Firefox's own table gives it; every value reads
                that list: ``navigator.language``/``languages``, the locale
                prefs, the default context's locale and the q-valued
                ``Accept-Language`` header. A region with no Firefox build of
                its own reports the list's first entry everywhere (an
                Australian egress gives ``en-US, en``, so ``en-US``).
            timezone: IANA zone (e.g. ``"America/New_York"``) - used as-is
                when set, the only way to force a specific zone. ``""``
                (default) or ``"auto"`` ALWAYS resolves from the egress IP:
                through the proxy when one is set, otherwise from the host's
                own public IP (one lookup + an offline mmdb). On failure: with
                a proxy it raises (a foreign proxy on the host TZ is the
                ``timezone_mismatch`` signal); without a proxy it falls back to
                the host TZ so a transient lookup failure can't break launch.
            extra_prefs: Optional dict of Firefox prefs overlayed on top
                of the generated profile - useful for niche tweaks
                without monkey-patching the package.
            profile_dir: Path to a persistent Firefox profile directory.
                When set, the session uses ``launch_persistent_context()``
                so cookies, localStorage, sessionStorage, extensions, cache
                and prefs are kept on disk between runs. ``__enter__``
                returns a ``BrowserContext`` (not a ``Browser``) - use it
                directly: ``with InvisiblePlaywright(profile_dir=p) as ctx:
                page = ctx.new_page()``. First run creates the dir;
                subsequent runs reuse it. Pair with a stable ``seed=`` to
                also pin the fingerprint identity across runs.
            show_cursor: Draw the pointer where the automation is, so a
                person watching the screen can follow the session - the
                Windows arrow, with the package logo's green halo around it.
                Default ``None``, meaning "not specified": the value is
                decided once, by ``invisible_core.prefs.DEFAULT_SHOW_CURSOR``,
                and today that is on. Pass ``False`` to draw nothing. What
                makes it safe either way is that it is drawn in the BROWSER'S
                OWN chrome window, which the page
                cannot reach - it is absent from ``page.screenshot()``,
                invisible to ``document.elementFromPoint``, and not a DOM
                node any site can enumerate. So it changes nothing a
                detector sees, and everything a PERSON sees: a dot gliding
                across a window with nobody touching the mouse reads as
                "this is a bot" to anyone glancing at the monitor. It is a
                demo and debugging switch, not a stealth one.
        Né   )r   g        r   )$ÚintÚsecretsÚrandbitsr*   Ú_pinÚ	_headlessÚ_proxyÚlistÚ_extra_argsÚ	_humanizer   Ú_cursor_enginer-   Ú_show_cursorÚ_locale_requestedÚ_localeÚ	_timezoneÚ_extra_prefsÚ_binary_pathr   Ú_profile_dirÚ_prep_recaptchar   Ú_profileÚ_pwÚ_browserÚ_persistent_contextÚ_virtual_displayr   Ú_session_tokenr   Ú_lifetime_guardÚ_webrtc_egress_ipÚ_srflx_declaredÚ_ultimo_controllo_uscitaÚ_uscite_non_misurabili)Úselfr*   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   s                 úNC:\Projects\Historical\venv\Lib\site-packages\invisible_playwright/launcher.pyÚ__init__zInvisiblePlaywright.__init___   sj  € ð| '+Ð&6�˜T™œ˜½GÔ<LÈRÑ<PÔ<PˆŒ	ØˆŒ	Ø!ˆŒØˆŒÝ 
Ð 0¨bÑ1Ô1ˆÔØ!ˆŒõ
 4°HÑ=Ô=ˆÔð &1Ð%8˜T˜TÝ"& {Ñ"3Ô"3ð 	Ôð
 "(ˆÔØ04ˆŒØ!ˆŒØ'ˆÔØ'ˆÔØALÐ,V­D°Ñ,=Ô,=Ð,=ÐRVˆÔõ  $ NÑ3Ô3ÐQ¸Ô8IÈTÐ8QˆÔõ "2°$´)ÀÄÐ!KÑ!KÔ!KˆŒØ)-ˆŒØ+/ˆŒØ=AˆÔ Ø%)ˆÔõ
 +™nœnˆÔÝ(™{œ{ˆÔð 15ˆÔð /3ˆÔð
 03ˆÔ%ð ,-ˆÔ#Ð#Ð#ó    úUnion[Browser, BrowserContext]c                óî  — t          | j        | j        | j        ¦  «        }|j        | _        |j        | _        |j        | _        | 	                    ¦   «         | _
        t          | j        ¦  «        }|                      ¦   «         }|                      ¦   «         }t          | j        |¦  «        }t!          j        ¦   «         | _        |                      |¦  «        }	 t)          ¦   «                              ¦   «         | _        | j        �«| j                             dd¬¦  «          | j        j        j        dt7          | j        ¦  «        t7          |¦  «        |||| j        |dœ|                      ¦   «         ¤Ž| _        |                      ¦   «          |                       | j        ¦  «         | j        S | j        j         !                    t7          |¦  «        |||| j        |¬¦  «        | _"        tG          | j"        ¦  «         |                      ¦   «          n## tH          $ r |  %                    ¦   «          ‚ w xY w|  &                    | j"        ¦  «         |                       | j"        ¦  «         | j"        S )NT)ÚparentsÚexist_ok)Úuser_data_dirÚexecutable_pathr   Úfirefox_user_prefsr    ÚargsÚenv)r_   r   r`   r    ra   rb   © )'r   rF   r>   rD   r$   r#   rE   Ú	egress_iprR   Úsrflx_to_declarerS   r   rH   Ú_resolve_headlessÚ_build_prefsÚ_configure_proxy_sharedr   ÚmintrP   Ú
_build_envr   ÚstartrL   rI   ÚmkdirÚfirefoxÚlaunch_persistent_contextr1   r@   Ú_persistent_context_kwargsrN   Ú_bind_process_treeÚ_arm_cursor_engineÚlaunchrM   r   ÚBaseExceptionÚ	_teardownÚ_patch_new_context_defaults)rV   Ú_geoÚ
executableÚpw_headlessÚprefsÚplaywright_proxyrb   s          rW   Ú	__enter__zInvisiblePlaywright.__enter__  sa  € õ # 4¤>°4´;ÀÔ@VÑWÔWˆØœˆŒØ”{ˆŒØ!%¤ˆÔð  $×4Ò4Ñ6Ô6ˆÔõ (¨Ô(9Ñ:Ô:ˆ
ð ×,Ò,Ñ.Ô.ˆØ×!Ò!Ñ#Ô#ˆÝ2°4´;ÀÑFÔFÐÝ*Ô/Ñ1Ô1ˆÔØ�oŠo˜eÑ$Ô$ˆðY	Ý&Ñ(Ô(×.Ò.Ñ0Ô0ˆDŒHØÔ Ð,ðl Ô!×'Ò'°¸tÐ'ÑDÔDÐDØ+U¨4¬8Ô+;Ô+Uð 	,Ý"% dÔ&7Ñ"8Ô"8Ý$'¨
¡O¤OØ(Ø',Ø*ØÔ)Øð	,ð 	,ð ×5Ò5Ñ7Ô7ð	,ð 	,�Ô(ð ×'Ò'Ñ)Ô)Ð)Ø×'Ò'¨Ô(@ÑAÔAÐAØÔ/Ð/Ø œHÔ,×3Ò3Ý # J¡¤Ø$Ø#(Ø&ØÔ%Øð 4ñ ô ˆDŒMõ   ¤Ñ.Ô.Ð.Ø×#Ò#Ñ%Ô%Ð%Ð%øÝð 	ð 	ð 	ð �NŠNÑÔÐØð	øøøð 	×(Ò(¨¬Ñ7Ô7Ð7Ø×Ò ¤Ñ.Ô.Ð.ØŒ}Ðs   ÃCH Æ4A$H È H9úDict[str, Any]c                ó*   — |                       ¦   «         S )aï  Context-level kwargs accepted by launch_persistent_context.

        Identical to ``_default_context_kwargs``: viewport / screen / DPR /
        color-scheme / locale / timezone_id. Up to firefox-4 we had to drop
        locale and timezone_id because Playwright's per-realm overrides
        called IDL methods (``docShell.languageOverride``,
        ``docShell.overrideTimezone``) that weren't exposed by our patched
        build, causing launch_persistent_context to hang for 180s. From
        firefox-5 (C7 chiusura), the C++ ``overrideTimezone`` method is
        present and ``languageOverride`` was already there, so the
        per-realm overrides land and the persistent context starts in
        ~20s like the non-persistent path.
        )Ú_default_context_kwargs©rV   s    rW   ro   z.InvisiblePlaywright._persistent_context_kwargs‡  s   € ð ×+Ò+Ñ-Ô-Ð-rY   g      ^@é   c                óÒ  — | j         r| j        sdS t          j        ¦   «         }|| j        z
  | j        k     rdS || _        t          j        | j         | j        ¦  «        \  }}|t          j        k    r t          j	        d| j        ›d|›d�¦  «        ‚|t          j
        k    r>| xj        dz  c_        | j        | j        k    rt          j        d| j        z  ¦  «        ‚dS d| _        dS )a\  Refuses if the egress IP has changed since launch.

        A change mid-session cannot be recovered from: the IP we declare to
        the engine for the srflx was photographed at launch, so from that
        moment the page exits from one address and WebRTC announces
        another - the disagreement detectors look for. Updating it on the
        fly would not help: it would make the WebRTC IP change under the
        site's eyes, which is just as unnatural. If the egress does not
        hold for the session's duration, that proxy is not sticky and is
        not fit for this purpose.
        Nz9the proxy's egress IP changed during the session: it was z at launch, now it is a-  . The WebRTC srflx candidate still declares the first one, so from this moment the page exits from one address and WebRTC announces another - the disagreement detectors look for. This proxy does not hold the session sticky for the required duration: use one that guarantees it, or shorten the session.r   a,  the egress IP was not verifiable for %d checks in a row. It is not drift - the probe did not respond at all - but it is not parity either: from here on the engine would keep declaring an address on every page that nobody confirms anymore. Check that the proxy is reachable, then relaunch the session.r   )r>   rR   ÚtimeÚ	monotonicrT   Ú_INTERVALLO_CONTROLLO_USCITA_Sr   Úegress_ancora_validoÚUSCITA_DERIVATAÚProxyEgressDriftedÚUSCITA_NON_MISURABILErU   Ú_MAX_USCITE_NON_MISURABILIÚProxyEgressNonVerificabile)rV   ÚnowÚoutcomeÚcurrents       rW   Ú_assert_uscita_invariataz,InvisiblePlaywright._assert_uscita_invariata£  s   € ð Œ{ð 	 $Ô"8ð 	ØˆFÝŒnÑÔˆØ�Ô.Ñ.°Ô1TÒTÐTØˆFØ(+ˆÔ%Ý#Ô8ØŒK˜Ô/ñ1ô 1Ñˆ�à•hÔ.Ò.Ð.ÝÔ-Ð-ð Ô)Ð)Ð)¨7¨7¨7ð4ñ	5ô 	5ð 	5ð •hÔ4Ò4Ð4ð Ð'Ô'¨1Ñ,Ð'Ô'ØÔ*¨dÔ.MÒMÐMÝÔ9ð<ð Ô1ñ2ñ3ô 3ð 3ð ˆFØ&'ˆÔ#Ð#Ð#rY   Úbrowserr	   c                óÐ   ‡ ‡‡‡‡‡‡	‡
— |j         Š‰                      ¦   «         Š‰ j        Š‰ j        Š	‰ j        Šˆˆ	fd„Š
ˆˆˆˆ
ˆ fd„}||_         |j        Šˆˆˆˆ
ˆ fd„}||_        dS )a<  Wrap ``browser.new_context`` AND ``browser.new_page`` so their
        defaults derive from the profile (viewport, screen, DPR, color-scheme,
        locale, timezone). Users get a coherent context for free; explicit
        kwargs still override.

        BOTH, because ``new_page`` does not go through the patched
        ``new_context``. Playwright's sync ``Browser.new_page`` forwards to the
        IMPLEMENTATION object, whose own ``new_page`` calls ``self.new_context``
        - itself, the impl - so a wrapper installed on the sync-api object is
        never consulted. Read on the installed Playwright, and it is the call in
        this package's own README and docstring: ``browser.new_page()`` was
        opening a page with Playwright's stock 1280x720 viewport, the host's
        colour scheme and no locale or timezone override, against a fingerprint
        claiming the profile's screen. A viewport that contradicts
        ``screen.width`` is not a missing feature, it is an inconsistency, which
        is the one thing this package exists to avoid.

        Written through the public ``new_page`` rather than by reaching into the
        impl: that keeps Playwright's own ownership wiring (closing the page
        closes the context it owns) instead of reimplementing it against private
        attributes.
        c                ór   •— 	 |                       t          ‰‰¦  «        ¦  «         d S # t          $ r Y d S w xY w©N)Úadd_cookiesr   Ú	Exception)ÚctxÚlocÚprofiles    €€rW   Úseed_cookieszEInvisiblePlaywright._patch_new_context_defaults.<locals>.seed_cookiesó  sL   ø€ ðØ—’¥°¸Ñ =Ô =Ñ>Ô>Ð>Ð>Ð>øÝð ð ð Ø��ðøøøs   ƒ#( ¨
6µ6c                 óÌ   •‡— ‰	                      ¦   «          t          ‰¦  «        }|                     | ¦  «          ‰di |¤Ž}‰r ‰|¦  «         |j        Šˆˆ	fd„}||_        |S )Nc                 ó<   •— ‰                      ¦   «           ‰di | ¤ŽS ©Nrc   )rŽ   )Úkw2Ú_new_page_ctxrV   s    €€rW   Ú_new_page_guardedz[InvisiblePlaywright._patch_new_context_defaults.<locals>.patched.<locals>._new_page_guarded  s+   ø€ Ø×-Ò-Ñ/Ô/Ð/Ø$�}Ð+Ð+ sÐ+Ð+Ð+rY   rc   )rŽ   ÚdictÚupdateÚnew_page)
ÚkwÚmergedr•   rž   r�   ÚdefaultsÚoriginalÚprepr˜   rV   s
       @€€€€€rW   Úpatchedz@InvisiblePlaywright._patch_new_context_defaults.<locals>.patchedü  s•   øø€ Ø×)Ò)Ñ+Ô+Ð+Ý˜(‘^”^ˆFØ�MŠM˜"ÑÔÐØ�(Ð$Ð$˜VÐ$Ð$ˆCØð "Ø�˜SÑ!Ô!Ð!ð$  œLˆMð,ð ,ð ,ð ,ð ,ð ,ð -ˆCŒLØˆJrY   c                 ó°   •— ‰                      ¦   «          t          ‰¦  «        }|                     | ¦  «          ‰di |¤Ž}|j        }‰r ‰|¦  «         |S r›   )rŽ   rŸ   r    Úcontext)	r¢   r£   Úpager•   r¤   Úoriginal_pager¦   r˜   rV   s	       €€€€€rW   Úpatched_pagezEInvisiblePlaywright._patch_new_context_defaults.<locals>.patched_page!  sk   ø€ Ø×)Ò)Ñ+Ô+Ð+Ý˜(‘^”^ˆFØ�MŠM˜"ÑÔÐØ �=Ð*Ð* 6Ð*Ð*ˆDØ”,ˆCØð "Ø�˜SÑ!Ô!Ð!ØˆKrY   N)Únew_contextr~   rJ   rK   rE   r¡   )rV   r�   r§   r¬   r¤   r–   r¥   r«   r¦   r—   r˜   s   `   @@@@@@@rW   ru   z/InvisiblePlaywright._patch_new_context_defaultsÖ  sÖ   øøøøøøøø€ ð. Ô&ˆØ×/Ò/Ñ1Ô1ˆØÔ#ˆØ”-ˆØŒlˆð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ðB &ˆÔàÔ(ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð (ˆÔÐÐrY   Úexcr   c                ó.   — |                       ¦   «          d S r’   )rt   )rV   r®   s     rW   Ú__exit__zInvisiblePlaywright.__exit__.  s   € Ø�ŠÑÔÐÐÐrY   c                óh  — | j         �2	 | j                              ¦   «          n# t          $ r Y nw xY wd | _         | j        �2	 | j                             ¦   «          n# t          $ r Y nw xY wd | _        | j        �2	 | j                             ¦   «          n# t          $ r Y nw xY wd | _        | j        �2	 | j                             ¦   «          n# t          $ r Y nw xY wd | _        | j        rF	 | j         	                    | j        ¦  «         n# t          $ r Y nw xY wt          ¦   «         | _        d S d S r’   )rN   Úcloser”   rM   rL   ÚstoprO   rP   rQ   Úreapr   r   s    rW   rt   zInvisiblePlaywright._teardown1  s™  € ØÔ#Ð/ðØÔ(×.Ò.Ñ0Ô0Ð0Ð0øÝð ð ð Ø�ðøøøà'+ˆDÔ$ØŒ=Ð$ðØ”×#Ò#Ñ%Ô%Ð%Ð%øÝð ð ð Ø�ðøøøà ˆDŒMØŒ8ÐðØ”—’‘”��øÝð ð ð Ø�ðøøøàˆDŒHØÔ Ð,ðØÔ%×*Ò*Ñ,Ô,Ð,Ð,øÝð ð ð Ø�ðøøøà$(ˆDÔ!ð Ôð 	1ðØÔ$×)Ò)¨$Ô*=Ñ>Ô>Ð>Ð>øÝð ð ð Ø�ðøøøå".¡.¤.ˆDÔÐÐð	1ð 	1sT   ‰# £
0¯0ÁA Á
A)Á(A)Á;B Â
B"Â!B"Â4C Ã
CÃCÃ-D Ä
DÄDr’   )r*   r+   r   r,   r   r-   r    r.   r!   r/   r"   r0   r#   r1   r$   r1   r%   r,   r&   r2   r'   r3   r(   r-   r)   r4   r5   r6   )r5   rZ   )r5   r|   )r5   r6   )r�   r	   r5   r6   )r®   r   r5   r6   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rX   r{   ro   r„   r‰   rŽ   ru   r°   rt   rc   rY   rW   r   r   ?   s  € € € € € ðð ðB #ðc-ð )-ØØ*.Ø*.Ø'+ØØØ04Ø%)Ø26Ø$Ø&*ðc-ð c-ð c-ð c-ð c-ð c-ðJð ð ð ðF.ð .ð .ð .ð& &+Ð"ð "#Ðð1(ð 1(ð 1(ð 1(ðfU(ð U(ð U(ð U(ðpð ð ð ð#1ð #1ð #1ð #1ð #1ð #1rY   r   ))r¸   Ú
__future__r   r:   r‚   Úpathlibr   Útypingr   r   r   r   Ú!invisible_playwright._pw.sync_apir	   r
   r   r   r   r   Ú_cursorr   Úinvisible_core._fpforger   r   Úinvisible_corer   r   r   Ú_enginer   r   r   rh   Ú_reaperr   r   Ú_IANA_TO_POSIX_TZÚtz_envÚ_tz_envÚCommonLaunchr   rc   rY   rW   ú<module>rÆ      sy  ðØ 8Ð 8Ø "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -à bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bà Ð Ð Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø EÐ EÐ EÐ EÐ EÐ EØ ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ðT Ô.Ð Ø
Œ/€ðU1ð U1ð U1ð U1ð U1˜(Ô/ñ U1ô U1ð U1ð U1ð U1rY   