# Resources to be used as redirect destinations.
# Copyright (C) 2019-present Raymond Hill (https://github.com/gorhill/uBlock)
# See LICENSE file for accredation
#
# - Each distinct resource entry is separated by an empty line.
# - The first line in a resource entry is: token mime-type[;encoding]
# - All following lines are the data. An empty line signals the end of the
#   data.
#
# If the encoding is absent, the data will be converted to base64, and the
# encoding will be set to `;base64`.


# http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever
1x1-transparent.gif image/gif;base64
R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==


2x2-transparent.png image/png;base64
iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAC0lEQVQI12NgQAcAABIAAe+JVKQAAAAA
SUVORK5CYII=


3x2-transparent.png image/png;base64
iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAC0lEQVQI12NgwAUAABoAASRETuUAAAAA
SUVORK5CYII=


32x32-transparent.png image/png;base64
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGklEQVRYw+3BAQEAAACCIP+vbkhAAQAA
AO8GECAAAZf3V9cAAAAASUVORK5CYII=


nooptext text/plain
   

noopcss text/css
   

noopjs application/javascript
(function() {
	;
})();


noopframe text/html
<!DOCTYPE html>
<html>
	<head><title></title></head>
	<body></body>
</html>


# From:
#   https://ubuntuforums.org/showthread.php?t=1911430&p=11624471#post11624471
# ffmpeg -ar 48000 -t 0.1 -f s16le -acodec pcm_s16le -ac 2 -i /dev/zero -acodec libmp3lame -aq 4 output.mp3
# But with 0.1 (second) instead of 60.
noopmp3-0.1s audio/mp3;base64
SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//tUAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAGAAADAABgYGBgYGBgYGBgYGBgYGBggICAgICA
gICAgICAgICAgICgoKCgoKCgoKCgoKCgoKCgwMDAwMDAwMDAwMDAwMDAwMDg4ODg4ODg4ODg4ODg4ODg
4P////////////////////8AAAAATGF2YzU2LjYwAAAAAAAAAAAAAAAAJAAAAAAAAAAAAwDNZKlY//sU
ZAAP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAETEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVV
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZB4P8AAAaQAAAAgAAA0gAAABAAABpAAA
ACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
VVVVVVVVVVVV//sUZDwP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVV
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZFoP8AAAaQAAAAgA
AA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
VVVVVVVVVVVVVVVVVVVVVVVVVVVV//sUZHgP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVV
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sU
ZJYP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

# From:
#   https://github.com/kud/blank-video
noopmp4-1s video/mp4;base64
AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAGF21kYXTeBAAAbGliZmFhYyAxLjI4
AABCAJMgBDIARwAAArEGBf//rdxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxNDIgcjIgOTU2Yzhk
OCAtIEguMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTQgLSBodHRwOi8vd3d3
LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYmxvY2s9MTow
OjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBt
aXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTAgY3FtPTAg
ZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxv
b2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNl
ZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAg
a2V5aW50PTI1MCBrZXlpbnRfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29r
YWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02
OSBxcHN0ZXA9NCB2YnZfbWF4cmF0ZT03NjggdmJ2X2J1ZnNpemU9MzAwMCBjcmZfbWF4PTAuMCBuYWxf
aHJkPW5vbmUgZmlsbGVyPTAgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAFZliIQL8mKAAKvMnJyc
nJycnJycnXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXiEASZACGQAjgCEASZACGQAjgAAAAAdBmjgX4GSAIQBJkAIZACOAAAAAB0GaVAX4
GSAhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGagC/AySEA
SZACGQAjgAAAAAZBmqAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZrAL8DJIQBJkAIZACOAAAAABkGa
4C/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmwAvwMkhAEmQAhkAI4AAAAAGQZsgL8DJIQBJkAIZACOA
IQBJkAIZACOAAAAABkGbQC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm2AvwMkhAEmQAhkAI4AAAAAG
QZuAL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGboC/AySEASZACGQAjgAAAAAZBm8AvwMkhAEmQAhkA
I4AhAEmQAhkAI4AAAAAGQZvgL8DJIQBJkAIZACOAAAAABkGaAC/AySEASZACGQAjgCEASZACGQAjgAAA
AAZBmiAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpAL8DJIQBJkAIZACOAAAAABkGaYC/AySEASZAC
GQAjgCEASZACGQAjgAAAAAZBmoAvwMkhAEmQAhkAI4AAAAAGQZqgL8DJIQBJkAIZACOAIQBJkAIZACOA
AAAABkGawC/AySEASZACGQAjgAAAAAZBmuAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZsAL8DJIQBJ
kAIZACOAAAAABkGbIC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm0AvwMkhAEmQAhkAI4AhAEmQAhkA
I4AAAAAGQZtgL8DJIQBJkAIZACOAAAAABkGbgCvAySEASZACGQAjgCEASZACGQAjgAAAAAZBm6AnwMkh
AEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AAAAhubW9vdgAAAGxtdmhkAAAAAAAAAAAA
AAAAAAAD6AAABDcAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzB0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAA
AAABAAAAAAAAA+kAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABA
AAAAALAAAACQAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAPpAAAAAAABAAAAAAKobWRpYQAAACBt
ZGhkAAAAAAAAAAAAAAAAAAB1MAAAdU5VxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABW
aWRlb0hhbmRsZXIAAAACU21pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAA
AAAAAQAAAAx1cmwgAAAAAQAAAhNzdGJsAAAAr3N0c2QAAAAAAAAAAQAAAJ9hdmMxAAAAAAAAAAEAAAAA
AAAAAAAAAAAAAAAAALAAkABIAAAASAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAGP//AAAALWF2Y0MBQsAN/+EAFWdCwA3ZAsTsBEAAAPpAADqYA8UKkgEABWjLg8sgAAAAHHV1aWRr
aEDyXyRPxbo5pRvPAyPzAAAAAAAAABhzdHRzAAAAAAAAAAEAAAAeAAAD6QAAABRzdHNzAAAAAAAAAAEA
AAABAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAABAAAAAQAAAIxzdHN6AAAAAAAAAAAAAAAeAAADDwAAAAsA
AAALAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoA
AAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAiHN0Y28A
AAAAAAAAHgAAAEYAAANnAAADewAAA5gAAAO0AAADxwAAA+MAAAP2AAAEEgAABCUAAARBAAAEXQAABHAA
AASMAAAEnwAABLsAAATOAAAE6gAABQYAAAUZAAAFNQAABUgAAAVkAAAFdwAABZMAAAWmAAAFwgAABd4A
AAXxAAAGDQAABGh0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAACAAAAAAAABDcAAAAAAAAAAAAAAAEB
AAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxl
bHN0AAAAAAAAAAEAAAQkAAADcAABAAAAAAPgbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAC7gAAAykBV
xAAAAAAALWhkbHIAAAAAAAAAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAADi21pbmYAAAAQ
c21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAADT3N0YmwAAABn
c3RzZAAAAAAAAAABAAAAV21wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAC7gAAAAAAAM2VzZHMAAAAA
A4CAgCIAAgAEgICAFEAVBbjYAAu4AAAADcoFgICAAhGQBoCAgAECAAAAIHN0dHMAAAAAAAAAAgAAADIA
AAQAAAAAAQAAAkAAAAFUc3RzYwAAAAAAAAAbAAAAAQAAAAEAAAABAAAAAgAAAAIAAAABAAAAAwAAAAEA
AAABAAAABAAAAAIAAAABAAAABgAAAAEAAAABAAAABwAAAAIAAAABAAAACAAAAAEAAAABAAAACQAAAAIA
AAABAAAACgAAAAEAAAABAAAACwAAAAIAAAABAAAADQAAAAEAAAABAAAADgAAAAIAAAABAAAADwAAAAEA
AAABAAAAEAAAAAIAAAABAAAAEQAAAAEAAAABAAAAEgAAAAIAAAABAAAAFAAAAAEAAAABAAAAFQAAAAIA
AAABAAAAFgAAAAEAAAABAAAAFwAAAAIAAAABAAAAGAAAAAEAAAABAAAAGQAAAAIAAAABAAAAGgAAAAEA
AAABAAAAGwAAAAIAAAABAAAAHQAAAAEAAAABAAAAHgAAAAIAAAABAAAAHwAAAAQAAAABAAAA4HN0c3oA
AAAAAAAAAAAAADMAAAAaAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkA
AAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkA
AAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkA
AAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAACMc3RjbwAAAAAAAAAfAAAALAAAA1UA
AANyAAADhgAAA6IAAAO+AAAD0QAAA+0AAAQAAAAEHAAABC8AAARLAAAEZwAABHoAAASWAAAEqQAABMUA
AATYAAAE9AAABRAAAAUjAAAFPwAABVIAAAVuAAAFgQAABZ0AAAWwAAAFzAAABegAAAX7AAAGFwAAAGJ1
ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAl
qXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTUuMzMuMTAw


hd-main.js application/javascript
(function(){
	var l = {};
	var noopfn = function() {
		;
	};
	var props = [
		"$j","Ad","Bd","Cd","Dd","Ed","Fd","Gd","Hd","Id","Jd","Nj","Oc","Pc","Pe",
		"Qc","Qe","Rc","Re","Ri","Sc","Tc","Uc","Vc","Wc","Wg","Xc","Xg","Yc","Yd",
		"ad","ae","bd","bf","cd","dd","ed","ef","ek","fd","fg","fh","fk","gd","hd",
		"ig","ij","jd","kd","ke","ld","md","mi","nd","od","oh","pd","pf","qd","rd",
		"sd","td","ud","vd","wd","wg","xd","xh","yd","zd",
		"$d","$e","$k","Ae","Af","Aj","Be","Ce","De","Ee","Ek","Eo","Ep","Fe","Fo",
		"Ge","Gh","Hk","Ie","Ip","Je","Ke","Kk","Kq","Le","Lh","Lk","Me","Mm","Ne",
		"Oe","Pe","Qe","Re","Rp","Se","Te","Ue","Ve","Vp","We","Xd","Xe","Yd","Ye",
		"Zd","Ze","Zf","Zk","ae","af","al","be","bf","bg","ce","cp","df","di","ee",
		"ef","fe","ff","gf","gm","he","hf","ie","je","jf","ke","kf","kl","le","lf",
		"lk","mf","mg","mn","nf","oe","of","pe","pf","pg","qe","qf","re","rf","se",
		"sf","te","tf","ti","ue","uf","ve","vf","we","wf","wg","wi","xe","ye","yf",
		"yk","yl","ze","zf","zk"
	];
	for (var i = 0; i < props.length; i++) {
		l[props[i]] = noopfn;
	}
	window.L = window.J = l;
})();


uAssets-17 application/javascript
(function() {
	var sto = window.setTimeout;
	var mysto = function(a, b) {
		if ( b === 15000 && a.toString().indexOf('a()') !== -1 ) {
			return;
		}
		return sto(a, b);
	};
	Object.defineProperty(window, 'setTimeout', {
		get: function() {
			return mysto;
		}
	});
})();


# fuckadblock defuser
fuckadblock.js-3.2.0 application/javascript
(function() {
	var noopfn = function() {
		;
	};
	//
	var Fab = function() {};
	Fab.prototype.check = noopfn;
	Fab.prototype.clearEvent = noopfn;
	Fab.prototype.emitEvent = noopfn;
	Fab.prototype.on = function(a, b) {
		if ( !a ) { b(); }
		return this;
	};
	Fab.prototype.onDetected = function() {
		return this;
	};
	Fab.prototype.onNotDetected = function(a) {
		a();
		return this;
	};
	Fab.prototype.setOption = noopfn;
	var fab = new Fab(),
		getSetFab = {
			get: function() { return Fab; },
			set: function() {}
		},
		getsetfab = {
			get: function() { return fab; },
			set: function() {}
		};
	if ( window.hasOwnProperty('FuckAdBlock') ) { window.FuckAdBlock = Fab; }
	else { Object.defineProperty(window, 'FuckAdBlock', getSetFab); }
	if ( window.hasOwnProperty('BlockAdBlock') ) { window.BlockAdBlock = Fab; }
	else { Object.defineProperty(window, 'BlockAdBlock', getSetFab); }
	if ( window.hasOwnProperty('SniffAdBlock') ) { window.SniffAdBlock = Fab; }
	else { Object.defineProperty(window, 'SniffAdBlock', getSetFab); }
	if ( window.hasOwnProperty('fuckAdBlock') ) { window.fuckAdBlock = fab; }
	else { Object.defineProperty(window, 'fuckAdBlock', getsetfab); }
	if ( window.hasOwnProperty('blockAdBlock') ) { window.blockAdBlock = fab; }
	else { Object.defineProperty(window, 'blockAdBlock', getsetfab); }
	if ( window.hasOwnProperty('sniffAdBlock') ) { window.sniffAdBlock = fab; }
	else { Object.defineProperty(window, 'sniffAdBlock', getsetfab); }
})();


antiAdBlock.js application/javascript
(function() {
	window.antiAdBlock = {
		onDetected: function() {
			;
		},
		onNotDetected: function(a) {
			a();
		}
	};
})();


# To neutralize GA scripts. The goal is to provide the minimal API
# expected by clients of these scripts so that the end users are able
# to wholly block GA while minimizing risks of page breakage.
# Test cases (need way more):
# - https://github.com/chrisaljoudi/uBlock/issues/119
# Reference API:
# - https://developers.google.com/analytics/devguides/collection/gajs/
google-analytics.com/ga.js application/javascript
(function() {
	var noopfn = function() {
		;
	};
	//
	var Gaq = function() {
		;
	};
	Gaq.prototype.Na = noopfn;
	Gaq.prototype.O = noopfn;
	Gaq.prototype.Sa = noopfn;
	Gaq.prototype.Ta = noopfn;
	Gaq.prototype.Va = noopfn;
	Gaq.prototype._createAsyncTracker = noopfn;
	Gaq.prototype._getAsyncTracker = noopfn;
	Gaq.prototype._getPlugin = noopfn;
	Gaq.prototype.push = function(a) {
		if ( typeof a === 'function' ) {
			a(); return;
		}
		if ( Array.isArray(a) === false ) {
			return;
		}
		// https://twitter.com/catovitch/status/776442930345218048
		// https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiDomainDirectory#_gat.GA_Tracker_._link
		if ( a[0] === '_link' && typeof a[1] === 'string' ) {
			window.location.assign(a[1]);
		}
		// https://github.com/gorhill/uBlock/issues/2162
		if ( a[0] === '_set' && a[1] === 'hitCallback' && typeof a[2] === 'function' ) {
			a[2]();
		}
	};
	//
	var tracker = (function() {
		var out = {};
		var api = [
			'_addIgnoredOrganic _addIgnoredRef _addItem _addOrganic',
			'_addTrans _clearIgnoredOrganic _clearIgnoredRef _clearOrganic',
			'_cookiePathCopy _deleteCustomVar _getName _setAccount',
			'_getAccount _getClientInfo _getDetectFlash _getDetectTitle',
			'_getLinkerUrl _getLocalGifPath _getServiceMode _getVersion',
			'_getVisitorCustomVar _initData _link _linkByPost',
			'_setAllowAnchor _setAllowHash _setAllowLinker _setCampContentKey',
			'_setCampMediumKey _setCampNameKey _setCampNOKey _setCampSourceKey',
			'_setCampTermKey _setCampaignCookieTimeout _setCampaignTrack _setClientInfo',
			'_setCookiePath _setCookiePersistence _setCookieTimeout _setCustomVar',
			'_setDetectFlash _setDetectTitle _setDomainName _setLocalGifPath',
			'_setLocalRemoteServerMode _setLocalServerMode _setReferrerOverride _setRemoteServerMode',
			'_setSampleRate _setSessionTimeout _setSiteSpeedSampleRate _setSessionCookieTimeout',
			'_setVar _setVisitorCookieTimeout _trackEvent _trackPageLoadTime',
			'_trackPageview _trackSocial _trackTiming _trackTrans',
			'_visitCode'
		].join(' ').split(/\s+/);
		var i = api.length;
		while ( i-- ) {
			out[api[i]] = noopfn;
		}
		out._getLinkerUrl = function(a) {
			return a;
		};
		return out;
	})();
	//
	var Gat = function() {
		;
	};
	Gat.prototype._anonymizeIP = noopfn;
	Gat.prototype._createTracker = noopfn;
	Gat.prototype._forceSSL = noopfn;
	Gat.prototype._getPlugin = noopfn;
	Gat.prototype._getTracker = function() {
		return tracker;
	};
	Gat.prototype._getTrackerByName = function() {
		return tracker;
	};
	Gat.prototype._getTrackers = noopfn;
	Gat.prototype.aa = noopfn;
	Gat.prototype.ab = noopfn;
	Gat.prototype.hb = noopfn;
	Gat.prototype.la = noopfn;
	Gat.prototype.oa = noopfn;
	Gat.prototype.pa = noopfn;
	Gat.prototype.u = noopfn;
	var gat = new Gat();
	window._gat = gat;
	//
	var gaq = new Gaq();
	(function() {
		var aa = window._gaq || [];
		if ( Array.isArray(aa) ) {
			while ( aa[0] ) {
				gaq.push(aa.shift());
			}
		}
	})();
	window._gaq = gaq.qf = gaq;
})();

google-analytics.com/analytics.js application/javascript
(function() {
    'use strict';
    // https://developers.google.com/analytics/devguides/collection/analyticsjs/
    const noopfn = function() {
    };
    const noopnullfn = function() {
        return null;
    };
    //
    const Tracker = function() {
    };
    const p = Tracker.prototype;
    p.get = noopfn;
    p.set = noopfn;
    p.send = noopfn;
    //
    const w = window;
    const gaName = w.GoogleAnalyticsObject || 'ga';
    const gaQueue = w[gaName];
    const ga = function() {
        const len = arguments.length;
        if ( len === 0 ) { return; }
        const args = Array.from(arguments);
        let fn;
        let a = args[len-1];
        if ( a instanceof Object && a.hitCallback instanceof Function ) {
            fn = a.hitCallback;
        } else {
            const pos = args.indexOf('hitCallback');
            if ( pos !== -1 && args[pos+1] instanceof Function ) {
                fn = args[pos+1];
            }
        }
        if ( fn instanceof Function === false ) { return; }
        try {
            fn();
        } catch (ex) {
        }
    };
    ga.create = function() {
        return new Tracker();
    };
    ga.getByName = noopnullfn;
    ga.getAll = function() {
        return [];
    };
    ga.remove = noopfn;
    // https://github.com/uBlockOrigin/uAssets/issues/2107
    ga.loaded = true;
    w[gaName] = ga;
    // https://github.com/gorhill/uBlock/issues/3075
    const dl = w.dataLayer;
    if ( dl instanceof Object && dl.hide instanceof Object && typeof dl.hide.end === 'function' ) {
        dl.hide.end();
    }
    // empty ga queue
    if ( gaQueue instanceof Function && Array.isArray(gaQueue.q) ) {
        for ( const entry of gaQueue.q ) {
            ga(...entry);
        }
    }
})();

google-analytics.com/inpage_linkid.js application/javascript
(function() {
	window._gaq = window._gaq || {
		push: function() {
			;
		}
	};
})();

# https://github.com/gorhill/uBlock/issues/2480
# https://developers.google.com/analytics/devguides/collection/gajs/experiments#cxjs
google-analytics.com/cx/api.js application/javascript
(function() {
	var noopfn = function() {
	};
	window.cxApi = {
		chooseVariation: function() {
			return 0;
		},
		getChosenVariation: noopfn,
		setAllowHash: noopfn,
		setChosenVariation: noopfn,
		setCookiePath: noopfn,
		setDomainName: noopfn
		};
})();

# Ubiquitous googletagservices.com: not blocked by EasyPrivacy.
# "Tags are tiny bits of website code that let you measure traffic and
# "visitor behavior"
googletagservices.com/gpt.js application/javascript
(function() {
	var p;
	// https://developers.google.com/doubleclick-gpt/reference
	var noopfn = function() {
		;
	}.bind();
	var noopthisfn = function() {
		return this;
	};
	var noopnullfn = function() {
		return null;
	};
	var nooparrayfn = function() {
		return [];
	};
	var noopstrfn = function() {
		return '';
	};
	//
	var companionAdsService = {
		addEventListener: noopthisfn,
		enableSyncLoading: noopfn,
		setRefreshUnfilledSlots: noopfn
	};
	var contentService = {
		addEventListener: noopthisfn,
		setContent: noopfn
	};
	var PassbackSlot = function() {
		;
	};
	p = PassbackSlot.prototype;
	p.display = noopfn;
	p.get = noopnullfn;
	p.set = noopthisfn;
	p.setClickUrl = noopthisfn;
	p.setTagForChildDirectedTreatment = noopthisfn;
	p.setTargeting = noopthisfn;
	p.updateTargetingFromMap = noopthisfn;
	var pubAdsService = {
		addEventListener: noopthisfn,
		clear: noopfn,
		clearCategoryExclusions: noopthisfn,
		clearTagForChildDirectedTreatment: noopthisfn,
		clearTargeting: noopthisfn,
		collapseEmptyDivs: noopfn,
		defineOutOfPagePassback: function() { return new PassbackSlot(); },
		definePassback: function() { return new PassbackSlot(); },
		disableInitialLoad: noopfn,
		display: noopfn,
		enableAsyncRendering: noopfn,
		enableSingleRequest: noopfn,
		enableSyncRendering: noopfn,
		enableVideoAds: noopfn,
		get: noopnullfn,
		getAttributeKeys: nooparrayfn,
		getTargeting: noopfn,
		getTargetingKeys: nooparrayfn,
		getSlots: nooparrayfn,
		refresh: noopfn,
		set: noopthisfn,
		setCategoryExclusion: noopthisfn,
		setCentering: noopfn,
		setCookieOptions: noopthisfn,
		setForceSafeFrame: noopthisfn,
		setLocation: noopthisfn,
		setPublisherProvidedId: noopthisfn,
		setRequestNonPersonalizedAds: noopthisfn,
		setSafeFrameConfig: noopthisfn,
		setTagForChildDirectedTreatment: noopthisfn,
		setTargeting: noopthisfn,
		setVideoContent: noopthisfn,
		updateCorrelator: noopfn
	};
	var SizeMappingBuilder = function() {
		;
	};
	p = SizeMappingBuilder.prototype;
	p.addSize = noopthisfn;
	p.build = noopnullfn;
	var Slot = function() {
		;
	};
	p = Slot.prototype;
	p.addService = noopthisfn;
	p.clearCategoryExclusions = noopthisfn;
	p.clearTargeting = noopthisfn;
	p.defineSizeMapping = noopthisfn;
	p.get = noopnullfn;
	p.getAdUnitPath = nooparrayfn;
	p.getAttributeKeys = nooparrayfn;
	p.getCategoryExclusions = nooparrayfn;
	p.getDomId = noopstrfn;
	p.getSlotElementId = noopstrfn;
	p.getSlotId = noopthisfn;
	p.getTargeting = nooparrayfn;
	p.getTargetingKeys = nooparrayfn;
	p.set = noopthisfn;
	p.setCategoryExclusion = noopthisfn;
	p.setClickUrl = noopthisfn;
	p.setCollapseEmptyDiv = noopthisfn;
	p.setTargeting = noopthisfn;
	//
	var gpt = window.googletag || {};
	var cmd = gpt.cmd || [];
	gpt.apiReady = true;
	gpt.cmd = [];
	gpt.cmd.push = function(a) {
		try {
			a();
		} catch (ex) {
		}
		return 1;
	};
	gpt.companionAds = function() { return companionAdsService; };
	gpt.content = function() { return contentService; };
	gpt.defineOutOfPageSlot = function() { return new Slot(); };
	gpt.defineSlot = function() { return new Slot(); };
	gpt.destroySlots = noopfn;
	gpt.disablePublisherConsole = noopfn;
	gpt.display = noopfn;
	gpt.enableServices = noopfn;
	gpt.getVersion = noopstrfn;
	gpt.pubads = function() { return pubAdsService; };
	gpt.pubadsReady = true;
	gpt.setAdIframeTitle = noopfn;
	gpt.sizeMapping = function() { return new SizeMappingBuilder(); };
	window.googletag = gpt;
	while ( cmd.length !== 0 ) {
		gpt.cmd.push(cmd.shift());
	}
})();


# Obviously more work needs to be done, but at least for now it takes care of:
# See related filter in assets/ublock/privacy.txt
# Also:
# - https://github.com/gorhill/uBlock/issues/2569
# - https://github.com/uBlockOrigin/uAssets/issues/420
googletagmanager.com/gtm.js application/javascript
(function() {
	var noopfn = function() {
	};
	var w = window;
	w.ga = w.ga || noopfn;
	var dl = w.dataLayer;
	if ( dl instanceof Object === false ) { return; }
	if ( dl.hide instanceof Object && typeof dl.hide.end === 'function' ) {
		dl.hide.end();
	}
	if ( typeof dl.push === 'function' ) {
		dl.push = function(o) {
			if (
				o instanceof Object &&
				typeof o.eventCallback === 'function'
			) {
				setTimeout(o.eventCallback, 1);
			}
		};
	}
})();


# https://github.com/uBlockOrigin/uAssets/issues/282
# https://github.com/uBlockOrigin/uAssets/issues/418
googlesyndication.com/adsbygoogle.js application/javascript
(function() {
	window.adsbygoogle = window.adsbygoogle || {
		length: 0,
		loaded: true,
		push: function Si(a) {
			/*
			client = client || google_ad_client || google_ad_client;
			slotname = slotname || google_ad_slot;
			tag_origin = tag_origin || google_tag_origin
			*/
			this.length += 1;
		}
	};
	const phs = document.querySelectorAll('.adsbygoogle');
	const css = 'height:1px!important;max-height:1px!important;max-width:1px!important;width:1px!important;';
	for ( let i = 0; i < phs.length; i++ ) {
		const fr = document.createElement('iframe');
        const id = `aswift_${(i+1)}`;
        if ( document.querySelector(`iframe#${id}`) !== null ) { continue; }
        fr.id = id;
		fr.style = css;
		const cfr = document.createElement('iframe');
		cfr.id = `google_ads_frame${i}`;
		fr.appendChild(cfr);
		document.body.appendChild(fr);
	}
})();


# https://forums.lanik.us/viewtopic.php?f=91&t=27188
# https://forums.lanik.us/viewtopic.php?f=91&t=29609
ligatus.com/*/angular-tag.js application/javascript
(function() {
	self.adProtect = true;
	Object.defineProperties(window, {
		uabpdl: { value: true },
		uabDetect: { value: true }
	});
})();


# Addefend defuser
uabinject-defuser.js application/javascript
(function() {
	window.trckd = window.uabpdl = window.uabInject = window.uabDetect = true;
})();


# https://github.com/gorhill/uBlock/issues/1094
pornhub-popup-defuser.js application/javascript
(function() {
	var w = window;
	var count = Math.ceil(8+Math.random()*4);
	var tomorrow = new Date(Date.now() + 86400000);
	document.cookie = 'FastPopSessionRequestNumber=' + count + '; expires=' + tomorrow.toUTCString();
	var db;
	if ( (db = w.localStorage) ) {
		db.setItem('InfNumFastPops', count);
		db.setItem('InfNumFastPopsExpire', tomorrow.toISOString());
	}
	if ( (db = w.sessionStorage) ) {
		db.setItem('InfNumFastPops', count);
		db.setItem('InfNumFastPopsExpire', tomorrow.toISOString());
	}
})();


# https://archive.rebeccablacktech.com/g/thread/S54040346#p54046766
pornhub-sanitizer.js application/javascript
(function() {
	var removeAdFrames = function(aa) {
		var el;
		for ( var i = 0; i < aa.length; i++ ) {
			el = document.getElementById(aa[i]);
			if ( el !== null ) {
				el.parentNode.removeChild(el);
			}
		}
	};
	Object.defineProperty(window, 'block_logic', {
		get: function() { return removeAdFrames; },
		set: function() {}
	});
})();


goyavelab-defuser.js application/javascript
(function() {
	var noopfn = function() {
		;
	};
	Object.defineProperty(window, '_$14', {
		get: function() { return noopfn; },
		set: noopfn
	});
})();


# https://news.ycombinator.com/item?id=10814913
forbes-defuser.js application/javascript
(function() {
	if ( window.location.pathname.lastIndexOf('/forbes/welcome/', 0) !== 0 ) {
		return;
	}
	document.cookie = 'welcomeAd=true';
	window.addEventListener('load', function() {
		// https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_2_Get_a_sample_cookie_named_test2
		var toURL = document.cookie.replace(/(?:(?:^|.*;\s*)toURL\s*\=\s*([^;]*).*$)|^.*$/, "$1");
		if ( toURL.lastIndexOf('http', 0) === 0 ) {
			window.location.replace(toURL);
		}
	});
})();


# https://github.com/gorhill/uBlock/issues/733
wpredirect-defuser.js application/javascript
(function() {
	var twp = window.TWP = window.TWP || {};
	twp.Identity = twp.Identity || {};
	twp.Identity.initComplete = true;
})();


# https://github.com/gorhill/uBlock/issues/1194
# https://github.com/uBlockOrigin/uAssets/issues/106
openload.co.js application/javascript
(function() {
	Object.defineProperties(window, {
		adblock2: { value: false },
		OlPopup: { value: null },
		preserve: {
			get: function() { return true; },
			set: function() {}
		},
		turnoff: { value: true }
	});
})();


bab-defuser.js application/javascript
(function() {
	var sto = window.setTimeout,
		re = /\.bab_elementid.$/;
	window.setTimeout = function(a, b) {
		if ( typeof a !== 'string' || !re.test(a) ) {
			return sto.apply(this, arguments);
		}
	}.bind(window);
	var signatures = [
		['blockadblock'],
		['babasbm'],
		[/getItem\('babn'\)/],
		['getElementById','String.fromCharCode','ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789','charAt','DOMContentLoaded','AdBlock','addEventListener','doScroll','fromCharCode','<<2|r>>4','sessionStorage','clientWidth','localStorage','Math','random']
	];
	var check = function(s) {
		var tokens, match, j, token, pos;
		for ( var i = 0; i < signatures.length; i++ ) {
			tokens = signatures[i];
			match = 0;
			for ( j = 0, pos = 0; j < tokens.length; j++ ) {
				token = tokens[j];
				pos = token instanceof RegExp ? s.search(token) : s.indexOf(token);
				if ( pos !== -1 ) { match += 1; }
			}
			if ( (match / tokens.length) >= 0.8 ) { return true; }
		}
		return false;
	};
	var realEval = window.eval;
	window.eval = function(a) {
		if ( typeof a !== 'string' || !check(a) ) {
			return realEval(a);
		}
		var el = document.body;
		if ( el ) {
			el.style.removeProperty('visibility');
		}
		el = document.getElementById('babasbmsgx');
		if ( el ) {
			el.parentNode.removeChild(el);
		}
	}.bind(window);
})();


kissanime-defuser.js application/javascript
(function() {
	Object.defineProperties(window, {
		DoDetect1: { value: function() {} },
		DoDetect2: { value: function() {} },
		isBlockAds2: { value: false }
	});
	window.onerror = function(msg, src, line, col, error) {
		if ( /DoDetect\d?|isBlockAds\d/.test(msg) ) { return true; }
	};
})();


phenv-defuser.js application/javascript
(function() {
	var phenv = window.PHENV;
	var noopfn = function() {
		;
	};
	var trapOnDetection = function() {
		if ( phenv.onDetection === undefined ) {
			Object.defineProperty(phenv, 'onDetection', {
				get: function() {
					return noopfn;
				},
				set: noopfn
			});
			return;
		}
		phenv.onDetection = noopfn;
	};
	if ( phenv === undefined ) {
		Object.defineProperty(window, 'PHENV', {
			get: function() {
				return phenv;
			},
			set: function(a) {
				phenv = a;
				trapOnDetection();
			}
		});
		return;
	}
	trapOnDetection();
})();


scorecardresearch.com/beacon.js application/javascript
(function() {
	window.COMSCORE = {
		purge: function() {
			_comscore = [];
		},
		beacon: function() {
			;
		}
	};
})();


# https://github.com/gorhill/uBlock/issues/1250#issuecomment-173533894
widgets.outbrain.com/outbrain.js application/javascript
(function() {
	var noopfn = function() {
		;
	};
	var obr = {};
	var methods = [
		'callClick', 'callLoadMore', 'callRecs', 'callUserZapping',
		'callWhatIs', 'cancelRecommendation', 'cancelRecs', 'closeCard',
		'closeModal', 'closeTbx', 'errorInjectionHandler', 'getCountOfRecs',
		'getStat', 'imageError', 'manualVideoClicked', 'onOdbReturn',
		'onVideoClick', 'pagerLoad', 'recClicked', 'refreshSpecificWidget',
		'refreshWidget', 'reloadWidget', 'researchWidget', 'returnedError',
		'returnedHtmlData', 'returnedIrdData', 'returnedJsonData', 'scrollLoad',
		'showDescription', 'showRecInIframe', 'userZappingMessage', 'zappingFormAction'
	];
	obr.extern = {
		video: {
			getVideoRecs: noopfn,
			videoClicked: noopfn
		}
	};
	methods.forEach(function(a) {
		obr.extern[a] = noopfn;
	});
	window.OBR = window.OBR || obr;
})();


# https://github.com/gorhill/uBlock/issues/1228
window.name-defuser application/javascript
if ( window === window.top ) {
	window.name = '';
}


# https://github.com/gorhill/uBlock/issues/897#issuecomment-180871042
doubleclick.net/instream/ad_status.js application/javascript
window.google_ad_status = 1;


# https://github.com/gorhill/uBlock/issues/1384
addthis.com/addthis_widget.js application/javascript
(function() {
	var noopfn = function() {
		;
	};
	window.addthis = {
		addEventListener: noopfn,
		button: noopfn,
		init: noopfn,
		layers: noopfn,
		ready: noopfn,
		sharecounters: {
			getShareCounts: noopfn
		},
		toolbox: noopfn,
		update: noopfn
	};
})();


# https://github.com/gorhill/uBlock/issues/1059#issuecomment-185434177
# Works for stern.de, will see if reusable.
bcplayer-defuser.js application/javascript
(function() {
	var bcPlayer;
	Object.defineProperty(window, 'bcPlayer', {
		get: function() {
			return bcPlayer;
		},
		set: function(a) {
			bcPlayer = a;
			a.ads = function(a) {
				;
			};
		}
	});
})();


# Completely experimental: load Disqus on demand only. Purpose is to avoid
# connecting to Disqus' servers, unless the user explicitly asks for the
# comments to be loaded.
# Works with following filters:
# ||disqus.com/forums/*/embed.js$script,redirect=disqus.com/forums/*/embed.js
# ||disqus.com/embed.js$script,redirect=disqus.com/embed.js
# ||disqus.com/count.js$script
# @@||disqus.com/embed.js?_=1457540*$script
# If you want a site you regularly visit to always have the comment loaded,
# just use an exception static filter. Example for wired.com:
# @@||wired.disqus.com/embed.js

# Sometimes a site will use this one script:
disqus.com/forums/*/embed.js application/javascript
(function() {
	var ee = document.getElementsByTagName('script');
	var i = ee.length, src;
	while ( i-- ) {
		src = ee[i].src || '';
		if ( src === '' ) {
			continue;
		}
		if ( src.lastIndexOf('disqus.com/embed.js') === (src.length - 19) ) {
			return;
		}
	}
	var e = document.createElement('script');
	e.async = true;
	e.src = '//' + window.disqus_shortname + '.disqus.com/embed.js';
	document.body.appendChild(e);
})();

# Most use this one though:
disqus.com/embed.js application/javascript
(function() {
	var p = document.getElementById(window.disqus_container_id || 'disqus_thread');
	if ( p === null ) {
		return;
	}
	var b = document.createElement('button');
	b.textContent = 'Disqus blocked by uBlock Origin: click to unblock';
	b.type = 'button';
	p.appendChild(b);
	var loadDisqus = function(ev) {
		b.removeEventListener('click', loadDisqus);
		p.removeChild(b);
		var script = document.createElement('script');
		script.async = true;
		var t = Date.now().toString();
		script.src = '//' + window.disqus_shortname + '.disqus.com/embed.js?_=1457540' + t.slice(-6);
		document.body.appendChild(script);
		ev.preventDefault();
		ev.stopPropagation();
	};
	b.addEventListener('click', loadDisqus);
})();


# https://github.com/gorhill/uBlock/issues/1461
ytad-defuser.js application/javascript
(function() {
	var bind = Function.prototype.bind;
	Function.prototype.bind = function() {
		'native code';
		var bound = bind.apply(this, arguments);
		bound.xpizqvtnrfkcjixkmdnu = this.toString();
		return bound;
	};
	var sto = window.setTimeout;
	window.setTimeout = function(a, b) {
		if ( b === 15000 && b < 20000 && 'xpizqvtnrfkcjixkmdnu' in a ) {
			console.log('uBO>', a.xpizqvtnrfkcjixkmdnu);
		}
		return sto(a, b);
	};
})();


amazon-adsystem.com/aax2/amzn_ads.js application/javascript
(function() {
	if ( amznads ) {
		return;
	}
	var w = window;
	var noopfn = function() {
		;
	}.bind();
	var amznads = {
		appendScriptTag: noopfn,
		appendTargetingToAdServerUrl: noopfn,
		appendTargetingToQueryString: noopfn,
		clearTargetingFromGPTAsync: noopfn,
		doAllTasks: noopfn,
		doGetAdsAsync: noopfn,
		doTask: noopfn,
		detectIframeAndGetURL: noopfn,
		getAds: noopfn,
		getAdsAsync: noopfn,
		getAdForSlot: noopfn,
		getAdsCallback: noopfn,
		getDisplayAds: noopfn,
		getDisplayAdsAsync: noopfn,
		getDisplayAdsCallback: noopfn,
		getKeys: noopfn,
		getReferrerURL: noopfn,
		getScriptSource: noopfn,
		getTargeting: noopfn,
		getTokens: noopfn,
		getValidMilliseconds: noopfn,
		getVideoAds: noopfn,
		getVideoAdsAsync: noopfn,
		getVideoAdsCallback: noopfn,
		handleCallBack: noopfn,
		hasAds: noopfn,
		renderAd: noopfn,
		saveAds: noopfn,
		setTargeting: noopfn,
		setTargetingForGPTAsync: noopfn,
		setTargetingForGPTSync: noopfn,
		tryGetAdsAsync: noopfn,
		updateAds: noopfn
	};
	w.amznads = amznads;
	w.amzn_ads = w.amzn_ads || noopfn;
	w.aax_write = w.aax_write || noopfn;
	w.aax_render_ad = w.aax_render_ad || noopfn;
})();


# https://adblockplus.org/forum/viewtopic.php?f=2&t=25216#p149739
sas-defuser.js application/javascript
(function() {
	var noopfn = function() {
		;
	};
	var ads = {
		display: noopfn,
		refresh: noopfn
	};
	Object.defineProperty(window, 'Ads', {
		get: function() {
			return ads;
		},
		set: noopfn
	});
})();

# https://adblockplus.org/forum/viewtopic.php?f=2&t=25216#p149739
figaro-defuser.js application/javascript
(function() {
	Object.defineProperty(window, 'adisplaynormal', {
		get: function() {
			return true;
		},
		set: function() {}
	});
})();

# https://adblockplus.org/forum/viewtopic.php?f=2&t=25216#p149739
lemonde-defuser.js application/javascript
(function() {
	localStorage.setItem('lmd_me_displayed',JSON.stringify({data:true,timeout:Date.now()+31536000000}));
})();

# Good case for https://github.com/gorhill/uBlock/issues/781
rtlfr-defuser.js application/javascript
(function() {
	window.addEventListener('load', function() {
		document.body.style.setProperty('overflow', 'auto');
	});
})();


# Experimental: Generic nuisance overlay buster.
# if this works well and proves to be useful, this may end up as a stock tool
# in uBO's popup panel.
overlay-buster.js application/javascript
(function() {
	if ( window !== window.top ) {
		return;
	}
	var tstart;
	var ttl = 30000;
	var delay = 0;
	var delayStep = 50;
	var buster = function(mutations) {
		var docEl = document.documentElement,
			bodyEl = document.body,
			vw = Math.min(docEl.clientWidth, window.innerWidth),
			vh = Math.min(docEl.clientHeight, window.innerHeight),
			tol = Math.min(vw, vh) * 0.05,
			el = document.elementFromPoint(vw/2, vh/2),
			style, rect;
		for (;;) {
			if ( el === null || el.parentNode === null || el === bodyEl ) {
				break;
			}
			style = window.getComputedStyle(el);
			if ( parseInt(style.zIndex, 10) >= 1000 || style.position === 'fixed' ) {
				rect = el.getBoundingClientRect();
				if ( rect.left <= tol && rect.top <= tol && (vw - rect.right) <= tol && (vh - rect.bottom) < tol ) {
					el.parentNode.removeChild(el);
					tstart = Date.now();
					el = document.elementFromPoint(vw/2, vh/2);
					bodyEl.style.setProperty('overflow', 'auto', 'important');
					docEl.style.setProperty('overflow', 'auto', 'important');
					continue;
				}
			}
			el = el.parentNode;
		}
		if ( (Date.now() - tstart) < ttl ) {
			delay = Math.min(delay + delayStep, 1000);
			setTimeout(buster, delay);
		}
	};
	var domReady = function(ev) {
		if ( ev ) {
			document.removeEventListener(ev.type, domReady);
		}
		tstart = Date.now();
		setTimeout(buster, delay);
	};
	if ( document.readyState === 'loading' ) {
		document.addEventListener('DOMContentLoaded', domReady);
	} else {
		domReady();
	}
})();


# http://www.wilderssecurity.com/threads/ublock-a-lean-and-fast-blocker.365273/page-77
imore-sanitizer.js application/javascript
(function() {
	if ( window.mbn_zones ) {
		delete window.mbn_zones;
		return;
	}
	Object.defineProperty(window, 'mbn_zones', {
		value: undefined
	});
})();


# https://forums.lanik.us/viewtopic.php?f=62&t=25212
# https://github.com/uBlockOrigin/uAssets/issues/3
impspcabe-defuser.js application/javascript
(function(){
	window._impspcabe = false;
	window._impspcabe_alpha = false;
	window._impspcabe_beta = false;
	window._impspcabe_path = 'about:blank';
})();


# https://github.com/uBlockOrigin/uAssets/issues/8
alert-buster.js application/javascript
(function() {
	window.alert = function(a) {
		console.info(a);
	};
})();


# https://github.com/uBlockOrigin/uAssets/issues/36
nr-unwrapper.js application/javascript
(function(){
	var wrapped = ' \
		EventTarget.prototype.addEventListener \
		EventTarget.prototype.removeEventListener \
		XMLHttpRequest.prototype.open \
		XMLHttpRequest.prototype.send \
		addEventListener \
		clearTimeout \
		removeEventListener \
		requestAnimationFrame \
		setInterval \
		setTimeout \
		'.split(/\s+/);
	var path, o, p, fn;
	for ( var i = 0; i < wrapped.length; i++ ) {
		path = wrapped[i].split('.');
		p = '';
		for ( var j = 0; j < path.length; j++ ) {
			if ( path[j] === '' ) {
				continue;
			}
			o = p !== '' ? o = o[p] : window;
			p = path[j];
		}
		if ( p === '' ) {
			continue;
		}
		fn = o[p];
		if (
			typeof fn === 'function' &&
			fn.toString().indexOf('nrWrapper') !== -1 &&
			typeof fn['nr@original'] === 'function'
		) {
			o[p] = fn['nr@original'];
		}
	}
})();


# https://github.com/uBlockOrigin/uAssets/issues/58
gpt-defuser.js application/javascript
(function() {
    const noopfn = function() {
    };
    let props = '_resetGPT resetGPT resetAndLoadGPTRecovery _resetAndLoadGPTRecovery setupGPT setupGPTuo';
    props = props.split(/\s+/);
    while ( props.length ) {
        var prop = props.pop();
        if ( typeof window[prop] === 'function' ) {
            window[prop] = noopfn;
        } else {
            Object.defineProperty(window, prop, {
                get: function() { return noopfn; },
                set: noopfn
            });
        }
    }
})();


# https://github.com/uBlockOrigin/uAssets/issues/66
folha-de-sp.js application/javascript
(function() {
	if ( window.folha_ads !== undefined ) {
		window.folha_ads = true;
		return
	}
	Object.defineProperty(window, 'folha_ads', {
		get: function() {
			return true;
		},
		set: function() {
			;
		}
	});
})();


# Prevent web pages from using eval(), and report attempts in console.
noeval.js application/javascript
(function() {
	window.eval = function(s) {
		console.log('Document tried to eval... \n' + s);
	}.bind(window);
})();

silent-noeval.js application/javascript
(function() {
	window.eval = function(s) {
		;
	}.bind(window);
})();

noeval-if.js application/javascript
(function() {
    let needle = '{{1}}';
    if ( needle === '' || needle === '{{1}}' ) {
        needle = '.?';
    } else if ( needle.slice(0,1) === '/' && needle.slice(-1) === '/' ) {
        needle = needle.slice(1,-1);
    } else {
        needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    needle = new RegExp(needle);
    window.eval = new Proxy(window.eval, {          // jshint ignore: line
        apply: function(target, thisArg, args) {
            const a = args[0];
            if ( needle.test(a.toString()) === false ) {
                return target.apply(thisArg, args);
            }
        }
    });
})();


no-fetch-if.js application/javascript
(function() {
    let arg1 = '{{1}}';
    if ( arg1 === '{{1}}' ) { arg1 = ''; }
    const needles = [];
    for ( const condition of arg1.split(/\s+/) ) {
        if ( condition === '' ) { continue; }
        const pos = condition.indexOf(':');
        let key, value;
        if ( pos !== -1 ) {
            key = condition.slice(0, pos);
            value = condition.slice(pos + 1);
        } else {
            key = 'url';
            value = condition;
        }
        if ( value === '' ) {
            value = '^';
        } else if ( value.startsWith('/') && value.endsWith('/') ) {
            value = value.slice(1, -1);
        } else {
            value = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
        }
        needles.push({ key, re: new RegExp(value) });
    }
    const log = needles.length === 0 ? console.log.bind(console) : undefined;
    self.fetch = new Proxy(self.fetch, {
        apply: function(target, thisArg, args) {
            let proceed = true;
            try {
                let details;
                if ( args[0] instanceof self.Request ) {
                    details = args[0];
                } else {
                    details = Object.assign({ url: args[0] }, args[1]);
                }
                const props = new Map();
                for ( const prop in details ) {
                    let v = details[prop];
                    if ( typeof v !== 'string' ) {
                        try { v = JSON.stringify(v); }
                        catch(ex) { }
                    }
                    if ( typeof v !== 'string' ) { continue; }
                    props.set(prop, v);
                }
                if ( log !== undefined ) {
                    const out = Array.from(props)
                                     .map(a => `${a[0]}:${a[1]}`)
                                     .join(' ');
                    log(`uBO: fetch(${out})`);
                }
                proceed = needles.length === 0;
                for ( const { key, re } of needles ) {
                    if (
                        props.has(key) === false ||
                        re.test(props.get(key)) === false
                    ) {
                        proceed = true;
                        break;
                    }
                }
            } catch(ex) {
            }
            return proceed
                ? Reflect.apply(target, thisArg, args)
                : Promise.resolve(new Response());
        }
    });
})();


# Prevent web pages from using RTCPeerConnection(), and report attempts in console.
nowebrtc.js application/javascript
(function() {
	var rtcName = window.RTCPeerConnection ? 'RTCPeerConnection' : (
		window.webkitRTCPeerConnection ? 'webkitRTCPeerConnection' : ''
	);
	if ( rtcName === '' ) { return; }
	var log = console.log.bind(console);
	var pc = function(cfg) {
		log('Document tried to create an RTCPeerConnection: %o', cfg);
	};
	var noop = function() {
		;
	};
	pc.prototype = {
		close: noop,
		createDataChannel: noop,
		createOffer: noop,
		setRemoteDescription: noop,
		toString: function() {
			return '[object RTCPeerConnection]';
		}
	};
	var z = window[rtcName];
	window[rtcName] = pc.bind(window);
	if ( z.prototype ) {
		z.prototype.createDataChannel = function(a, b) {
			return {
				close: function() {},
				send: function() {}
			};
		}.bind(null);
	}
})();


webrtc-if.js application/javascript
(function() {
    let good = '{{1}}';
    if ( good.startsWith('/') && good.endsWith('/') ) {
        good = good.slice(1, -1);
    } else {
        good = good.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    let reGood;
    try {
        reGood = new RegExp(good);
    } catch(ex) {
        return;
    }
    const rtcName = window.RTCPeerConnection
        ? 'RTCPeerConnection'
        : (window.webkitRTCPeerConnection ? 'webkitRTCPeerConnection' : '');
    if ( rtcName === '' ) { return; }
    const log = console.log.bind(console);
    const neuteredPeerConnections = new WeakSet();
    const isGoodConfig = function(instance, config) {
        if ( neuteredPeerConnections.has(instance) ) { return false; }
        if ( config instanceof Object === false ) { return true; }
        if ( Array.isArray(config.iceServers) === false ) { return true; }
        for ( const server of config.iceServers ) {
            const urls = typeof server.urls === 'string'
                ? [ server.urls ]
                : server.urls;
            if ( Array.isArray(urls) ) {
                for ( const url of urls ) {
                    if ( reGood.test(url) ) { return true; }
                }
            }
            if ( typeof server.username === 'string' ) {
                if ( reGood.test(server.username) ) { return true; }
            }
            if ( typeof server.credential === 'string' ) {
                if ( reGood.test(server.credential) ) { return true; }
            }
        }
        neuteredPeerConnections.add(instance);
        return false;
    };
    const peerConnectionCtor = window[rtcName];
    const peerConnectionProto = peerConnectionCtor.prototype;
    peerConnectionProto.createDataChannel =
        new Proxy(peerConnectionProto.createDataChannel, {
            apply: function(target, thisArg, args) {
                if ( isGoodConfig(target, args[1]) === false ) {
                    log(args[1]);
                    return Reflect.apply(target, thisArg, args.slice(0, 1));
                }
                return Reflect.apply(target, thisArg, args);
            },
        });
    window[rtcName] =
        new Proxy(peerConnectionCtor, {
            construct: function(target, args) {
                if ( isGoodConfig(target, args[0]) === false ) {
                    log(args[0]);
                    return Reflect.construct(target);
                }
                return Reflect.construct(target, args);
            }
        });
})();


# https://github.com/gorhill/uBlock/issues/1340#issuecomment-230495317
__$dc-defuser.js application/javascript
(function() {
	if ( Math.mt_random === undefined ) {
		Object.defineProperty(Math, 'mt_random', {
			value: function() { throw new TypeError(); }.bind()
		});
	} else {
		Math.mt_random = function() { throw new TypeError(); }.bind();
	}
})();


# https://github.com/uBlockOrigin/uAssets/issues/88
golem.de.js application/javascript
(function() {
	const rael = window.addEventListener;
	window.addEventListener = function(a, b) {
		rael(...arguments);
		let haystack;
		try {
			haystack = b.toString();
		} catch(ex) {
		}
		if (
			typeof haystack === 'string' &&
			/^\s*function\s*\(\)\s*\{\s*window\.clearTimeout\(r\)\s*\}\s*$/.test(haystack)
		) {
			b();
		}
	}.bind(window);
})();


# https://www.reddit.com/r/firefox/comments/4wpd23/popads_just_announced_that_they_have_a_new_method/
popads.net.js application/javascript
(function() {
	var magic = String.fromCharCode(Date.now() % 26 + 97) +
				Math.floor(Math.random() * 982451653 + 982451653).toString(36),
		oe = window.onerror;
	window.onerror = function(msg, src, line, col, error) {
		if ( typeof msg === 'string' && msg.indexOf(magic) !== -1 ) { return true; }
		if ( oe instanceof Function ) {
			return oe(msg, src, line, col, error);
		}
	}.bind();
	var throwMagic = function() { throw magic; };
	delete window.PopAds;
	delete window.popns;
	Object.defineProperties(window, {
		PopAds: { set: throwMagic },
		popns: { set: throwMagic }
	});
})();


# https://github.com/uBlockOrigin/uAssets/issues/503
popads-dummy.js application/javascript
(function() {
	delete window.PopAds;
	delete window.popns;
	Object.defineProperties(window, {
		PopAds: { value: {} },
		popns: { value: {} }
	});
})();


# https://forums.lanik.us/viewtopic.php?f=62&t=32070
xvideos.com.js application/javascript
(function() {
	var z = function(ads) {
		var banners = ads && ads.banners;
		if ( !banners ) { return; }
		var banner, div;
		while ( banners.length !== 0 ) {
			banner = banners[0];
			if ( !banner ) { continue; }
			while ( (div = document.getElementById(banner.div_id)) !== null ) {
				div.parentNode.removeChild(div);
			}
			banners.shift();
		}
	};
	window.addEventListener('DOMContentLoaded', function() {
		var xv = window.xv;
		z(xv && xv.conf && xv.conf.ads);
	});
	var dfn,
		dfntrap = function(a, b, c) {
			if ( a !== 'config/ads' ) { dfn(a, b, c); return; }
			var ads = b;
			while ( typeof ads === 'function' ) { ads = ads(); }
			z(ads);
			b = function() { return function() { return JSON.parse(JSON.stringify(ads)); }; };
			dfn(a, ads, c);
		};
	Object.defineProperty(window, 'define', {
		get: function() { return dfn ? dfntrap : undefined; },
		set: function(a) { dfn = a; }
	});
})();


# https://forums.lanik.us/viewtopic.php?f=64&t=32278
# https://www.reddit.com/r/chrome/comments/58eix6/ublock_origin_not_working_on_certain_sites/
upmanager-defuser.js application/javascript
(function() {
	var onerror = window.onerror;
	window.onerror = function(msg, source, lineno, colno, error) {
		if ( typeof msg === 'string' && msg.indexOf('upManager') !== -1 ) {
			return true;
		}
		if ( onerror instanceof Function ) {
			onerror.call(window, msg, source, lineno, colno, error);
		}
	};
	Object.defineProperty(window, 'upManager', { value: function() {} });
})();


# https://github.com/uBlockOrigin/uAssets/issues/110
smartadserver.com.js application/javascript
Object.defineProperties(window, {
	SmartAdObject: { value: function(){} },
	SmartAdServerAjax: { value: function(){} },
	smartAd: { value: { LoadAds: function() {}, Register: function() {} } }
});


# http://www.linuxtricks.fr/news/10-logiciels-libres/169-contourner-les-anti-bloqueurs-de-pub-la-revanche/
lesechos.fr.js application/javascript
Object.defineProperty(window, 'checkAdBlock', {
	value: function(){}
});


# https://github.com/uBlockOrigin/uAssets/issues/141
criteo.net.js application/javascript
(function() {
	var noopfn = function() {};
	var criteo = {
		DisplayAd: noopfn
	};
	if ( window.hasOwnProperty('Criteo') ) {
		window.Criteo = criteo;
	} else {
		Object.defineProperty(window, 'Criteo', { value: criteo });
	}
})();


# https://github.com/uBlockOrigin/uAssets/issues/38
# https://github.com/uBlockOrigin/uAssets/issues/150
r3z-defuser.js application/javascript
window._r3z = {};
Object.defineProperties(window._r3z, {
	jq: { value: undefined },
	pub: { value: {} }
});


# https://github.com/uBlockOrigin/uAssets/issues/125
d3pkae9owd2lcf.cloudfront.net/mb105.js application/javascript
(function() {
	var noopfn = function(){};
	window.pbjs = { libLoaded: true };
	var mb = window.MonkeyBroker || {
		addAttribute: noopfn,
		addSlot: function(a) {
			this.slots[a.slot] = {};
		},
		defineSlot: noopfn,
		fillSlot: noopfn,
		go: noopfn,
		inventoryConditionalPlacement: noopfn,
		registerSizeCallback: noopfn,
		registerSlotCallback: noopfn,
		slots: {},
		version: ''
	};
	mb.regSlotsMap = mb.slots;
	window.MonkeyBroker = mb;
})();


# https://www.reddit.com/r/uBlockOrigin/comments/55pu1e/lastfm_super_aggressive_adblock_warning_message/
last.fm.js application/javascript
(function() {
	var st = window.setTimeout;
	var z = function(a, b) {
		if ( b === 2000 && a.name.indexOf('bound') !== -1 ) {
			return;
		}
		return st(a, b);
	}.bind(window);
	Object.defineProperty(window, 'setTimeout', { value: z });
})();


# https://twitter.com/Scarbir/status/785551814460571648
static.chartbeat.com/chartbeat.js application/javascript
(function() {
	var noopfn = function(){};
	window.pSUPERFLY = {
		activity: noopfn,
		virtualPage: noopfn
	};
})();


# https://github.com/gorhill/uBlock/issues/2132
abort-on-property-write.js application/javascript
(function() {
    const magic = String.fromCharCode(Date.now() % 26 + 97) +
                  Math.floor(Math.random() * 982451653 + 982451653).toString(36);
    let prop = '{{1}}';
    let owner = window;
    for (;;) {
        const pos = prop.indexOf('.');
        if ( pos === -1 ) { break; }
        owner = owner[prop.slice(0, pos)];
        if ( owner instanceof Object === false ) { return; }
        prop = prop.slice(pos + 1);
    }
    delete owner[prop];
    Object.defineProperty(owner, prop, {
        set: function() {
            throw new ReferenceError(magic);
        }
    });
    const oe = window.onerror;
    window.onerror = function(msg, src, line, col, error) {
        if ( typeof msg === 'string' && msg.indexOf(magic) !== -1 ) {
            return true;
        }
        if ( oe instanceof Function ) {
            return oe(msg, src, line, col, error);
        }
    }.bind();
})();


abort-on-property-read.js application/javascript
(function() {
    const magic = String.fromCharCode(Date.now() % 26 + 97) +
                  Math.floor(Math.random() * 982451653 + 982451653).toString(36);
    const abort = function() {
        throw new ReferenceError(magic);
    };
    const makeProxy = function(owner, chain) {
        const pos = chain.indexOf('.');
        if ( pos === -1 ) {
            const desc = Object.getOwnPropertyDescriptor(owner, chain);
            if ( !desc || desc.get !== abort ) {
                Object.defineProperty(owner, chain, {
                    get: abort,
                    set: function(){}
                });
            }
            return;
        }
        const prop = chain.slice(0, pos);
        let v = owner[prop];
        chain = chain.slice(pos + 1);
        if ( v ) {
            makeProxy(v, chain);
            return;
        }
        const desc = Object.getOwnPropertyDescriptor(owner, prop);
        if ( desc && desc.set !== undefined ) { return; }
        Object.defineProperty(owner, prop, {
            get: function() { return v; },
            set: function(a) {
                v = a;
                if ( a instanceof Object ) {
                    makeProxy(a, chain);
                }
            }
        });
    };
    const owner = window;
    let chain = '{{1}}';
    makeProxy(owner, chain);
    const oe = window.onerror;
    window.onerror = function(msg, src, line, col, error) {
        if ( typeof msg === 'string' && msg.indexOf(magic) !== -1 ) {
            return true;
        }
        if ( oe instanceof Function ) {
            return oe(msg, src, line, col, error);
        }
    }.bind();
})();


setTimeout-logger.js application/javascript
(function() {
	var z = window.setTimeout,
		log = console.log.bind(console);
	window.setTimeout = function(a, b) {
		log('uBO: setTimeout("%s", %s)', a.toString(), b);
		return z.apply(this, arguments);
	}.bind(window);
})();


setInterval-defuser.js application/javascript
(function() {
	var w = window,
		z = w.setInterval,
		needle = '{{1}}',
		delay = parseInt('{{2}}', 10);
	if ( needle === '' || needle === '{{1}}' ) {
		needle = '.?';
	} else if ( needle.slice(0,1) === '/' && needle.slice(-1) === '/' ) {
		needle = needle.slice(1,-1);
	} else {
		needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
	}
	needle = new RegExp(needle);
	w.setInterval = function(a, b) {
		if ( (isNaN(delay) || b == delay) && needle.test(a.toString()) ) {
			return z(function(){}, b);
		}
		return z.apply(this, arguments);
	}.bind(w);
	w.setInterval.toString = function() { return z.toString(); };
})();


setInterval-logger.js application/javascript
(function() {
	var z = window.setInterval,
		log = console.log.bind(console);
	window.setInterval = function(a, b) {
		log('uBO: setInterval("%s", %s)', a.toString(), b);
		return z.apply(this, arguments);
	}.bind(window);
})();


sharedWorker-defuser.js application/javascript
(function() {
	if ( window.SharedWorker instanceof Function === false ) { return; }
	var needle = '{{1}}';
	if ( needle === '' || needle === '{{1}}' ) { needle = '.?'; }
	else if ( /^\/.+\/$/.test(needle) ) { needle = needle.slice(1,-1); }
	else { needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }
	needle = new RegExp(needle);
	var RealSharedWorker = window.SharedWorker;
	var WrappedSharedWorker = function(a, b) {
		if ( this instanceof WrappedSharedWorker === false ) { return RealSharedWorker(); }
		if ( needle.test(a) ) {
			return new RealSharedWorker(window.URL.createObjectURL(new Blob([';'], {type:'text/javascript'})));
		}
		return new RealSharedWorker(a, b);
	};
	WrappedSharedWorker.prototype = RealSharedWorker.prototype;
	window.SharedWorker = WrappedSharedWorker.bind(window);
})();


# Ability to inject CSP in document, to further restrict what web pages can do.
# Reference: https://www.w3.org/TR/CSP3/
csp.js application/javascript
(function() {
	var doc = document;
	if ( doc.head === null ) { return; }
	var meta = doc.createElement('meta');
	meta.setAttribute('http-equiv', 'Content-Security-Policy');
	meta.setAttribute('content', '{{1}}');
	doc.head.appendChild(meta);
})();


# https://github.com/uBlockOrigin/uAssets/issues/513
entrepreneur.com.js application/javascript
window.analyticsEvent = function(){};


# https://github.com/uBlockOrigin/uAssets/issues/521
addEventListener-logger.js application/javascript
(function() {
	var c = console, l = c.log;
	var z = self.EventTarget.prototype.addEventListener;
	self.EventTarget.prototype.addEventListener = function(a, b) {
		l.call(c, 'addEventListener("%s", %s)', a, String(b));
		return z.apply(this, arguments);
	};
})();


# https://github.com/uBlockOrigin/uAssets/issues/521
addEventListener-defuser.js application/javascript
(function() {
	var needle1 = '{{1}}',
		needle2 = '{{2}}',
		z = self.EventTarget.prototype.addEventListener;
	if ( needle1 === '' || needle1 === '{{1}}' ) {
		needle1 = '.?';
	} else if ( /^\/.+\/$/.test(needle1) ) {
		needle1 = needle1.slice(1,-1);
	} else {
		needle1 = needle1.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
	}
	needle1 = new RegExp(needle1);
	if ( needle2 === '' || needle2 === '{{2}}' ) {
		needle2 = '.?';
	} else if ( /^\/.+\/$/.test(needle2) ) {
		needle2 = needle2.slice(1,-1);
	} else {
		needle2 = needle2.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
	}
	needle2 = new RegExp(needle2);
	self.EventTarget.prototype.addEventListener = function(a, b) {
		if ( needle1.test(a.toString()) && needle2.test(String(b)) ) {
			return;
		}
		return z.apply(this, arguments);
	};
})();


# https://github.com/uBlockOrigin/uAssets/issues/531
# Scriptlet below borrowed from:
#   https://github.com/AdguardTeam/AdguardFilters/blob/master/RussianFilter/sections/antiadblock.txt
palacesquare.rambler.ru-defuser.js application/javascript
(function() {
	var w = window,
		pr = w.Promise,
		tostr = Function.prototype.toString;
	w.Promise = function(executor) {
		if ( tostr.call(executor).indexOf('getRandomSelector') !== -1 ) {
			throw new Error();
		} else {
			return new pr(executor);
		}
	}.bind();
	Object.getOwnPropertyNames(pr).forEach(function(propName) {
		Object.defineProperty(w.Promise, propName, Object.getOwnPropertyDescriptor(pr, propName));
	});
	pr.prototype.constructor = w.Promise;
})();


# https://github.com/uBlockOrigin/uAssets/issues/618
abort-current-inline-script.js application/javascript
(function() {
    const target = '{{1}}';
    if ( target === '' || target === '{{1}}' ) { return; }
    const needle = '{{2}}';
    let reText = '.?';
    if ( needle !== '' && needle !== '{{2}}' ) {
        reText = /^\/.+\/$/.test(needle)
            ? needle.slice(1,-1)
            : needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    const thisScript = document.currentScript;
    const re = new RegExp(reText);
    const chain = target.split('.');
    let owner = window;
    let prop;
    for (;;) {
        prop = chain.shift();
        if ( chain.length === 0 ) { break; }
        owner = owner[prop];
        if ( owner instanceof Object === false ) { return; }
    }
    let value;
    let desc = Object.getOwnPropertyDescriptor(owner, prop);
    if (
        desc instanceof Object === false ||
        desc.get instanceof Function === false
    ) {
        value = owner[prop];
        desc = undefined;
    }
    const magic = String.fromCharCode(Date.now() % 26 + 97) +
                  Math.floor(Math.random() * 982451653 + 982451653).toString(36);
    const validate = function() {
        const e = document.currentScript;
        if (
            e instanceof HTMLScriptElement &&
            e.src === '' &&
            e !== thisScript &&
            re.test(e.textContent)
        ) {
            throw new ReferenceError(magic);
        }
    };
    Object.defineProperty(owner, prop, {
        get: function() {
            validate();
            return desc instanceof Object
                ? desc.get()
                : value;
        },
        set: function(a) {
            validate();
            if ( desc instanceof Object ) {
                desc.set(a);
            } else {
                value = a;
            }
        }
    });
    const oe = window.onerror;
    window.onerror = function(msg) {
        if ( typeof msg === 'string' && msg.indexOf(magic) !== -1 ) {
            return true;
        }
        if ( oe instanceof Function ) {
            return oe.apply(this, arguments);
        }
    }.bind();
})();


# https://github.com/uBlockOrigin/uAssets/commit/a6c77af4afb45800d4fd7c268a2a5eab5a64daf3#commitcomment-24611606
window.open-defuser.js application/javascript
(function() {
    'use strict';
    let arg1 = '{{1}}';
    if ( arg1 === '{{1}}' ) { arg1 = ''; }
    let arg2 = '{{2}}';
    if ( arg2 === '{{2}}' ) { arg2 = ''; }
    let arg3 = '{{3}}';
    if ( arg3 === '{{3}}' ) { arg3 = ''; }
    const log = arg3 !== ''
        ? console.log.bind(console)
        : ( ) => { };
    const newSyntax = /^[01]?$/.test(arg1) === false;
    let pattern = '';
    let targetResult = true;
    let autoRemoveAfter = -1;
    if ( newSyntax ) {
        pattern = arg1;
        if ( pattern.startsWith('!') ) {
            targetResult = false;
            pattern = pattern.slice(1);
        }
        autoRemoveAfter = parseInt(arg2);
        if ( isNaN(autoRemoveAfter) ) {
            autoRemoveAfter = -1;
        } 
    } else {
        pattern = arg2;
        if ( arg1 === '0' ) {
            targetResult = false;
        }
    }
    if ( pattern === '' ) {
        pattern = '.?';
    } else if ( /^\/.+\/$/.test(pattern) ) {
        pattern = pattern.slice(1,-1);
    } else {
        pattern = pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    const rePattern = new RegExp(pattern);
    window.open = new Proxy(window.open, {
        apply: function(target, thisArg, args) {
            log('window.open:', ...args);
            const url = args[0];
            if ( rePattern.test(url) !== targetResult ) {
                return target.apply(thisArg, args);
            }
            if ( autoRemoveAfter < 0 ) { return null; }
            const iframe = document.createElement('iframe');
            iframe.src = url;
            iframe.style.setProperty('display','none', 'important');
            iframe.style.setProperty('height','1px', 'important');
            iframe.style.setProperty('width','1px', 'important');
            document.body.appendChild(iframe);
            setTimeout(( ) => iframe.remove(), autoRemoveAfter * 1000);
            if ( arg3 === '' ) { return iframe.contentWindow; }
            return new Proxy(iframe.contentWindow, {
                get: function(target, prop) {
                    log('window.open / get', prop, '===', target[prop]);
                    return target[prop];
                },
                set: function(target, prop, value) {
                    log('window.open / set', prop, '=', value);
                    target[prop] = value;
                },
            });
        }
    });
})();


json-prune.js application/javascript
(function() {
    const rawPrunePaths = '{{1}}';
    const rawNeedlePaths = '{{2}}';
    const prunePaths = rawPrunePaths !== '{{1}}' && rawPrunePaths !== ''
        ? rawPrunePaths.split(/ +/)
        : [];
    let needlePaths;
    let log, reLogNeedle;
    if ( prunePaths.length !== 0 ) {
        needlePaths = prunePaths.length !== 0 &&
                      rawNeedlePaths !== '{{2}}' && rawNeedlePaths !== ''
            ? rawNeedlePaths.split(/ +/)
            : [];
    } else {
        log = console.log.bind(console);
        let needle;
        if ( rawNeedlePaths === '' || rawNeedlePaths === '{{2}}' ) {
            needle = '.?';
        } else if ( rawNeedlePaths.charAt(0) === '/' && rawNeedlePaths.slice(-1) === '/' ) {
            needle = rawNeedlePaths.slice(1, -1);
        } else {
            needle = rawNeedlePaths.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
        }
        reLogNeedle = new RegExp(needle);
    }
    const findOwner = function(root, path, prune = false) {
        let owner = root;
        let chain = path;
        for (;;) {
            if ( typeof owner !== 'object' || owner === null  ) {
                return false;
            }
            const pos = chain.indexOf('.');
            if ( pos === -1 ) {
                const found = owner.hasOwnProperty(chain);
                if ( found === false ) { return false; }
                if ( prune ) {
                    delete owner[chain];
                }
                return true;
            }
            const prop = chain.slice(0, pos);
            if (
                prop === '[]' && Array.isArray(owner) ||
                prop === '*' && owner instanceof Object
            ) {
                const next = chain.slice(pos + 1);
                let found = false;
                for ( const key of Object.keys(owner) ) {
                    found = findOwner(owner[key], next, prune) || found;
                }
                return found;
            }
            if ( owner.hasOwnProperty(prop) === false ) { return false; }
            owner = owner[prop];
            chain = chain.slice(pos + 1);
        }
    };
    const mustProcess = function(root) {
        for ( const needlePath of needlePaths ) {
            if ( findOwner(root, needlePath) === false ) {
                return false;
            }
        }
        return true;
    };
    const pruner = function(o) {
        if ( log !== undefined ) {
            const json = JSON.stringify(o, null, 2);
            if ( reLogNeedle.test(json) ) {
                log('uBO:', location.hostname, json);
            }
            return o;
        }
        if ( mustProcess(o) === false ) { return o; }
        for ( const path of prunePaths ) {
            findOwner(o, path, true);
        }
        return o;
    };
    JSON.parse = new Proxy(JSON.parse, {
        apply: function() {
            return pruner(Reflect.apply(...arguments));
        },
    });
    Response.prototype.json = new Proxy(Response.prototype.json, {
        apply: function() {
            return Reflect.apply(...arguments).then(o => pruner(o));
        },
    });
})();


adfly-defuser.js application/javascript
(function() {
	// Based on AdsBypasser
	// License:
	// https://github.com/adsbypasser/adsbypasser/blob/master/LICENSE
	var isDigit = /^\d$/;
	var handler = function(encodedURL) {
		var var1 = "", var2 = "", i;
		for (i = 0; i < encodedURL.length; i++) {
			if (i % 2 === 0) {
				var1 = var1 + encodedURL.charAt(i);
			} else {
				var2 = encodedURL.charAt(i) + var2;
			}
		}
		var data = (var1 + var2).split("");
		for (i = 0; i < data.length; i++) {
			if (isDigit.test(data[i])) {
				for (var ii = i + 1; ii < data.length; ii++) {
					if (isDigit.test(data[ii])) {
						var temp = parseInt(data[i],10) ^ parseInt(data[ii],10);
						if (temp < 10) {
							data[i] = temp.toString();
						}
						i = ii;
						break;
					}
				}
			}
		}
		data = data.join("");
		var decodedURL = window.atob(data).slice(16, -16);
		window.stop();
		window.onbeforeunload = null;
		window.location.href = decodedURL;
	};
	try {
		var val;
		var flag = true;
		window.Object.defineProperty(window, "ysmm", {
			configurable: false,
			set: function(value) {
				if (flag) {
					flag = false;
					try {
						if (typeof value === "string") {
							handler(value);
						}
					} catch (err) { }
				}
				val = value;
			},
			get: function() {
				return val;
			}
		});
	} catch (err) {
		window.console.error("Failed to set up Adfly bypasser!");
	}
})();


# https://github.com/uBlockOrigin/uAssets/issues/913
disable-newtab-links.js application/javascript
(function() {
	document.addEventListener('click', function(ev) {
		var target = ev.target;
		while ( target !== null ) {
			if ( target.localName === 'a' && target.hasAttribute('target') ) {
				ev.stopPropagation();
				ev.preventDefault();
				break;
			}
			target = target.parentNode;
		}
	});
})();


set-constant.js application/javascript
(function() {
    const chain = '{{1}}';
    let cValue = '{{2}}';
    const thisScript = document.currentScript;
    if ( cValue === 'undefined' ) {
        cValue = undefined;
    } else if ( cValue === 'false' ) {
        cValue = false;
    } else if ( cValue === 'true' ) {
        cValue = true;
    } else if ( cValue === 'null' ) {
        cValue = null;
    } else if ( cValue === 'noopFunc' ) {
        cValue = function(){};
    } else if ( cValue === 'trueFunc' ) {
        cValue = function(){ return true; };
    } else if ( cValue === 'falseFunc' ) {
        cValue = function(){ return false; };
    } else if ( /^\d+$/.test(cValue) ) {
        cValue = parseFloat(cValue);
        if ( isNaN(cValue) ) { return; }
        if ( Math.abs(cValue) > 0x7FFF ) { return; }
    } else if ( cValue === "''" ) {
        cValue = '';
    } else {
        return;
    }
    let aborted = false;
    const mustAbort = function(v) {
        if ( aborted ) { return true; }
        aborted =
            (v !== undefined && v !== null) &&
            (cValue !== undefined && cValue !== null) &&
            (typeof v !== typeof cValue);
        return aborted;
    };
    // https://github.com/uBlockOrigin/uBlock-issues/issues/156
    //   Support multiple trappers for the same property.
    const trapProp = function(owner, prop, configurable, handler) {
        if ( handler.init(owner[prop]) === false ) { return; }
        const odesc = Object.getOwnPropertyDescriptor(owner, prop);
        let prevGetter, prevSetter;
        if ( odesc instanceof Object ) {
            if ( odesc.configurable === false ) { return; }
            if ( odesc.get instanceof Function ) {
                prevGetter = odesc.get;
            }
            if ( odesc.set instanceof Function ) {
                prevSetter = odesc.set;
            }
        }
        Object.defineProperty(owner, prop, {
            configurable,
            get() {
                if ( prevGetter !== undefined ) {
                    prevGetter();
                }
                return handler.getter(); // cValue
            },
            set(a) {
                if ( prevSetter !== undefined ) {
                    prevSetter(a);
                }
                handler.setter(a);
            }
        });
    };
    const trapChain = function(owner, chain) {
        const pos = chain.indexOf('.');
        if ( pos === -1 ) {
            trapProp(owner, chain, false, {
                v: undefined,
                init: function(v) {
                    if ( mustAbort(v) ) { return false; }
                    this.v = v;
                    return true;
                },
                getter: function() {
                    return document.currentScript === thisScript
                        ? this.v
                        : cValue;
                },
                setter: function(a) {
                    if ( mustAbort(a) === false ) { return; }
                    cValue = a;
                }
            });
            return;
        }
        const prop = chain.slice(0, pos);
        const v = owner[prop];
        chain = chain.slice(pos + 1);
        if ( v instanceof Object || typeof v === 'object' && v !== null ) {
            trapChain(v, chain);
            return;
        }
        trapProp(owner, prop, true, {
            v: undefined,
            init: function(v) {
                this.v = v;
                return true;
            },
            getter: function() {
                return this.v;
            },
            setter: function(a) {
                this.v = a;
                if ( a instanceof Object ) {
                    trapChain(a, chain);
                }
            }
        });
    };
    trapChain(window, chain);
})();


# Imported from:
#   https://github.com/NanoAdblocker/NanoFilters/blob/1f3be7211bb0809c5106996f52564bf10c4525f7/NanoFiltersSource/NanoResources.txt#L82
#
# Speed up or down setTimeout, 3 optional arguments.
# funcMatcher - The payload matcher, a string literal or a JavaScript RegExp,
# defaults to match all.
# delayMatcher - The delay matcher, an integer, defaults to 1000.
# boostRatio - The delay multiplier when there is a match, 0.5 speeds up by
# 2 times and 2 slows down by 2 times, defaults to 0.05 or speed up 20 times.
# Speed up and down both cap at 50 times.
nano-setTimeout-booster.js application/javascript
(function() {
	// Based on uAssets
	// License: https://github.com/uBlockOrigin/uAssets/blob/master/LICENSE
    let needleArg = '{{1}}';
    if ( needleArg === '{{1}}' ) { needleArg = ''; }
    let delayArg = '{{2}}';
    if ( delayArg === '{{2}}' ) { delayArg = ''; }
    let boostArg = '{{3}}';
    if ( boostArg === '{{3}}' ) { boostArg = ''; }
    if ( needleArg === '' ) {
        needleArg = '.?';
    } else if ( needleArg.charAt(0) === '/' && needleArg.slice(-1) === '/' ) {
        needleArg = needleArg.slice(1, -1);
    } else {
        needleArg = needleArg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    const reNeedle = new RegExp(needleArg);
    let delay = delayArg !== '*' ? parseInt(delayArg, 10) : -1;
    if ( isNaN(delay) || isFinite(delay) === false ) { delay = 1000; }
    let boost = parseFloat(boostArg);
    boost = isNaN(boost) === false && isFinite(boost)
        ? Math.min(Math.max(boost, 0.02), 50)
        : 0.05;
    self.setTimeout = new Proxy(self.setTimeout, {
        apply: function(target, thisArg, args) {
            const [ a, b ] = args;
            if (
                (delay === -1 || b === delay) &&
                reNeedle.test(a.toString())
            ) {
                args[1] = b * boost;
            }
            return target.apply(thisArg, args);
        }
    });
})();


# Imported from:
#   https://github.com/NanoAdblocker/NanoFilters/blob/1f3be7211bb0809c5106996f52564bf10c4525f7/NanoFiltersSource/NanoResources.txt#L126
#
# Same as the last one except it is for setInterval instead of setTimeout.
nano-setInterval-booster.js application/javascript
(function() {
	// Based on uAssets
	// License: https://github.com/uBlockOrigin/uAssets/blob/master/LICENSE
    let needleArg = '{{1}}';
    if ( needleArg === '{{1}}' ) { needleArg = ''; }
    let delayArg = '{{2}}';
    if ( delayArg === '{{2}}' ) { delayArg = ''; }
    let boostArg = '{{3}}';
    if ( boostArg === '{{3}}' ) { boostArg = ''; }
    if ( needleArg === '' ) {
        needleArg = '.?';
    } else if ( needleArg.charAt(0) === '/' && needleArg.slice(-1) === '/' ) {
        needleArg = needleArg.slice(1, -1);
    } else {
        needleArg = needleArg.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    const reNeedle = new RegExp(needleArg);
    let delay = delayArg !== '*' ? parseInt(delayArg, 10) : -1;
    if ( isNaN(delay) || isFinite(delay) === false ) { delay = 1000; }
    let boost = parseFloat(boostArg);
    boost = isNaN(boost) === false && isFinite(boost)
        ? Math.min(Math.max(boost, 0.02), 50)
        : 0.05;
    self.setInterval = new Proxy(self.setInterval, {
        apply: function(target, thisArg, args) {
            const [ a, b ] = args;
            if (
                (delay === -1 || b === delay) &&
                reNeedle.test(a.toString())
            ) {
                args[1] = b * boost;
            }
            return target.apply(thisArg, args);
        }
    });
})();


remove-attr.js application/javascript
(function() {
    const token = '{{1}}';
    if ( token === '' || token === '{{1}}' ) { return; }
    const tokens = token.split(/\s*\|\s*/);
    let selector = '{{2}}';
    if ( selector === '' || selector === '{{2}}' ) {
        selector = `[${tokens.join('],[')}]`;
    }
    let behavior = '{{3}}';
    let timer;
    const rmattr = ( ) => {
        timer = undefined;
        try {
            const nodes = document.querySelectorAll(selector);
            for ( const node of nodes ) {
                for ( const attr of tokens ) {
                    node.removeAttribute(attr);
                }
            }
        } catch(ex) {
        }
    };
    const mutationHandler = mutations => {
        if ( timer !== undefined ) { return; }
        let skip = true;
        for ( let i = 0; i < mutations.length && skip; i++ ) {
            const { type, addedNodes, removedNodes } = mutations[i];
            if ( type === 'attributes' ) { skip = false; }
            for ( let j = 0; j < addedNodes.length && skip; j++ ) {
                if ( addedNodes[j].nodeType === 1 ) { skip = false; break; }
            }
            for ( let j = 0; j < removedNodes.length && skip; j++ ) {
                if ( removedNodes[j].nodeType === 1 ) { skip = false; break; }
            }
        }
        if ( skip ) { return; }
        timer = self.requestIdleCallback(rmattr, { timeout: 67 });
    };
    const start = ( ) => {
        rmattr();
        if ( /\bstay\b/.test(behavior) === false ) { return; }
        const observer = new MutationObserver(mutationHandler);
        observer.observe(document.documentElement, {
            attributes: true,
            attributeFilter: tokens,
            childList: true,
            subtree: true,
        });
    };
    if ( document.readyState !== 'complete' && /\bcomplete\b/.test(behavior) ) {
        self.addEventListener('load', start, { once: true });
    } else if ( document.readyState === 'loading' ) {
        self.addEventListener('DOMContentLoaded', start, { once: true });
    } else {
        start();
    }
})();


remove-class.js application/javascript
(function() {
    const token = '{{1}}';
    if ( token === '' || token === '{{1}}' ) { return; }
    const tokens = token.split(/\s*\|\s*/);
    let selector = '{{2}}';
    if ( selector === '' || selector === '{{2}}' ) {
        selector = '.' + tokens.map(a => CSS.escape(a)).join(',.');
    }
    const rmclass = function() {
        try {
            const nodes = document.querySelectorAll(selector);
            for ( const node of nodes ) {
                node.classList.remove(...tokens);
            }
        } catch(ex) {
        }
    };
    if ( document.readyState === 'loading' ) {
        window.addEventListener(
            'DOMContentLoaded',
            rmclass,
            { capture: true, once: true }
        );
    } else {
        rmclass();
    }
})();


damoh-defuser.js application/javascript
(function() {
	var handled = new WeakSet();
	var asyncTimer;
	var cleanVideo = function() {
		asyncTimer = undefined;
		var v = document.querySelector('video');
		if ( v === null ) { return; }
		if ( handled.has(v) ) { return; }
		handled.add(v);
		v.pause();
		v.controls = true;
		var el = v.querySelector('meta[itemprop="contentURL"][content]');
		if ( el === null ) { return; }
		v.src = el.getAttribute('content');
		el = v.querySelector('meta[itemprop="thumbnailUrl"][content]');
		if ( el !== null ) { v.poster = el.getAttribute('content'); }
	};
	var cleanVideoAsync = function() {
		if ( asyncTimer !== undefined ) { return; }
		asyncTimer = window.requestAnimationFrame(cleanVideo);
	};
	var observer = new MutationObserver(cleanVideoAsync);
	observer.observe(document.documentElement, { childList: true, subtree: true });
})();


# https://github.com/uBlockOrigin/uAssets/pull/3517
twitch-videoad.js application/javascript
(function() {
	if ( /(^|\.)twitch\.tv$/.test(document.location.hostname) === false ) { return; }
	var realFetch = window.fetch;
	window.fetch = function(input, init) {
		if ( arguments.length >= 2 && typeof input === 'string' && input.includes('/access_token') ) {
			var url = new URL(arguments[0]);
			url.searchParams.set('platform', '_');
			arguments[0] = url.href;
		}
		return realFetch.apply(this, arguments);
	};
})();


# https://github.com/uBlockOrigin/uAssets/issues/2912
fingerprint2.js application/javascript
(function() {
    let browserId = '';
    for ( let i = 0; i < 8; i++ ) {
        browserId += (Math.random() * 0x10000 + 0x1000 | 0).toString(16).slice(-4);
    }
    const fp2 = function(){};
    fp2.get = function(opts, cb) {
        if ( !cb  ) { cb = opts; }
        setTimeout(( ) => { cb(browserId, []); }, 1);
    };
    fp2.prototype = {
        get: fp2.get
    };
    window.Fingerprint2 = fp2;
})();


# https://github.com/NanoAdblocker/NanoFilters/issues/149
cookie-remover.js application/javascript
(function() {
	let needle = '{{1}}',
		reName = /./;
	if ( /^\/.+\/$/.test(needle) ) {
		reName = new RegExp(needle.slice(1,-1));
	} else if ( needle !== '' && needle !== '{{1}}' ) {
		reName = new RegExp(needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
	}
	let removeCookie = function() {
		document.cookie.split(';').forEach(cookieStr => {
			let pos = cookieStr.indexOf('=');
			if ( pos === -1 ) { return; }
			let cookieName = cookieStr.slice(0, pos).trim();
			if ( !reName.test(cookieName) ) { return; }
			let part1 = cookieName + '=';
			let part2a = '; domain=' + document.location.hostname;
			let part2b = '; domain=.' + document.location.hostname;
			let domain = document.domain;
			let part2c = domain && domain !== document.location.hostname ? '; domain=.' + domain : undefined;
			let part3 = '; path=/';
			let part4 = '; Max-Age=-1000; expires=Thu, 01 Jan 1970 00:00:00 GMT';
			document.cookie = part1 + part4;
			document.cookie = part1 + part2a + part4;
			document.cookie = part1 + part2b + part4;
			document.cookie = part1 + part3 + part4;
			document.cookie = part1 + part2a + part3 + part4;
			document.cookie = part1 + part2b + part3 + part4;
			if ( part2c !== undefined ) {
				document.cookie = part1 + part2c + part3 + part4;
			}
		});
	};
	removeCookie();
	window.addEventListener('beforeunload', removeCookie);
})();


# https://www.reddit.com/r/firefox/comments/9dudod/the_mysterious_case_of_missing_urls_and_googles/e5kgkkh
ampproject.org/v0.js application/javascript
(function() {
	let head = document.head;
	if ( !head ) { return; }
	let style = document.createElement('style');
	style.textContent = [
		'body {',
		'  animation: none !important;',
		'  overflow: unset !important;',
		'}'
	].join('\n');
	head.appendChild(style);
})();


requestAnimationFrame-if.js  application/javascript
(function() {
    let needle = '{{1}}';
    const not = needle.charAt(0) === '!';
    if ( not ) { needle = needle.slice(1); }
    if ( needle === '' || needle === '{{1}}' ) {
        needle = '.?';
    } else if ( needle.startsWith('/') && needle.endsWith('/') ) {
        needle = needle.slice(1,-1);
    } else {
        needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    const log = needle === '.?' && not === false ? console.log : undefined;
    needle = new RegExp(needle);
    window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, {
        apply: function(target, thisArg, args) {
            const a = String(args[0]);
            if ( log !== undefined ) {
                log('uBO: requestAnimationFrame("%s")', a);
            } else if ( needle.test(a) === not ) {
                args[0] = function(){};
            }
            return target.apply(thisArg, args);
        }
    });
})();


no-requestAnimationFrame-if.js  application/javascript
(function() {
    let needle = '{{1}}';
    if ( needle === '{{1}}' ) { needle = ''; }
    const needleNot = needle.charAt(0) === '!';
    if ( needleNot ) { needle = needle.slice(1); }
    if ( needle.startsWith('/') && needle.endsWith('/') ) {
        needle = needle.slice(1, -1);
    } else if ( needle !== '' ) {
        needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    const log = needleNot === false && needle === '' ? console.log : undefined;
    const reNeedle = new RegExp(needle);
    window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, {
        apply: function(target, thisArg, args) {
            const a = String(args[0]);
            let defuse = false;
            if ( log !== undefined ) {
                log('uBO: requestAnimationFrame("%s")', a);
            } else {
                defuse = reNeedle.test(a) !== needleNot;
            }
            if ( defuse ) {
                args[0] = function(){};
            }
            return target.apply(thisArg, args);
        }
    });
})();


no-setTimeout-if.js  application/javascript
(function() {
    let needle = '{{1}}';
    const needleNot = needle.charAt(0) === '!';
    if ( needleNot ) { needle = needle.slice(1); }
    let delay = '{{2}}';
    const delayNot = delay.charAt(0) === '!';
    if ( delayNot ) { delay = delay.slice(1); }
    delay = parseInt(delay, 10);
    if ( needle === '' || needle === '{{1}}' ) {
        needle = '';
    } else if ( needle.startsWith('/') && needle.endsWith('/') ) {
        needle = needle.slice(1,-1);
    } else {
        needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    const log = needleNot === false && needle === '' &&
                delayNot === false && isNaN(delay)
        ? console.log
        : undefined;
    const reNeedle = new RegExp(needle);
    window.setTimeout = new Proxy(window.setTimeout, {
        apply: function(target, thisArg, args) {
            const a = String(args[0]);
            const b = args[1];
            let defuse = false;
            if ( log !== undefined ) {
                log('uBO: setTimeout("%s", %s)', a, b);
            } else if ( isNaN(delay) ) {
                defuse = reNeedle.test(a) !== needleNot;
            } else if ( needle === '' ) {
                defuse = (b === delay) !== delayNot;
            } else {
                defuse = reNeedle.test(a) !== needleNot && (b === delay) !== delayNot;
            }
            if ( defuse ) {
                args[0] = function(){};
            }
            return target.apply(thisArg, args);
        }
    });
})();


setTimeout-defuser.js  application/javascript
(function() {
    let needle = '{{1}}';
    const delay = parseInt('{{2}}', 10);
    if ( needle === '' || needle === '{{1}}' ) {
        needle = '.?';
    } else if ( needle.startsWith('/') && needle.endsWith('/') ) {
        needle = needle.slice(1,-1);
    } else {
        needle = needle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    }
    needle = new RegExp(needle);
    window.setTimeout = new Proxy(window.setTimeout, {
        apply: function(target, thisArg, args) {
            const a = args[0];
            const b = args[1];
            if ( (isNaN(delay) || b === delay) && needle.test(a.toString()) ) {
                args[0] = function(){};
            }
            return target.apply(thisArg, args);
        }
    });
})();


window.name-defuser.js  application/javascript
(function() {
    if ( window === window.top ) {
        window.name = '';
    }
})();
