
    _fL                     R   d Z ddlmZ ddlZddlZddlZddlZdZ G d de          Z	 G d de          Z
d	 Z G d
 de          ZdZi ZeZej        dk     reefZd Zd Zd Zd Zd Zd Zd Zd Zd Zd3dZd4dZ	 	 	 	 	 d5dZd3dZ	 	 	 	 	 d5dZ ej!        "                    d          Z#e#rddl$Z$	 ddl$m%Z& n# e'$ r	 ddl$m&Z& Y nw xY w e(e#d          5 Z) e$j*        e)e&           Z+ddd           n# 1 swxY w Y   g Z,e+d!         D ]eZ-e-d"         Z.e-"                    d#          Z/e-"                    d$          Z0e-"                    d%          Z1 e,j2         e	e.e/e0e1                     fg Z3e+d&         D ]Z4e4d"         Z.e4"                    d'          Z5e4"                    d(          Z6e4"                    d)          Z7e4"                    d*          Z8e4"                    d+          Z9 e3j2         e
e.e5e6e7e8e9                     g Z:e+d,         D ]{Z;e;d"         Z.e;"                    d-          Z<e;"                    d.          Z=e;"                    d/          Z>e;"                    d0          Z? e:j2         ee.e<e=e>e?                     |[+[$[&dS d1d2l@m,Z,m:Z:m3Z3 dS )6z'Python implementation of the UA parser.    )absolute_importNz Lindsey Simon <elsigh@gmail.com>c                   $    e Zd Z	 ddZd Zd ZdS )UserAgentParserNc                 z    || _         t          j        | j                   | _        || _        || _        || _        dS )aE  Initialize UserAgentParser.

        Args:
          pattern: a regular expression string
          family_replacement: a string to override the matched family (optional)
          v1_replacement: a string to override the matched v1 (optional)
          v2_replacement: a string to override the matched v2 (optional)
        N)patternrecompileuser_agent_refamily_replacementv1_replacementv2_replacement)selfr   r   r   r   s        M/var/www/html/env/lib/python3.11/site-packages/ua_parser/user_agent_parser.py__init__zUserAgentParser.__init__   s=     Z55"4,,    c                     g }| j                             |          r$fdt          dj        dz             D             }|S )Nc                 :    g | ]}                     |          S  span.0group_indexmatchs     r   
<listcomp>z.UserAgentParser.MatchSpans.<locals>.<listcomp>1   2       ,7

;''  r      r
   searchrange	lastindexr   user_agent_stringmatch_spansr   s      @r   
MatchSpanszUserAgentParser.MatchSpans-   i    "))*;<< 	   ;@EOVWDW;X;X  K r   c                 b   d\  }}}}| j                             |          }|r| j        rQt          j        d| j                  r/t          j        d|                    d          | j                  }n| j        }n|                    d          }| j        r| j        }n)|j        r"|j        dk    r|                    d          pd }| j        r| j        }n)|j        r"|j        dk    r|                    d          pd }|j        r"|j        dk    r|                    d          pd }||||fS )NNNNNz\$1r            )	r
   r   r   r   subgroupr   r!   r   )r   r#   familyv1v2v3r   s          r   ParsezUserAgentParser.Parse6   sC   3B"))*;<< 	,& (9VT%<== 5VFEKKNND<STTFF!4FFQ" ,( ,U_%9%9[[^^+t" ,( ,U_%9%9[[^^+t ,5?a#7#7[[^^+tr2r!!r   NNN__name__
__module____qualname__r   r%   r2   r   r   r   r   r      sI        TX- - - -"  " " " " "r   r   c                   ,    e Zd Z	 	 	 	 	 ddZd Zd ZdS )OSParserNc                     || _         t          j        | j                   | _        || _        || _        || _        || _        || _        dS )a  Initialize UserAgentParser.

        Args:
          pattern: a regular expression string
          os_replacement: a string to override the matched os (optional)
          os_v1_replacement: a string to override the matched v1 (optional)
          os_v2_replacement: a string to override the matched v2 (optional)
          os_v3_replacement: a string to override the matched v3 (optional)
          os_v4_replacement: a string to override the matched v4 (optional)
        N)	r   r   r	   r
   os_replacementos_v1_replacementos_v2_replacementos_v3_replacementos_v4_replacement)r   r   r;   r<   r=   r>   r?   s          r   r   zOSParser.__init__S   sM    & Z55,!2!2!2!2r   c                     g }| j                             |          r$fdt          dj        dz             D             }|S )Nc                 :    g | ]}                     |          S r   r   r   s     r   r   z'OSParser.MatchSpans.<locals>.<listcomp>r   r   r   r   r   r"   s      @r   r%   zOSParser.MatchSpansn   r&   r   c                    d\  }}}}}| j                             |          }|rI| j        rt          | j        |          }n|j        r|                    d          }| j        rt          | j        |          }n'|j        r |j        dk    r|                    d          }| j        rt          | j        |          }n'|j        r |j        dk    r|                    d          }| j        rt          | j        |          }n'|j        r |j        dk    r|                    d          }| j	        rt          | j	        |          }n'|j        r |j        dk    r|                    d          }|||||fS )NNNNNNr   r)   r*   r+      )
r
   r   r;   MultiReplacer!   r-   r<   r=   r>   r?   )r   r#   osos_v1os_v2os_v3os_v4r   s           r   r2   zOSParser.Parsew   s   )E&E5%"))*;<< 	'" $!$"5u== $[[^^% '$T%;UCC 'U_%9%9A% '$T%;UCC 'U_%9%9A% '$T%;UCC 'U_%9%9A% '$T%;UCC 'U_%9%9A5%--r   rC   r4   r   r   r   r9   r9   R   sW         3 3 3 36  . . . . .r   r9   c                 z    fd}t          j        d||           }t          j        dd|          }|dk    rd S |S )Nc                     t          |                     d                    dz
  }                                }|t          |          k     r||         S dS )Nr    )intr-   groupslen)mindexr-   r   s      r   _replzMultiReplace.<locals>._repl   sJ    AGGAJJ!#3u::<rr   z\$(\d)z	^\s+|\s+$rM   )r   r,   )stringr   rS   _strings    `  r   rE   rE      sW         fYv..Gf\2w//G"}}tNr   c                   *    e Zd Z	 	 	 	 ddZd Zd ZdS )DeviceParserNc                     || _         |dk    r*t          j        | j         t          j                  | _        nt          j        | j                   | _        || _        || _        || _        dS )zInitialize UserAgentParser.

        Args:
          pattern: a regular expression string
          device_replacement: a string to override the matched device (optional)
        iN)r   r   r	   
IGNORECASEr
   device_replacementbrand_replacementmodel_replacement)r   r   
regex_flagr[   r\   r]   s         r   r   zDeviceParser.__init__   sc     !#DL"-!H!HD!#DL!9!9D"4!2!2r   c                     g }| j                             |          r$fdt          dj        dz             D             }|S )Nc                 :    g | ]}                     |          S r   r   r   s     r   r   z+DeviceParser.MatchSpans.<locals>.<listcomp>   r   r   r   r   r"   s      @r   r%   zDeviceParser.MatchSpans   r&   r   c                    d\  }}}| j                             |          }|r| j        rt          | j        |          }n|                    d          }| j        rt          | j        |          }| j        rt          | j        |          }n:t          |                                          dk    r|                    d          }|||fS )Nr3   r   r   )	r
   r   r[   rE   r-   r\   r]   rP   rO   )r   r#   devicebrandmodelr   s         r   r2   zDeviceParser.Parse   s    /u"))*;<< 	'& (%d&=uEEQ% D$T%;UCC% '$T%;UCCU\\^^$$q((Aue##r   r(   r4   r   r   r   rW   rW      sT         3 3 3 3.  $ $ $ $ $r   rW      )r*   c                 x   t          | t                    st          d| z            | t          t	          |                                                    f}t                              |          }||S t          t                    t          k    rt          
                                 d| ix}t          |<   |S )Nz*Expected user agent to be a string, got %rrT   )
isinstance	_UA_TYPES	TypeErrortuplesorteditems_PARSE_CACHEgetrP   MAX_CACHE_SIZEclear)uaargskeyentryvs        r   _lookuprv      s    b)$$ KDrIJJJuVDJJLL))**
+CS!!E
<N**%rN*ASHr   c                 v    t          | |          }|                    |          }|s || |          x}||<   |S )N)rv   rn   )rq   rr   rs   fnrt   rs         r   _cachedrz      sE    BE		#A &B%E#JHr   c                     t          | |          }t          |          dk    r|S d|vrt          | |          |d<   d|vrt          | |          |d<   d|vrt	          | |          |d<   |S )zParse all the things
    Args:
      user_agent_string: the full user agent string
    Returns:
      A dictionary containing all parsed bits
    r+   
user_agentrF   rb   )rv   rP   _ParseUserAgent_ParseOS_ParseDevice)r#   jsParseBitsrt   s      r   r2   r2      s     %{33E
5zzQ 5  -.?MMl50+>>du&'8+FFhLr   c                 0    t          | |dt                    S )zParses the user-agent string for user agent (browser) info.
    Args:
      user_agent_string: The full user-agent string.
    Returns:
      A dictionary containing parsed bits.
    r|   )rz   r}   r#   r   s     r   ParseUserAgentr     s     $k<QQQr   c                 P   |rt          j        dt          d           d|v rZ|d         dk    rN|d         }|                    d          pd }|                    d          pd }|                    d          pd }n(t          D ] }|                    |           \  }}}}|r n!d	|v rn|d	         }|rd|                    d
          dk    rK|                     d          dk    r2i }t          |          }d|d|d}|d         }|d         }|d         }|pd}||pd |pd |pd dS )NDjavascript overrides are deprecated and will be removed next releaser)   category
stackleveljs_user_agent_familyrM   js_user_agent_v1js_user_agent_v2js_user_agent_v3js_user_agent_stringChrome/chromeframeChrome Frame ( )majorminorpatchOther)r.   r   r   r   )warningswarnDeprecationWarningrn   USER_AGENT_PARSERSr2   findr   )	r#   r   r.   r/   r0   r1   uaParserr   
jsOverrides	            r   r}   r}     s    
R'	
 	
 	
 	
 	+--./25534__/008D__/008D__/008D* 	 	H!)0A!B!BFBB  ,,*+AB 
	%$)))44r99!&&}55::J'(<==JJ/5vvrrr:FG$BG$BG$BwFttt	  r   c                 0    t          | |dt                    S )zParses the user-agent string for operating system info
    Args:
      user_agent_string: The full user-agent string.
    Returns:
      A dictionary containing parsed bits.
    rF   )rz   r~   r   s     r   ParseOSr   I  s     $k4BBBr   c                     |rt          j        dt          d           t          D ]!}|                    |           \  }}}}}|r n"|pd}|||||dS )Nr   r)   r   r   )r.   r   r   r   patch_minor)r   r   r   
OS_PARSERSr2   )r#   r   osParserrF   rG   rH   rI   rJ   s           r   r~   r~   S  s     
R'	
 	
 	
 	

   )18I)J)J&E5% 	E		wB  r   c                 0    t          | |dt                    S )zParses the user-agent string for device info.
    Args:
        user_agent_string: The full user-agent string.
    Returns:
        A dictionary containing parsed bits.
    rb   )rz   r   r   s     r   ParseDevicer   h  s     $k8\JJJr   c                     |rt          j        dt          d           t          D ]}|                    |           \  }}}|r n |d}|||dS )Nr   r)   r   r   )r.   rc   rd   )r   r   r   DEVICE_PARSERSr2   )r#   r   deviceParserrb   rc   rd   s         r   r   r   r  s     
R'	
 	
 	
 	

 '  +112CDDu 	E	 ~uu===r   c                     |r3|d                                          r| d|d|d|S | d|d||S |r
| d|d|S |r| d|S | S )zPretty user agent string.r   r   .isdigitr.   r/   r0   r1   s       r   PrettyUserAgentr     s    	 &a5==?? 	7$*FFBBBBB77#)66222rr2266	 &#VVRRR,,	 & &&""%%Mr   c           	          |r| d|d|d|d|	S |r3|d                                          r| d|d|d|S | d|d||S |r
| d|d|S |r| d|S | S )zPretty os string.r   r   r   r   )rF   rG   rH   rI   rJ   s        r   PrettyOSr     s     C#%22uuueeeUUUEEBB %8 	<$&BBuuuee<<#%22uuueeUU;;	 %RR..	 %""ee$$Ir   c                    t          j        dt          d           ||dk    r|}d}d}d}	||}||}||}	n(t          D ] }
|
                    |           \  }}}}	|r n!|rb|                    d          dk    rI|                     d          dk    r0d	|d
|d}t          |          }|d         }|d         }|d         }	|pd|||	fS )zAbackwards compatible. use one of the other Parse methods instead!z#Use Parse (or a specialised parser)r)   r   NrM   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r2   r   r   )r#   r   r   r   r   r   r.   r/   r0   r1   parserua_dicts               r   ParseWithJSOverridesr     s;    M-/Aa   
 ',@B,F,F%'!B'!B'!B( 	 	F!'.?!@!@FBB 
 		 %%i00255""=11B666+1662226 !566WWWWb"b((r   c                     t          j        dt          d           |r3|d                                         r| d|d|d|S | d|d||S |r
| d|d|S |r| d|S | S )z2backwards compatible. use PrettyUserAgent instead!zUse PrettyUserAgentr)   r   r   r   r   )r   r   r   r   r   s       r   Prettyr     s    M');JJJJ	 &a5==?? 	7$*FFBBBBB77#)66222rr2266	 &#VVRRR,,	 & &&""%%Mr   c                 h    i }|||||d}|                                 D ]\  }}	|	|	dk    r|	||<   |S )a  Return the optional arguments that should be saved and used to query.

    js_user_agent_string is always returned if it is present. We really only need
    it for Chrome Frame. However, I added it in the generally case to find other
    cases when it is different. When the recording of js_user_agent_string was
    added, we created new records for all new user agents.

    Since we only added js_document_mode for the IE 9 preview case, it did not
    cause new user agent records the way js_user_agent_string did.

    js_document_mode has since been removed in favor of individual property
    overrides.

    Args:
      user_agent_string: The full user-agent string.
      js_user_agent_string: JavaScript ua string from client-side
      js_user_agent_family: This is an override for the family name to deal
          with the fact that IE platform preview (for instance) cannot be
          distinguished by user_agent_string, but only in javascript.
      js_user_agent_v1: v1 override - see above.
      js_user_agent_v2: v1 override - see above.
      js_user_agent_v3: v1 override - see above.
    Returns:
      {js_user_agent_string: '[...]', js_family_name: '[...]', etc...}
    )r   r   r   r   r   NrM   )rl   )
r#   r   r   r   r   r   filters
filterdictrs   values
             r   
GetFiltersr     sc    B G 4 4,,, J !&&(( ! !
U" GCLNr   UA_PARSER_YAML)CSafeLoader)
SafeLoaderrb)Loaderuser_agent_parsersregexr   r   r   
os_parsersr;   r<   r=   r>   r?   device_parsersr^   r[   r\   r]   r   )r   r   r   r3   r(   rC   )A__doc__
__future__r   rF   r   sysr   
__author__objectr   r9   rE   rW   ro   rm   strrh   version_infounicoderv   rz   r2   r   r}   r   r~   r   r   r   r   r   r   r   environrn   r   yamlr   r   ImportErroropenfploadregexesr   
_ua_parser_regex_family_replacement_v1_replacement_v2_replacementappendr   
_os_parser_os_replacement_os_v1_replacement_os_v2_replacement_os_v3_replacement_os_v4_replacementr   _device_parser_regex_flag_device_replacement_brand_replacement_model_replacement_regexesr   r   r   <module>r      sS   . - & & & & & & 				 				 



 /
4" 4" 4" 4" 4"f 4" 4" 4"nB. B. B. B. B.v B. B. B.J  2$ 2$ 2$ 2$ 2$6 2$ 2$ 2$j 	dgI       .R R R* * *ZC C C  *K K K> > >$      $ +) +) +) +)\   " , , , ,`  011 LI KKK$ 	3222222 $ $ $########$ 
nd	#	# 3r$)Bz2223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 23 
 

G$(nn-ABB$..)9::$..)9::!!O+_o 	
 	
 	
 	
 Jl+ 
 

G$$..)9::'^^,?@@'^^,?@@'^^,?@@'^^,?@@
H"""" 		
 		
 		
 		
 N!"23 
 
($((66,001EFF+//0CDD+//0CDDL#"" 	
 	
 	
 	
 	

 IHHHHHHHHHHHs$   8B? ?CCC;;C?C?