| 
				
			 | 
			
			
				@@ -28,7 +28,6 @@ import os 
			 | 
		
	
		
			
			| 
				28
			 | 
			
				28
			 | 
			
			
				 import hashlib 
			 | 
		
	
		
			
			| 
				29
			 | 
			
				29
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				30
			 | 
			
				30
			 | 
			
			
				 from datetime import datetime, timedelta 
			 | 
		
	
		
			
			| 
				31
			 | 
			
				
			 | 
			
			
				-from itertools import chain 
			 | 
		
	
		
			
			| 
				32
			 | 
			
				31
			 | 
			
			
				 from urllib import urlencode 
			 | 
		
	
		
			
			| 
				33
			 | 
			
				32
			 | 
			
			
				 from flask import ( 
			 | 
		
	
		
			
			| 
				34
			 | 
			
				33
			 | 
			
			
				     Flask, request, render_template, url_for, Response, make_response, 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -234,11 +233,9 @@ def render(template_name, override_theme=None, **kwargs): 
			 | 
		
	
		
			
			| 
				234
			 | 
			
				233
			 | 
			
			
				     if autocomplete not in autocomplete_backends: 
			 | 
		
	
		
			
			| 
				235
			 | 
			
				234
			 | 
			
			
				         autocomplete = None 
			 | 
		
	
		
			
			| 
				236
			 | 
			
				235
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				237
			 | 
			
				
			 | 
			
			
				-    nonblocked_categories = (engines[e].categories 
			 | 
		
	
		
			
			| 
				238
			 | 
			
				
			 | 
			
			
				-                             for e in engines 
			 | 
		
	
		
			
			| 
				239
			 | 
			
				
			 | 
			
			
				-                             if e not in blocked_engines) 
			 | 
		
	
		
			
			| 
				240
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				241
			 | 
			
				
			 | 
			
			
				-    nonblocked_categories = set(chain.from_iterable(nonblocked_categories)) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				236
			 | 
			
			
				+    nonblocked_categories = set(category for engine_name in engines 
			 | 
		
	
		
			
			| 
				
			 | 
			
				237
			 | 
			
			
				+                                for category in engines[engine_name].categories 
			 | 
		
	
		
			
			| 
				
			 | 
			
				238
			 | 
			
			
				+                                if (engine_name, category) not in blocked_engines) 
			 | 
		
	
		
			
			| 
				242
			 | 
			
				239
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				243
			 | 
			
				240
			 | 
			
			
				     if 'categories' not in kwargs: 
			 | 
		
	
		
			
			| 
				244
			 | 
			
				241
			 | 
			
			
				         kwargs['categories'] = ['general'] 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -492,21 +489,19 @@ def preferences(): 
			 | 
		
	
		
			
			| 
				492
			 | 
			
				489
			 | 
			
			
				             elif pd_name == 'method': 
			 | 
		
	
		
			
			| 
				493
			 | 
			
				490
			 | 
			
			
				                 method = pd 
			 | 
		
	
		
			
			| 
				494
			 | 
			
				491
			 | 
			
			
				             elif pd_name.startswith('engine_'): 
			 | 
		
	
		
			
			| 
				495
			 | 
			
				
			 | 
			
			
				-                engine_name = pd_name.replace('engine_', '', 1) 
			 | 
		
	
		
			
			| 
				496
			 | 
			
				
			 | 
			
			
				-                if engine_name in engines: 
			 | 
		
	
		
			
			| 
				497
			 | 
			
				
			 | 
			
			
				-                    blocked_engines.append(engine_name) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				492
			 | 
			
			
				+                if pd_name.find('__') > -1: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				493
			 | 
			
			
				+                    engine_name, category = pd_name.replace('engine_', '', 1).split('__', 1) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				494
			 | 
			
			
				+                    if engine_name in engines and category in engines[engine_name].categories: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				495
			 | 
			
			
				+                        blocked_engines.append((engine_name, category)) 
			 | 
		
	
		
			
			| 
				498
			 | 
			
				496
			 | 
			
			
				             elif pd_name == 'theme': 
			 | 
		
	
		
			
			| 
				499
			 | 
			
				497
			 | 
			
			
				                 theme = pd if pd in themes else default_theme 
			 | 
		
	
		
			
			| 
				500
			 | 
			
				498
			 | 
			
			
				             else: 
			 | 
		
	
		
			
			| 
				501
			 | 
			
				499
			 | 
			
			
				                 resp.set_cookie(pd_name, pd, max_age=cookie_max_age) 
			 | 
		
	
		
			
			| 
				502
			 | 
			
				500
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				503
			 | 
			
				
			 | 
			
			
				-        user_blocked_engines = request.cookies.get('blocked_engines', '').split(',')  # noqa 
			 | 
		
	
		
			
			| 
				504
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				505
			 | 
			
				
			 | 
			
			
				-        if sorted(blocked_engines) != sorted(user_blocked_engines): 
			 | 
		
	
		
			
			| 
				506
			 | 
			
				
			 | 
			
			
				-            resp.set_cookie( 
			 | 
		
	
		
			
			| 
				507
			 | 
			
				
			 | 
			
			
				-                'blocked_engines', ','.join(blocked_engines), 
			 | 
		
	
		
			
			| 
				508
			 | 
			
				
			 | 
			
			
				-                max_age=cookie_max_age 
			 | 
		
	
		
			
			| 
				509
			 | 
			
				
			 | 
			
			
				-            ) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				501
			 | 
			
			
				+        resp.set_cookie( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				502
			 | 
			
			
				+            'blocked_engines', ','.join('__'.join(e) for e in blocked_engines), 
			 | 
		
	
		
			
			| 
				
			 | 
			
				503
			 | 
			
			
				+            max_age=cookie_max_age 
			 | 
		
	
		
			
			| 
				
			 | 
			
				504
			 | 
			
			
				+        ) 
			 | 
		
	
		
			
			| 
				510
			 | 
			
				505
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				511
			 | 
			
				506
			 | 
			
			
				         if locale: 
			 | 
		
	
		
			
			| 
				512
			 | 
			
				507
			 | 
			
			
				             resp.set_cookie( 
			 |