
    iU                     D   U d Z ddlZddlmZmZ ddlmZmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlZddlZddlZddlZddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddl m!Z! dZ" e#ed         Z$ eg d      Z%e&e'e(f   e)d<    G d de*      Z+ G d d      Z, G d de,      Z- G d de,      Z. G d de,      Z/ G d de,      Z0 G d de.      Z1 G d  d!e,      Z2 G d" d#e,      Z3 G d$ d%      Z4 G d& d'e4      Z5 G d( d)e4      Z6 G d* d+      Z7 G d, d-      Z8d.e'fd/Z9y)0z!Searx preferences implementation.    N)urlsafe_b64encodeurlsafe_b64decode)compress
decompress)parse_qs	urlencode)OrderedDict)Iterable)settingsautocompletefavicons)Engine)DEFAULT_CATEGORY)SXNG_Request)LOCALE_NAMES)VALID_LANGUAGE_CODEif	doi_resolvers))0F)1T)onT)offF)TrueT)FalseF)noneFMAP_STR2BOOLc                       e Zd ZdZy)ValidationExceptionzBExption from ``cls.__init__`` when configuration value is invalid.N__name__
__module____qualname____doc__     "/root/searxng/searx/preferences.pyr   r   ,   s    Lr$   r   c                   x     e Zd ZdZddej
                  def fdZdefdZ	d Z
ded	ej                  fd
Z xZS )SettingzBase class of user settingsdefault_valuelockedc                 >    t         |           || _        || _        y N)super__init__valuer)   )selfr(   r)   	__class__s      r%   r-   zSetting.__init__3   s    )
"r$   datac                     || _         y)zvParse ``data`` and store the result at ``self.value``

        If needed, its overwritten in the inheritance.
        Nr.   r/   r1   s     r%   parsezSetting.parse8   s    
 
r$   c                     | j                   S )zaReturns the value of the setting

        If needed, its overwritten in the inheritance.
        r3   r/   s    r%   	get_valuezSetting.get_value?   s    
 zzr$   namerespc                 H    |j                  || j                  t               y)zhSave cookie ``name`` in the HTTP response object

        If needed, its overwritten in the inheritance.max_ageN)
set_cookier.   COOKIE_MAX_AGEr/   r9   r:   s      r%   savezSetting.saveF   s     	djj.Ar$   F)r   r    r!   r"   tAnyboolr-   strr5   r8   flaskResponserA   __classcell__r0   s   @r%   r'   r'   0   sH    %#aee #T #
# B BENN Br$   r'   c                       e Zd ZdZy)StringSettingzSetting of plain string valuesNr   r#   r$   r%   rL   rL   M   s    (r$   rL   c                   \     e Zd ZU dZeed<   ddedee   def fdZdefdZ	d	efd
Z
 xZS )EnumStringSettingz=Setting of a value which can only come from the given choicesr.   r(   choicesr)   c                 j    t         |   ||       || _        | j                  | j                         y r+   )r,   r-   rO   _validate_selectionr.   r/   r(   rO   r)   r0   s       r%   r-   zEnumStringSetting.__init__V   s+    /&-  ,r$   	selectionc                 T    || j                   vrt        dj                  |            y NzInvalid value: "{0}"rO   r   formatr/   rS   s     r%   rQ   z%EnumStringSetting._validate_selection[   s*    DLL(%&<&C&CI&NOO )r$   r1   c                 4    | j                  |       || _        yBParse and validate ``data`` and store the result at ``self.value``N)rQ   r.   r4   s     r%   r5   zEnumStringSetting.parse_   s      &
r$   rB   )r   r    r!   r"   rF   __annotations__r
   rE   r-   rQ   r5   rI   rJ   s   @r%   rN   rN   Q   sC    GJ-c -HSM -4 -
PS P# r$   rN   c                        e Zd ZdZddee   dee   def fdZdee   fdZ	defd	Z
dee   fd
Zdedej                  fdZ xZS )MultipleChoiceSettingz<Setting of values which can only come from the given choicesr(   rO   r)   c                 j    t         |   ||       || _        | j                  | j                         y r+   )r,   r-   rO   _validate_selectionsr.   rR   s       r%   r-   zMultipleChoiceSetting.__init__h   s+    /&-!!$**-r$   
selectionsc                 b    |D ]*  }|| j                   vst        dj                  |             y rU   rV   )r/   ra   items      r%   r`   z*MultipleChoiceSetting._validate_selectionsm   s6     	UD4<<')*@*G*G
*STT	Ur$   r1   c                 p    |dk(  rg | _         y|j                  d      }| j                  |       || _         yr[    N,)r.   splitr`   r/   r1   elementss      r%   r5   zMultipleChoiceSetting.parser   s5    2:$&DJ::c?!!(+
r$   c                     | j                   ry g | _        |D ];  }|| j                  v s|| j                  vs!| j                  j                  |       = y r+   )r)   r.   rO   append)r/   r1   choices      r%   
parse_formz MultipleChoiceSetting.parse_form|   sK    ;;
 	*F%&

*B

!!&)	*r$   r9   r:   c                 f    |j                  |dj                  | j                        t               y0Save cookie ``name`` in the HTTP response objectrg   r<   N)r>   joinr.   r?   r@   s      r%   rA   zMultipleChoiceSetting.save   s!    chhtzz2NKr$   rB   )r   r    r!   r"   listrF   r
   rE   r-   r`   r5   rn   rG   rH   rA   rI   rJ   s   @r%   r^   r^   e   sq    F.d3i .(3- .QU .
UtCy U
# *tCy *L LENN Lr$   r^   c                   d     e Zd ZdZ fdZd ZdefdZdefdZdede	j                  fd	Z xZS )

SetSettingz:Setting of values of type ``set`` (comma separated string)c                 B    t        |   |i | t               | _        y r+   )r,   r-   setvalues)r/   argskwargsr0   s      r%   r-   zSetSetting.__init__   s    $)&) #r$   c                 8    dj                  | j                        S )z-Returns a string with comma separated values.rg   )rr   rx   r7   s    r%   r8   zSetSetting.get_value   s    xx$$r$   r1   c                     |dk(  rt               | _        y|j                  d      }|D ]  }| j                  j                  |        yre   )rw   rx   rh   add)r/   r1   rj   elements       r%   r5   zSetSetting.parse   sA    2:%DK::c? 	%GKKOOG$	%r$   c                 `    | j                   ry |j                  d      }t        |      | _        y )Nrg   )r)   rh   rw   rx   ri   s      r%   rn   zSetSetting.parse_form   s$    ;;::c?(mr$   r9   r:   c                 f    |j                  |dj                  | j                        t               yrp   )r>   rr   rx   r?   r@   s      r%   rA   zSetSetting.save   s!    chht{{3^Lr$   )r   r    r!   r"   r-   r8   rF   r5   rn   rG   rH   rA   rI   rJ   s   @r%   ru   ru      sB    D&%%# %$s $M MENN Mr$   ru   c                   4    e Zd ZU dZeed<   defdZdefdZy)SearchLanguageSettingzKAvailable choices may change, so user's value may not be in choices anymorer.   rS   c                 z    |dk7  r6|dk7  r0t        j                  |      st        dj                  |            y y y )Nrf   autozInvalid language code: "{0}")r   matchr   rW   rX   s     r%   rQ   z)SearchLanguageSetting._validate_selection   sA    ?yF2;N;T;TU^;_%&D&K&KI&VWW <`2?r$   r1   c                 (   || j                   vrl|| j                  k7  r]t        |      j                  dd      }|j	                  dd      d   }|| j                   v rn|| j                   v r|}n| j                  }| j                  |       || _        y)r[   _-   )maxsplitr   N)rO   r.   rF   replacerh   rQ   )r/   r1   langs      r%   r5   zSearchLanguageSetting.parse   s    t||#

(:t9$$S#.D::cA:.q1Dt||#%zz  &
r$   N)r   r    r!   r"   rF   r\   rQ   r5   r#   r$   r%   r   r      s$    UJXS X# r$   r   c                        e Zd ZU dZeed<   eed<   	 ddedeeef   def fdZ	defd	Z
d
edej                  fdZ xZS )
MapSettingzDSetting of a value that has to be translated in order to be storablekeyr.   r(   mapr)   c                     t         |   ||       || _        | j                  | j                  j	                         vrt        d      y )NzInvalid default value)r,   r-   r   r.   rx   r   )r/   r(   r   r)   r0   s       r%   r-   zMapSetting.__init__   sC     	/&)::TXX__..%&=>> /r$   r1   c                     || j                   vrt        dj                  |            | j                   |   | _        || _        y)r[   zInvalid choice: {0}N)r   r   rW   r.   r   r4   s     r%   r5   zMapSetting.parse   s=     txx%&;&B&B4&HIIXXd^
r$   r9   r:   c                 b    t        | d      r#|j                  || j                  t               yyrq   r   r<   Nhasattrr>   r   r?   r@   s      r%   rA   zMapSetting.save   '    4OOD$((NOC  r$   rB   )r   r    r!   r"   rF   r\   objectdictrE   r-   r5   rG   rH   rA   rI   rJ   s   @r%   r   r      sc    N	HM MR?#?*.sF{*;?EI?# D DENN Dr$   r   c                   z    e Zd ZU dZeed<   eed<   dej                  defdZ	defdZ
d	ed
ej                  fdZy)BooleanSettingzLSetting of a boolean value that has to be translated in order to be storabler.   r   valreturnc                     t         j                         D ]  \  }}||k(  s|c S  t        dt        |      dt	        |      d      )NzInvalid value: z (z) is not a boolean!)r   items
ValueErrorreprtype)r/   r   v_strv_objs       r%   normalized_strzBooleanSetting.normalized_str   sG    (..0 	LE5e|	 tCyRVWZR[\]]r$   r1   c                 `    t         |   | _        | j                  | j                        | _        yrZ   )r   r.   r   r   r4   s     r%   r5   zBooleanSetting.parse   s$    !$'
&&tzz2r$   r9   r:   c                 b    t        | d      r#|j                  || j                  t               yyr   r   r@   s      r%   rA   zBooleanSetting.save   r   r$   N)r   r    r!   r"   rE   r\   rF   rC   rD   r   r5   rG   rH   rA   r#   r$   r%   r   r      sO    VK	H^!%% ^C ^3# 3
D DENN Dr$   r   c                       e Zd ZdZddedeeef   defdZd Zd Z	ded	efd
Z
dee   fdZed        Zed        Zdej"                  fdZd Zd Zy)BooleanChoicesz7Maps strings to booleans that are either true or false.r9   rO   r)   c                 N    || _         || _        || _        t        |      | _        y r+   )r9   rO   r)   r   default_choices)r/   r9   rO   r)   s       r%   r-   zBooleanChoices.__init__   s#    	(/"04Wr$   c                     |S r+   r#   )r/   r   s     r%   transform_form_itemsz#BooleanChoices.transform_form_items  s    r$   c                     |S r+   r#   )r/   rx   s     r%   transform_valueszBooleanChoices.transform_values  s    r$   data_disableddata_enabledc                     |j                  d      D ]   }|| j                  v sd| j                  |<   " |j                  d      D ]   }|| j                  v sd| j                  |<   " y )Nrg   FT)rh   rO   )r/   r   r   disabledenableds        r%   parse_cookiezBooleanChoices.parse_cookie  sl    %++C0 	/H4<<').X&	/ $))#. 	-G$,,&(,W%	-r$   r   c                     | j                   ry | j                  |      }| j                  D ]  }||v| j                  |<    y r+   )r)   r   rO   )r/   r   r   settings       r%   rn   zBooleanChoices.parse_form  sB    ;;,,U3|| 	<G$+8$;DLL!	<r$   c                 D    d | j                   j                         D        S )Nc              3   ,   K   | ]  \  }}|s	|  y wr+   r#   .0kvs      r%   	<genexpr>z)BooleanChoices.enabled.<locals>.<genexpr>  s     8daa8   
rO   r   r7   s    r%   r   zBooleanChoices.enabled  s    8dll00288r$   c                 D    d | j                   j                         D        S )Nc              3   ,   K   | ]  \  }}|r	|  y wr+   r#   r   s      r%   r   z*BooleanChoices.disabled.<locals>.<genexpr>  s     <da!<r   r   r7   s    r%   r   zBooleanChoices.disabled  s    <dll002<<r$   r:   c                 Z     fd j                   D        } fd j                  D        }|j                  dj                   j                        dj                  |      t               |j                  dj                   j                        dj                  |      t               y)'Save cookie in the HTTP response objectc              3   B   K   | ]  }j                   |   s|  y wr+   r   r   r   r/   s     r%   r   z&BooleanChoices.save.<locals>.<genexpr>#  s     P!8L8LQ8OAP   c              3   B   K   | ]  }j                   |   r|  y wr+   r   r   s     r%   r   z&BooleanChoices.save.<locals>.<genexpr>$  s     R$:N:Nq:Q1Rr   zdisabled_{0}rg   r<   zenabled_{0}N)r   r   r>   rW   r9   rr   r?   )r/   r:   disabled_changedenabled_changeds   `   r%   rA   zBooleanChoices.save!  sw    Pt}}PRdllR--dii8#((CS:T^lm,,TYY7/9R\jkr$   c                 J    | j                  t        | j                              S r+   )r   rs   r   r7   s    r%   get_disabledzBooleanChoices.get_disabled(  s    $$T$--%899r$   c                 J    | j                  t        | j                              S r+   )r   rs   r   r7   s    r%   get_enabledzBooleanChoices.get_enabled+  s    $$T$,,%788r$   NrB   )r   r    r!   r"   rF   r   rE   r-   r   r   r   rs   rn   propertyr   r   rG   rH   rA   r   r   r#   r$   r%   r   r      s    A>S >4T	? >D >-# -S -<S	 < 9 9 = =l l:9r$   r   c                   :     e Zd ZdZdee   f fdZd Zd Z xZ	S )EnginesSettingzEngine settingsenginesc                    i }|D ]h  }|j                   D ]W  }|t        t        d   j                               t        gz   vr.|j
                   |dj                  |j                  |      <   Y j t        | %  ||       y )Ncategories_as_tabsz{}__{})

categoriesrs   r   keysr   r   rW   r9   r,   r-   )r/   r(   r   rO   enginecategoryr0   s         r%   r-   zEnginesSetting.__init__2  s     	VF"-- V41E(F(K(K(M#NRbQc#ccFLooBUX>?V	V
 	0r$   c                     |D cg c]0  }|t        d      d  j                  dd      j                  dd      2 c}S c c}w )Nengine_r    z  __)lenr   r/   r   rc   s      r%   r   z#EnginesSetting.transform_form_items;  s=    Y^_QUS^%&..sC8@@tL___s   5=c                     t        |      dk(  rt        t        |            dk(  rg S g }|D ])  }|j                  d      \  }}|j	                  ||f       + |S )Nr   rf   r   )r   nextiterrh   rl   )r/   rx   transformed_valuesr.   r   r   s         r%   r   zEnginesSetting.transform_values>  sf    v;!T&\ 2b 8I 	:E${{40FH%%vx&89	: "!r$   )
r   r    r!   r"   r
   r   r-   r   r   rI   rJ   s   @r%   r   r   /  s"    1x/? 1`"r$   r   c                   \     e Zd ZdZdeej                  j                     f fdZd Z	 xZ
S )PluginsSettingzPlugin settingspluginsc                 v    t         |   ||D ci c]  }|j                  |j                   c}       y c c}w r+   )r,   r-   idactive)r/   r(   r   pluginr0   s       r%   r-   zPluginsSetting.__init__K  s.    PW(XfFMM)A(XY(Xs   6
c                 D    |D cg c]  }|t        d      d   c}S c c}w )Nplugin_)r   r   s      r%   r   z#PluginsSetting.transform_form_itemsN  s"    3894S^%&999s   )r   r    r!   r"   r
   searxr   Pluginr-   r   rI   rJ   s   @r%   r   r   H  s(    Zx8L8L/M Z:r$   r   c                       e Zd ZU dZej
                  dz  ed<   	 ddej
                  dz  fdZed        Z	e
defd       Zy)	
ClientPrefz7Container to assemble client prefferences and settings.Nlocalec                     || _         y r+   r   )r/   r   s     r%   r-   zClientPref.__init__Z  s	    r$   c                     | j                   y | j                   j                  }| j                   j                  r|d| j                   j                  z   z  }|S )Nr   )r   language	territory)r/   tags     r%   
locale_tagzClientPref.locale_tag]  sI    ;;kk"";;  3....C
r$   http_requestc                 >   |j                   j                  d      }|s	 | d      S g }|j                  d      D ]  }|j                  d      dgz   dd D cg c]  }|j                          c}\  }}	 t	        |j                  d      d	         }t
        j                  j                  |d
      }|j                  ||f        d}|r|j                  dd        |d   d   } | |      S c c}w # t        t
        j                  j                  f$ r Y w xY w)zBuild ClientPref object from HTTP request.

        - `Accept-Language used for locale setting
          <https://www.w3.org/International/questions/qa-accept-lang-locales.en>`__

        zAccept-LanguageNr   rg   ;zq=1   =r   )sepTc                     | d   S )Nr   r#   )xs    r%   <lambda>z.ClientPref.from_http_request.<locals>.<lambda>  s
    1Q4 r$   )reverser   r   )headersgetrh   stripfloatbabelLocaler5   r   coreUnknownLocaleErrorrl   sort)	clsr   	al_headerpairslr   r   qvaluer   s	            r%   from_http_requestzClientPref.from_http_requestf  s    !((,,->?	d##24% 		+A01x0G!/LM!AGGIMLD&v||C045++Dc+: LL&&)*		+ JJtJ81Xa[F&!! N
 

 = => s   C15>C66#DDr+   )r   r    r!   r"   r  r	  r\   r-   r   r   classmethodr   r  r#   r$   r%   r   r   R  s]    A LL4)u||d2    "\ " "r$   r   c                       e Zd ZdZ	 ddee   dee   deeef   dej                  j                  dedz  f
 fdZd	 Zd
efdZd
eeef   fdZd
eeef   fdZdedej$                  fdZdej*                  fdZd Z xZS )Preferencesz*Validates and saves preferences to cookiesNthemesr   r   r   clientc           
         t         |           i dt        dgt        d      |dgz         dt	        t
        d   d   t        d      t
        d   d   d	gz         d
t        t
        d   d   t        d
      t        t        j                               d	gz         dt        t
        d   d   t        d      t        t        j                  j                               d	gz         dt        t
        d   d   t        d      t        t        j                  j                  j                  j                               d	gz         dt!        t
        d   d   t        d            dt        t
        d   d   t        d      d      dt#        t
        d   d   t        d      dddd      dt        t
        d   d   t        d      |      dt!        t
        d   d   t        d            dt        t
        d   gt        d      t$              d t        t
        d   d!   d    t        d       g d"      d#t!        t
        d   d#   t        d#            d$t!        t
        d   d$   t        d$            d%t!        t
        d   d%   t        d%            d&t!        t
        d   d&   t        d&            d't        t
        d   d'   d(d)g*      d+t        t
        d   d+   g d,*      i| _        t)        d-|j+                         .      | _        t/        d/|0      | _        t3        d1      | _        |xs
 t7               | _        y )2Nr   generalr   )r)   rO   r   searchdefault_lang	languagesrf   r   uidefault_localer   favicon_resolverimage_proxyserver)r)   method)GETPOST
safesearchsafe_searchr   r   r   )r   r   2)r)   r   themedefault_themeresults_on_new_tabdoi_resolverdefault_doi_resolversimple_style
theme_args)rf   r   lightdarkblackcenter_alignmentadvanced_searchquery_in_titlesearch_on_category_selecthotkeysdefaultvim)rO   url_formatting)prettyfullhostr   )r   r   )r   tokens)r,   r-   r^   	is_lockedr   r   rN   rs   r   r   r   backendsr   proxyCFGresolver_mapr   r   DOI_RESOLVERSkey_value_settingsr   rx   r   r   r   ru   r=  r   r  )r/   r  r   r   r   r  r0   s         r%   r-   zPreferences.__init__  s    	Y7
/ ."fX-Y7
 -">2 , *;72$>Y7
 '/0 *\..01RD8Y7
" -">2 0\22779:bTA#Y7
,  1"#56 !34X^^//<<AACDtK!-Y7
6 >"=1 /7Y7
> '"8, *'?Y7
H *"=1 .IY7
Z &/ )[Y7
d !.34 !56#eY7
l 1014 0%mY7
v -|,^< 0>wY7
@ 12 !34!AY7
H ~01 !23 IY7
P n/0 !12QY7
X (:; !<=*YY7
` (y)"E*aY7
h //02iY7
v &i9IJ%iA *,
r$   c                    i }| j                   j                         D ]X  \  }}|j                  rt        |t              r#dj                  |j                               ||<   F|j                         ||<   Z dj                  | j                  j                        |d<   dj                  | j                  j                        |d<   dj                  | j                  j                        |d<   dj                  | j                  j                        |d<   dj                  | j                  j                        |d<   t        t        t        |      j!                                     j#                         S )z$Return preferences as URL parametersrg   disabled_enginesenabled_enginesdisabled_pluginsenabled_pluginsr=  )rD  r   r)   
isinstancer^   rr   r8   r   r   r   r   r=  rx   r   r   r   encodedecode)r/   settings_kvr   r   s       r%   get_as_url_paramszPreferences.get_as_url_params  s#   ++113 	/DAqxx!23!$!++-!8A!"A	/ +.((4<<3H3H*I&'),$,,2F2F)G%&*-((4<<3H3H*I&'),$,,2F2F)G%& #);); <H )K*@*G*G*I!JKRRTTr$   
input_datac                     t        t        |            }i }t        |j                  d      d      j	                         D ]  \  }}|d   ||<    | j                  |       y)zOparse (base64) preferences from request (``flask.request.form['preferences']``)asciiT)keep_blank_valuesr   N)r   r   r   rL  r   
parse_dict)r/   rO  bin_data	dict_datar  ys         r%   parse_encoded_datazPreferences.parse_encoded_data  s\    /
;<	X__W5NTTV 	 DAqQ4IaL	 	"r$   c                    |j                         D ]  \  }}|| j                  v r9| j                  |   j                  r.| j                  |   j                  |       M|dk(  r=| j                  j                  |j                  dd      |j                  dd             |dk(  r=| j                  j                  |j                  dd      |j                  dd             |dk(  s| j                  j                  |        y)z7parse preferences from request (``flask.request.form``)rF  rf   rG  rH  rI  r=  N)	r   rD  r)   r5   r   r   r  r   r=  )r/   rO  user_setting_nameuser_settings       r%   rS  zPreferences.parse_dict  s    /9/?/?/A 
	0+| D$;$;;**+<=DD''(9:@@N"&88))*..9KR*PR\R`R`artvRwx"&88))*..9KR*PR\R`R`artvRwx"h.!!,/
	0r$   c                    g }g }g }| j                   j                         D ].  \  }}||j                         vst        |t              s*d||<   0 |j                         D ]  \  }}|| j                   v r| j                   |   j                  |       3|j                  d      r|j                  |       V|j                  d      r|j                  |t        d      d        |j                  d      r|j                  |       |dk(  s| j                  j                  |        | j                   d   j                  |       | j                  j                  |       | j                  j                  |       y)z?Parse formular (``<input>``) data from a ``flask.request.form``r   r   	category_Nr   r=  r   )rD  r   r   rJ  r   r5   
startswithrl   r   r=  rn   r   r   )	r/   rO  rF  enabled_categoriesrH  r   r   rY  rZ  s	            r%   rn   zPreferences.parse_form  sa    !3399; 	*LC*//++
7N0S")
3	* 0:/?/?/A 
	5+| D$;$;;''(9:@@N"--i8 ''(9:"--k:"))*;C<L<N*OP"--i8 ''(9:"h.&&|4
	5 	-889KL 01 01r$   rY  r   c                 `    d}|| j                   v r| j                   |   j                         }|S )z+Returns the value for ``user_setting_name``N)rD  r8   )r/   rY  ret_vals      r%   r8   zPreferences.get_value;  s4     7 77--.?@JJLGr$   r:   c                 F   | j                   j                         D ]1  \  }}| j                   |   j                  r |j                  ||       3 | j                  j                  |       | j
                  j                  |       | j                  j                  d|       |S )r   r=  )rD  r   r)   rA   r   r   r=  )r/   r:   rY  rZ  s       r%   rA   zPreferences.saveB  s    /3/F/F/L/L/N 	7+|&&'89@@/6		7
 	$$4(r$   c                     d}t        |d      r<|j                  r0d}| j                  j                  D ]  }||j                  v sd} |S  |S )NTr=  F)r   r=  rx   )r/   r   validtokens       r%   validate_tokenzPreferences.validate_tokenN  sU    68$E++ FMM) E
 r$   r+   )r   r    r!   r"   rs   rF   r   r   r   r   PluginStorager   r-   rN  rW  rS  rn   rC   rD   r8   rG   rH   rA   re  rI   rJ   s   @r%   r  r    s    4 %)i-S	i- Ii- c6k"	i-
 ,,i- T!i-VU*#S #0T#s(^ 02T#s(^ 2:3 155 
 
	r$   r  setting_namec                 H    dt         vrydt         d   vry| t         d   d   v S )z8Checks if a given setting name is locked by settings.ymlpreferencesFlock)r   )rg  s    r%   r>  r>  Z  s2    H$Xm,,8M26:::r$   ):r"   typingrC   base64r   r   zlibr   r   urllib.parser   r   collectionsr	   collections.abcr
   rG   r  
babel.coresearx.pluginsr   r   r   r   searx.enginelibr   searx.enginesr   searx.extended_typesr   searx.localesr   searx.webutilsr   r?   rs   rC  r   r   rF   rE   r\   	Exceptionr   r'   rL   rN   r^   ru   r   r   r   r   r   r   r   r  r>  r#   r$   r%   <module>ry     s1   '  7 % , # $     2 2 " * - & . (Xo./ +
!d39o 
M) MB B:)G ) ("LG "LJM MB- 4D D:DW D.39 39l"^ "2:^ :0" 0"fR Rj;C ;r$   