+
    ¢THi6]  ã                   óÖ  a € R! t10 t ^ RIt^ RIt^ RIt^ RIHt ^ RIHtHt ^ RI	H
t
 ^ RIHtHt ^ RIHt ^ RIHt ^ RIHtHtHt ^ R	IHt . R"Ot]! ^^^$^0^<R
7      tR tR tR#R lt]]3t ]!]"3t#]!! 4       t$] ^ k R$R lt% ! R R4      t&]! RRRRR7      t' ! R R]&4      t(R%R lt)R t* ! R R]4      t+]+! 4       t,R& F  t-],P]                  ]-R]- R24       K  	   ! R R]&4      t/R%R  lt0R# )'é    N)Údefaultdict)ÚHashableÚMutableMapping)Ú	resources)ÚceilÚlog2)Úexc)Úlogger)Ú
getrandstrÚrngÚ
to_unicode)Úmemoized_property)ÚunsafeÚweakÚfairÚstrongÚsecurec                ó`   € \        V 4      P                  pW"P                  V4      ^,           R # )z2return remaining classes in object's MRO after clsN)ÚtypeÚ__mro__Úindex)ÚobjÚclsÚmros   && Ú-/usr/lib/python3/dist-packages/passlib/pwd.pyÚ_superclassesr   %   s*   € ä
ˆs‹)×
Ñ
€CØ�y‰y˜‹~ Õ!Ð#Ð$Ð$ó    c                ó^  €  \        V 4      p\        \        4      pV  F  pW#;;,          ^,          uu&   K  	  Vf   VP	                  4       p\        V4      pMVP	                  4       pV'       g   ^ # \        V4      \        R V 4       4      V,          ,
          #   \         d    Rp Lži ; i)aË  
returns 'rate of self-information' --
i.e. average (per-symbol) entropy of the sequence **source**,
where probability of a given symbol occurring is calculated based on
the number of occurrences within the sequence itself.

if all elements of the source are unique, this should equal ``log(len(source), 2)``.

:arg source:
    iterable containing 0+ symbols
    (e.g. list of strings or ints, string of characters, etc).

:returns:
    float bits of entropy
Nc              3   óD   "  € T F  q\        V4      ,          x € K  	  R # 5i©N)r   )Ú.0Úvalues   & r   Ú	<genexpr>Ú"_self_info_rate.<locals>.<genexpr>L   s   é € ÐD¹V°E¤D¨£K×/Ò/»Vùs   ‚ )ÚlenÚ	TypeErrorr   ÚintÚvaluesÚsumr   )ÚsourceÚsizeÚcountsÚcharr(   s   &    r   Ú_self_info_rater.   +   s“   € ð Ü�6‹{ˆô œÓ€FÛˆØ�˜Õ�ñ à‚|Ø—‘“ˆÜ�6‹{‰à—‘“ˆßÙô �‹:œÑD¹VÓDÓDÀtÕKÕKÐKøô ô àŠðús   ‚B ÂB,Â+B,c                ó|  € V'       d&   \         P                  ! V4      ! \        V 4      4      # \        P                  P                  V 4      '       d   \        V R4      # V P                  R4      w  r#pV'       g   \        RV : 24      h\        P                  ! V4      P                  V4      P                  R4      # )zð
:param asset_path:
    string containing absolute path to file,
    or package-relative path using format
    ``"python.module:relative/file/path"``.

:returns:
    filehandle opened in 'rb' mode
    (unless encoding explicitly specified)
ÚrbÚ:zIasset path must be absolute file path or use 'pkg.name:sub/path' format: )ÚcodecsÚ	getreaderÚ_open_asset_pathÚosÚpathÚisabsÚopenÚ	partitionÚ
ValueErrorr   ÚfilesÚjoinpath)r6   ÚencodingÚpackageÚsepÚsubpaths   &&   r   r4   r4   W   sœ   € ÷ Ü×Ò Ô)Ô*:¸4Ó*@ÓAÐAÜ	‡w�w‡}�}�T×ÒÜ�D˜$ÓÐØ ŸN™N¨3Ó/Ñ€G�'ßÜð2Ø26±ð;ó
ð 	
ô �?Š?˜7Ó#×,Ñ,¨WÓ5×:Ñ:¸4Ó@Ð@r   c                óØ  € \         pRp W9   d   R#  \        V \        4      '       g#   \	        \        V 4      4      \	        V 4      8X  dI   V'       d?   \        P                  ! \        4      ;_uu_ 4        VP                  V 4       RRR4       R# R# \        4       p\        4       pV  F  pWd9   d   TMTP                  V4       K  	  \        V4      p^p\	        V4      V8”  d   ^pRP                  R VRV  4       4      p\	        V4      V8”  d!   VR\	        V4      V,
          ,          ,          p\        RV RV 24      h  \         d    Rp ELAi ; i  + '       g   i     R# ; i)	zŸ
helper for generators --
Throws ValueError if source elements aren't unique.
Error message will display (abbreviated) repr of the duplicates in a string/list
TFNú, c              3   óJ   "  € T F  p\        \        V4      4      x € K  	  R # 5ir    )ÚreprÚstr©r!   Úwords   & r   r#   Ú!_ensure_unique.<locals>.<genexpr>˜   s   é € ÐB±\¨Tœœc $›iŸ˜³\ùs   ‚!#z, ... plus %d othersÚ`z%` cannot contain duplicate elements: )Ú_ensure_unique_cacher&   Ú
isinstanceÚ
_set_typesr%   ÚsetÚ
contextlibÚsuppressÚaddÚsortedÚjoinr:   )	r*   ÚparamÚcacheÚhashableÚseenÚdupsÚelemÚtruncÚdup_reprs	   &&       r   Ú_ensure_uniquer[   w   s:  € ô !€EØ€HðØŒ?Ùð ô �&œ*×%Ò%¬¬S°«[Ó)9¼SÀ»[Ô)HßÜ×$Ò$¤Y×/Õ/ð —	‘	˜&Ô!÷ 0ó ô ‹5€DÜ‹5€DÛˆØ”‰ 4×,Ñ,¨TÖ2ñ ä�$‹<€DØ€EÜ
ˆ4ƒy�5ÔØˆØ�y‰yÑB°T¸&¸5±\ÓBÓB€HÜ
ˆ4ƒy�5ÔØÐ*¬c°$«i¸%Õ.?Õ@Õ@ˆô �q˜˜ÐDÀXÀJÐOÓ
PÐPøô5 ô Ø‹ðú÷ 0Ö/ñ ús   ŠE Á5EÅEÅEÅE)	c                   ó€   a a€ ] tR t^ t oRtRtRt]tRtRV 3R llt	]
R 4       t]
R 4       tR tRR ltR	 tR
tVtV ;t# )ÚSequenceGeneratoraÙ  
Base class used by word & phrase generators.

These objects take a series of options, corresponding
to those of the :func:`generate` function.
They act as callables which can be used to generate a password
or a list of 1+ passwords. They also expose some read-only
informational attributes.

Parameters
----------
:param entropy:
    Optionally specify the amount of entropy the resulting passwords
    should contain (as measured with respect to the generator itself).
    This will be used to auto-calculate the required password size.

:param length:
    Optionally specify the length of password to generate,
    measured as count of whatever symbols the subclass uses (characters or words).
    Note if ``entropy`` requires a larger minimum length,
    that will be used instead.

:param rng:
    Optionally provide a custom RNG source to use.
    Should be an instance of :class:`random.Random`,
    defaults to :class:`random.SystemRandom`.

Attributes
----------
.. autoattribute:: length
.. autoattribute:: symbol_count
.. autoattribute:: entropy_per_symbol
.. autoattribute:: entropy

Subclassing
-----------
Subclasses must implement the ``.__next__()`` method,
and set ``.symbol_count`` before calling base ``__init__`` method.
Nr   c                ó2  <€ V P                   f   Q R4       hVf   Vfh   Vf   V P                  p\        P                  W4      pV^ 8:  d   \	        R4      h\        \        WP                  ,          4      4      pVe   W%8  d   TpWn        V^8  d   \	        R4      hW n        Ve   W0n	        V'       dR   \        V \        4      \        38X  d8   \        RP                  RP                  VP!                  4       4      4      4      h\"        SV `H  ! R/ VB  R # )Nzsubclass must set .symbol_countz!`entropy` must be positive numberz!`length` must be positive integerzUnexpected keyword(s): {}rB   © )Úsymbol_countÚrequested_entropyÚentropy_aliasesÚgetr:   r'   r   Úentropy_per_symbolÚlengthr   r   r]   Úobjectr&   ÚformatrR   ÚkeysÚsuperÚ__init__)ÚselfÚentropyre   r   ÚkwdsÚ
min_lengthÚ	__class__s   &&&&, €r   rj   ÚSequenceGenerator.__init__Õ   s÷   ø€ à× Ñ Ò,ÐOÐ.OÓOÐ,ð Ò &¢.ØŠØ×0Ñ0�Ü%×)Ñ)¨'Ó;ˆGØ˜!Œ|Ü Ð!DÓEÐEÜœT '×,CÑ,CÕ"CÓDÓEˆJØŠ~ Ô!4Ø#�à!(Ôà�AŒ:ÜÐ@ÓAÐAØŒð Š?ØŒH÷ ”M $Ô(9Ó:¼v¸iÔGÜÐ7×>Ñ>¸t¿y¹yÈÏÉËÓ?UÓVÓWÐWÜ‰ÒÑ ˜4Ô r   c                ó,   € \        V P                  4      # )zJ
Average entropy per symbol (assuming all symbols have equal probability)
)r   r`   ©rk   s   &r   rd   Ú$SequenceGenerator.entropy_per_symboló   s   € ô
 �D×%Ñ%Ó&Ð&r   c                ó<   € V P                   V P                  ,          # )a  
Effective entropy of generated passwords.

This value will always be a multiple of :attr:`entropy_per_symbol`.
If entropy is specified in constructor, :attr:`length` will be chosen so
so that this value is the smallest multiple >= :attr:`requested_entropy`.
)re   rd   rr   s   &r   rl   ÚSequenceGenerator.entropyú   s   € ð �{‰{˜T×4Ñ4Õ4Ð4r   c                ó   € \        R4      h)z;main generation function, should create one password/phrasezimplement in subclass)ÚNotImplementedErrorrr   s   &r   Ú__next__ÚSequenceGenerator.__next__  s   € ä!Ð"9Ó:Ð:r   c                óæ   € Vf   \        V 4      # \        V\        4      '       d%   \        V4       Uu. uF  p\        V 4      NK  	  up# V\        J d   V # \
        P                  ! VRR4      hu upi )z>
frontend used by genword() / genphrase() to create passwords
z<None>, int, or <iter>Úreturns)ÚnextrK   r'   ÚrangeÚiterr	   ÚExpectedTypeError)rk   r{   Ú_s   && r   Ú__call__ÚSequenceGenerator.__call__	  sd   € ð Š?Ü˜“:ÐÜ�gœs×#Ò#Ü(-¨g¬Ó7© 1”D˜–J©Ñ7Ð7Ø”d‹?ØˆKÜ×#Ò# GÐ-EÀyÓQÐQùò 8s   ³A.c                ó   € V # r    r_   rr   s   &r   Ú__iter__ÚSequenceGenerator.__iter__  s   € Øˆr   )re   ra   r   ©NNNr    )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__re   ra   r   r`   rj   r   rd   rl   rx   r�   r„   Ú__static_attributes__Ú__classdictcell__Ú__classcell__©ro   Ú__classdict__s   @@r   r]   r]       sj   ù‡ € ñ&ðR €Fð !Ðð €Cð €L÷!ð< ñ'ó ð'ð ñ5ó ð5ò;ô
R÷ò r   r]   zH0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*?/Ú>0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZÚ2234679abcdefghjkmnpqrstuvwxyzACDEFGHJKMNPQRTUVWXYZÚ0123456789abcdef)Úascii_72Úascii_62Úascii_50Úhexc                   óX   a a€ ] tR tRt oRtRtRtR	V 3R llt]R 4       t	R t
RtVtV ;t# )
ÚWordGeneratori&  a®  
Class which generates passwords by randomly choosing from a string of unique characters.

Parameters
----------
:param chars:
    custom character string to draw from.

:param charset:
    predefined charset to draw from.

:param \*\*kwds:
    all other keywords passed to the :class:`SequenceGenerator` parent class.

Attributes
----------
.. autoattribute:: chars
.. autoattribute:: charset
.. autoattribute:: default_charsets
r•   Nc                ó  <€ V'       d   V'       d   \        R 4      hM+V'       g   V P                  pV'       g   Q h\        V,          pW n        \        VRR7      p\	        VRR7       Wn        \        SV `  ! R/ VB  R# )z,`chars` and `charset` are mutually exclusiveÚchars©rS   Nr_   )r&   ÚcharsetÚdefault_charsetsr   r[   r›   ri   rj   )rk   r›   r�   rm   ro   s   &&&,€r   rj   ÚWordGenerator.__init__B  sk   ø€ çßÜÐ NÓOÐOð ÷ ØŸ,™,�ß��wÜ$ WÕ-ˆEØŒÜ˜5¨Ô0ˆÜ�u GÕ,ØŒ
ô 	‰ÒÑ ˜4Ô r   c                ó,   € \        V P                  4      # r    )r%   r›   rr   s   &r   r`   ÚWordGenerator.symbol_countU  ó   € ä�4—:‘:‹Ðr   c                óX   € \        V P                  V P                  V P                  4      # r    )r   r   r›   re   rr   s   &r   rx   ÚWordGenerator.__next__Y  s   € ô ˜$Ÿ(™( D§J¡J°·±Ó<Ð<r   )r›   r�   )NN)r‡   rˆ   r‰   rŠ   r‹   r�   r›   rj   r   r`   rx   rŒ   r�   rŽ   r�   s   @@r   r™   r™   &  s;   ù‡ € ñð, €Gð €E÷!ð& ñó ð÷=ò =r   r™   c                ó0   € \        RRVRV /VB pV! V4      # )aò	  Generate one or more random passwords.

This function uses :mod:`random.SystemRandom` to generate
one or more passwords using various character sets.
The complexity of the password can be specified
by size, or by the desired amount of entropy.

Usage Example::

    >>> # generate a random alphanumeric string with 48 bits of entropy (the default)
    >>> from passlib import pwd
    >>> pwd.genword()
    'DnBHvDjMK6'

    >>> # generate a random hexadecimal string with 52 bits of entropy
    >>> pwd.genword(entropy=52, charset="hex")
    '310f1a7ac793f'

:param entropy:
    Strength of resulting password, measured in 'guessing entropy' bits.
    An appropriate **length** value will be calculated
    based on the requested entropy amount, and the size of the character set.

    This can be a positive integer, or one of the following preset
    strings: ``"weak"`` (24), ``"fair"`` (36),
    ``"strong"`` (48), and ``"secure"`` (56).

    If neither this or **length** is specified, **entropy** will default
    to ``"strong"`` (48).

:param length:
    Size of resulting password, measured in characters.
    If omitted, the size is auto-calculated based on the **entropy** parameter.

    If both **entropy** and **length** are specified,
    the stronger value will be used.

:param returns:
    Controls what this function returns:

    * If ``None`` (the default), this function will generate a single password.
    * If an integer, this function will return a list containing that many passwords.
    * If the ``iter`` constant, will return an iterator that yields passwords.

:param chars:

    Optionally specify custom string of characters to use when randomly
    generating a password. This option cannot be combined with **charset**.

:param charset:

    The predefined character set to draw from (if not specified by **chars**).
    There are currently four presets available:

    * ``"ascii_62"`` (the default) -- all digits and ascii upper & lowercase letters.
      Provides ~5.95 entropy per character.

    * ``"ascii_50"`` -- subset which excludes visually similar characters
      (``1IiLl0Oo5S8B``). Provides ~5.64 entropy per character.

    * ``"ascii_72"`` -- all digits and ascii upper & lowercase letters,
      as well as some punctuation. Provides ~6.17 entropy per character.

    * ``"hex"`` -- Lower case hexadecimal.  Providers 4 bits of entropy per character.

:returns:
    :class:`!str` string containing randomly generated password;
    or list of 1+ passwords if :samp:`returns={int}` is specified.
re   rl   r_   )r™   ©rl   re   r{   rm   Úgens   &&&, r   Úgenwordr¨   _  s&   € ôL Ñ
?˜vÐ
?¨wÐ
?¸$Ñ
?€CÙˆw‹<Ðr   c                ó  € \        V R4      ;_uu_ 4       pR V 4       p\        ;QJ d    . R V 4       F  NK  	  5M! R V 4       4      pRRR4       \        P                  ! R\	        X4      V 4       V#   + '       g   i     L3; i)a  
load wordset from compressed datafile within package data.
file should be utf-8 encoded

:param asset_path:
    string containing  absolute path to wordset file,
    or "python.module:relative/file/path".

:returns:
    tuple of words, as loaded from specified words file.
zutf-8c              3   ó@   "  € T F  qP                  4       x € K  	  R # 5ir    )ÚstriprF   s   & r   r#   Ú _load_wordset.<locals>.<genexpr>·  s   é € Ð+© �z‰z�|ˆ|«ùs   ‚c              3   ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir    r_   rF   s   & r   r#   r¬   ¸  s   é € Ð3¡s˜t«d—d’d£sùs   ‚	�
Nz!loaded %d-element wordset from %r)r4   Útupler
   Údebugr%   )Ú
asset_pathÚfhr§   Úwordss   &   r   Ú_load_wordsetr³   ©  se   € ô 
˜* g×	.Ô	.°"Ù+©Ó+ˆß”Ñ3¡sÓ3—‘Ñ3¡sÓ3Ó3ˆ÷ 
/ô$ ‡L‚LÐ4´c¸%³jÀ*ÔMØ€L÷' 
/×	.ús   •6A6Á6B	c                   óx   a a€ ] tR tRt oRtRtRtV 3R ltR tR t	R t
R t]R	 4       tR
 tR tR tRtVtV ;t# )ÚWordsetDictiÌ  z’
Special mapping used to store dictionary of wordsets.
Different from a regular dict in that some wordsets
may be lazy-loaded from an asset path.
Nc                óD   <€ / V n         / V n        \        SV `  ! V/ VB  R # r    )ÚpathsÚ_loadedri   rj   )rk   Úargsrm   ro   s   &*,€r   rj   ÚWordsetDict.__init__Ù  s#   ø€ ØˆŒ
ØˆŒÜ‰Ò˜$Ð' $Ô'r   c                ó¨   €  V P                   V,          #   \         d     Mi ; iT P                  T,          p\        T4      ;q0P                   T&   T# r    )r¸   ÚKeyErrorr·   r³   )rk   Úkeyr6   r"   s   &&  r   Ú__getitem__ÚWordsetDict.__getitem__Þ  sP   € ð	Ø—<‘< Õ$Ð$øÜô 	Ùð	úà�z‰z˜#�ˆÜ$1°$Ó$7Ð7ˆ—‘˜SÑ!Øˆs   ‚ •#¢#c                ó"   € W P                   V&   R# )z+
set asset path to lazy-load wordset from.
N)r·   )rk   r½   r6   s   &&&r   Úset_pathÚWordsetDict.set_pathç  s   € ð �
‰
�3‹r   c                ó"   € W P                   V&   R # r    )r¸   )rk   r½   r"   s   &&&r   Ú__setitem__ÚWordsetDict.__setitem__í  s   € Ø!�‰�SÓr   c                ó‚   € W9   d,   V P                   V V P                  P                  VR 4       R # V P                  V R # r    )r¸   r·   Úpop©rk   r½   s   &&r   Ú__delitem__ÚWordsetDict.__delitem__ð  s0   € ØŒ;Ø—‘˜SÐ!Ø�J‰J�N‰N˜3 Ö%à—
‘
˜3’r   c                óf   € \        V P                  4      pVP                  V P                  4       V# r    )rM   r¸   Úupdater·   )rk   rh   s   & r   Ú_keysetÚWordsetDict._keyset÷  s%   € ä�4—<‘<Ó ˆØ�‰�D—J‘JÔØˆr   c                ó,   € \        V P                  4      # r    )r~   rÍ   rr   s   &r   r„   ÚWordsetDict.__iter__ý  s   € Ü�D—L‘LÓ!Ð!r   c                ó,   € \        V P                  4      # r    )r%   rÍ   rr   s   &r   Ú__len__ÚWordsetDict.__len__   s   € Ü�4—<‘<Ó Ð r   c                óJ   € WP                   9   ;'       g    WP                  9   # r    ©r¸   r·   rÈ   s   &&r   Ú__contains__ÚWordsetDict.__contains__  s   € Ø—l‘lÑ"×7Ð7 c¯Z©ZÑ&7Ð7r   rÕ   )r‡   rˆ   r‰   rŠ   r‹   r·   r¸   rj   r¾   rÁ   rÄ   rÉ   ÚpropertyrÍ   r„   rÒ   rÖ   rŒ   r�   rŽ   r�   s   @@r   rµ   rµ   Ì  sY   ù‡ € ñð €Eð €Gõ(ò
òò"ò ð ñó ðò
"ò!÷8ò 8r   rµ   zpasslib:_data/wordsets/z.txtc                   ó\   a a€ ] tR tRt oRtRtRtRtR
V 3R llt]	R 4       t
R tR	tVtV ;t# )ÚPhraseGeneratori  a   class which generates passphrases by randomly choosing
from a list of unique words.

:param wordset:
    wordset to draw from.
:param preset:
    name of preset wordlist to use instead of ``wordset``.
:param spaces:
    whether to insert spaces between words in output (defaults to ``True``).
:param \*\*kwds:
    all other keywords passed to the :class:`SequenceGenerator` parent class.

.. autoattribute:: wordset
Úeff_longNÚ c                óX  <€ Ve   Ve   \        R4      hM'Vf   V P                  pV'       g   Q h\        V,          pWn        \        V\        4      '       g   \        V4      p\        VRR7       W n        Vf   V P                  p\        VRR7      pW0n        \        SV `,  ! R/ VB  R # )Nz,`words` and `wordset` are mutually exclusiver²   rœ   r?   r_   )r&   ÚwordsetÚdefault_wordsetsrK   Ú_sequence_typesr®   r[   r²   r?   r   ri   rj   )rk   rÞ   r²   r?   rm   ro   s   &&&&,€r   rj   ÚPhraseGenerator.__init__*  s    ø€ àÒØÒ"ÜÐ NÓOÐOð #ð ŠØŸ,™,�ß��wÜ$ WÕ-ˆEØŒô ˜%¤×1Ò1Ü˜%“LˆEÜ�u GÕ,ØŒ
ð Š;Ø—(‘(ˆCÜ˜ EÔ*ˆØŒô 	‰ÒÑ ˜4Ô r   c                ó,   € \        V P                  4      # r    )r%   r²   rr   s   &r   r`   ÚPhraseGenerator.symbol_countG  r¢   r   c                óx   a € V 3R  l\        S P                  4       4       pS P                  P                  V4      # )c              3   ón   <"  € T F*  pSP                   P                  SP                  4      x € K,  	  R # 5ir    )r   Úchoicer²   )r!   r€   rk   s   & €r   r#   Ú+PhraseGenerator.__next__.<locals>.<genexpr>L  s'   øé € ÐIÑ6H°�—‘—‘ §¡×,Ð,Ó6Hùs   ƒ25)r}   re   r?   rR   )rk   r²   s   f r   rx   ÚPhraseGenerator.__next__K  s)   ø€ ÜI´e¸D¿K¹KÔ6HÓIˆØ�x‰x�}‰}˜UÓ#Ð#r   )r?   r²   rÞ   r†   )r‡   rˆ   r‰   rŠ   r‹   rÞ   r²   r?   rj   r   r`   rx   rŒ   r�   rŽ   r�   s   @@r   rÚ   rÚ     sB   ù‡ € ñð  €Gð €Eð €C÷!ð: ñó ð÷$ò $r   rÚ   c                ó0   € \        RRV RV/VB pV! V4      # )aR  Generate one or more random password / passphrases.

This function uses :mod:`random.SystemRandom` to generate
one or more passwords; it can be configured to generate
alphanumeric passwords, or full english phrases.
The complexity of the password can be specified
by size, or by the desired amount of entropy.

Usage Example::

    >>> # generate random phrase with 48 bits of entropy
    >>> from passlib import pwd
    >>> pwd.genphrase()
    'gangly robbing salt shove'

    >>> # generate a random phrase with 52 bits of entropy
    >>> # using a particular wordset
    >>> pwd.genword(entropy=52, wordset="bip39")
    'wheat dilemma reward rescue diary'

:param entropy:
    Strength of resulting password, measured in 'guessing entropy' bits.
    An appropriate **length** value will be calculated
    based on the requested entropy amount, and the size of the word set.

    This can be a positive integer, or one of the following preset
    strings: ``"weak"`` (24), ``"fair"`` (36),
    ``"strong"`` (48), and ``"secure"`` (56).

    If neither this or **length** is specified, **entropy** will default
    to ``"strong"`` (48).

:param length:
    Length of resulting password, measured in words.
    If omitted, the size is auto-calculated based on the **entropy** parameter.

    If both **entropy** and **length** are specified,
    the stronger value will be used.

:param returns:
    Controls what this function returns:

    * If ``None`` (the default), this function will generate a single password.
    * If an integer, this function will return a list containing that many passwords.
    * If the ``iter`` builtin, will return an iterator that yields passwords.

:param words:

    Optionally specifies a list/set of words to use when randomly generating a passphrase.
    This option cannot be combined with **wordset**.

:param wordset:

    The predefined word set to draw from (if not specified by **words**).
    There are currently four presets available:

    ``"eff_long"`` (the default)

        Wordset containing 7776 english words of ~7 letters.
        Constructed by the EFF, it offers ~12.9 bits of entropy per word.

        This wordset (and the other ``"eff_"`` wordsets)
        were `created by the EFF <https://www.eff.org/deeplinks/2016/07/new-wordlists-random-passphrases>`_
        to aid in generating passwords.  See their announcement page
        for more details about the design & properties of these wordsets.

    ``"eff_short"``

        Wordset containing 1296 english words of ~4.5 letters.
        Constructed by the EFF, it offers ~10.3 bits of entropy per word.

    ``"eff_prefixed"``

        Wordset containing 1296 english words of ~8 letters,
        selected so that they each have a unique 3-character prefix.
        Constructed by the EFF, it offers ~10.3 bits of entropy per word.

    ``"bip39"``

        Wordset of 2048 english words of ~5 letters,
        selected so that they each have a unique 4-character prefix.
        Published as part of Bitcoin's `BIP 39 <https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt>`_,
        this wordset has exactly 11 bits of entropy per word.

        This list offers words that are typically shorter than ``"eff_long"``
        (at the cost of slightly less entropy); and much shorter than
        ``"eff_prefixed"`` (at the cost of a longer unique prefix).

:param sep:
    Optional separator to use when joining words.
    Defaults to ``" "`` (a space), but can be an empty string, a hyphen, etc.

:returns:
    :class:`!str` containing randomly generated passphrase;
    or list of 1+ passphrases if :samp:`returns={int}` is specified.
rl   re   r_   )rÚ   r¦   s   &&&, r   Ú	genphraserê   P  s&   € ôB Ñ
A 'Ð
A°&Ð
A¸DÑ
A€CÙˆw‹<Ðr   c                óV   € V ^8„  d   Qh/ ^ \         9   d   \        \        ,          ;R&   # )é   rJ   )Ú__conditional_annotations__rM   r   )rg   s   "r   Ú__annotate__rî      s   € ‡�÷f ,Ò +”cœ(•mÑ +òg r   )r¨   rž   rê   rß   r    )r*   r†   )rÛ   Ú	eff_shortÚeff_prefixedÚbip39)2rí   r2   rN   r5   Úcollectionsr   Úcollections.abcr   r   Ú	importlibr   Úmathr   r   Úpasslibr	   Úpasslib._loggingr
   Úpasslib.utilsr   r   r   Úpasslib.utils.decorr   Ú__all__Údictrb   r   r.   r4   Úlistr®   rà   rM   Ú	frozensetrL   rJ   r[   r]   rž   r™   r¨   r³   rµ   rß   ÚnamerÁ   rÚ   rê   rî   )rí   s   @r   Ú<module>rÿ      s  øðß €Û Û 	Ý #ß 4Ý ß å Ý #ß 5Ñ 5Ý 1ò€ñ àà	à	ààô€ò%ò!LôXAð2 ˜�-€Ø�9Ð€
ñ '*£eÐ Ó +ô&Q÷Rvñ vñt àWàMàAàô	Ð ô6=Ð%ô 6=ôrGòT ôF98�.ô 98ñ| “=Ð ó ?€DØ×Ñ˜dÐ&=¸d¸VÀ4Ð$HÖIñ ?ô<$Ð'ô <$ö~br   