§
    ¢”jÝM  ã                   óž  — d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZd dlm	Z	 ej
        ZddddœZ G d„ d	ej        ¦  «        Zd
„ Zdd„Z G d„ de¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d„ de¦  «        Zefd„Zefd„Zedk    r/d dlZ e j         ej        ej        ¬¦  «        j         ¦  «         dS dS )é    N©Úwraps)ÚMappingÚCallable)ÚPercentStylez%(levelname)s: %(message)sz%(message)s)Ú*ÚINFOÚDEBUGc                   ó.   ‡ — e Zd ZdZdˆ fd„	Zˆ fd„Zˆ xZS )ÚLevelFormatteraí  Log formatter with level-specific formatting.

    Formatter class which optionally takes a dict of logging levels to
    format strings, allowing to customise the log records appearance for
    specific levels.


    Attributes:
            fmt: A dictionary mapping logging levels to format strings.
                    The ``*`` key identifies the default format string.
            datefmt: As per py:class:`logging.Formatter`
            style: As per py:class:`logging.Formatter`

    >>> import sys
    >>> handler = logging.StreamHandler(sys.stdout)
    >>> formatter = LevelFormatter(
    ...     fmt={
    ...         '*':     '[%(levelname)s] %(message)s',
    ...         'DEBUG': '%(name)s [%(levelname)s] %(message)s',
    ...         'INFO':  '%(message)s',
    ...     })
    >>> handler.setFormatter(formatter)
    >>> log = logging.getLogger('test')
    >>> log.setLevel(logging.DEBUG)
    >>> log.addHandler(handler)
    >>> log.debug('this uses a custom format string')
    test [DEBUG] this uses a custom format string
    >>> log.info('this also uses a custom format string')
    this also uses a custom format string
    >>> log.warning("this one uses the default format string")
    [WARNING] this one uses the default format string
    Nú%c                 óú  •— |dk    rt          d¦  «        ‚|€t          }t          |t          ¦  «        r|}i }nMt          |t          ¦  «        r&t          |¦  «        }|                     dd ¦  «        }nt          d|z  ¦  «        ‚t          t          | ¦  «         
                    ||¦  «         | j        | _        i | _        |                     ¦   «         D ]#\  }}t          j        |¦  «        }|| j        |<   Œ$d S )Nr   z:only '%' percent style is supported in both python 2 and 3r   z&fmt must be a str or a dict of str: %r)Ú
ValueErrorÚDEFAULT_FORMATSÚ
isinstanceÚstrr   ÚdictÚpopÚ	TypeErrorÚsuperr   Ú__init__Ú_fmtÚdefault_formatÚcustom_formatsÚitemsÚloggingÚ_checkLevel)ÚselfÚfmtÚdatefmtÚstyler   r   ÚlevelÚ	__class__s          €új/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/fontTools/misc/loggingTools.pyr   zLevelFormatter.__init__8   s  ø€ Ø�CŠ<ˆ<ÝØLñô ð ð ˆ;Ý!ˆCÝ�c�3ÑÔð 	LØ ˆNØˆNˆNÝ˜�WÑ%Ô%ð 	LÝ! #™YœYˆNØ+×/Ò/°°TÑ:Ô:ˆNˆNåÐDÀsÑJÑKÔKÐKÝ�n˜dÑ#Ô#×,Ò,¨^¸WÑEÔEÐEØ"œiˆÔØ ˆÔØ(×.Ò.Ñ0Ô0ð 	-ð 	-‰JˆE�3ÝÔ'¨Ñ.Ô.ˆEØ),ˆDÔ Ñ&Ð&ð	-ð 	-ó    c                 ó  •— | j         rR| j                              |j        | j        ¦  «        }| j        |k    r"|| _        t
          rt          |¦  «        | _        t          t          | ¦  «         	                    |¦  «        S ©N)
r   ÚgetÚlevelnor   r   r   Ú_styler   r   Úformat)r   Úrecordr   r#   s      €r$   r+   zLevelFormatter.formatN   st   ø€ ØÔð 	4ØÔ%×)Ò)¨&¬.¸$Ô:MÑNÔNˆCØŒy˜CÒÐØ�”	åð 4Ý".¨sÑ"3Ô"3�D”KÝ•^ TÑ*Ô*×1Ò1°&Ñ9Ô9Ð9r%   )NNr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r+   Ú__classcell__©r#   s   @r$   r   r      sa   ø€ € € € € ðð ðB-ð -ð -ð -ð -ð -ð,:ð :ð :ð :ð :ð :ð :ð :ð :r%   r   c                  óÂ  — |                       dd¦  «        }|€d| v rd| v rt          d¦  «        ‚nd| v sd| v rt          d¦  «        ‚|€q|                       dd¦  «        }|                       dd¦  «        }|rt          j        ||¦  «        }n*|                       dd¦  «        }t          j        |¦  «        }|g}|                       d	d
¦  «        }|rt          |t          ¦  «        rt          j        |¦  «        }t          |j	        ¬¦  «         |                       dd¦  «        }|                       dd¦  «        }|                       dd¦  «        }	t          |||	¦  «        }
|                       dg ¦  «        }|D ]T}|j        €|                     |
¦  «         |j        s|D ]}|                     |¦  «         Œ|                     |¦  «         ŒU|j	        dk    r|                       dd¦  «        |_        |                       dd¦  «        }|�|                     |¦  «         | r9d                     |                      ¦   «         ¦  «        }t          d|z  ¦  «        ‚dS )a–
  A more sophisticated logging system configuation manager.

    This is more or less the same as :py:func:`logging.basicConfig`,
    with some additional options and defaults.

    The default behaviour is to create a ``StreamHandler`` which writes to
    sys.stderr, set a formatter using the ``DEFAULT_FORMATS`` strings, and add
    the handler to the top-level library logger ("fontTools").

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    Args:

            logger: Specifies the logger name or a Logger instance to be
                    configured. (Defaults to "fontTools" logger). Unlike ``basicConfig``,
                    this function can be called multiple times to reconfigure a logger.
                    If the logger or any of its children already exists before the call is
                    made, they will be reset before the new configuration is applied.
            filename: Specifies that a ``FileHandler`` be created, using the
                    specified filename, rather than a ``StreamHandler``.
            filemode: Specifies the mode to open the file, if filename is
                    specified. (If filemode is unspecified, it defaults to ``a``).
            format: Use the specified format string for the handler. This
                    argument also accepts a dictionary of format strings keyed by
                    level name, to allow customising the records appearance for
                    specific levels. The special ``'*'`` key is for 'any other' level.
            datefmt: Use the specified date/time format.
            level: Set the logger level to the specified level.
            stream: Use the specified stream to initialize the StreamHandler. Note
                    that this argument is incompatible with ``filename`` - if both
                    are present, ``stream`` is ignored.
            handlers: If specified, this should be an iterable of already created
                    handlers, which will be added to the logger. Any handler in the
                    list which does not have a formatter assigned will be assigned the
                    formatter created in this function.
            filters: If specified, this should be an iterable of already created
                    filters. If the ``handlers`` do not already have filters assigned,
                    these filters will be added to them.
            propagate: All loggers have a ``propagate`` attribute which determines
                    whether to continue searching for handlers up the logging hierarchy.
                    If not provided, the "propagate" attribute will be set to ``False``.
    ÚhandlersNÚstreamÚfilenamez8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'ÚfilemodeÚaÚloggerÚ	fontTools)Úparentr+   r    r!   r   ÚfiltersÚrootÚ	propagateFr"   z, zUnrecognised argument(s): %s)r   r   r   ÚFileHandlerÚStreamHandlerr   r   Ú	getLoggerÚ_resetExistingLoggersÚnamer   Ú	formatterÚsetFormatterr<   Ú	addFilterÚ
addHandlerr>   ÚsetLevelÚjoinÚkeys)Úkwargsr4   r6   ÚmodeÚhr5   r9   ÚfsÚdfsr!   r   r<   Úfr"   rJ   s                  r$   ÚconfigLoggerrQ   Y   s‘  € ðZ �zŠz˜* dÑ+Ô+€HØÐØ�vÐÐ *°Ð"6Ð"6ÝØMñô ð øð �vÐÐ ¨vÐ!5Ð!5Ýð5ñô ð ð ÐØ—:’:˜j¨$Ñ/Ô/ˆØ�zŠz˜* cÑ*Ô*ˆØð 	.ÝÔ# H¨dÑ3Ô3ˆAˆAà—Z’Z ¨$Ñ/Ô/ˆFÝÔ% fÑ-Ô-ˆAØ�3ˆà�ZŠZ˜ +Ñ.Ô.€FØð +•Z ­Ñ,Ô,ð +åÔ" 6Ñ*Ô*ˆå ¤Ð-Ñ-Ô-Ð-à	�Š�H˜dÑ	#Ô	#€BØ
�*Š*�Y Ñ
%Ô
%€Cà�JŠJ�w Ñ$Ô$€EÝ
˜˜S %Ñ
(Ô
(€CØ�jŠj˜ BÑ'Ô'€GØð ð ˆØŒ;ÐØ�NŠN˜3ÑÔÐØŒyð 	Øð ð �Ø—’˜A‘”��Ø×Ò˜!ÑÔÐÐØ„{�fÒÐà!Ÿ:š: k°5Ñ9Ô9ˆÔà�JŠJ�w Ñ%Ô%€EØÐØ�Š˜ÑÔÐØð @Ø�yŠy˜Ÿš™œÑ'Ô'ˆÝÐ7¸$Ñ>Ñ?Ô?Ð?ð@ð @r%   r=   c                 ó  — t           j        }t          |j        j                             ¦   «         ¦  «        }| dk    r| g|z   }nˆ| |vrdS | |v r~| g}|                     | ¦  «        dz   }| dz   }t          |¦  «        }t          |¦  «        }||k     r:||         d|…         |k    r|                     ||         ¦  «         |dz  }||k     °:|D ]¼}|dk    ru| 	                    t           j
        ¦  «         |j        dd…         D ]}	|                     |	¦  «         Œ|j        dd…         D ]}
|                     |
¦  «         Œd|_        Œ}|j        j        |         }t           j        |_        g |_        g |_        d|_        d|_        Œ½dS )z‰Reset the logger named 'parent' and all its children to their initial
    state, if they already exist in the current configuration.
    r=   Né   ú.FT)r   r=   ÚsortedÚmanagerÚ
loggerDictrJ   ÚindexÚlenÚappendrH   ÚWARNINGr4   ÚremoveHandlerr<   ÚremoveFiltersÚdisabledÚNOTSETr"   r>   )r;   r=   ÚexistingÚloggers_to_resetÚiÚprefixedÚpflenÚnum_existingrC   rM   rP   r9   s               r$   rB   rB   ¼   sÆ  € õ Œ<€Då�d”lÔ-×2Ò2Ñ4Ô4Ñ5Ô5€HØ�ÒÐà"˜8 hÑ.ÐÐØ	�xÐ	Ð	àˆØ	�8Ð	Ð	Ø"˜8Ðà�NŠN˜6Ñ"Ô" QÑ&ˆØ˜C‘<ˆÝ�H‘”ˆÝ˜8‘}”}ˆØ�,ÒÐØ˜Œ{˜6˜E˜6Ô" hÒ.Ð.Ø ×'Ò'¨°¬Ñ4Ô4Ð4Ø�‰FˆAð �,ÒÐð !ð $ð $ˆØ�6Š>ˆ>Ø�MŠM�'œ/Ñ*Ô*Ð*Ø”] 1 1 1Ô%ð &ð &�Ø×"Ò" 1Ñ%Ô%Ð%Ð%Ø”\ ! ! !”_ð &ð &�Ø×"Ò" 1Ñ%Ô%Ð%Ð%Ø!ˆDŒMˆMà”\Ô,¨TÔ2ˆFÝ"œ>ˆFŒLØ ˆFŒOØˆFŒNØ#ˆFÔØ#ˆFŒOˆOð$ð $r%   c                   óž   — e Zd ZU dZ eej        ¦  «        Zeg e	f         e
d<   dZdZdd„Zdd„Zd„ Zd	„ Zd
„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ ZdS )ÚTimeraY  Keeps track of overall time and split/lap times.

    >>> import time
    >>> timer = Timer()
    >>> time.sleep(0.01)
    >>> print("First lap:", timer.split())
    First lap: ...
    >>> time.sleep(0.02)
    >>> print("Second lap:", timer.split())
    Second lap: ...
    >>> print("Overall time:", timer.time())
    Overall time: ...

    Can be used as a context manager inside with-statements.

    >>> with Timer() as t:
    ...     time.sleep(0.01)
    >>> print("%0.3f seconds" % t.elapsed)
    0... seconds

    If initialised with a logger, it can log the elapsed time automatically
    upon exiting the with-statement.

    >>> import logging
    >>> log = logging.getLogger("my-fancy-timer-logger")
    >>> configLogger(logger=log, level="DEBUG", format="%(message)s", stream=sys.stdout)
    >>> with Timer(log, 'do something'):
    ...     time.sleep(0.01)
    Took ... to do something

    The same Timer instance, holding a reference to a logger, can be reused
    in multiple with-statements, optionally with different messages or levels.

    >>> timer = Timer(log)
    >>> with timer():
    ...     time.sleep(0.01)
    elapsed time: ...s
    >>> with timer('redo it', level=logging.INFO):
    ...     time.sleep(0.02)
    Took ... to redo it

    It can also be used as a function decorator to log the time elapsed to run
    the decorated function.

    >>> @timer()
    ... def test1():
    ...    time.sleep(0.01)
    >>> @timer('run test 2', level=logging.INFO)
    ... def test2():
    ...    time.sleep(0.02)
    >>> test1()
    Took ... to run 'test1'
    >>> test2()
    Took ... to run test 2
    Ú_timezelapsed time: %(time).3fszTook %(time).3fs to %(msg)sNc                 óà   — |                       |¦  «         |€8dD ]5}t          ¦   «                              |¦  «        �t          d|z  ¦  «        ‚Œ6|| _        |�|nt
          | _        || _        d S )N)Úmsgr"   z*'%s' can't be specified without a 'logger')ÚresetÚlocalsr(   r   r9   Ú
TIME_LEVELr"   rj   )r   r9   rj   r"   ÚstartÚargs         r$   r   zTimer.__init__#  s|   € Ø�
Š
�5ÑÔÐØˆ>Ø'ð Yð Y�Ý‘8”8—<’< Ñ$Ô$Ð0Ý$Ð%QÐTWÑ%WÑXÔXÐXð 1àˆŒØ#Ð/�U�UµZˆŒ
ØˆŒˆˆr%   c                 ór   — |€|                       ¦   «         | _        n|| _        | j        | _        d| _        dS )z0Reset timer to 'start_time' or the current time.Nç        )rh   rn   ÚlastÚelapsed)r   rn   s     r$   rk   zTimer.reset-  s3   € àˆ=ØŸš™œˆDŒJˆJàˆDŒJØ”JˆŒ	ØˆŒˆˆr%   c                 ó:   — |                       ¦   «         | j        z
  S )z=Return the overall time (in seconds) since the timer started.)rh   rn   ©r   s    r$   Útimez
Timer.time6  s   € à�zŠz‰|Œ|˜dœjÑ(Ð(r%   c                 ód   — |                       ¦   «         }|| j        z
  | _        || _        | j        S )z=Split and return the lap time (in seconds) in between splits.©rh   rr   rs   )r   Úcurrents     r$   ÚsplitzTimer.split:  s,   € à—*’*‘,”,ˆØ ¤Ñ*ˆŒØˆŒ	ØŒ|Ðr%   c                 ó¦   — |s| j         }|                     d¦  «        dk     r| j        ||dœz  }n 	 |d|iz  }n# t          t          f$ r Y nw xY w|S )zÿFormat 'time' value in 'msg' and return formatted string.
        If 'msg' contains a '%(time)' format string, try to use that.
        Otherwise, use the predefined 'default_format'.
        If 'msg' is empty or None, fall back to 'default_msg'.
        z%(time)r   ©rj   rv   rv   )Údefault_msgÚfindr   ÚKeyErrorr   )r   rj   rv   s      r$   Ú
formatTimezTimer.formatTimeA  s�   € ð ð 	#ØÔ"ˆCØ�8Š8�IÑÔ Ò"Ð"ØÔ%°¸TÐ(BÐ(BÑBˆCˆCðØ˜V T˜NÑ*��øÝ�jÐ)ð ð ð Ø�ðøøøàˆ
s   ²: ºAÁAc                 óF   — |                       ¦   «         | _        d| _        | S )zStart a new laprq   rx   ru   s    r$   Ú	__enter__zTimer.__enter__R  s   € à—J’J‘L”LˆŒ	ØˆŒØˆr%   c                 óÐ   — |                       ¦   «         }| j        �|rdS |                      | j        |¦  «        }| j        |dœ}| j                             | j        ||¦  «         dS )zŒEnd the current lap. If timer has a logger, log the time elapsed,
        using the format string in self.msg (or the default one).
        Nr|   )rz   r9   r€   rj   Úlogr"   )r   Úexc_typeÚ	exc_valueÚ	tracebackrv   ÚmessageÚ	msg_partss          r$   Ú__exit__zTimer.__exit__X  sk   € ð �zŠz‰|Œ|ˆØŒ;Ð (Ðð ˆFØ—/’/ $¤(¨DÑ1Ô1ˆð !œH¨dÐ3Ð3ˆ	ØŒ�Š˜œ
 G¨YÑ7Ô7Ð7Ð7Ð7r%   c                 ó6  ‡ ‡— t          |t          ¦  «        r5|Š‰ j        sd‰j        z  ‰ _        t	          ‰¦  «        ˆˆ fd„¦   «         }|S |p|                     d¦  «        }|                     d‰ j        ¦  «        }‰                      ‰ j        ||¦  «        S )aV  If the first argument is a function, return a decorator which runs
        the wrapped function inside Timer's context manager.
        Otherwise, treat the first argument as a 'msg' string and return an updated
        Timer instance, referencing the same logger.
        A 'level' keyword can also be passed to override self.level.
        zrun '%s'c                  óL   •— ‰5   ‰| i |¤Žcd d d ¦  «         S # 1 swxY w Y   d S r'   © )ÚargsÚkwdsÚfuncr   s     €€r$   ÚwrapperzTimer.__call__.<locals>.wrappert  s   ø€ àð /ð /Ø˜4 Ð.¨Ð.Ð.ð/ð /ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /ð /ð /s   „™ rj   r"   )	r   r   rj   r-   r   r(   r"   r#   r9   )r   Úfunc_or_msgrK   r‘   rj   r"   r�   s   `     @r$   Ú__call__zTimer.__call__g  s­   øø€ õ �k¥8Ñ,Ô,ð 	;ØˆDà”8ð 6Ø%¨¬Ñ5�”å�4‰[Œ[ð/ð /ð /ð /ð /ñ Œ[ð/ð ˆNàÐ2 §¢¨EÑ!2Ô!2ˆCØ—J’J˜w¨¬
Ñ3Ô3ˆEØ—>’> $¤+¨s°EÑ:Ô:Ð:r%   c                 ó   — | j         S r'   ©rs   ru   s    r$   Ú	__float__zTimer.__float__  s
   € ØŒ|Ðr%   c                 ó*   — t          | j        ¦  «        S r'   )Úintrs   ru   s    r$   Ú__int__zTimer.__int__‚  s   € Ý�4”<Ñ Ô Ð r%   c                 ó   — d| j         z  S )Nz%.3fr•   ru   s    r$   Ú__str__zTimer.__str__…  s   € Ø˜œÑ$Ð$r%   )NNNNr'   )r-   r.   r/   r0   ÚstaticmethodÚtimeitÚdefault_timerrh   r   ÚfloatÚ__annotations__r}   r   r   rk   rv   rz   r€   r‚   rŠ   r“   r–   r™   r›   r�   r%   r$   rg   rg   å   s  € € € € € € ð6ð 6ðr ". ¨fÔ.BÑ!CÔ!C€Eˆ8�B˜�IÔÐCÐCÑCØ-€KØ2€Nðð ð ð ðð ð ð ð)ð )ð )ðð ð ðð ð ð"ð ð ð8ð 8ð 8ð;ð ;ð ;ð ;ð0ð ð ð!ð !ð !ð%ð %ð %ð %ð %r%   rg   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚChannelsFilteraQ  Provides a hierarchical filter for log entries based on channel names.

    Filters out records emitted from a list of enabled channel names,
    including their children. It works the same as the ``logging.Filter``
    class, but allows the user to specify multiple channel names.

    >>> import sys
    >>> handler = logging.StreamHandler(sys.stdout)
    >>> handler.setFormatter(logging.Formatter("%(message)s"))
    >>> filter = ChannelsFilter("A.B", "C.D")
    >>> handler.addFilter(filter)
    >>> root = logging.getLogger()
    >>> root.addHandler(handler)
    >>> root.setLevel(level=logging.DEBUG)
    >>> logging.getLogger('A.B').debug('this record passes through')
    this record passes through
    >>> logging.getLogger('A.B.C').debug('records from children also pass')
    records from children also pass
    >>> logging.getLogger('C.D').debug('this one as well')
    this one as well
    >>> logging.getLogger('A.B.').debug('also this one')
    also this one
    >>> logging.getLogger('A.F').debug('but this one does not!')
    >>> logging.getLogger('C.DE').debug('neither this one!')
    c                 ó^   — || _         t          |¦  «        | _        d„ |D ¦   «         | _        d S )Nc                 ó.   — i | ]}|t          |¦  «        “ŒS r�   )rY   )Ú.0Úns     r$   ú
<dictcomp>z+ChannelsFilter.__init__.<locals>.<dictcomp>§  s    € Ð1Ð1Ð1 a˜�3˜q™6œ6Ð1Ð1Ð1r%   )ÚnamesrY   ÚnumÚlengths)r   r¨   s     r$   r   zChannelsFilter.__init__¤  s/   € ØˆŒ
Ý�u‘:”:ˆŒØ1Ð1¨5Ð1Ñ1Ô1ˆŒˆˆr%   c                 óÒ   — | j         dk    rdS | j        D ]Q}| j        |         }||j        k    r dS |j                             |d|¦  «        dk    r|j        |         dk    r dS ŒRdS )Nr   TrT   F)r©   r¨   rª   rC   r~   )r   r,   rC   Únlens       r$   ÚfilterzChannelsFilter.filter©  s€   € ØŒ8�qŠ=ˆ=Ø�4Ø”Jð 	ð 	ˆDØ”< Ô%ˆDØ�v”{Ò"Ð"Ø�t�tØ”×!Ò! $¨¨4Ñ0Ô0°AÒ5Ð5¸&¼+ÀdÔ:KÈsÒ:RÐ:RØ�t�tøØˆur%   N)r-   r.   r/   r0   r   r­   r�   r%   r$   r¢   r¢   ‰  s<   € € € € € ðð ð42ð 2ð 2ð
	ð 	ð 	ð 	ð 	r%   r¢   c                   ó8   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zdd„Zˆ xZS )ÚCapturingLogHandlerc                 óÖ   •— t          t          | ¦  «                             |¬¦  «         g | _        t	          |t
          ¦  «        rt          j        |¦  «        | _        d S || _        d S )N)r"   )	r   r¯   r   Úrecordsr   r   r   rA   r9   )r   r9   r"   r#   s      €r$   r   zCapturingLogHandler.__init__¶  s_   ø€ ÝÕ! 4Ñ(Ô(×1Ò1¸Ð1Ñ>Ô>Ð>ØˆŒÝ�f�cÑ"Ô"ð 	!Ý!Ô+¨FÑ3Ô3ˆDŒKˆKˆKà ˆDŒKˆKˆKr%   c                 ó  — | j         j        | _        | j         j        | _        | j         j        | _        | j                              | ¦  «         | j                              | j        ¦  «         d| j         _        d| j         _        | S )NF)	r9   r^   Úoriginal_disabledr"   Úoriginal_levelr>   Úoriginal_propagaterG   rH   ru   s    r$   r‚   zCapturingLogHandler.__enter__¾  sp   € Ø!%¤Ô!5ˆÔØ"œkÔ/ˆÔØ"&¤+Ô"7ˆÔàŒ×Ò˜tÑ$Ô$Ð$ØŒ×Ò˜TœZÑ(Ô(Ð(Ø$ˆŒÔØ %ˆŒÔàˆr%   c                 ó¼   — | j                              | ¦  «         | j                              | j        ¦  «         | j        | j         _        | j        | j         _        | S r'   )r9   r\   rH   r´   r³   r^   rµ   r>   )r   ÚtypeÚvaluer‡   s       r$   rŠ   zCapturingLogHandler.__exit__Ê  sP   € ØŒ×!Ò! $Ñ'Ô'Ð'ØŒ×Ò˜TÔ0Ñ1Ô1Ð1Ø#Ô5ˆŒÔØ $Ô 7ˆŒÔàˆr%   c                 ó:   — | j                              |¦  «         d S r'   )r±   rZ   )r   r,   s     r$   ÚemitzCapturingLogHandler.emitÒ  s   € ØŒ×Ò˜FÑ#Ô#Ð#Ð#Ð#r%   Nc                 ó¾   — dd l }|                     |¦  «        }| j        D ],}|                     |                     ¦   «         ¦  «        r dS Œ-|€d|z  }J |¦   «         ‚)Nr   Tz(Pattern '%s' not found in logger records)ÚreÚcompiler±   ÚsearchÚ
getMessage)r   Úregexprj   r¼   ÚpatternÚrs         r$   ÚassertRegexzCapturingLogHandler.assertRegexÕ  so   € Øˆ	ˆ	ˆ	à—*’*˜VÑ$Ô$ˆØ”ð 	ð 	ˆAØ�~Š~˜aŸlšl™nœnÑ-Ô-ð Ø�t�tðàˆ;Ø<¸vÑEˆCØ�#‰Œˆr%   r'   )	r-   r.   r/   r   r‚   rŠ   rº   rÃ   r1   r2   s   @r$   r¯   r¯   µ  sy   ø€ € € € € ð!ð !ð !ð !ð !ð
ð 
ð 
ðð ð ð$ð $ð $ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r%   r¯   c                   ó(   — e Zd ZdZed„ ¦   «         ZdS )ÚLogMixina2  Mixin class that adds logging functionality to another class.

    You can define a new class that subclasses from ``LogMixin`` as well as
    other base classes through multiple inheritance.
    All instances of that class will have a ``log`` property that returns
    a ``logging.Logger`` named after their respective ``<module>.<class>``.

    For example:

    >>> class BaseClass(object):
    ...     pass
    >>> class MyClass(LogMixin, BaseClass):
    ...     pass
    >>> a = MyClass()
    >>> isinstance(a.log, logging.Logger)
    True
    >>> print(a.log.name)
    fontTools.misc.loggingTools.MyClass
    >>> class AnotherClass(MyClass):
    ...     pass
    >>> b = AnotherClass()
    >>> isinstance(b.log, logging.Logger)
    True
    >>> print(b.log.name)
    fontTools.misc.loggingTools.AnotherClass
    c                 ó¸   — t          | d¦  «        sDd                     | j        j        | j        j        f¦  «        }t          j        |¦  «        | _        | j        S )NÚ_logrT   )ÚhasattrrI   r#   r.   r-   r   rA   rÇ   )r   rC   s     r$   r„   zLogMixin.logý  sN   € å�t˜VÑ$Ô$ð 	0Ø—8’8˜Tœ^Ô6¸¼Ô8OÐPÑQÔQˆDÝÔ)¨$Ñ/Ô/ˆDŒIØŒyÐr%   N)r-   r.   r/   r0   Úpropertyr„   r�   r%   r$   rÅ   rÅ   á  s9   € € € € € ðð ð6 ðð ñ „Xðð ð r%   rÅ   c                 ó>   — t          j        | ›d|›�|d¬¦  «         dS )z:Raise a warning about deprecated function argument 'name'.ú is deprecated; é   ©ÚcategoryÚ
stacklevelN)ÚwarningsÚwarn)rC   rj   rÎ   s      r$   ÚdeprecateArgumentrÒ     s+   € å„M¨D¨D¨D°#°#Ð6ÀÐVWÐXÑXÔXÐXÐXÐXr%   c                 ó   ‡ ‡— ˆˆ fd„}|S )zBDecorator to raise a warning when a deprecated function is called.c                 óB   •‡ — t          ‰ ¦  «        ˆˆ ˆfd„¦   «         }|S )Nc                  óV   •— t          j        ‰j        ›d‰›�‰d¬¦  «          ‰| i |¤ŽS )NrË   é   rÍ   )rÐ   rÑ   r-   )rŽ   rK   rÎ   r�   rj   s     €€€r$   r‘   z5deprecateFunction.<locals>.decorator.<locals>.wrapper  sI   ø€ åŒMØ*.¬-¨-¨-¸¸Ð=Ø!Øðñ ô ð ð
 �4˜Ð( Ð(Ð(Ð(r%   r   )r�   r‘   rÎ   rj   s   ` €€r$   Ú	decoratorz$deprecateFunction.<locals>.decorator  s>   øø€ Ý	ˆt‰Œð	)ð 	)ð 	)ð 	)ð 	)ð 	)ñ 
Œð	)ð ˆr%   r�   )rj   rÎ   r×   s   `` r$   ÚdeprecateFunctionrØ   
  s*   øø€ ð
ð 
ð 
ð 
ð 
ð 
ð Ðr%   Ú__main__)Úoptionflags)r=   )!Úsysr   r�   Ú	functoolsr   Úcollections.abcr   r   rÐ   r   r
   rm   r   Ú	Formatterr   rQ   rB   Úobjectrg   ÚFilterr¢   ÚHandlerr¯   rÅ   ÚUserWarningrÒ   rØ   r-   ÚdoctestÚexitÚtestmodÚELLIPSISÚfailedr�   r%   r$   ú<module>rè      s  ðØ 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø €€€Ø  Ð  Ð  Ð  Ð  Ð  ð Œ]€
ð
 
&ØØðð €ð@:ð @:ð @:ð @:ð @:�WÔ&ñ @:ô @:ð @:ðF`@ð `@ð `@ðF&$ð &$ð &$ð &$ðRa%ð a%ð a%ð a%ð a%ˆFñ a%ô a%ð a%ðH)ð )ð )ð )ð )�W”^ñ )ô )ð )ðX)ð )ð )ð )ð )˜'œ/ñ )ô )ð )ðX!ð !ð !ð !ð !ˆvñ !ô !ð !ðH +6ð Yð Yð Yð Yð
 %0ð ð ð ð ð$ ˆzÒÐØ€N€N€Nà€C„Hˆ_ˆWŒ_¨Ô)9Ð:Ñ:Ô:ÔAÑBÔBÐBÐBÐBð Ðr%   