
    @j){                       g d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZ ej        e          Z dZ!da"dZ#dZ$ej%         G d dej&        j'                              Z(ej%         G d d	                      Z) G d
 d          Z*ej%         G d de*                      Z+ej%         G d d                      Z,ej%         G d de*                      Z-ej%         G d de*                      Z.ej%         G d d                      Z/ej%         G d d                      Z0 G d d          Z1ej%         G d de1                      Z2ej%         G d de2                      Z3ej%         G d de1                      Z4ej%         G d  d!                      Z5ej%         G d" d#e1                      Z6ej%         G d$ d%e1                      Z7ej%         G d& d'                      Z8ej%         G d( d)e1                      Z9ej%         G d* d+e1                      Z:ej%         G d, d-e1                      Z;ej%         G d. d/                      Z<ej%         G d0 d1e1                      Z=ej%         G d2 d3e1                      Z>ej%         G d4 d5e1                      Z?ej%         G d6 d7e1                      Z@ej%         G d8 d9e1                      ZAej%         G d: d;e1                      ZBeCZDeCZEeCZFeCZGej%         G d< d=e1                      ZH G d> d?          ZIej%         G d@ dAeI                      ZJej%         G dB dCeI                      ZKej%         G dD dEeI                      ZLej%         G dF dG                      ZMej%         G dH dIeI                      ZNej%         G dJ dK                      ZOej%         G dL dMeI                      ZPej%         G dN dOeI                      ZQej%         G dP dQeI                      ZRej%         G dR dS                      ZSej%         G dT dU                      ZTej%         G dV dW                      ZUej%         G dX dY                      ZVej%         G dZ d[                      ZWej%         G d\ d]                      ZX G d^ d_ejY                  ZZej%         G d` daej&        j'                              Z[ej%         G db dcej&        j'                              Z\ej%         G dd deej&        j'                              Z]ej%         G df dg                      Z^ej%         G dh di                      Z_ G dj dkejY                  Z`ej%         G dl dmej&        j'                              Zaej%         G dn doej&        j'                              Zb G dp dqejY                  Zc G dr ds          Zd G dt dued          Ze G dv dwej&        jf                  Zg G dx dyejY                  Zh G dz d{ej&        ji                  Zj G d| d}ejY                  Zk G d~ dej          Zl G d del          Zm G d dem          Zn G d del          Zo G d del          Zp G d dejY                  Zq G d dej          Zr G d del          Zs G d dej          Zt G d dej          Zu G d dej          Zvejw        x                    e e)          \  ZyZzdS ))BTweetTextLinkMediumPhotoVideoVariantVideoGifCoordinatesPlaceCardSummaryCardAppCardPollCard
PollOption
PlayerCardPromoConvoCardPromoConvoActionBroadcastCardPeriscopeBroadcastCard	EventCardEventNewsletterCardNewsletterIssueCardAmplifyCardAppPlayerCard
SpacesCardMessageMeCardUnifiedCardUnifiedCardComponentObject UnifiedCardDetailComponentObject UnifiedCardMediumComponentObject%UnifiedCardButtonGroupComponentObjectUnifiedCardButton(UnifiedCardSwipeableMediaComponentObjectUnifiedCardSwipeableMediaMedium"UnifiedCardAppStoreComponentObject,UnifiedCardTwitterListDetailsComponentObject1UnifiedCardTwitterCommunityDetailsComponentObjectUnifiedCardDestinationUnifiedCardAppUnifiedCardSwipeableLayoutSlide UnifiedCardCollectionLayoutSlideVibe	EditStateConversationControlPolicyTweetRef	TombstoneUser	UserLabelUserRefProfileImageShape	CommunityTrendGuestTokenManagerTwitterSearchScraperModeTwitterSearchScraperTwitterUserScraperTwitterProfileScraperTwitterHashtagScraperTwitterCashtagScraperTwitterTweetScraperModeTwitterTweetScraperTwitterListPostsScraperTwitterCommunityScraperTwitterTrendsScraperTwitterUsersScraper    NzmBearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs=1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnAi0*  a\  TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHAc                   l   e Zd ZU eed<   ej        ed<   eed<   eed<   eed<   ej        d         ed<   eed<   eed	<   eed
<   eed<   eed<   eed<   dZ	ej
        e         ed<   dZej
        e         ed<   dZej
        e         ed<   dZej
        ej        d                  ed<   dZej
        ej        d                  ed<   dZej
        d          ed<   dZej
        d          ed<   dZej
        e         ed<   dZej
        d         ed<   dZej
        ej        d                  ed<   dZej
        d         ed<   dZej
        d         ed<   dZej
        ej        e                  ed <   dZej
        ej        e                  ed!<   dZej
        d"         ed#<   dZej
        e         ed$<   dZej
        d%         ed&<   dZej
        e         ed'<   dZej
        e         ed(<   dZej
        d)         ed*<   dZ ej
        d+         ed,<   e!j"        #                    d-d. d/          Z$e!j"        #                    d0d1 d2          Z%e!j"        #                    d3d4 d2          Z&e!j"        #                    d5d6 d7          Z'e!j"        #                    d8d9 d7          Z(e!j"        #                    d:d; d          Z)d< Z*dS )=r   urldate
rawContentrenderedContentid)r1   r3   user
replyCountretweetCount	likeCount
quoteCountconversationIdlangNsource	sourceUrlsourceLabelr   linksr   mediaretweetedTweetquotedTweetinReplyToTweetIdr1   inReplyToUsermentionedUsersr	   coordinatesr
   placehashtagscashtagsr   card	viewCountr,   vibebookmarkCountpinnedr-   	editStater.   conversationControlPolicyusernamec                 .    t          | j        dd           S )Nrg   )getattrrK   selfs    _/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/snscrape/modules/twitter.py<lambda>zTweet.<lambda>   s    wtyZdfjGkGk     zuser.usernameoutlinksc                 6    | j         rd | j         D             ng S )Nc                     g | ]	}|j         
S  rF   .0xs     rl   
<listcomp>z"Tweet.<lambda>.<locals>.<listcomp>   s    GbGbGbRSGbGbGbrn   rU   rj   s    rl   rm   zTweet.<lambda>   s(    fjfpGxGbGbW[WaGbGbGbGbvx rn   zlinks (url attribute)
outlinksssc                 \    | j         r$d                    d | j         D                       ndS )N c              3   $   K   | ]}|j         V  d S Nrs   rt   s     rl   	<genexpr>z!Tweet.<lambda>.<locals>.<genexpr>   s'      SnSn^_TUTYSnSnSnSnSnSnrn    rU   joinrj   s    rl   rm   zTweet.<lambda>   s<    rvr|  LE388SnSncgcmSnSnSnKnKnKn  CE rn   tcooutlinksc                 6    | j         rd | j         D             ng S )Nc                     g | ]	}|j         
S rr   tcourlrt   s     rl   rw   z"Tweet.<lambda>.<locals>.<listcomp>   s    MkMkMk[\ahMkMkMkrn   rx   rj   s    rl   rm   zTweet.<lambda>   s0    osoy  NBMkMk`d`jMkMkMkMk  @B rn   zlinks (tcourl attribute)tcooutlinksssc                 \    | j         r$d                    d | j         D                       ndS )Nr{   c              3   $   K   | ]}|j         V  d S r}   r   rt   s     rl   r~   z!Tweet.<lambda>.<locals>.<genexpr>   s'      YwYwghZ[ZbYwYwYwYwYwYwrn   r   r   rj   s    rl   rm   zTweet.<lambda>   sC    {  |F  RNQTQYQYYwYwlplvYwYwYwQwQwQw  LN rn   contentc                     | j         S r}   )rH   rj   s    rl   rm   zTweet.<lambda>   s    T_ rn   c                     | j         S r}   rs   rj   s    rl   __str__zTweet.__str__   	    	/rn   )+__name__
__module____qualname__str__annotations__datetimeinttypingUnionrR   OptionalrS   rT   rU   ListrV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   boolre   rf   snscrapebase_DeprecatedPropertyrg   ro   ry   r   r   r   r   rr   rn   rl   r   r   h   s        	|%&&&&
 $	$$$#'FOC '''%)foc")))37J/077715H-.555,0)000)-fog&---*.6?3'...*.'...8<V!45<<</3fom,333#' '''/36?6;s+,333/36?6;s+,333!%vv%%%#'FOC '''!%vv%%%'+$+++!%	%%%+/FOK(///KOFO,GHOOOM--j:k:km|}}M--j:x:x  {R  S  Sm//  ?E  ?E  G^  _  _}00  AB  AB  D^  _  _22?  EN  EN  Pj  k  k=,,Y8T8TVbcc    rn   r   c                   ~    e Zd ZU ej        e         ed<   eed<   ej        e         ed<   ej        eef         ed<   dS )r   textrF   r   indicesN)	r   r   r   r   r   r   r   Tupler   rr   rn   rl   r   r      sX         s			
,sCx
      rn   r   c                       e Zd ZdS )r   Nr   r   r   rr   rn   rl   r   r              rn   r   c                   H    e Zd ZU eed<   eed<   dZej        e         ed<   dS )r   
previewUrlfullUrlNaltText)r   r   r   r   r   r   r   r   rr   rn   rl   r   r      s;         
!%&/#
%%%%%rn   r   c                   Z    e Zd ZU eed<   ej        e         ed<   ej        e         ed<   dS )r   rF   contentTypebitrateN)r   r   r   r   r   r   r   r   rr   rn   rl   r   r      sA         	oc""""
/#
rn   r   c                       e Zd ZU eed<   ej        e         ed<   dZej	        e
         ed<   dZej	        e         ed<   dZej	        e         ed<   dS )r   thumbnailUrlvariantsNdurationviewsr   )r   r   r   r   r   r   r   r   r   r   floatr   r   r   rr   rn   rl   r   r      sv         ;|$$$$$(6?5!(((####!%&/#
%%%%%rn   r   c                   ^    e Zd ZU eed<   ej        e         ed<   dZej	        e         ed<   dS )r   r   r   Nr   )
r   r   r   r   r   r   r   r   r   r   rr   rn   rl   r   r      sH         ;|$$$$!%&/#
%%%%%rn   r   c                   $    e Zd ZU eed<   eed<   dS )r	   	longitudelatitudeN)r   r   r   r   r   rr   rn   rl   r	   r	      s%         rn   r	   c                   L    e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   dS )r
   rJ   fullNamenametypecountrycountryCodeNr   r   r   r   r   rr   rn   rl   r
   r
      sK         


rn   r
   c                       e Zd ZdS )r   Nr   rr   rn   rl   r   r      r   rn   r   c                       e Zd ZU eed<   eed<   dZej        e         ed<   dZej        e         ed<   dZ	ej        d         ed<   dZ
ej        d         ed<   dS )	r   titlerF   Ndescriptionr   r1   siteUsercreatorUser)r   r   r   r   r   r   r   r   r   r   r   rr   rn   rl   r   r      s         	%)foc")))&*vs#***%)6?6")))(,fof%,,,,,rn   r   c                       e Zd ZdS )r   Nr   rr   rn   rl   r   r      s        rn   r   c                       e Zd ZU ej        d         ed<   ej        ed<   eed<   eed<   dZ	ej
        ej                 ed<   dZej
        e         ed<   dS )	r   r   optionsendDater   finalResultsNlastUpdateDatemedium)r   r   r   r   r   r   r   r   r   r   r   r   r   rr   rn   rl   r   r      sz         
+l
####

6:!23:::#'	 '''''rn   r   c                   >    e Zd ZU eed<   dZej        e         ed<   dS )r   labelNcount)	r   r   r   r   r   r   r   r   r   rr   rn   rl   r   r      s2         ######rn   r   c                       e Zd ZU eed<   eed<   dZej        e         ed<   dZej        e         ed<   dZ	ej        d         ed<   dS )r   r   rF   Nr   imageUrlr1   r   )
r   r   r   r   r   r   r   r   r   r   rr   rn   rl   r   r      si         	%)foc")))"&6?3&&&%)6?6")))))rn   r   c                       e Zd ZU ej        d         ed<   eed<   eed<   dZej	        e         ed<   dZ
ej	        e         ed<   dZej	        d         ed	<   dS )
r   r   actionsthankYouTextr   NthankYouUrlthankYouTcoUrlr   cover)r   r   r   r   r   r   r   r   r   r   r   r   rr   rn   rl   r   r      s         
+(
))))	%)foc")))(,%,,,#' '''''rn   r   c                   $    e Zd ZU eed<   eed<   dS )r   r   tweetNr   rr   rn   rl   r   r     s"         rn   r   c                       e Zd ZU eed<   eed<   dZej        e         ed<   dZej        e         ed<   dZ	ej        d         ed<   dZ
ej        e         ed<   dZej        e         ed	<   dZej        d         ed
<   dS )r   rJ   rF   Nr   stater1   broadcasterr   rR   r   )r   r   r   r   r   r   r   r   r   r   r   rR   r   rr   rn   rl   r   r     s         	########(,fof%,,,&*vs#*** $	$$$%)6?6")))))rn   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   dZej        e         ed<   dZ	ej        e         ed	<   dZ
ej        d
         ed<   dZej        d
         ed<   dS )r   rJ   rF   r   r   r   totalParticipantsNr   rR   r1   r   r   )r   r   r   r   r   r   r   r   r   rR   r   r   rr   rn   rl   r   r     s         	&*vs#*** $	$$$(,fof%,,,%)6?6")))))rn   r   c                       e Zd ZU ded<   dS )r   r   eventN)r   r   r   r   rr   rn   rl   r   r   '  s         rn   r   c                       e Zd ZU eed<   eed<   eed<   dZej	        e         ed<   dZ
ej	        e         ed<   ed             ZdS )r   rJ   categoryphotoNr   r   c                     d| j          S )Nzhttps://twitter.com/i/events/rJ   rj   s    rl   rF   z	Event.url4  s    	2	2	22rn   )r   r   r   r   r   r   r   r   r   r   r   propertyrF   rr   rn   rl   r   r   ,  sx         ####%)foc")))
3 3 (3 3 3rn   r   c                   f    e Zd ZU eed<   eed<   eed<   eed<   eed<   dZej        e         ed<   dS )r   r   r   rF   revueAccountId
issueCountNr   )	r   r   r   r   r   r   r   r   r   rr   rn   rl   r   r   9  s\         	"&6?3&&&&&rn   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   dZej        e         ed<   dZ	ej        e         ed	<   dS )
r   newsletterTitlenewsletterDescription
issueTitleissueNumberrF   r   NissueDescriptionr   )
r   r   r   r   r   r   r   r   r   r   rr   rn   rl   r   r   C  s         	*.6?3'..."&6?3&&&&&rn   r   c                   $    e Zd ZU eed<   eed<   dS )r   rJ   videoN)r   r   r   r   r   r   rr   rn   rl   r   r   O  s"         rn   r   c                   \    e Zd ZU eed<   eed<   eed<   eed<   dZej	        d         ed<   dS )r   r   r   appCategoryplayerOwnerIdNr1   r   )
r   r   r   r   r   r   r   r   r   r   rr   rn   rl   r   r   U  sS         %)6?6")))))rn   r   c                   $    e Zd ZU eed<   eed<   dS )r   rF   rJ   Nr   rr   rn   rl   r   r   ^  s"         	rn   r   c                   .    e Zd ZU ded<   eed<   eed<   dS )r   r1   	recipientrF   
buttonTextN)r   r   r   r   r   rr   rn   rl   r   r   d  s.         	rn   r   c                      e Zd ZU ej        edf         ed<   ej        edf         ed<   ej        ee	f         ed<   dZ
ej        ej        eej        d         f                  ed<   dZej        ej        e                  ed	<   dZej        ej        d
                  ed<   dZej        ej        d                  ed<   dZej        e         ed<   d ZdS )r   r   componentObjectsr(   destinationsrV   Nr)   apps
componentsr*   swipeableLayoutSlidesr+   collectionLayoutSlidesr   c                 f    | j         d u| j        d uz   | j        d uz   dk    rt          d          d S )N   zXdid not get exactly one of components, swipeableLayoutSlides, and collectionLayoutSlides)r   r   r   
ValueErrorrj   s    rl   __post_init__zUnifiedCard.__post_init__|  sI    
oT!d&@&LMQUQltxQxy}~~~	n	o	oo ~rn   )r   r   r   r   DictUnifiedCardComponentKeyr   UnifiedCardDestinationKeyUnifiedCardMediumKeyr   r   r   UnifiedCardAppKeyr   r   r   r   r   r   r   rr   rn   rl   r   r   q  s        ;68TTUUUU{46NNOOOO(&01111X\vv{#4fkBR6S#STU\\\EIV_V[)@ABIIIZ^4U(VW^^^\`5W)XY```"vs"""p p p p prn   r   c                       e Zd ZdS )r   Nr   rr   rn   rl   r   r     r   rn   r   c                   $    e Zd ZU eed<   eed<   dS )r   r   destinationKeyNr   r   r   r   r   r  rr   rn   rl   r   r     s'         
******rn   r   c                   $    e Zd ZU eed<   eed<   dS )r    	mediumKeyr  Nr   r   r   r  r   r  rr   rn   rl   r    r      *             ******rn   r    c                   0    e Zd ZU ej        d         ed<   dS )r!   r"   buttonsNr   r   r   r   r   r   rr   rn   rl   r!   r!     s&         
+)
******rn   r!   c                   $    e Zd ZU eed<   eed<   dS )r"   r   r  Nr	  rr   rn   rl   r"   r"     s'         
******rn   r"   c                   0    e Zd ZU ej        d         ed<   dS )r#   r$   rV   Nr  rr   rn   rl   r#   r#     s&         5666666rn   r#   c                   $    e Zd ZU eed<   eed<   dS )r$   r  r  Nr  rr   rn   rl   r$   r$     r  rn   r$   c                   $    e Zd ZU eed<   eed<   dS )r%   appKeyr  N)r   r   r   r  r   r  rr   rn   rl   r%   r%     s*         	******rn   r%   c                   B    e Zd ZU eed<   eed<   eed<   ded<   eed<   dS )r&   r   memberCountsubscriberCountr1   rK   r  N)r   r   r   r   r   r   r  rr   rn   rl   r&   r&     sH         
******rn   r&   c                   r    e Zd ZU eed<   eed<   eed<   eed<   dZej	        ej
        d                  ed<   dS )r'   r   thememembersCountr  Nr1   membersFacepile)r   r   r   r   r   r   r  r  r   r   r   rr   rn   rl   r'   r'     sZ         
****9=&/&+f"56=====rn   r'   c                       e Zd ZU dZej        e         ed<   dZej        e	         ed<   dZ
ej        e         ed<   d ZdS )r(   NrF   r  r  c                 L    | j         d u | j        d u k    rt          d          d S )Nz)did not get exactly one of url and appKey)rF   r  r   rj   s    rl   r   z$UnifiedCardDestination.__post_init__  s2    
h$DK4/00	?	@	@@ 10rn   )r   r   r   rF   r   r   r   r   r  r  r  r  r   rr   rn   rl   r(   r(     sq         !foc!!!.2*	+22248FO01888A A A A Arn   r(   c                      e Zd ZU eed<   eed<   eed<   eed<   eed<   dZej        e         ed<   dZej        e         ed<   dZ	ej        e
         ed	<   dZej        e         ed
<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dS )r)   r   rJ   r   r   rF   Nr   r   iconMediumKeysizeinstallsratingAverageratingCountisFreeisEditorsChoicehasInAppPurchaseshasInAppAds)r   r   r   r   r   r   r   r   r   r   r  r!  r   r"  r#  r   r$  r%  r   r&  r'  r(  rr   rn   rl   r)   r)     sA        
	"&6?3&&&%)foc")))8< 45<<<"vs""""&6?3&&&)-&---%)foc")))!%	%%%*.&/$'...,0FOD)000&*fod#*****rn   r)   c                   $    e Zd ZU eed<   eed<   dS )r*   mediumComponentKeycomponentKeyNr   r   r   r  r   rr   rn   rl   r*   r*     s*         ,,,,&&&&&&rn   r*   c                   $    e Zd ZU eed<   eed<   dS )r+   detailsComponentKeyr*  Nr,  rr   rn   rl   r+   r+     s*         ----,,,,,,rn   r+   c                   .    e Zd ZU eed<   eed<   eed<   dS )r,   r   r   imageDescriptionNr   rr   rn   rl   r,   r,     s0         
rn   r,   c                   N    e Zd ZU ej        e         ed<   ej        ed<   eed<   dS )r-   editTweetIdseditableUntilDateeditsRemainingN)r   r   r   r   r   r   r   r   rr   rn   rl   r-   r-     s@         {3%%%%rn   r-   c                   0    e Zd ZdZdZdZed             ZdS )r.   everyone	mentioned	followersc                     || j         S |dk    r| j        S |dk    r| j        S t                              d|           d S )NByInvitationr5   z$Unknown conversation control policy )EVERYONE	MENTIONED	FOLLOWERS_loggerwarning)clspolicys     rl   _from_policyz&ConversationControlPolicy._from_policy  sU    ^
,
-
-	//CCCDDD	rn   N)r   r   r   r;  r<  r=  classmethodrB  rr   rn   rl   r.   r.     s<          +  rn   r.   c                   $    e Zd ZU dZeed<   d ZdS )r/   zkA reference to a tweet for which no proper Tweet object could be produced from the data returned by TwitterrJ   c                     d| j          S Nz!https://twitter.com/i/web/status/r   rj   s    rl   r   zTweetRef.__str__      	6TW	6	66rn   N)r   r   r   __doc__r   r   r   rr   rn   rl   r/   r/   	  s4         rr7 7 7 7 7rn   r/   c                       e Zd ZU dZeed<   dZej        e	         ed<   dZ
ej        ej        e                  ed<   d ZdS )r0   z1A placeholder for a tweet that cannot be accessedrJ   Nr   	textLinksc                     d| j          S rF  r   rj   s    rl   r   zTombstone.__str__  rG  rn   )r   r   r   rH  r   r   r   r   r   r   rJ  r   r   r   rr   rn   rl   r0   r0     si         88"vs"""59FOFK129997 7 7 7 7rn   r0   c                   <   e Zd ZU eed<   eed<   dZej        e         ed<   dZ	ej        e         ed<   dZ
ej        e         ed<   dZej        ej        e                  ed<   dZej        e         ed<   dZej        ej                 ed	<   dZej        e         ed
<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        e         ed<   dZej        d         ed<   dZej        e         ed<   dZej        e         ed<   dZ ej        d         ed<   e!j"        #                    dd d          Z$e!j"        #                    dd d          Z%e!j"        #                    d d! d"          Z&e!j"        #                    d#d$ d          Z'e(d%             Z)d& Z*dS )'r1   rg   rJ   NdisplaynamerawDescriptionrenderedDescriptiondescriptionLinksverifiedcreatedfollowersCountfriendsCountstatusesCountfavouritesCountlistedCount
mediaCountlocation	protectedlinkprofileImageUrlprofileBannerUrlr2   r   blueblueTyper4   profileImageShapedescriptionUrlsc                     | j         S r}   )rP  rj   s    rl   rm   zUser.<lambda>;  s
    UYUj rn   linkUrlc                 ,    | j         r| j         j        nd S r}   )r[  rF   rj   s    rl   rm   zUser.<lambda><  s    VZV_EiTY]]ei rn   zlink.url
linkTcourlc                 ,    | j         r| j         j        nd S r}   )r[  r   rj   s    rl   rm   zUser.<lambda>=  s    _c_hKr49K[K[nr rn   zlink.tcourlr   c                     | j         S r}   )rO  rj   s    rl   rm   zUser.<lambda>>  s	    TMe rn   c                     d| j          S )Nhttps://twitter.com/)rg   rj   s    rl   rF   zUser.url@  s    	/	/	//rn   c                     | j         S r}   rs   rj   s    rl   r   zUser.__str__D  r   rn   )+r   r   r   r   r   r   rM  r   r   rN  rO  rP  r   r   rQ  r   rR  r   rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r   r^  r_  r`  r   r   r   ra  rc  re  r   r   rF   r   rr   rn   rl   r1   r1     s         %)foc")))(,%,,,-1foc*111<@6?6;x#89@@@#'6?4 '''/3&/(+
,333(,%,,,&*vs#***'+$+++)-&/#&---%)foc")))$(V_S!((("&6?3&&&$(FOD!(((#'vx ''')-&/#&---*.6?3'...'+$+++#vt###"&6?3&&&;?FO$78???=445FHjHjl~=,,Y8i8ikuvvm//>r>r  uB  C  C}00@e@eg|}}
0 0 (0    rn   r1   c                       e Zd ZU eed<   dZej        e         ed<   dZej        e         ed<   dZ	ej        e         ed<   dS )r2   r   NrF   badgeUrllongDescription)
r   r   r   r   r   rF   r   r   rl  rm  rr   rn   rl   r2   r2   H  sc         !foc!!!"&6?3&&&)-&/#&-----rn   r2   c                   ~    e Zd ZU eed<   dZej        e         ed<   dZ	ej        ej
        e                  ed<   d ZdS )r3   rJ   Nr   rJ  c                     d| j          S )Nhttps://twitter.com/i/user/r   rj   s    rl   r   zUserRef.__str__V  s    	0tw	0	00rn   )r   r   r   r   r   r   r   r   r   rJ  r   r   r   rr   rn   rl   r3   r3   P  sc         "vs"""59FOFK129991 1 1 1 1rn   r3   c                   0    e Zd ZdZdZdZed             ZdS )r4   circlehexagonsquarec                     |dk    r| j         S |dk    r| j        S |dk    r| j        S t                              d|           d S )NCircleHexagonSquarezUnknown profile picture shape )CIRCLEHEXAGONSQUAREr>  r?  )r@  ss     rl   _from_twitter_stringz&ProfileImageShape._from_twitter_string_  sU    (]]
*I~~
+H}}
*	//8188999	rn   N)r   r   r   ry  rz  r{  rC  r}  rr   rn   rl   r4   r4   Z  s<        

  +  rn   r4   c                   &   e Zd ZU eed<   eed<   ej        ed<   ej        e	e
f         ed<   ej        e	e
f         ed<   ej        ej        e	e
f                  ed<   eed<   eed<   ej        e         ed	<   eed
<   eed<   dZej        e         ed<   dS )r5   rJ   r   rR  admincreatorr  moderatorsCountr  rulesr  	bannerUrlNr   )r   r   r   r   r   r   r   r   r   r1   r3   r   r   r   rr   rn   rl   r5   r5   k  s         


T7]####
,tW}
%%%%+fl4=9::::C%)foc")))))rn   r5   c                   N    e Zd ZU eed<   eed<   dZej        e         ed<   d ZdS )r6   r   domainContextNmetaDescriptionc                 P    dt           j                            | j                   S )Nzhttps://twitter.com/search?q=)urllibparsequoter   rj   s    rl   r   zTrend.__str__  s"    	H););DI)F)F	H	HHrn   )	r   r   r   r   r   r  r   r   r   rr   rn   rl   r6   r6   {  sV         
)-&/#&---I I I I Irn   r6   c                   h    e Zd Z ej                    Z ej                    Z ej                    ZdS )_ScrollDirectionN)r   r   r   enumautoTOPBOTTOMBOTHrr   rn   rl   r  r    s5        ty{{
$)++	rn   r  c                   l    e Zd Zd Zed             Zej        d             Zed             ZdddZdS )r7   c                 "    d | _         d| _        d S Ng        _token_setTimerj   s    rl   __init__zGuestTokenManager.__init__      $+$---rn   c                     | j         S r}   )r  rj   s    rl   tokenzGuestTokenManager.token  s
    	rn   c                 D    || _         t          j                    | _        d S r}   )r  timer  )rk   r  s     rl   r  zGuestTokenManager.token  s    $+)++$---rn   c                     | j         S r}   )r  rj   s    rl   setTimezGuestTokenManager.setTime  s
    	rn   N
blockUntilc                "    d | _         d| _        d S r  r  rk   r  s     rl   resetzGuestTokenManager.reset  r  rn   )	r   r   r   r  r   r  setterr  r  rr   rn   rl   r7   r7     s             ( ,  ,   ( "&       rn   r7   c                        e Zd Z fdZd Zd Zd Zd Zed             Z	e	j
         fd            Z	ed             Zd	d
 fd
Z xZS )_CLIGuestTokenManagerc                    t                                                       d| _        t          j                            d          }|rt          j                            |          s=t          j                            t          j        	                    d          d          }t          j                            |d          }t          j        
                    |          sJt          j        t          j                            |          dd           t          j        |d	           t          j                            |d
          | _        | j         d| _        t!          j        | j                  | _        d S )NrD   XDG_CACHE_HOME~z.cacher   i  T)modeexist_okr  zcli-twitter-guest-token.jsonz.lock)superr  _blockedUntilosenvirongetpathisabsr   
expanduserisdirmakedirsdirnamemkdir_file	_lockFilefilelockFileLock_lock)rk   	cacheHomedir	__class__s      rl   r  z_CLIGuestTokenManager.__init__  s"   ''$jnn-..)	 ?"'--	22 ? w||BG..s33X>>9
Y
++#	s		  ;rws##EdCCCC8Cw||C!?@@$*j'''$. 00$***rn   c                    t           j                            | j                  sd S t                              d| j                    t          | j        d          5 }	 t          j        |          }na# t          j	        $ rO}t          
                    d| j         d|           |                                  Y d }~d d d            d S d }~ww xY w	 d d d            n# 1 swxY w Y   |                    d          dk    r8t          
                    d| j                    |                                  d S |S )NzReading guest token file rzMalformed guest token file : versionr   z%Outdated version of guest token file )r  r  existsr  r>  infoopenjsonloadJSONDecodeErrorr?  _locked_deleter  )rk   fpoes       rl   _locked_loadz"_CLIGuestTokenManager._locked_load  s   	
	#	# 
$	,,74:77888DJ 	"AA

   OOE$*EEEEFFF444                       UU9
??G4:GGHHH
$	
(s<   C# A54C#5C9C=C#CC##C'*C'c                    | j         5  |                                 }d d d            n# 1 swxY w Y   |s|                                  d S t          j                    t          z
  fd|d                                         D             }|sd S t          j        |          }|| _        |d         |         d         | _	        d| _
        d S )Nc                 f    g | ]-\  }}|d          k    |                     dd          k     +|.S )r  blockedUntilrD   r  )ru   r  tcurrentTimesetTimeThresholds      rl   rw   z/_CLIGuestTokenManager._read.<locals>.<listcomp>  sk      K  K  K85!a	lN^>^>^cdchchiwyzc{c{  J  dJ  dJ  dJ  dJ  dJrn   tokensr  rD   )r  r  r  r  _GUEST_TOKEN_VALIDITYitemsrandomchoicer  r  r  )rk   r  validTokensr  r  r  s       @@rl   _readz_CLIGuestTokenManager._read  s-   z  1              	
 ::<<<
$	+ #88 K  K  K  K  Kq{'8'8':':  K  K  K+	 
$
-
$
$%$+H+e$Y/$-$s   +//c                    | j         5  |                                 }|sdi d}t          j                    t          z
  fd|d                                         D             |d<   | j        r\| j        |d         vri |d         | j        <   | j        |d         | j                 d<   | j        r| j        |d         | j                 d<   |d         ret          	                    d| j
                    t          | j
        d          5 }t          j        ||           d d d            n# 1 swxY w Y   n|                                  d d d            d S # 1 swxY w Y   d S )	Nr   )r  r  c                 4    i | ]\  }}|d          k    ||S )r  rr   )ru   r  detailsr  s      rl   
<dictcomp>z0_CLIGuestTokenManager._write.<locals>.<dictcomp>  s0    uuu^UGgV_N`dtNtNt%NtNtNtrn   r  r  r  zWriting guest token file w)r  r  r  r  r  r  r  r  r>  r  r  r  r  dumpr  )rk   r  r  r  s      @rl   _writez_CLIGuestTokenManager._write  s   z  1
 %$$A ikk$99uuuuq{7H7H7J7Juuu1X; k C{!H+%% "Qx[*.-AhKY' C040BQx[n- k LL9TZ99:::	dj#		 "	Yq"               	1                 s6   DED-!E-D1	1E4D1	5EE!Ec                     t                               d| j                    	 t          j        | j                   d S # t
          $ r Y d S w xY w)NzDeleting guest token file )r>  r  r  r  removeFileNotFoundErrorrj   s    rl   r  z$_CLIGuestTokenManager._locked_delete  s^    	,,8DJ889999TZ	   44s   ? 
AAc                 F    | j         s|                                  | j         S r}   )r  r  rj   s    rl   r  z_CLIGuestTokenManager.token  s!    	 ::<<<	rn   c                     t          t          |           t          |                     j                            | |           |                                  d S r}   )r  r   r  __set__r  )rk   r  r  s     rl   r  z_CLIGuestTokenManager.token   sC    T

DJJ%--dE:::++-----rn   c                     | j          | j        S r}   )r  r  rj   s    rl   r  z_CLIGuestTokenManager.setTime  s    **	rn   Nr  c                    || _         |                                  t                                                       d| _         d S )NrD   )r  r  r  r  )rk   r  r  s     rl   r  z_CLIGuestTokenManager.reset
  s7    !$++---''--///$rn   )r   r   r   r  r  r  r  r  r   r  r  r  r  __classcell__r  s   @rl   r  r    s        1 1 1 1 1$  "  "  6     (
 ,    ,   ( "&           rn   r  c                        e Zd Z fdZ xZS )_TwitterTLSAdapterc                     t           j        j                            t                    |d<    t                      j        |i | d S )N)ciphersssl_context)urllib3utilssl_create_urllib3_context_CIPHERS_CHROMEr  init_poolmanager)rk   argskwargsr  s      rl   r  z#_TwitterTLSAdapter.init_poolmanager  sE    !,+BB_B]]&%''D+F+++++rn   )r   r   r   r  r  r  s   @rl   r  r    s8        , , , , , , , , ,rn   r  c                       e Zd ZdZdZdS )_TwitterAPITyperD   r   N)r   r   r   V2GRAPHQLrr   rn   rl   r  r    s        rn   r  c                        e Zd Zddd fd
Zd ZddZd Zd Zdd	Zdde	j
        dfd
Zd Zd ZddZd Zd Zd Zd Zd ZddZddZd ZddZd ZddZddZe fd            Z xZS )_TwitterAPIScraperNrD   )guestTokenManagermaxEmptyPagesc                R    t                      j        di | || _        |t          t	                      at          }|| _        || _        t          | j        dd| _        t                      }| j
                            d|           | j
                            d|           d S )Nzen-US,en;q=0.5)AuthorizationRefererzAccept-Languagezhttps://twitter.comzhttps://api.twitter.comrr   )r  r  _baseUrl_globalGuestTokenManagerr7   _guestTokenManager_maxEmptyPages_API_AUTHORIZATION_HEADER_apiHeadersr  _sessionmount)rk   baseUrlr  r  r  adapterr  s         rl   r  z_TwitterAPIScraper.__init__  s    %''V$-&022/-$%$-m& $
   '-+W555-/99999rn   c                 V    |j         dk    rd|j         dk    rdndd|j          dz   fS dS )	N   F  znon-200 responseblockedz ()TN)status_code)rk   r  s     rl   _check_guest_token_responsez._TwitterAPIScraper._check_guest_token_response1  sF    ]c
(<(<$$)OdTUTaOdOdOdd
dd	rn   c           	      J   | j         j        t                              d           |                     || j        n|| j                  }t          j        d|j	                  x}r9t          
                    d           |                    d          | j         _        d|j        v r1t          
                    d           |j        d         | j         _        | j         j        st          
                    d           t                              d	           |                     d
d| j        | j                  }|                                }|                    d          st"          j                            d          |d         | j         _        | j         j        sJ t          
                    d| j         j                    | j        j                            d| j         j        ddd| j         j        t.          z              | j         j        | j        d<   d S )NzRetrieving guest token)responseOkCallbackzjdocument\.cookie = decodeURIComponent\("gt=(\d+); Max-Age=10800; Domain=\.twitter\.com; Path=/; Secure"\);zFound guest token in HTMLr   gtzFound guest token in cookieszNo guest token in responsezRetrieving guest token via APIz/https://api.twitter.com/1.1/guest/activate.jsonrn   )dataheadersr  guest_tokenzUnable to retrieve guest tokenzUsing guest token z.twitter.com/T)domainr  secureexpiresx-guest-token)r
  r  r>  r  _getr  r  researchr   debuggroupcookies_postr  r  r  r   r   ScraperExceptionr  setr  r  )rk   rF   r  matchr  s        rl   _ensure_guest_tokenz&_TwitterAPIScraper._ensure_guest_token6  s   	"*
<<()))yy#+3TMmynn1	  H  JK  JP  Q  Q  Qu 3MM-...$)KKNND!
aiMM0111$%IdOD!

!
' 5MM.///LL1222

DS\`\l  DH  Dd
  	e  	eA	A55 L=))*JKKK$%m$4D!

!
'''
'	--DT%<%BDDEEE-D$"9"?.ados  @D  @W  @_  bw  @w  x  x  x&*&=&C$?###rn   c                 f    | j                             |           | j        j        d= | j        d= d S )Nr  r  r$  )r
  r  r  r*  r  r  s     rl   _unset_guest_tokenz%_TwitterAPIScraper._unset_guest_tokenM  s:    Z888
mD!
'''rn   c                    |j         dv r|j         dk    rr|j                            dd          dk    rSd|j        v rJt          t	          |j        d                   t	          t          j                              dz             }n#t	          t          j                              dz   }|                     |           |                                  d	d
|j          dfS |j                            dd                              dd          dk    rdS |j         dk    rd	d|j          dfS 	 |	                                }n$# t          j
        $ r}d	d| dfcY d }~S d }~ww xY w||_        |t          j        u rkd|v rgdd                    d |d         D                       z   }|}|D ]}	|                    |	i           }|rt                              |           dS d	|fS dS )N)i  r    r3  zx-rate-limit-remainingr   0zx-rate-limit-reseti  i,  Fz	blocked (r  zcontent-typer{   zapplication/json;charset=utf-8)Fzcontent type is not JSONr  znon-200 status code (z$received invalid JSON from Twitter (errorsz!Twitter responded with an error: , c              3   <   K   | ]}|d           d|d          V  dS )r   r  messageNrr   )ru   r  s     rl   r~   z9_TwitterAPIScraper._check_api_response.<locals>.<genexpr>f  s9      8o8o\]AfI9W9W99W9W8o8o8o8o8o8orn   r  )r  r  r  minr   r  r1  r/  replacer  r  _snscrapeObjr  r   r   r>  warn)
rk   r  apiTypeinstructionsPathr  objr  msginstructionsks
             rl   _check_api_responsez&_TwitterAPIScraper._check_api_responseR  s)   ]o%%msqy}}-ErJJcQQVjnonwVwVwS#78993ty{{;K;Kc;QRRJJTY[[!!C'J:&&&
-Q]---
--Y]]>2&&..sB77;[[[
+
+]c
9999
99=	
33		 = = =
<<<<
<<<<<<<= !.'''HOO	,tyy8o8oademan8o8o8o/o/o	o3< + +q##Ar**LL LL:#:	s   .E E$EE$E$c           
      \   |                                   |t          j        u rLt          j                            d |                                D             t          j        j                  }|                     ||| j	        t          j        | j        ||                    }|j        S )Nc                 B    i | ]\  }}|t          j        |d           S )),:)
separators)r  dumps)ru   rB  vs      rl   r  z4_TwitterAPIScraper._get_api_data.<locals>.<dictcomp>u  s0    #i#i#iRVRSUVAtz!*'M'M'M#i#i#irn   )	quote_via)r=  r>  )paramsr  r  )r/  r  r   r  r  	urlencoder  r  r%  r  	functoolspartialrC  r;  )rk   endpointr=  rL  r>  r  s         rl   _get_api_dataz _TwitterAPIScraper._get_api_datar  s    '''L""#i#iZ`ZfZfZhZh#i#i#iw}  xD  xJ"  K  K6
ii6T5E\e\mnr  oG  SZ  o  ]@  ]@  ]@i  A  A!	
rn   c              #     K   |t           j        u sJ ||}nt          j        |          }||d         d<   d }	|t          j        u s|t          j        u rd}
nd}
d}d}d}	 t                              d|            | 	                    ||||	          }|V  d }d }d }|}|D ]
}||         }d}|D ]}d
|v r|d
         d         }nZd|v r|d         d         g}nF|
                    d          dk    r	|d         }n$|
                    d          dk    r
|d         g}np||                     |          z  }|D ]y}|d                             d          s|d                             d          s:|d         }|
                    d          dk    s|
                    d          dk    r:|d         }|
                    d          dk    !|
                    d          dk    :|d         |
                    dd           }}|d         d|
 k    s|d                             d|
 d          r|}||}|d                             d          s|d                             d          r|}<|t          j        u r/|	-|d         dk    s|d                             d          r||pdf}{|	||}	||k    r|dk    r|d z  }|| j        k    rd S |dk    r8|d z  }| j        r+|| j        k    r t                              d!| d"           d S nd}|r|r'|dk    r!||}n|t          j        u r|	
d}
|	\  }}d }	nd S ||k    rd}|}t          j        |          }||d         d<   )#N	variablescursortopbottomFrD   TzRetrieving scroll page r>  
addEntriesentriesreplaceEntryentryr   TimelineAddEntriesTimelineReplaceEntryentryIdz
sq-cursor-cursor-r   itemTypeTimelineTimelineItem	entryTypeitemContentvaluestopOnEmptyResponse-zcursor-showmorethreadsprompt-zcursor-showmorethreads-zsq-cursor-bottomzcursor-bottom-r   zStopping after z empty pages)r  r   copydeepcopyr  r  r  r>  r  rQ  r  _count_tweets_and_users
startswith_retriesr  r?  )rk   rP  r=  rL  paginationParamsrT  	directionr>  	reqParamsbottomCursorAndStopr  re  emptyResponsesOnCursor
emptyPagesr?  	newCursorpromptCursornewBottomCursorAndStoprA  rB  
entryCountinstructionrY  r[  cursorContententryCursorentryCursorStops                              rl   _iter_api_dataz!_TwitterAPIScraper._iter_api_datay  s      
O+	+	+	+	+^99}-..9&,9[(#"&&&)7G7L*L*L	33	3*F-
<<2&22333			HgyM]		^	^3	999 9< < # #q?LL:" G G{{""<(3WW	;	&	&N+G45WW		 	 $8	8	89%WW		 	 $:	:	:G$%WW$..w777J G G9((66 %	:J:U:UV_:`:` 9%]Z((,BBBmFWFWXcFdFdh~F~F~#M2m Z((,BBBmFWFWXcFdFdh~F~F~$1'$:M<M<MNcei<j<j/[i.....%	2B2M2MN^X[N^N^N^2_2_.i		$,
	

%
%&E
F
F G%PYJZJeJef  KA  KA G ll
',
,
,1D1LRWXaRbfxRxRx  }B  CL  }M  }X  }X  Yi  }j  }jRx +_-EFG  !&<&H06jAoo a--
UAoo!OJ zT-@@@__?z???@@@
UJ
 	+ 	
aYY	&+	+	+0C0OS&9#Y#
U66}-..9&,9[(#MF-rn   c                 4    t          d |D                       S )Nc              3      K   | ]U}|d                               d          p5|d                               d          p|d                               d          V  VdS )r^  zsq-I-t-tweet-zuser-Nrj  )ru   r[  s     rl   r~   z=_TwitterAPIScraper._count_tweets_and_users.<locals>.<genexpr>  s        [  [  JOU9((33  EuY7G7R7RS[7\7\  E`efo`p`{`{  }D  aE  aE  [  [  [  [  [  [rn   )sum)rk   rY  s     rl   ri  z*_TwitterAPIScraper._count_tweets_and_users  s<    	  [  [  SZ  [  [  [  
[  
[  [rn   c                 D    d|v r|d         nt          |d                   S )NrJ   id_strr   )rk   r   s     rl   _get_tweet_idz _TwitterAPIScraper._get_tweet_id  s$    t3uX+?+??rn   c           	      v   |                      |          }||d<   |rd|v r|d         |d<   |d         }	n3|rt                              d| d           |d         |d<   |d         }	|	                    d	          }
|                     |d         |
          |d
<   ||d<   t
          j                            |d                   |d<   |
rd |
D             |d<   dt          |dd           d| |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   d|v r|d         nt          |d                   |d<   |d          |d <   d!|v ru|d!         |d!<   t          j        d"|d!                   x}r|                    d#          |d$<   t          j        d%|d!                   x}r|                    d#          |d&<   d'|v rQd(|d'         v rGg }|d'         d(         D ]/}|                     ||          x}r|                    |           0|r||d(<   |r||d)<   |r||d*<   |                    d+          x}rt          |          |d,<   t          |d-                   }||d         j        k    r|d         |d.<   nr|	                    d/          r]|	d/         D ]T}|d0         |d-         k    r@t!          |d1         d|v r|d         nt          |d0                   |d2         3          |d.<   Ud.|vrt!          |d4         |5          |d.<   |	                    d/          rd6 |	d/         D             |d7<   |                    d8          rC|d8         d8         x}r2t#          |          d9k    rt%          |d:         |d#                   |d8<   nW|                    d;          rB|d;         d8         x}r2t#          |          d9k    rt%          |d#         |d:                   |d8<   |                    d<          rt'          |d<         d         |d<         d=         |d<         d2         |d<         d>         |d<         d?         |d<         d@                   |d<<   d8|vr|d<                             dA          rt|d<         dA         d8         x}r^|d:         rVt#          |d:         d:                   d9k    r7t%          |d:         d:         d:         |d:         d:         d#                   |d8<   |	                    dB          rdC |	dB         D             |dB<   |	                    dD          rdE |	dD         D             |dF<   |r||dG<   t)          |d          rdH|j        v r}g }d|v r|                    |d                    |r|                    |j                   |D ] }|j        |j        k    r|j        |_         n!t                              dI|            dJ|v r|dJ         |dK<   t2                              |                    dLdMd i          dM                   |dN<   t7          dOi |S )PNrJ   r   rH   
entity_setz.Twitter returned an empty note tweet in tweet z'; text and entities might be incomplete	full_textentitiesurlsrI   rK   
created_atrG   c                     g | ]G}t          |                    d           |d         |d         t          |d                             HS display_urlexpanded_urlrF   r   r   rF   r   r   r   r  tupleru   us     rl   rw   z2_TwitterAPIScraper._make_tweet.<locals>.<listcomp>  sf     ( ( (
   uu]33/!"5"')"5"5	   ( ( (rn   rU   ri  rg   zi/webz/status/rF   reply_countrL   retweet_countrM   favorite_countrN   quote_countrO   conversation_idconversation_id_strrP   rQ   rR   zhref=[\'"]?([^\'" >]+)r   rS   z	>([^<]*)<rT   extended_entitiesrV   rW   rX   in_reply_to_status_id_strrY   in_reply_to_user_id_strrZ   user_mentionsr  screen_namer   rg   rJ   rM  in_reply_to_screen_name)rg   rJ   c           	          g | ]?}t          |d          d|v r|d         nt          |d                   |d                   @S )r  rJ   r  r   r  )r1   r   r  s     rl   rw   z2_TwitterAPIScraper._make_tweet.<locals>.<listcomp>  s      o  o  o  PQtq/?QUYZQZQZagg`cdefndo`p`p  AB  CI  AJ   K   K   K  o  o  orn   r[   r\      rD   geor]   	full_name
place_typer   country_codebounding_boxr^   c                     g | ]
}|d          S r   rr   ru   r  s     rl   rw   z2_TwitterAPIScraper._make_tweet.<locals>.<listcomp>*  s    AAAq6AAArn   symbolsc                     g | ]
}|d          S r  rr   r  s     rl   rw   z2_TwitterAPIScraper._make_tweet.<locals>.<listcomp>,  s    @@@q6@@@rn   r_   r`   z//t.co/z+Could not translate t.co card URL on tweet bookmark_countrc   conversation_controlrA  rf   rr   )r  r>  r?  r  _render_text_with_urlsemailutilsparsedate_to_datetimeri   r   r&  r'  r)  _make_mediumappendrJ   r1   lenr	   r
   hasattrrF   extendrU   r   r.   rB  r   )rk   r   rK   rW   rX   r`   	noteTweetr  tweetIdr  rU   r.  rV   r   mediumOrY   inReplyToUserIdr  coords
candidatess                       rl   _make_tweetz_TwitterAPIScraper._make_tweet  s/   u%%'&,  6Y&&#F+6,%88 wOOuWuuuvvv,6,J8
,,v

%"99&:NPUVV&	&.;44U<5HII&.
 (( (
 "'( ( (6'? _z7)K)K^^U\^^&-}-& 1&./&}-&9Je9S9SU#455Y\]bcx]yYzYz&	=&.Ho6(	3U8_EEEu )++a..F;	,h888u +!KKNNF=E!!g7J1K&K&K5*+G4  v$$VW555 
\\' F7O -,6
 '&6-))$?@@@ 
f #$4 5 56
89::?***$VnF?_%% Lo& L L	(u6777 $-0@RVZ[R[R[qwwadefgoepaqaq  BC  DJ  BK  !L  !L  !Lf_V##"e4M.NUdeeeF?\\/"" o o  o  U]  ^m  Un  o  o  o6
 YY} >}%m44v >#f++:J:J'q	6!9==F=yy >um,,v >#f++2B2B'q	6!9==F=
YYw J5>$/w1LeT[n]cNdfklsft  vB  gC  EJ  KR  ES  T]  E^  `e  fm  `n  o}  `~    6'?6!!eGn&8&8&H&H!X]^eXfguXv  xE  YF  OFf!  LR  ST  LU!  Z]  ^d  ef  ^g  hi  ^j  Zk  Zk  op  Zp  Zp'q	!Q1aIIF=\\* BAAHZ,@AAA6*\\) A@@HY,?@@@6*	 N6&>dE NyDH44 J&vg''' -~+,,, N N	DHdhe 	 __L7LLMMM"#346/(A(N(NuyyYorz  }A  rB  PC  PC  DL  PM  )N  )N&	$%	rn   c           
      H   |d         dk    rd|d         v s
d|d         v rt          |d         |d                   S d|d         vr)t                              d| d	|d         d
           d S |d                             dd          \  }}|dvr"t                              d| d	|           d S | d| d| d| dd}|                    d          r|d         |d<   t          d%i |S |d         dk    s|d         dk    rpg }|d         d         D ]F}|                    t          |d         |d         |                    d                               G|d         |d}|d         dk    r|d         d         dz  |d<   |                    d          x}rr|                    d          x}	r[t          |	d          x}
t                    r>d!|
v r:t          |
d!         t                    rt          |
d!         d"                   |d#<   n"|                    d          x}	r|	d"         |d#<   t          }n|d         dk    rt          }|                    d          r|d         |d<    |d%i |S t                              d$| d	|d                    d S )&Nr   r   z?format=media_url_httpsz&format=r   r   .z'Skipping malformed medium URL on tweet r  z contains no dotr   )jpgpngz,Skipping photo with unknown format on tweet z&name=smallz
&name=origext_alt_textr   r   animated_gif
video_infor   content_typerF   r   r   rF   r   r   r   duration_millis  r   ext
mediaStatsr  okra   r   z!Unsupported medium type on tweet rr   )r   r>  r?  rsplitr  r  r   
isinstancedictr   r   r   )rk   r   r  r  formatmKwargsr   variantr  r  r  r@  s               rl   r  z_TwitterAPIScraper._make_mediumB  s   F^wF,---vFW?X1X1Xf%676J[C\]]]]	)***OOvgvvPaIbvvvwww
F-.55c1==?7FN""OOX7XXfXXYYY
F99f999556555 7 jj   0/GI


'

f~  F6Nn$D$D8&z2 A AwOOLw~/FgV[nhohshst}h~h~  A  A  A  A,- 7 Vn ./@ADHGJzz%    0SWW\5J5J'Jz 0PZ`jkn`o[o[\quPvPv 0{  DE  |E  |E  JT  UV  W[  U\  ^b  Jc  Jc  |EAdGK011WW

<00
0* 0";/WW
CCv.((
Cjj   0/GI
#....
??TwTT&.TTUUUUUrn   c                 )   "# i }i }d                              dg           D ]}d|vrt                              d|            $                     |          }t	          |t
                    s|t                              d|            n|j        |v r7||j                 |k    r%t                              d|j         d|            |||j        <   d d         d	         D             }|D ]}\  }	}
d
|
vr%|	dvr t                              d|	d|            /|
d
         dk    rm|
d         ||	<   |	                    d          rLt          j        	                    ||	         d          
                    t          j        j                  ||	<   |
d
         dk    r|
d         d         ||	<   |
d
         dk    r|
d
         dk    r|
d         ||	<   |
d
         dk    r]t          |
d         d                   }|                     |          ||	<   ||	          t                              d| d|            Tt                              d|	d| d|
d
                    d         d          ""d!v rjd"d#dd$d%d&}"d'v r/d(|d)<   t          di t          j                            ||          S d(|d*<   t%          di t          j                            ||          S t'          "fd+d,D                       r"                    d-d.          d.         d/v rt          j                            |d0d1d2d3d4          }g }t+          |          D ]}	|	                    d5          rr|	                    d6          r]d7||	         i}|                     |	d d8          d9          x}rt          |          |d9<   |                    t1          di |           ||d:<   t          |d2                   |d2<   "                    d;          r!t3          |d<         |d=         >          |d?<   nŉ"                    d@          rg }|                    t5          dA|dB         d C                     dD|dE         vr t                              dF" dG|            |                    t5          dH|dE         d C                     t7          |dI         |t          |dJ                   K          |d?<   t9          di |S "dLk    r0t;          di t          j                            |d"d#ddMd$dN          S "dOv rt          j                            |dPdQdRdS          }g |dT<   dUD ]F}dV| |v r=|dT                             t=          |dV|          |dV| dW         X                     GdY"v rEt3          |dZ         |d[         >          |d?<   d\|v r t3          |d]         |d^         >          |d_<   nd`"v rg }|                    t5          |da         |dE         d C                     |dE         |db         k    rUdD|db         vr t                              dF" dc|            |                    t5          dH|db         d C                     t7          |dI         |t          |dJ                   K          |d?<   t?          di |S "ddv rdedfd$dg}"dhk    ri |didd"d(dj}ni |didd"d#dkd(dl}t          j                            ||          }dm|v rjt          |dm                   |v r|t          |dm                            |dn<   n4tA          t          |dm                   |do         |dp         q          |dn<   d$|vrd |d$<   "dhk    rtC          di |S t          |dk                   |dk<   tE          di |S "drk    rt          j                            |did"dsd#dt          }t          |di                   |di<   t3          |du         |                     dv          p|dw         >          |dx<   tG          tI          di |y          S "dzk    rct          j                            |d"d#dMdd{d|d}          }t          |d{                   |d{<   t          |d|                   |d|<   tK          di |S "d~k    ret          j                            |ddddddMdd{d          }t          |d                   |d<   t          |d{                   |d{<   tM          di |S "dk    rVtO          |d         t7          |d         t5          |d         |                     da          d           g                    S "dk    rt          j                            |d"ddd$d          }t          |d                   |d<   g }|                    t5          dA|dB         d C                     dD|db         vr t                              dF" dc|            |                    t5          dH|db         d C                     t7          |dI         |t          |dJ                   K          |d`<   tQ          di |S "dk    r-tS          di t          j                            |ddid          S "dk    rsddi}|d         |vr(t                              d| d|d                    d S tU          di t          j                            |ddd          d||d                  iS "dk    	r{tW          j,        |d                   }i }d
|v rA|                     d
          }|dvr"t                              d| d|           d S ||d
<   nXt[          d |d         .                                D                       ddhddhfvrt                              d|            d S i |d<   |d         /                                D ]\  }}|d
         dk    r1ta          |d         d"         d         |d         d                   }nR|d
         dk    r+tc          |d         di         |d         d                   }n|d
         dk    rote          d |d         d         D                       s t                              d|             d S d |d         d         D             }tg          |          }n|d
         dk    r*d |d         d         D             }ti          |          }nj|d
         dk    r+tk          |d         d         |d         d                   }n3|d
         dk    rvtm          |d         d          d         |d         d         |d         d          7                    |d         |d         d                            |d         d                   }n|d
         dk    r|tq          |d         d          d         |d         d         |d         d         |d         d          fdts          |d         j         |d         d                   D                       }n)t                              d| d|d
                     d S ||d         |<   i |d<   |d         /                                D ]s\  }}i }d|d         v r|d         d         d         |d<   d|d         v r|d         d         |d<   d|d         v r|d         d         |d<   tu          di ||d         |<   ti |d<   |d         /                                D ](\  }} ;                    ||          x}r||d         |<   )d|v rci |d<   |d         /                                D ]B\  }}g }|D ]+#d
didddddddddќ
}#fd҄|/                                D             }#d"         d         |d"<   d##v r#d#         d         |d#<   ds#v r#ds         d         |ds<   #d         x}r"#d         d         |d<   #d         d9         |d<   #d
         dk    rd؉#di          n
dى#di          |d<   d|v rL|d         |d         vr<t                              d| d|d         d|d
         d|di         dޝ	           |d= |                    ty          di |           -||d         |<   D|d         r|d         |d<   d|v r|d         d
         dk    r"d |d         d         d         D             |d<   nb|d         d
         dk    r"d |d         d         d         D             |d<   n.t                              d| d|d         d
                    d S t{          di |t[                      }j>        r5te          fdj>        D                       s|?                    dߦ           j@        r5te          fdj@        D                       s|?                    dߦ           t'          fdjA        .                                D                       r|?                    d           t'          fdjA        .                                D                       r|?                    d           g } jA        .                                D ]k}!t	          |!tb                    r|                     |!jB                   2t	          |!th                    r$| C                    d |!jD        D                        l| C                    d jE        .                                D                        | C                    d jF        jF        .                                ng D                        t'          fd| D                       r|?                    d           t'          fdjA        .                                D                       r|?                    dȦ           t'          fdjE        .                                D                       r|?                    dȦ           |r3t                              d| ddG                    |                      S t                              d| d"           d S )Nlegacyuser_refs_resultsresultz'Empty user ref object in card on tweet z"Unavailable user in card on tweet zDuplicate user z& with differing data in card on tweet c              3   6   K   | ]}|d          |d         fV  dS )keyrd  Nrr   rt   s     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>}  s/      YY151W:.YYYYYYrn   binding_valuesr   )r  sitezSkipping type-less card value 
 on tweet STRINGstring_value_datetime_utcz%Y-%m-%dT%H:%M:%SZ)tzinfoIMAGEimage_valuerF   IMAGE_COLORBOOLEANboolean_valueUSER
user_valuer  zUser z) not found in user refs in card on tweet zUnsupported card value type on r  r   )summarysummary_large_imageappdirect_store_link_appr   r   r   r   )r   r   card_urlr  r  )r  r  r   thumbnail_originalthumbnail_image_originalc              3   B   K   | ]}                     |          V  d S r}   r~  )ru   rv   cardNames     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  s1      
\
\a8q!!
\
\
\
\
\
\rn   )poll2choice_poll3choice_poll4choice__r   )	text_onlyimager   r   r   r   r   )end_datetime_utclast_updated_datetime_utcduration_minutescounts_are_finalr  _labelr   r   r   _imageimage_smallimage_originalr  r   _videozapplication/x-mpegurlplayer_hls_urlr  vmapplayer_stream_urlzNon-VMAP URL in z player_stream_url on tweet ztext/xmlplayer_image_originalcontent_duration_seconds)r   r   r   playerr   )r   r   r  r  r  )promo_image_convopromo_video_convor   r   r   )thank_you_textthank_you_urlthank_you_shortened_urlr   )onetwothreefourcta__tweet)r   r   r  promo_image_smallpromo_image_originalcover_promo_imagecover_promo_image_smallcover_promo_image_originalr   r   player_stream_content_type
player_urlz player_url on tweet )745291183405076480:broadcastz3691233323:periscope_broadcastr   rR   )broadcast_statebroadcast_sourcer  r  rJ   )broadcast_idbroadcast_urlbroadcast_titlebroadcast_thumbnail_originalr   )rJ   rF   r   r   total_participantsfull_size_thumbnail_urlbroadcaster_twitter_idr   broadcaster_usernamebroadcaster_display_name)rJ   rg   rM  z745291183405076480:live_eventr   )event_idevent_titleevent_categoryevent_subtitleevent_thumbnail_smallevent_thumbnail_originalevent_thumbnailr   )r   z!3337203208:newsletter_publicationr   r   )newsletter_titlenewsletter_descriptionnewsletter_image_originalr  revue_account_idissue_countz3337203208:newsletter_issuer   r   r   r   r   )r-  r.  issue_titleissue_descriptionissue_numberissue_image_originalr  r0  amplifyamplify_content_idplayer_imageamplify_url_vmap)rF   r   r   r  )rJ   r   	appplayerr   r   )r   app_categoryplayer_owner_idr  z3691233323:audiospace)r  rJ   z2586390716:message_memessage_me_card_cta_2zSend us a private messagectaz)Unsupported message_me card cta on tweet r   )r   r  r   unified_card)	image_appimage_carousel_appimage_carousel_websiteimage_collection_website!image_multi_dest_carousel_websiteimage_website'mixed_media_multi_dest_carousel_website$mixed_media_single_dest_carousel_app(mixed_media_single_dest_carousel_website	video_appvideo_carousel_appvideo_carousel_website!video_multi_dest_carousel_websitevideo_websitez'Unsupported unified_card type on tweet c              3   &   K   | ]}|d          V  dS )r   Nrr   )ru   cs     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>3  s&      ??!AfI??????rn   component_objectsrV   twitter_list_detailscommunity_detailsr   r  r  r   destination)r   r  r  r  button_groupc              3   .   K   | ]}|d          dk    V  dS )r   r>  Nrr   ru   bs     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>>  s+      AAq&	U"AAAAAArn   r  z;Unsupported unified_card button_group button type on tweet c                     g | ]]}t          |d          d                                         t          j        dd |d          dd                   z   |d                   ^S )actionrD   z[A-Z]c                     d| d          S )Nr{   rD   rr   rv   s    rl   rm   z:_TwitterAPIScraper._make_card.<locals>.<listcomp>.<lambda>A  s    \f`abc`d\f\f rn   r   NrS  )r   r  )r"   upperr&  subrW  s     rl   rw   z1_TwitterAPIScraper._make_card.<locals>.<listcomp>A  s      |  |  |  bc!8Q)=)=)?)?"&RfRfhijrhstutvtvhwBxBx)x  LM  N[  L\  ]  ]  ]  |  |  |rn   )r  swipeable_mediac                 H    g | ]}t          |d          |d                    S )rJ   rS  rT  )r$   )ru   ms     rl   rw   z1_TwitterAPIScraper._make_card.<locals>.<listcomp>D  sD      H  H  Hjk-!D'TUVcTdeee  H  H  Hrn   
media_listrV   app_store_detailsapp_id)r  r  member_countsubscriber_countusersuser_id)r   r  r  rK   r  r  c                 >    g | ]}|                     |          S rr   )_user_to_user)ru   r  rk   s     rl   rw   z1_TwitterAPIScraper._make_card.<locals>.<listcomp>V  s-    ppp1nop++A..ppprn   members_facepile)r   r  r  r  r  z1Unsupported unified_card component type on tweet r   destination_objectsurl_datar  media_idr  media_entitiesapp_store_datar   r   r   r"  r!  r%  r&  r'  r(  )
r   rJ   icon_media_keyr  num_installs
size_bytesis_freeis_editors_choicehas_in_app_purchaseshas_in_app_adsc                 0    i | ]\  }}|v 	||         S rr   rr   )ru   r  kwargvars      rl   r  z1_TwitterAPIScraper._make_card.<locals>.<dictcomp>~  s)    TTTZS%PSCrn   ratingsstarr#  r$  android_appz.https://play.google.com/store/apps/details?id=zhttps://itunes.apple.com/app/idzTweet z! contains an app icon medium key z on app r   z3, but the corresponding medium is missing; droppingr   layout	swipeablec                 H    g | ]}t          |d          |d                    S )rD   r   )r*  r+  )r*   ru   rJ  s     rl   rw   z1_TwitterAPIScraper._make_card.<locals>.<listcomp>  sG      (`  (`  (`|}(G]^_`]arsturv(w(w(w  (`  (`  (`rn   slidesr   
collectionc                 H    g | ]}t          |d          |d                    S )rD   r   )r.  r*  )r+   r  s     rl   rw   z1_TwitterAPIScraper._make_card.<locals>.<listcomp>  sT      )i  )i  )i  FG)I`abc`d{|}~{  *A  *A  *A  )i  )i  )irn   r   z.Unsupported unified_card layout type on tweet c              3   *   K   | ]}|j         v V  d S r}   )r   ru   rB  r`   s     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  s+      !V!V!t'<"<!V!V!V!V!V!Vrn   c              3   P   K   | ] }|j         j        v o|j        j        v V  !d S r}   )r*  r   r+  )ru   r|  r`   s     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  sh        -l  -l  LMQ-ATEZ-Z  .G_`_mqu  rG  `G  -l  -l  -l  -l  -l  -lrn   c              3   T   K   | ]"}t          |d           |j        j        vV  #dS )r  N)r  r  r   ru   rO  r`   s     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  s@      	|	|_fghjz_{_{	|!
$"3
3	|	|	|	|	|	|rn   c              3   r   K   | ]1}t          |t                    |j        D ]}|j        j        vV  2d S r}   )r  r!   r  r  r   )ru   rO  rX  r`   s      rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  s        
h  
h_ijk  nS  `T  `T  
h  ^_  ^g  
h  
h  YZ!
$"3
3  
h  
h  
h  
h  
h  
h  
hrn   c              3   $   K   | ]}|j         V  d S r}   r  rt   s     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  s$      33aak333333rn   c              3   2   K   | ]}|j         	|j         V  d S r}   r  )ru   ds     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  s+      __Aq{G^AKG^G^G^G^__rn   c              3   <   K   | ]}|D ]}|j         	|j         V  d S r}   )r   )ru   las      rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  sj        N  Nlm  N  Nghqr  rA  rMAO  rM  rM  rM  rM  rM  N  Nrn   c              3   *   K   | ]}|j         vV  d S r}   rc  r  s     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  s*      	1	1!!4:
	1	1	1	1	1	1rn   c              3   T   K   | ]"}t          |d           |j        j        vV  #dS )r  N)r  r  r   r  s     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  s=      	d	dwWXZbOcOc	d!($)
#	d	d	d	d	d	drn   c              3   B   K   | ]}|j         	|j         j        vV  d S r}   )r  r   )ru   r  r`   s     rl   r~   z0_TwitterAPIScraper._make_card.<locals>.<genexpr>  s3      	`	`18K_!($)
#K_K_K_K_	`	`rn   z,Consistency errors in unified card on tweet z
: missing r6  zUnsupported card type on tweet rr   )Hr  r>  r?  _graphql_user_results_to_userr  r3   rJ   endswithr   strptimer:  timezoneutcr   r   r   r  dict_mapr   anysplitsortedrj  r  r   r   r   r   r   r   r   r   r1   r   r   r   r   r   r   r   r   r   r   r  loadsr-  valuesr  r   r    allr!   r#   r%   r&   rk  r'   mapr(   r  r)   r   r   addr   r   r  r  rV   r   r   r   )$rk   r`   r=  r  bindingValuesuserRefsr  rK   messyBindingValuesr  rd  userIdkeyMapr  r   	optKwargsr   r   r  ctasunifiedCardTyperB  rJ  cor  rV   dKwargsr   
vKwargsMapvKwargsr|  missingParts	mediaKeysrO  r  r{  s$   ``                                @@rl   
_make_cardz_TwitterAPIScraper._make_cardk  s   -(>1266  aaOOGgGGHHH

,
,Q
/
/4w 4<OOBBBCCC
gD  ___tw__V]__```8DGYYXGW8XYYY& e ejc5E
%%%__PcPPwPPQQQFmx~.M#
||O$$ G"+44]35GI]^^ffpx  qB  qFf  G  G]3f  }-e4M#f&&f""/M#f|$X.//F!f--M#S!__WVWWgWWXXXOOccccwccRWX^R_ccdddd(^F#(SSS  6 222#1F DDX^,,]FCCDDD)7F%&HH00GGHHH

\
\
\
\+[
\
\
\\\ Qaiaoaopsuvawawxyaz  ^  b^  b^N##M	  qA  Wa  wE  4F  4F  G  G67]## - -s
~~h -CLL$:$: -=-.Y##s3B3x$6$6$677	7 &u::i^^J++++,,,6)F:.//6*!! d-*FR_`pRqrrrF8(## dHOOL/Fm\lNmy}~~~]#6777__WWWgWWXXXOOLzObAcostttuuuM:Q,R_gtw  yF  Ga  yb  uc  uc  d  d  dF8


V

8
  }  }x~..}`m  |A  \f  pz  ?{  ?{  |  |  }  }  }===N##Mngt  Rb  4c  4c  d  d66)+ | |qazz]""I.}ZAZZ7PZghxophxhxhxZyzzz{{{-8K*LXef|X}~~~F8m++-8Q*R^k  mI  _J  K  K  KVG_8HOOL}=Y/Zbo  qD  cE  QU  V  V  V  W  W  W()]<-HHHmL111ooQQQQQRRR__\
-P\B]imnnnoooM:Q,R_gtw  yF  Ga  yb  uc  uc  d  d  dF8

"
"6
"
""UUU 'XzZZ6000 R  RuY`  CQ  R  R  RFF x  xd57S`  yL  iw  x  x  xFN##M6::6-//
=1233x??%c-8P*Q&R&RSVM!s=9Q+R'S'S`m  oE  aF  Vc  d~  V  @  @  @VMF:000""6""""%f-@&A"B"BF!++F+++222N##MU\pz  O\  4]  4]  ^  ^6fTl##6$<6M(NZgZkZk  mG  [H  [H  [l  LY  Zk  Ll  m  m  m6'?
EOOFOO
,
,
,,666N##Mkx  Xb  pu  K[  lx  4y  4y  z  z6!&)9":;;6
f\2336,

"
"6
"
""000N##M)5+!&(	4 	4 	 	6 vm4556-!&)9":;;6


'
'
'
''9
	+	,!.1M2D$EUbUfUf  hD  VE  VE  QU  V  V  V  W      ;N##MWVc  yH  R\  4]  4]  ^  ^6 !8996/8??<.E][kMlx|}}}~~~M,///OOOxOOgOOPPP??<jl@[gklllmmm-8O*P]eru  wD  E_  w`  sa  sa  b  b  b6'?

!
!&
!
!!***

_
_x~..}5X\>]>]^^
_
__*** #$?
@4E$&&OOccc=Y^K_ccddd
F
  Z  Z(.11-{hmAnAnoo  Z  Z  C  DQ  RW  DX  Y  Z  Z  Z  Z>!!z-/0016kkeeFmmO     __]w]]/]]^^^V$F6NN??q!45<<>>?????RhHils  vI  lJ  HK  	K  	KOOGgGGHHH
F "6
$%++-- #' #'tq!yI
*QvYw5G	5Refgmeno|e}
~
~
~RR	
6g		
*qyYZ[aYbcpYq
r
r
rRR	
6n	$	$AAAfIi,@AAAAA oo]T[]]^^^ff |  |  gh  io  gp  qz  g{  |  |  |W
/'
B
B
BRR	
6'	'	' H  Hopqwox  zF  pG  H  H  HU
25
A
A
ARR	
6)	)	)
,ai6I\]^d\efs\t
u
u
uRR	
6,	,	,
6vYvy)fIn-&	"45'
1V9Y+? @AAy/  RR 
6)	)	)
;vYvy)i vY~.y/ppppAgJNAfIVhLi8j8jppp  RR __aaaTUV\T]aabbbVV$&Fq!!6.&'--// B Btq!GQvYi
+E2WU^1V968,WXQvYfIj1W[ 6 A A A AF>16'?!"((** ! !tq!##Aw/// ! VG_Q!F6N"#))++ " "1X 1 1($!-2& j UTTT:3C3C3E3ETTTgWi0gg	#		 #M 29 =w}	s		 _Y7wz^
#' 8"%i."8w #Iw 7w}WZ[aWbfsWsWsSD	SSS  zg  \_  `d  \e  zg  zggen	G	#	#(@w(W(W  G  G  G'RaJb  G  Gnuv|n}  G  G  CJ  KO  CP  G  G  G  H  H  H?#oon//w//0000!VF^Ao +\?F<!mm{6k)) (`  (`  BC  DL  BM  NT  BU  V^  B_  (`  (`  (`V#$$	
8V		,	, )i  )i  KL  MU  KV  W]  K^  _g  Kh  )i  )i  )iV$%%__hghhQRS[Q\]cQdhhiiiV




4 %%<
o #c!V!V!V!Vdo!V!V!VVV #\"""
  #  -l  -l  -l  -l  QU  Qk  -l  -l  -l  *l  *l #\"""		|	|	|	|T=R=Y=Y=[=[	|	|	||| %^$$$	  
h  
h  
h  
hT=R=Y=Y=[=[  
h  
h  
h  h  h %^$$$9!((** 4 4q!566 4ak""""	A?	@	@ 43317333333__):)A)A)C)C______  N  NDIDYdi.>.>.@.@.@_a  N  N  N  N  N  N		1	1	1	1y	1	1	111 W		d	d	d	dT-B-I-I-K-K	d	d	ddd V		`	`	`	`T->-E-E-G-G	`	`	``` V qOOo7ooVZV_V_`lVmVmooppp
;	//KGKKxKKLLLLLrn   c                 J    t          |d         |d         |d                   S )Nr   imgUrlimgDescription)r   r   r0  )r,   )rk   rb   s     rl   
_make_vibez_TwitterAPIScraper._make_vibe  s0    	
v,8n+,
 
 
 rn   c           	      2   d|v r|                      |d                   S t          d |d         D             t          j                            t	          |d                   dz  t          j        j                  t	          |d                             S )	Nedit_control_initialc                 ,    g | ]}t          |          S rr   r  rt   s     rl   rw   z7_TwitterAPIScraper._make_edit_state.<locals>.<listcomp>  s    AAAa3q66AAArn   edit_tweet_idseditable_until_msecsr  tzedits_remaining)r2  r3  r4  )_make_edit_stater-   r   fromtimestampr   r  r  )rk   editControls     rl   r  z#_TwitterAPIScraper._make_edit_state  s    {**


,B C
D
DD	AA;/?#@AAA(66s;G];^7_7_bf7fmum~  nC6  D  D$5677
 
 
 rn   c                     |t           j                            d          |rH|                    d|d                   xr*t	          |d         fdd         D                       S t	          |          S )Nz(Cannot create tombstone without tweet IDrichTextr   c           
          g | ]I}t          d          |d         |d                  |d         d         d|d         |d         f          JS r   	fromIndextoIndexrefrF   Nr  r   )ru   rv   r   s     rl   rw   z6_TwitterAPIScraper._make_tombstone.<locals>.<listcomp>  s      w  w  w  abfanQy\.I!JRSTYRZ[`Ralp}~  @K  ~L  NO  PY  NZ  }[  \  \  \  w  w  wrn   r  )rJ   r   rJ  r   )r   r   r,  r  r0   )rk   r  r  r   s      @rl   _make_tombstonez"_TwitterAPIScraper._make_tombstone  s    _		'	'(R	S	SS	 "txx
DL999t "
	< w  w  w  w  fj  ku  fv  w  w  w    
!
!
!!rn   c                    |d         dk    rn|d         dk    r	|d         }n|d         dk    r)|                      ||                    d                    S |d         dk    r1|t          j                            d          t          |	          S t          j                            d
|d                   |d         }|                     |d         d         t          |d         d                             }d|v r$|                     |d         d                   |d<   d|v rd|d         vrat          
                    d|d          d|                     |           d           t          t          |d                             |d<   n|                     |d         d         t          |d                             |d<   n|                    d          r|d         d         d         dk    r;|                     |d         d         t          |d                             |d<   nK|d         d         }|d         d         d         dvrGt          
                    d|d         d         d         d|                     |           d           n |d         d         d         dk    r|d         }t          t          |d                   	          |d<   nd|v r|d         |                    di                               di                               di                               di                               d          k    r&t          t          |d                   	          |d<   d|v r=|                     |d         t          j        |                     |                    |d<   d |v r|d          d!         d         |d"<   d#|v r(d$|d#         v rt          |d#         d$                   |d%<   d&|v r|                     |d&                   |d&<   d'|v r|                     |d'                   |d(<    | j        ||fi |S ))N
__typenamer   TweetWithVisibilityResultsr   TweetTombstone	tombstoneTweetUnavailablez0Cannot handle unavailable tweet without tweet IDr   zUnknown result type r  coreuser_resultsuser_id_str)r  retweeted_status_resultr  rW   quoted_status_resultzquoted_status_result for quoted_status_id_strz# without an actual result on tweet z, using TweetRefrX   r  quotedRefResult)r   r  zUnknown quotedRefResult type r  rest_idr`   
note_tweetnote_tweet_resultsr  r   r   ra   rb   edit_controlre   )r  r  r   r   r,  r/   r  r   ,_graphql_timeline_tweet_item_result_to_tweetr>  r?  r  r  r  r   r  r  r  )rk   r  r  r  r   rK   qTweets          rl   r  z?_TwitterAPIScraper._graphql_timeline_tweet_item_result_to_tweet  s}   LW$$l;;;7O66l///


w

;(?(?
@
@@l111o
-
(
()[
\
\\

 
 
  		'	'(Wvl?S(W(W	X	XX

%		+	+F6N>,JUXY_`hYijwYxUyUy	+	z	z$%''"OOPUVoPpqyPz{{6
v%%f3444OO  ^6L0M  ^  ^rv  sE  sE  FK  sL  sL  ^  ^  ^  _  _  _$S/E)F%G%GHHF= MMfUkNlmuNv  CF  GL  Mc  Gd  Ce  CeM  f  fF=zz#$$ N),7;KKK MMfUfNghpNq  ~A  BG  H^  B_  ~`  ~`M  a  aF=%&x0F *<8@ggg__  `V<M5Nx5XYe5f  `  `tx  uG  uG  HM  uN  uN  `  `  `  a  a  a  a	!	"8	,\	:>Z	Z	ZWoV$#fY.?*@*@AAAF=&&"#uyy1JB'O'O'S'ST\^`'a'a'e'ef|  A  (B  (B  (F  (F  GO  QS  (T  (T  (X  (X  Yb  (c  (c  c  c$#e4J.K*L*LMMMF=vOOF6NO4KTM_M_`eMfMfgg6&>V-.BCHM6+7fWo55VG_W5666+vOOF6N336&>v..vn/EFF6+		%	0	0	0	00rn   Fc           
   +     K   |D ]}|d         dk    r|d         D ]}|d                              d          rt          |d                             dd          d                   }|d         d	         d
k    r}|d         d         d         dk    red|d         d         d         vr$t                              d|d                      | j        |d         d         d         d         fd|i|V  t                              d           |d                              d          r?|d         d	         dk    r*t          |d         d                   D ]}|d                              |d                             dd          d         dz             r
d|d         vr(t          j        	                    d|d                   t          |d                             dd          d                   }|d         d         d         dk    rSd|d         d         d         v r+ | j        |d         d         d         d         fd|i|V  t          |          V  R|r|d                              d          r|d         d         D ]}|d                              |d          d          r|d         t          |d                   dz   d                              d          r$t                              d|d                     t          |d         t          |d                   dz   d                    } | j        |d         d         d         d         fd|i|V  a|d                              d           s#t                              d!|d                    d S )"Nr   r\  rY  r^  r}  rf  r   r   rb  ra  rc  r`  TimelineTweetr  tweet_resultszSkipping empty tweet entry r  z'Got unrecognised timeline tweet item(s))zhomeConversation-zprofile-conversation-TimelineTimelineModuler  zion-rD   z-tweet-z"Unexpected conversation entry ID: itemr   zconversationthread-   
0123456789zSkipping promoted tweet entry )r_  ztoptabsrpusermodule-ztweetdetailrelatedtweets-zlabel-z Skipping unrecognised entry ID: )rj  r   r  r>  r?  r  reversedr   r   r,  r/   r  strip)rk   rA  includeConversationThreadsr  rv  r[  r  r  s           rl   (_graphql_timeline_instructions_to_tweetsz;_TwitterAPIScraper._graphql_timeline_instructions_to_tweets  s     ! !N !Nk&111I& N NuY""8,, N5#))#q11!455Wi%)???E)DTUbDcdnDo  tC  EC  EC	y)-8I	I	IGU95EGGHHH=D=eI>N}>]^m>now>x  W  W  EL  W  PV  W  W  W  W  W  Woo?@@@@	y		$	$%S	T	T Ni%)AAA5+G455 & &$9o((y)9)?)?)J)J1)MPV)VWW g[dlpqzl{[{[{m,,-eRVW`Ra-e-efffT)_**9a88;<<w
v,}
%j
1_
D
DtF|M2?CCC@t@fmA\]lAmnvAw  V  V  DK  V  OU  V  V  
V  
V  
V  
VW%%%	%	%	%	# 	Ni(8(C(CDY(Z(Z 	Ny!'* T T	i	#	#uY'7$@$@$@	A	A T
y/#eI.//!344
5
;
;L
I
I JiJJKKKT)_Sy)9%:%:Q%>%?%?@AAw>T>tF|M?Z[j?klt?u  T  T  BI  T  MS  T  T  T  T  TT 9(()stt N__Li8HLLMMM=N!N !Nrn   c           	      "   |s|S g }|                     |d |d         d         d                             t          |d           }t          d t          ||dd                    D                       s
J d            t	          j        ||dd                    D ]]\  }}d|v r|                     |d                    |                     ||d         d         ||d         d         nd                     ^d	                    |          S )
NrD   r   c                     | d         d         S )Nr   rD   rr   r\  s    rl   rm   z;_TwitterAPIScraper._render_text_with_urls.<locals>.<lambda>4  s    AiLO rn   )r  c              3   X   K   | ]%\  }}|d          d         |d          d         k    V  &dS )r   r   rD   Nrr   )ru   rF   nextUrls      rl   r~   z<_TwitterAPIScraper._render_text_with_urls.<locals>.<genexpr>5  s>      ``LCS^A')"4Q"77``````rn   r   zbroken URL indicesr  r   )r  r  r  zip	itertoolszip_longestr   )rk   r   r  out
urlsSortedrF   r  s          rl   r  z)_TwitterAPIScraper._render_text_with_urls/  s2   	 
;
#**T(479%a(()***d";";<<<*	``CPTVZ[\[][]V^L_L_```	`	`vvbvvv	`+D$qrr(;; ` `lc7sJJs=!"""::d3y>!$@Swy'9!'<'<Y]]^____	rn   c           	      .   |d         |d<   |r|n d|v r|d         nt          |d                   |d<   |d         |d<   |d         |d<   |                     |d         |d	         d                             d
                    |d<   |d	         d                             d
          r!d |d	         d         d
         D             |d<   |                    d          |d<   t          j                            |d                   |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   |                    d          |d<   |                    d          r|d	                             di                               d
d g          d          }|r|d         |d         k    r#t                              d!|d                     |sd"d t          |d                   fi}t          |                    d#          |                    d$|d                   |d         t          |d"                   %          |d&<   |d'         |d(<   |                    d)          |d*<   d+|vrC|                    d,i                               d+          x}r|                     |          |d+<   d-|vr|                    d.          |d-<   d/|vr|                    d0          |d/<   t          d1i |S )2Nr  rg   rJ   r  r   rM  r   rN  r  r  rO  c                     g | ]G}t          |                    d           |d         |d         t          |d                             HS r  r  rt   s     rl   rw   z4_TwitterAPIScraper._user_to_user.<locals>.<listcomp>C  sl     !U !U !U
 () "**+%%*>*>)*>):,-eH-21Y<-@-@	"# "# "# !U !U !Urn   rP  rQ  r  rR  followers_countrS  friends_countrT  statuses_countrU  favourites_countrV  listed_countrW  media_countrX  rY  rZ  rF   rD   zLink inconsistency on user r   r  r  r  r[  profile_image_url_httpsr\  profile_banner_urlr]  r   affiliates_highlighted_labelr^  is_blue_verifiedr_  verified_typerr   )r   r  r  r  r  r  r>  r?  r  r   r  _user_label_to_user_labelr1   )rk   rK   id_r  entitylabelOs         rl   rk  z _TwitterAPIScraper._user_to_user<  s   M*&Ttt||dT(^ATAT&,v,&!-0&	"&"="=d=>QSWXbScdqSrSvSvw}S~S~""&		*m$((00 U!U !U
 -1,<],KF,S!U !U !U6
 xx
++&k77\8JKK&!"34&	0& !12&"#56&	~.&m,&J'&--&	XXe__ h  ++//??B6
 BF5MT%[00OO@&,@@AAA
 0!Se--./FFJJ}$=$=VZZP^`dej`kElElw{  }B  xC  OT  U[  \e  Uf  Og  Og  h  h  h6&>"#<=&	#xx(<==&	F$((3QSU*V*V*Z*Z[b*c*c c33F;;6'?6HH/006&>v116*	rn   c                     i }|d         |d<   d|v rd|d         v r|d         d         |d<   d|v rd|d         v r|d         d         |d<   d|v rd|d         v r|d         d         |d<   t          di |S )Nr   rF   badgerl  rm  r   rr   )r2   )rk   r   labelKwargss      rl   r   z,_TwitterAPIScraper._user_label_to_user_labeld  s    +$]3+m
e^^u--eU+;u%5>11"7^E2;z%Fe4E.F$F$F$)*;$<V$D; !		!	![	!	!!rn   c                 @   |d|vrd S t          |d         t                    r	|d         }n|d                             d          rm	 t          j        |d                   }n# t
          $ r Y d S w xY w|                    d          sJ t          |                    dd          d                   }i d|v rV|d         d         dk    rDd	|d         v r:|d         d	         d
         d
<   fd|d         d	         d         D             d<   t          dd|iS )NrJ   VXNlclJlc3VsdHM6s   UserResults:   :r   r  r  UserUnavailableunavailable_messager   c           
          g | ]I}t          d          |d         |d                  |d         d         d|d         |d         f          JS r  r  )ru   rv   r  s     rl   rw   zH_TwitterAPIScraper._graphql_user_results_to_user_ref.<locals>.<listcomp>  s      b  b  b  lm(&.;)9T*U]^_d]efk]lw{  IJ  KV  IW  YZ  [d  Ye  Hf  g  g  g  b  b  brn   r  rJ  rr   )r  r   rj  base64	b64decoder   r  r3   )rk   r?  r  r  s      @rl   !_graphql_user_results_to_user_refz4_TwitterAPIScraper._graphql_user_results_to_user_refo  s   ^
#oo4TC   	+YFFD	/00 +s4y))VV   DD_-----dA&&q)**F&__X|48IIINcgjksgtNtNtM"78@6&> b  b  b  b  qt  u}  q~  T  qU  V`  qa  b  b  b6+		'	'f	'	'	''s   
A% %
A32A3c                    d|vs|d         d         dk    r|                      ||          S i }|d         d         |d<   |d         d                             d          x}r|                     |          |d<   d|d         v r)t                              |d         d                   |d	<    | j        |d         d
         fd||nt          |d         d                   i|S )Nr  r  r
  r  r^  r  r   profile_image_shaper`  r  r  r  )r  r  r   r4   r}  rk  r   )rk   resultsr  r  r  s        rl   r  z0_TwitterAPIScraper._graphql_user_results_to_user  s3   W 1, ?CT T T

0
0&
A
AA&8$%78&.!"@AEEgNNNf <33F;;6'?gh///!2!G!GPXHYZoHp!q!q6
		GH-h7  
N  
NI[vvadelmuev  xA  fB  bC  bC  
N  GM  
N  
N  Nrn   c                 `    t                      |d<    t                      j        |g|R i |S )Nr  )r  r  _cli_construct)r@  argparseArgsr  r  r  s       rl   r  z!_TwitterAPIScraper._cli_construct  s;     5 7 7&				>t	>	>	>v	>	>>rn   r}   )NNNN)F)r   r   r   r  r  r/  r1  rC  rQ  r  r  rz  ri  r  r  r  r  r  r  r  r  r  r  rk  r   r  r  rC  r  r  r  s   @rl   r  r    s       48! : : : : : : :&  
D D D D.( ( (
  @    IMW[iy  jA  VZ ^- ^- ^- ^-@[ [ [@ @ @a a a aF'V 'V 'VROM OM OMb
    
" 
" 
"11 11 11 11f"N "N "N "NH  & & & &P	" 	" 	"( ( ( ((	N 	N 	N 	N ? ? ? ? +? ? ? ? ?rn   r  c                   0    e Zd ZdZdZdZed             ZdS )r8   liverU  rK   c                 H    |j         r| j        S |j        r| j        S | j        S r}   )rU  r  rK   r  LIVEr@  r  s     rl   _cli_from_argsz'TwitterSearchScraperMode._cli_from_args  s+    	X 
'>	Y 
(?	/rn   N)r   r   r   r  r  r  rC  r  rr   rn   rl   r8   r8     s<          +  rn   r8   c                   j     e Zd ZdZdej        ddd fd
Zd Zed             Z	ed             Z
 xZS )	r9   ztwitter-searchN   )rT  r  rU  r  c                j   |                                 st          d          |t          t                    vrt          d          ||d<    t	                      j        dddt          j                            dd|dd	          z   i| || _	        |&t          j        d
t          j        j        d           || _        |et            d|rdndz   }t          j        d| dt#          |           dt          j        j        d           |rt          j        nt          j        }|| _        d S )Nempty queryz0invalid mode, must be a TwitterSearchScraperModer  r  zhttps://twitter.com/search?r  enspelling_expansion_revert_click)frQ   qsrcz#the `cursor` argument is deprecatedr  )
stacklevelz.TwitterSearchScraperMode.r  r  z*`top` argument is deprecated, use `mode = z` instead of `top = `rr   )r  r   r  r8   r  r  r  r  rM  _querywarningsr<  r   r   DeprecatedFeatureWarning_cursorr   r   r  r  _mode)	rk   queryrT  r  rU  r  r  replacementr  s	           rl   r  zTwitterSearchScraper.__init__  s   	 #	M	"	""	/0000	F	G	GG)&%''  r  r:V\=S=SZ`jnuz  De  Uf  Uf  >g  >g  g  r  kq  r  r  r$+=68^mnoooo$,_888S<TEEfU;=kkkk_cdg_h_hkkkmumz  nT  cd  e  e  e  e*-
P
"
&
&3K3P4$***rn   c           	   #     K   | j                                         st          d          | j        t          j        u rt          j                            d          | j         dd | j        t          j	        u rdnddddd}|
                                }|d= i d	dd
dddddddddddddddddddddddddddddddddddddd}||d}||d}|                     dt          j        ||| j        g d          D ];}|                     |d          d!         d"         d#         d$                   E d {V  <d S )%Nr  z#User searches currently unsupportedr  LatestTopF)rawQueryr   rT  productwithDownvotePerspectivewithReactionsMetadatawithReactionsPerspectiverT  $rweb_lists_timeline_redesign_enabled)blue_business_profile_image_shape_enabled0responsive_web_graphql_exclude_directive_enabledTverified_phone_label_enabled/creator_subscriptions_tweet_preview_api_enabled2responsive_web_graphql_timeline_navigation_enabledAresponsive_web_graphql_skip_user_profile_image_extensions_enabled(tweetypie_unmention_optimization_enabledvibe_api_enabled%responsive_web_edit_tweet_api_enabled:graphql_is_translatable_rweb_tweet_is_translatable_enabled"view_counts_everywhere_api_enabled'longform_notetweets_consumption_enabled tweet_awards_web_tipping_enabled)freedom_of_speech_not_reach_fetch_enabledstandardized_nudges_misinfoGtweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled)interactive_text_enabled)responsive_web_text_conversations_enabled*longform_notetweets_rich_text_read_enabled(longform_notetweets_inline_media_enabled$responsive_web_enhance_cards_enabled5responsive_web_twitter_blue_verified_badge_is_enabledrS  featureszGhttps://twitter.com/i/api/graphql/7jT5GT59P8IFjgxwqnEdQw/SearchTimeline)r  search_by_raw_querysearch_timelinetimelinerA  )rT  r>  r  rO  rP  rQ  rA  )r'  r  r   r+  r8   r  r   r   r,  r  rg  rz  r  r   r*  r  rk   paginationVariablesrS  rN  rL  rl  r?  s          rl   	get_itemszTwitterSearchScraper.get_items  s     					 #	M	"	""	Z+000		'	'(M	N	NN {*(@(EEEhh5#!$  "&&(())5. 6t "5	
 5e 8 G .t t +D @ ( -d &u /  !$!" Me#$  $0516/4+0<@/  (2 #99&#6HMM  !jl{  mD  FL  N^  im  iu  JX  JX  JX   Y  Y O Oc;;CKH]<^_p<qr|<}  M  =N  O  O  O  O  O  O  O  O  O  OO Orn   c                 p   |                     ddd           |                    d          }|                     dddd	
           |                     dddd
           |                     dddt          dd           |                     dt          j                            d          d           d S )Nz--cursorCURSORz(deprecated))metavarhelpFrequiredz--top
store_truez/Search top tweets instead of live/chronologicalrZ  defaultrX  z--userzSearch users instead of tweetsz--max-empty-pagesr  Nr  z:Stop after N empty pages from Twitter; set to 0 to disable)destrW  r   r]  rX  r,  zA Twitter search stringr   rX  )add_argumentadd_mutually_exclusive_groupr   r   r  nonempty_string_argr@  	subparserr)  s      rl   _cli_setup_parserz&TwitterSearchScraper._cli_setup_parser  s    xOOO

0
0E
0
B
B%W|uM~XNnooo,_PS\_km  ws  t  t  t)K)KG)T)T]vwwwwwrn   c                     |                      ||j        |j        t                              |          |j                  S )N)rT  r  r  )r  r,  rT  r8   r  r  r  s     rl   r  z#TwitterSearchScraper._cli_from_args  sJ    			D$*t{KcKrKrswKxKx  KO  K]	  
^  
^  ^rn   )r   r   r   r   r8   r  r  rT  rC  rf  r  r  r  s   @rl   r9   r9     s        '+4L4QY]oq       ".O .O .O` x x +x ^ ^ +^ ^ ^ ^ ^rn   r9   c                   t     e Zd ZdZ fdZd Z fdZed             Ze	d             Z
e	d             Z xZS )r:   ztwitter-userc                    t          |t                    | _        | j        s$|                     |          st	          d           t                      j        d| fi | || _        | j        s
d| j         n	d| j         | _        d S )NzInvalid usernamefrom:ri  rp  )	r  r   	_isUserIdis_valid_usernamer   r  r  _userr  )rk   rK   r  r  s      rl   r  zTwitterUserScraper.__init__  s    dC(($.	 ( 6 6t < < (	&	'	''%''>4>>,,V,,,$*=A^{5555Q{osoyQ{Q{$---rn   c                    |                                   | j        sd}d}nd}d}|t          | j                  ddi}dddddddd}|                     |t
          j        ||d	d
dg          }|d
         rd|d
         d         vrt          j        	                    d          |d
         d         d         d         dk    rt          j        
                    d          |                     |d
         d                   S )Nr  zIhttps://twitter.com/i/api/graphql/pVrmNaXcxPjisIvKtLDMEA/UserByScreenNamer  zEhttps://twitter.com/i/api/graphql/1YAM811Q8Ry4XyPpJclURQ/UserByRestIdwithSafetyModeUserFieldsTF)r7  r8  r9   highlights_tweets_tab_ui_enabledr:  r<  r;  rM  r  rK   rL  r>  r  Empty responser  r
  User unavailable)r/  rk  r   rm  rQ  r  r   r   r   r,  EntityUnavailabler  )rk   	fieldNamerP  rS  rN  r?  s         rl   _get_entityzTwitterUserScraper._get_entity  s:   	 V9Y889U8#dj//+EtL)047;#(',6;HM9= ( 	8_%<U^ltGuGu  LR  TZ  K[  	\  	\#	V :FF(;;;		'	'(8	9	99["<04EEE		(	();	<	<<		+	+CK,?	@	@@rn   c              #     K   | j         rV| j        (t          j                            d| j        d          | j        j        | _        d| _         d| j         | _        t                      	                                E d {V  d S )NzCould not resolve user ID z to usernameFrj  )
rk  r  r   r   r,  rm  rg   r'  r  rT  )rk   r  s    rl   rT  zTwitterUserScraper.get_items  s      	^ &
k
-
(
()`dj)`)`)`
a
aa$4:4>%%%4;WW           rn   c                     dt          |           cxk    odk    nc o2|                     t          j        t          j        z   dz             dk    S )Nr   r  r  r   )r  r  stringascii_lettersdigits)r|  s    rl   rl  z$TwitterUserScraper.is_valid_username"  sP    	
c!ff									Xqwwv';fm'Kc'QRRVXXXrn   c                 v      fd}|                     ddddd           |                     d|d	
           d S )Nc                 x                         |           s|                                 r| S t          d          )NzInvalid username or ID)rl  isdigitr   )r|  r@  s    rl   rK   z2TwitterUserScraper._cli_setup_parser.<locals>.user(  s<    	A !))++ H	,	-	--rn   z	--user-idisUserIdr[  FzUse user ID instead of username)r_  rZ  r]  rX  rK   zA Twitter username (without @)r`  )ra  )r@  re  rK   s   `  rl   rf  z$TwitterUserScraper._cli_setup_parser&  sn    . . . . .
 Z,Z_  iJ  K  K  K5UVVVVVrn   c                 p    |                      ||j        rt          |j                  n|j                  S )N)rK   )r  r  r   rK   r  s     rl   r  z!TwitterUserScraper._cli_from_args0  s0    			D4=)WTYdi		X	XXrn   )r   r   r   r   r  rv  rT  staticmethodrl  rC  rf  r  r  r  s   @rl   r:   r:     s        | | | | |A A A2! ! ! ! ! Y Y ,Y W W +W Y Y +Y Y Y Y Yrn   r:   c                       e Zd ZdZd ZdS )r;   ztwitter-profilec           	   #     K   | j         s<| j        (t          j                            d| j        d          | j        j        }n| j        }|dd ddddd}|                                }|d= i ddd	dd
ddddddddddddddddddddddddddddddddddd}||d}||d}d}t                      }| 	                    dt          j        ||g d          D ]}	|	d         rd|	d         d          vrt          j                            d!          |	d         d          d         d"         d#k    rt          j                            d$          |	d         d          d         d%         d&         d'         }
|s|
D ]}|d(         d)k    rd}|d*         d+                             d,          r#t          |d*         d+         d-d                    nd }|                     |d*         d.         d/         d0         d         |d1          V  t!          |                     |
d2                    }t%          d3 |D                       }t'          |          d4k    r!||v rt(                              d5            d S |                    |           |D ]+}t/          t/          |d d           d6|          |k    r'|V  ,d S )7NzCould not resolve username z to IDd   T)r  r   rT  includePromotedContentwithCommunity	withVoicewithV2TimelinerT  r6  Fr7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rM  zMhttps://twitter.com/i/api/graphql/fn9oRltM1N4thkh5CVusPg/UserTweetsAndReplies)r  rK   r  timeline_v2rQ  rA  rW  r  r  rK   rr  r  r
  rs  r  rQ  rA  r   TimelinePinEntryr[  r^  r}     r   rc  r  )r  rd   )rd   c              3   $   K   | ]}|j         V  d S r}   r   )ru   r   s     rl   r~   z2TwitterProfileScraper.get_items.<locals>.<genexpr>v  s$      99EH999999rn   rD   zWFound duplicate page of tweets, stopping as assumed cycle found in Twitter's paginationrJ   )rk  r  r   r   r,  rm  rJ   rg  r-  rz  r  r   rt  rj  r   r  listr  	frozensetr  r>  r?  r  ri   )rk   r  rS  rS  rN  rL  rl  	gotPinnedpreviousPagesTweetIdsr?  rA  rv  r  tweetspageTweetIdsr   s                   rl   rT  zTwitterProfileScraper.get_items8  s=     	 
k
-
(
()[tz)[)[)[
\
\\KN66J6 !  "&&(())5. 6t "5	
 5e 8 G .t t +D @ ( -d &u /  !$!" Me#$  $0515/4+0-  (2 #99&#6HMM)%%  !p  sB  sJ  LR  Td  y~  y~  y~       c
f+ ;VV)<<<
-
(
()9
:
::	&k&(#L15FFF
-
)
)*<
=
==f+f%h/>zJ>Z<
 k# k kF111i<G<PQZ<[<f<fgo<p<pzK(3ABB7888vzg==k'>RS\>]^k>lm|>}  G  ?H  T[  fj=  k  k  k  k  k>>|V[>\\]]699&99999<	,!0E E EOOmnnn	EE\***  uwufd++T6::fDD
KKKK' rn   N)r   r   r   r   rT  rr   rn   rl   r;   r;   5  s-        G G G G Grn   r;   c                   N     e Zd ZdZ fdZed             Zed             Z xZS )r<   ztwitter-hashtagc                 P     t                      j        d| fi | || _        d S )N#)r  r  _hashtag)rk   hashtagr  r  s      rl   r  zTwitterHashtagScraper.__init__  3    %''=w==++F+++$---rn   c                 p    |                     dt          j                            d          d           d S )Nr  zA Twitter hashtag (without #)r`  ra  r   r  rc  r@  re  s     rl   rf  z'TwitterHashtagScraper._cli_setup_parser  G    8>+M+Mi+X+X  bA  B  B  B  B  Brn   c                 8    |                      ||j                  S r}   )r  r  r  s     rl   r  z$TwitterHashtagScraper._cli_from_args      			D$,	/	//rn   	r   r   r   r   r  rC  rf  r  r  r  s   @rl   r<   r<     v             B B +B 0 0 +0 0 0 0 0rn   r<   c                   N     e Zd ZdZ fdZed             Zed             Z xZS )r=   ztwitter-cashtagc                 P     t                      j        d| fi | || _        d S )N$)r  r  _cashtag)rk   cashtagr  r  s      rl   r  zTwitterCashtagScraper.__init__  r  rn   c                 p    |                     dt          j                            d          d           d S )Nr  zA Twitter cashtag (without $)r`  r  r  s     rl   rf  z'TwitterCashtagScraper._cli_setup_parser  r  rn   c                 8    |                      ||j                  S r}   )r  r  r  s     rl   r  z$TwitterCashtagScraper._cli_from_args  r  rn   r  r  s   @rl   r=   r=     r  rn   r=   c                   0    e Zd ZdZdZdZed             ZdS )r>   singlescrollrecursec                 H    |j         r| j        S |j        r| j        S | j        S r}   )r  SCROLLr  RECURSESINGLEr  s     rl   r  z&TwitterTweetScraperMode._cli_from_args  s.    	[ 
*	\ 
+	rn   N)r   r   r   r  r  r  rC  r  rr   rn   rl   r>   r>     s<        

  +  rn   r>   c                   p     e Zd ZdZej        d fd
Zd Zd Zd Z	e
d             Ze
d             Z xZS )	r?   ztwitter-tweetr  c                h    || _         || _         t                      j        d| j          fi | d S rF  )_tweetIdr+  r  r  )rk   r  r  r  r  s       rl   r  zTwitterTweetScraper.__init__  sA    $-$*%''Ft}FFQQ&QQQQQrn   c              #   @  K   t          | j                  d ddddddddd
}|                                }|d= |d= i ddddd	dd
ddddddddddddddddddddddddddddddddd}||d}||d}d}g d}| j        t          j        u r|                     |t          j        ||          }|d         sd S |d         d         d         D ]}	|	d          d!k    r|	d"         D ]x}
|
d#         d$| j         k    rb|
d%         d&         d'k    rP|
d%         d(         d)         d*k    r8| 	                    |
d%         d(         d+         d,         | j        -          V   nyd S | j        t          j
        u rd}|                     |t          j        ||t          j        |.          D ]W}|d         s|                     |d         d         d         d/          E d {V  |p|                     || j                  }X|r"|                     | j                  E d {V  d S d S | j        t          j        u rt%                      }t'          j                    }|                    | j                   |r|                                }t          j        |          }t          |          |d0         d1<   t          j        |          }|d0         d= |d0         d= d}|                     |t          j        ||t          j        |.          D ]}|d         s|                     |d         d         d         d/          D ]S}|j        |vrH|V  |                    |j                   |j        | j        k    r|                    |j                   T|p|                     ||          }|rY|                     |          D ]C}|j        |vr8|V  |                    |j                   |                    |j                   D|d S d S d S )2Nr   FT)
focalTweetIdrT  referrerwith_rux_injectionsr  r  &withQuickPromoteEligibilityTweetFieldswithBirdwatchNotesr  r  rT  r  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  r  rM  zDhttps://twitter.com/i/api/graphql/miKSMGb2R1SewIJv2-ablQ/TweetDetail)r  (threaded_conversation_with_injections_v2rA  rq  r  r  rA  r   r\  rY  r^  r}  r   rb  ra  rc  r`  r  r  r  r  rm  r>  r  rS  r  )r   r  rg  r+  r>   r  rQ  r  r   r  r  rz  r  r  r  _has_moderated_replies_get_moderated_repliesr  r-  collectionsdequer  popleftrh  rJ   r  )rk   rS  rS  rN  rL  rl  rF   r>  r?  rv  r[  hasModeratedReplies
seenTweetsqueuer  thisPagParams
thisParamsr   s                     rl   rT  zTwitterTweetScraper.get_items  s0     t}%%!-1  "&&(()9Z0)5. 6t "5	
 5e 8 G .t t +D @ ( -d &u /  !$!" Me#$  $0515/4+0-  (2 #99&#6HMMN#YYY	Z*111			C!86^n		o	o3
f+ 
F&k"LMn]  {6222Y'  i4T]4444y9I+9VZp9p9puz  |E  vF  GT  vU  V`  va  et  vt  vt==eI>N}>]^m>now>x  EI  ER=  S  S  S  S  Se  z,333!!#'>HXfvf{  Qa!  b  b a asv; <<S[Is=t  vD  >E  dh<  i  i  i  i  i  i  i  i  i-`1L1LSRVR_1`1` :**4=99999999999: :z,444:5<<	 mmooGM"233M14WM+~.}--Jk"8,mK.H.T""3(?]hxh}  Sc"  d  d 	\ 	\K ??FLv@w  yG  AH  gk?  l  l  		#	#{{{~~eh
(dm
#
#UX.[$2M2McSZ2[2[ --g66  		#	#{{{~~eh||EH- 
   	 54 rn   c                 "   |d         d         d         D ]y}|d         dk    r|d         D ]a}|d         d| k    rP|d	         d
         dk    r>|d	         d         d         dk    r&|d	         d                              dd          c c S bzdS )Nr  r  rA  r   r\  rY  r^  r}  r   rb  ra  rc  r`  r  r  Fr  )rk   r?  r  rv  r[  s        rl   r  z*TwitterTweetScraper._has_moderated_replies  s    [!KL^\ N Nk&111I& N NuY-G----%	2B;2OSi2i2inst}n~  @M  oN  OY  oZ  ^m  om  om)]+//0EuMMMMMMMN 
rn   c              #     K   t          |          dd dd}|                                }|d= i ddddddd	dd
dddddddddddddddddddddddddddi}||d}||d}d}g d}|                     |t          j        ||t
          j        |          D ]C}	|                     |	d         d         d         d         d          d!         d"          E d {V  Dd S )#Nr  F)rootTweetIdr   rT  r  rT  r6  Tr8  r9  r:  r;  r<  r=  r?  r@  rA  rB  rC  rD  rE  rF  rI  rJ  rK  rM  zJhttps://twitter.com/i/api/graphql/pOVQRe-x12WZeawviP7zxw/ModeratedTimeline)r  r   r  timeline_responserQ  rA  r  r  r   r  r  rQ  rA  r  )r   rg  rz  r  r   r  r  r  )
rk   r  rS  rS  rN  rL  rl  rF   r>  r?  s
             rl   r  z*TwitterTweetScraper._get_moderated_replies  s     g,,"	  "&&(())45t "5 5d	
 8 G .t +D @ ( -d &u / !$ Me  0!" .u#$ *5% (* #99&#6HMMT#aaa  o&=vGWeuez  P`   a  a p pc;;CK<PQY<Z[n<opz<{  }K  =L  ko;  p  p  p  p  p  p  p  p  p  pp prn   c                     |                     d          }|                    dddd           |                    ddddd	           |                    d
t          d           d S )NFrY  z--scrollr[  z#Enable scrolling in both directionsr\  z	--recursez--recursivez^Enable recursion through all tweets encountered (warning: slow, potentially memory-intensive!)r  z
A tweet IDr`  )rb  ra  r   rd  s      rl   rf  z%TwitterTweetScraper._cli_setup_parserC  s    

0
0E
0
B
B%Z,%Puvvv[-,RW  aA  B  B  B3|DDDDDrn   c                 l    |                      ||j        t                              |                    S )Nr  )r  r  r>   r  r  s     rl   r  z"TwitterTweetScraper._cli_from_argsJ  s/    			D$,7N7]7]^b7c7c		d	ddrn   )r   r   r   r   r>   r  r  rT  r  r  rC  rf  r  r  r  s   @rl   r?   r?     s        '>'E R R R R R R R
Z Z Zx  $p $p $pL E E +E e e +e e e e ern   r?   c                   N     e Zd ZdZ fdZed             Zed             Z xZS )r@   ztwitter-list-postsc                 P     t                      j        d| fi | || _        d S )Nzlist:)r  r  	_listName)rk   listNamer  r  s      rl   r  z TwitterListPostsScraper.__init__R  s6    %''%8%%00000$...rn   c                 p    |                     dt          j                            d          d           d S )Nr  zZA Twitter list ID or a string of the form "username/listname" (replace spaces with dashes)r`  r  r  s     rl   rf  z)TwitterListPostsScraper._cli_setup_parserV  sG    (J(J6(R(R  \x  y  y  y  y  yrn   c                 8    |                      ||j                  S r}   )r  r  r  s     rl   r  z&TwitterListPostsScraper._cli_from_argsZ  s    			D$)	,	,,rn   r  r  s   @rl   r@   r@   O  sv             y y +y - - +- - - - -rn   r@   c                   Z     e Zd ZdZ fdZd Zd Zed             Zed             Z	 xZ
S )rA   ztwitter-communityc                 Z    || _          t                      j        d| j          fi | d S )Nz"https://twitter.com/i/communities/)_communityIdr  r  )rk   communityIdr  r  s      rl   r  z TwitterCommunityScraper.__init__b  s<    !$%''K8IKKVVvVVVVVrn   c                                                        t           j                  dddddddddd}                     dt          j        |ddg	          }|d         rd
|d         d         vrt          j                            d          |d         d         d
         d         dk    rt          j        	                    d          |d         d         d
         }i }d|v r|d         |d<   t          d$t          |d                   |d         t          j                            |d         dz  t          j        j                                       |d                                        |d                    fd|d         D             |d         |d         d |d         D             |                    d|d                   |                    d|d                    d!         d"         d#|S )%NF)r  withDmMutingro  T)r7  r8  r<  r;  r9  rM  zQhttps://twitter.com/i/api/graphql/bC3Saf4niY6YuzJWV2oUGg/CommunitiesFetchOneQueryr  communityResultsrq  r  rr  r  CommunityUnavailableCommunity unavailabler   r  r   r  r  r  admin_resultscreator_resultsc                 :    g | ]}                     |          S rr   )r  )ru   ra  rk   s     rl   rw   z7TwitterCommunityScraper._get_entity.<locals>.<listcomp>  s'    kkkd88;;kkkrn   members_facepile_resultsmoderator_countrf  c                     g | ]
}|d          S )r   rr   )ru   r  s     rl   rw   z7TwitterCommunityScraper._get_entity.<locals>.<listcomp>  s    222!AfI222rn   r  custom_themedefault_themecustom_banner_mediadefault_banner_media
media_infooriginal_img_url)rJ   r   rR  r  r  r  r  r  r  r  r  rr   )r/  r   r  rQ  r  r   r   r   r,  rt  r5   r   r   r  r  r  r  r  )rk   rL  r?  	communityr  s   `    rl   rv  z#TwitterCommunityScraper._get_entityf  sU    t()) %  268<IN:>$)  & 	np  qH  SY  ou  wI  nJ  	K  	K#	V :F4F(GGG		'	'(8	9	99[#$X.|<@VVV		(	()@	A	AA&k,-h7))i'69]	 
Ih  
F
,,Y|-Dt-KRZRcRg,hh--i.HII//	:K0LMMkkkkYOiEjkkk01N+22y1222==?)CDD}}2I>T4UVVWcdewx
 
 
 
 rn   c              #   H  K   dd t          | j                  dd}|                                }|d= |d= i ddddd	dd
ddddddddddddddddddddddddddddddddd}||d}||d}|                     dt          j        ||g d          D ]~}|d         d         d         d          d!k    rt          j                            d"          | 	                    |d         d         d         d#         d$         d%                   E d {V  d S )&Nr  T)r   rT  r  r  r   rT  r6  Fr7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  r  rM  zPhttps://twitter.com/i/api/graphql/9nnDM-yum8Te--T2REfgkg/CommunityTweetsTimeline)r  r  r  community_timelinerQ  rA  rW  r  r  r  r  r  r  r  rQ  rA  )
r   r  rg  rz  r  r   r   r   rt  r  rR  s          rl   rT  z!TwitterCommunityScraper.get_items  so     d'((	  "&&(())H-)5. 6t "5	
 5e 8 G .t t +D @ ( -d &u /  !$!" Me#$  $0515/4+0-  (0 #99&#6HMM  !s  vE  vM  OU  Wg  |T  |T  |T   U  U Y Yc	&k$%h/=AWWW
-
)
)*A
B
BB;;CKHZ<[\d<efz<{  }G  =H  IW  =X  Y  Y  Y  Y  Y  Y  Y  Y  Y  YY Yrn   c                 @    |                     dt          d           d S )Nr  zA community IDr`  ra  r   r  s     rl   rf  z)TwitterCommunityScraper._cli_setup_parser  s$    s;KLLLLLrn   c                 8    |                      ||j                  S r}   )r  r  r  s     rl   r  z&TwitterCommunityScraper._cli_from_args  s    			D$"2	3	33rn   )r   r   r   r   r  rv  rT  rC  rf  r  r  r  s   @rl   rA   rA   _  s        W W W W W& & &P'Y 'Y 'YR M M +M 4 4 +4 4 4 4 4rn   rA   c                   (     e Zd ZdZ fdZd Z xZS )rB   ztwitter-trendsc                 :     t                      j        di | d S )Nhttps://twitter.com/i/trends)r  )r  r  )rk   r  r  s     rl   r  zTwitterTrendsScraper.__init__  s&    %''<<V<<<<<rn   c              #     K   i ddddddddddddddd	dd
dddddddddddddddddddddddddddddd}|                      dt          j        |          }|d         d         D ]}d|vr|d         d         D ]y}|d          dk    r|d!         d"         d#         D ]U}|d$         d!         d%         }t          |d&         |d'                             d(          |d'         d)         *          V  Vzd S )+N!include_profile_interstitial_type1include_blockinginclude_blocked_byinclude_followed_byinclude_want_retweetsinclude_mute_edgeinclude_can_dminclude_can_media_taginclude_ext_has_nft_avatarskip_statuscards_platformzWeb-12include_cardsinclude_ext_alt_texttrueinclude_quote_countinclude_reply_count
tweet_modeextendedinclude_entities20trendsfalsez`mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,enrichments,superFollowMetadata,unmentionInfo)include_user_entitiesinclude_ext_media_colorinclude_ext_media_availability#include_ext_sensitive_media_warning$include_ext_trusted_friends_metadatasend_error_codessimple_quoted_tweetr   candidate_sourceinclude_page_configurationentity_tokensr  z&https://twitter.com/i/api/2/guide.jsonrQ  rA  rX  rY  r^  r   timelineModuler  r  trendr   trendMetadatar  r  )r   r  r  )rQ  r  r  r6   r  )rk   rL  r?  rv  r[  r  r  s          rl   rT  zTwitterTrendsScraper.get_items  s2     &s  #	
 C  S C   # X C 6 & #  !" v#$ #$%+*0+1 !(
l;  &> 	C_EWY_``#_^4 a ak
+
%
%L))4 a auY8##i !127; a a&\)$W-Uf9O9S9STe9f9fx}  N  yO  P_  y`  a  a  a  a  a  a  aaaa arn   )r   r   r   r   r  rT  r  r  s   @rl   rB   rB     sS        = = = = =)a )a )a )a )a )a )arn   rB   c                   T     e Zd ZdZ fdZd Zed             Zed             Z xZ	S )rC   ztwitter-usersc                 f    || _          t                      j        d| j         d          fi | d S )Nrp  rD   )_userIdsr  r  )rk   userIdsr  r  s      rl   r  zTwitterUsersScraper.__init__  s?    $-%''Cq1ACCNNvNNNNNrn   c              #   >  K   dd | j         D             i}ddddd}|                     dt          j        ||ddd	g
          }t	          |d         d	                   D ]<\  }}|st
                              d|            %|                     |          V  =d S )Nr  c                 ,    g | ]}t          |          S rr   )r   rt   s     rl   rw   z1TwitterUsersScraper.get_items.<locals>.<listcomp>  s    999a3q66999rn   TF)r8  r9  r<  r;  zGhttps://twitter.com/i/api/graphql/GD4q8bBE2i6cqWw2iT74Gg/UsersByRestIdsrM  r  rh  rq  z+Skipping empty response object at position )r  rQ  r  r   	enumerater>  r?  r  )rk   rS  rN  r?  ir  s         rl   rT  zTwitterUsersScraper.get_items  s      994=999:)7;#(HM9=	 ( 	dfuf}  W`  nv  Iw  Iw  MS  U\  L]  	^  	^#FG,-- / /da
 OOE!EEFFF		+	+A	.	.....	/ /rn   c                 B    |                     dt          dd           d S )Nr  +zA numeric user ID)r   nargsrX  r  r  s     rl   rf  z%TwitterUsersScraper._cli_setup_parser	  s&    #sCVWWWWWrn   c                 8    |                      ||j                  S r}   )r  r  r  s     rl   r  z"TwitterUsersScraper._cli_from_args	  s    			D$+	.	..rn   )
r   r   r   r   r  rT  rC  rf  r  r  r  s   @rl   rC   rC     s        O O O O O/ / / X X +X / / +/ / / / /rn   rC   )DescriptionURL){__all__r  r  rg  dataclassesr   email.utilsr  r  r  rN  r  r  r  loggingr  r&  requests.adaptersrequestssnscrape.baser   snscrape.utilsry  r  r   urllib.parser  urllib3.util.ssl_r  r(  	getLoggerr   r>  r  r	  r  r  	dataclassr   Itemr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   Enumr.   r/   r0   r1   r2   r3   r4   r5   r6   r  r7   r  _HTTPSAdapterr  r  Scraperr  r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r  module_deprecation_helper__getattr____dir__rr   rn   rl   <module>r6     s  C C CL                             				 				                         '
H
%
% L    q + + + + +HM + + +\ ! ! ! ! ! ! ! !        & & & & &F & & &         & & & & &F & & & & & & & && & & &        
                - - - - -$ - - -     k    ( ( ( ( (t ( ( ( $ $ $ $ $ $ $ $
 * * * * * * * * ( ( ( ( (T ( ( (        
 * * * * *D * * * 
* 
* 
* 
* 
*T 
* 
* 
*         	3 	3 	3 	3 	3 	3 	3 	3 ' ' ' ' 'T ' ' ' ' ' ' ' '$ ' ' '     $   
 * * * * *D * * * 	 	 	 	 	 	 	 	
     D         p p p p p$ p p p        + + + + +'A + + +
 + + + + +'A + + +
 + + + + +,F + + + + + + + + + + +
 7 7 7 7 7/I 7 7 7 + + + + + + + +
 + + + + +)C + + +
 + + + + +3M + + + > > > > >8R > > > A A A A A A A A + + + + + + + +& ' ' ' ' ' ' ' '
 - - - - - - - -
                    	   " 7 7 7 7 7x}! 7 7 7 7 7 7 7 7" 7 7 7 % % % % %8= % % %P . . . . . . . . 1 1 1 1 1 1 1 1    	   " * * * * *" * * * I I I I IHM I I I    ty          .l l l l l- l l l^, , , , ,4 , , ,    di   
t? t? t? t? t?. t? t? t?n    ty   O^ O^ O^ O^ O^- O^ O^ O^d>Y >Y >Y >Y >Y- >Y >Y >YBJ J J J J. J J JZ0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0     di   \e \e \e \e \e, \e \e \e~- - - - -2 - - - ^4 ^4 ^4 ^4 ^40 ^4 ^4 ^4B/a /a /a /a /a- /a /a /ad/ / / / /, / / />  ~??Zb?cc WWWrn   