Last active
July 22, 2021 12:39
-
-
Save alpgul/9e2aaa5c2118437e1213837b7bae7679 to your computer and use it in GitHub Desktop.
Tampermonkey background.js GM_screenShot
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ! function ( e ) { | |
| function t( n ) { | |
| if ( r[ n ] ) return r[ n ].exports; | |
| var s = r[ n ] = { | |
| i: n, | |
| l: !1, | |
| exports: {} | |
| }; | |
| return e[ n ].call( s.exports, s, s.exports, t ), s.l = !0, s.exports | |
| } | |
| var r = {}; | |
| t.m = e, t.c = r, t.d = function ( e, r, n ) { | |
| t.o( e, r ) || Object.defineProperty( e, r, { | |
| enumerable: !0, | |
| get: n | |
| } ) | |
| }, t.r = function ( e ) { | |
| "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty( e, Symbol.toStringTag, { | |
| value: "Module" | |
| } ), Object.defineProperty( e, "__esModule", { | |
| value: !0 | |
| } ) | |
| }, t.t = function ( e, r ) { | |
| if ( 1 & r && ( e = t( e ) ), 8 & r ) return e; | |
| if ( 4 & r && "object" == typeof e && e && e.__esModule ) return e; | |
| var n = Object.create( null ); | |
| if ( t.r( n ), Object.defineProperty( n, "default", { | |
| enumerable: !0, | |
| value: e | |
| } ), 2 & r && "string" != typeof e ) | |
| for ( var s in e ) t.d( n, s, function ( t ) { | |
| return e[ t ] | |
| }.bind( null, s ) ); | |
| return n | |
| }, t.n = function ( e ) { | |
| var r = e && e.__esModule ? function () { | |
| return e.default | |
| } : function () { | |
| return e | |
| }; | |
| return t.d( r, "a", r ), r | |
| }, t.o = function ( e, t ) { | |
| return {}.hasOwnProperty.call( e, t ) | |
| }, t.p = "", t( t.s = 71 ) | |
| }( [ function ( e, t, r ) { | |
| "use strict"; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), t.normalizeLocale = t.I18N = void 0; | |
| const n = r( 3 ), | |
| s = r( 14 ), | |
| o = r( 2 ), | |
| a = window.rea, | |
| i = "en"; | |
| let A = {}, | |
| l = {}, | |
| c = null; | |
| const u = [], | |
| d = ( e, ...t ) => { | |
| const r = [], | |
| n = e => { | |
| for ( let t = 0; t < e.length; t++ ) Array.isArray( e[ t ] ) ? n( e[ t ] ) : r.push( String( e[ t ] ) ) | |
| }; | |
| return n( t ), a.i18n.getMessage( e, r ) | |
| }, | |
| g = e => new Promise( ( t, r ) => { | |
| const n = `_locales/${e}/messages.json`; | |
| s.getRaw( n, n => { | |
| try { | |
| if ( n ) return t( JSON.parse( n ) ) | |
| } catch ( t ) { | |
| o.logger.log( "i18n: parsing locale " + e + " failed!" ) | |
| } | |
| r() | |
| } ) | |
| } ), | |
| p = async e => { | |
| e = e.concat( i ); | |
| let t = -1, | |
| r = null; | |
| const n = async () => { | |
| if ( t++, t < e.length ) { | |
| const s = e[ t ]; | |
| if ( !s || !R.includes( s ) ) return n(); | |
| try { | |
| const e = await g( s ); | |
| r = s, A = e | |
| } catch ( e ) { | |
| return n() | |
| } | |
| if ( !v && s != i ) try { | |
| const e = await g( i ); | |
| l = e || {} | |
| } catch ( e ) {} | |
| } | |
| }; | |
| return await n(), r | |
| }, m = e => e ? e.replace( /-/g, "_" ).split( "_" ).map( ( e, t ) => t ? e.toUpperCase() : e.toLowerCase() ).join( "_" ) : e; | |
| t.normalizeLocale = m; | |
| const f = ( e, t ) => { | |
| let r, s; | |
| return t = t || ( c ? [ c, c.split( "_" )[ 0 ] ].concat( u ).filter( e => e ) : u ), n.each( t, ( t, o ) => { | |
| const a = Number( o ); | |
| if ( n.each( e, ( e, n ) => { | |
| const o = Number( n ), | |
| i = m( e ), | |
| A = i.split( /_/ )[ 0 ]; | |
| if ( i == t ) return s = o, !1; | |
| A == t && ( void 0 === r || a < r ) && ( s = o, r = a ) | |
| } ), void 0 !== s ) return !1 | |
| } ), void 0 === s ? s : e[ s ] | |
| }, | |
| h = [ { | |
| name: "Arabic - العربية", | |
| value: "ar" | |
| }, { | |
| name: "Chinese (Simplified) - 中文(简体中文)", | |
| value: "zh_CN" | |
| }, { | |
| name: "Chinese (Traditional) - 中文(繁體)", | |
| value: "zh_TW" | |
| }, { | |
| name: "Croatian - hrvatski", | |
| value: "hr" | |
| }, { | |
| name: "Czech - čeština", | |
| value: "cs" | |
| }, { | |
| name: "Danish - dansk", | |
| value: "da" | |
| }, { | |
| name: "English", | |
| value: "en" | |
| }, { | |
| name: "French - français", | |
| value: "fr" | |
| }, { | |
| name: "German - Deutsch", | |
| value: "de" | |
| }, { | |
| name: "Hindi - हिन्दी", | |
| value: "hi" | |
| }, { | |
| name: "Hungarian - magyar", | |
| value: "hu" | |
| }, { | |
| name: "Indonesian - Indonesia", | |
| value: "id" | |
| }, { | |
| name: "Italian - italiano", | |
| value: "it" | |
| }, { | |
| name: "Japanese - 日本語", | |
| value: "ja" | |
| }, { | |
| name: "Korean - 한국어", | |
| value: "ko" | |
| }, { | |
| name: "Norwegian - norsk", | |
| value: "nb" | |
| }, { | |
| name: "Polish - polski", | |
| value: "pl" | |
| }, { | |
| name: "Portuguese (Brazil) - português (Brasil)", | |
| value: "pt_BR" | |
| }, { | |
| name: "Portuguese (Portugal) - português (Portugal)", | |
| value: "pt_PT" | |
| }, { | |
| name: "Russian - русский", | |
| value: "ru" | |
| }, { | |
| name: "Serbian - српски", | |
| value: "sr" | |
| }, { | |
| name: "Slovak - slovenčina", | |
| value: "sk" | |
| }, { | |
| name: "Spanish - español", | |
| value: "es" | |
| }, { | |
| name: "Turkish - Türkçe", | |
| value: "tr" | |
| }, { | |
| name: "Ukrainian - українська", | |
| value: "uk" | |
| }, { | |
| name: "Vietnamese - Tiếng Việt", | |
| value: "vi" | |
| } ], | |
| R = h.map( e => e.value ), | |
| v = !( void 0 === a ) && a.i18n.native_support, | |
| b = { | |
| init: async () => { | |
| const e = async () => { | |
| c || v || ( c = await p( u ) ) | |
| }, t = m( v ? a.i18n.getUILanguage() : navigator.language ); | |
| if ( t ) { | |
| const e = [ t ], | |
| r = t.split( /_/ ); | |
| r[ 0 ] !== t && e.push( r[ 0 ] ), e.forEach( e => { | |
| u.unshift( e ) | |
| } ) | |
| } | |
| await e(), | |
| v && ( await new Promise( e => { | |
| a.i18n.getAcceptLanguages( t => { | |
| t.forEach( e => { | |
| u.push( m( e ) ) | |
| } ), e() | |
| } ) | |
| } ), await e() ) | |
| }, | |
| getMessage: ( e, ...t ) => { | |
| let r; | |
| return c && ( r = A[ e ] || l[ e ] ) ? ( ( e, t ) => { | |
| let r, n = e.message; | |
| return r = 1 == t.length && Array.isArray( t[ 0 ] ) ? t[ 0 ] : t, e.placeholders && Object.entries( e.placeholders ).forEach( ( [ e, t ] ) => { | |
| try { | |
| const s = Number( t.content.replace( /^\$/, "" ) ) - 1; | |
| let a; | |
| s < r.length ? ( a = r[ s ], n = n.replace( "$" + e + "$", a ) ) : o.logger.log( 'i18n: invalid argument count on processing "' + n + '" with args ' + JSON.stringify( r ) ) | |
| } catch ( e ) { | |
| o.logger.log( 'i18n: error processing "' + n + '" with args ' + JSON.stringify( r ) ) | |
| } | |
| } ), n | |
| } )( r, t ) : ( v && ( r = d( e, ...t ) ) || ( r = function ( e, ...t ) { | |
| let r = e; | |
| 1 == t.length && Array.isArray( t[ 0 ] ) && ( t = t[ 0 ] ); | |
| const n = new RegExp( "(^|_)0[a-zA-Z]+0(_|$)" ); | |
| for ( let e = 0; e < t.length; e++ ) { | |
| const s = r.match( n ); | |
| if ( !s ) { | |
| o.logger.log( "i18n: getMessage(): wrong argument count!!!" ); | |
| break | |
| } | |
| r = r.replace( n, ( s[ 1 ] ? " " : "" ) + t[ e ] + ( s[ 2 ] ? " " : "" ) ) | |
| } | |
| return r.replace( /_/g, " " ) | |
| }( e, ...t ), o.logger.warn( "i18n: missing translation" + r ) ), r ) | |
| }, | |
| getOriginalMessage: d, | |
| normalizeLocale: m, | |
| getTranslation: ( e, t ) => { | |
| let r, n; | |
| if ( e && ( n = e[ t + "_i18n" ] || {} ) ) { | |
| e[ t ] && ( n = { | |
| ...n, | |
| en: e[ t ] | |
| } ); | |
| const s = f( Object.keys( n ) ); | |
| void 0 !== s && ( r = n[ s ] ) | |
| } | |
| return r || e[ t ] | |
| }, | |
| setLocale: async e => { | |
| let t = e; | |
| if ( "null" === e && ( t = null ), t && ( t = m( t ) ), !t && v ) c = t; | |
| else if ( t !== c ) return p( [ t, ...u, c ].filter( e => e ) ).then( t => { | |
| c = t, c != e && o.logger.log( "i18n: retrieving locale " + t + " failed!" ) | |
| } ) | |
| }, | |
| getLocale: () => c, | |
| getUiLocale: () => m( c || v ? a.i18n.getUILanguage() : u[ 0 ] || navigator.language || i ), | |
| getBestLocale: f, | |
| supported: h | |
| }; | |
| t.I18N = b | |
| }, function ( e, t ) { | |
| "use strict"; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), t.Deferred = void 0; | |
| const r = e => { | |
| const t = ( () => { | |
| let e, t; | |
| const n = [], | |
| s = [], | |
| o = e => { | |
| s.push( e ), a() | |
| }, | |
| a = () => { | |
| if ( void 0 !== e ) { | |
| let r; | |
| for ( ; s.length; ) r = s.shift(), void 0 !== r.state && r.state !== e || ( t = ( "function" == typeof r.f ? r.f.call( i, t ) : r.f ) || t ) | |
| } | |
| }, | |
| i = { | |
| promise: () => i, | |
| done: e => ( o( { | |
| state: !0, | |
| f: e | |
| } ), i ), | |
| fail: e => ( o( { | |
| state: !1, | |
| f: e | |
| } ), i ), | |
| always: e => ( o( { | |
| f: e | |
| } ), i ), | |
| progress: e => ( e && n.push( e ), i ), | |
| then: ( e, n, s ) => r( r => { | |
| [ { | |
| fn: "done", | |
| forward: "resolve", | |
| f: e | |
| }, { | |
| fn: "fail", | |
| forward: "reject", | |
| f: n | |
| }, { | |
| fn: "progress", | |
| forward: "notify", | |
| f: s | |
| } ].forEach( e => { | |
| i[ e.fn ]( ( ...n ) => { | |
| const s = e.f ? e.f( t ) : void 0, | |
| o = s && "function" == typeof s.promise ? s.promise() : null, | |
| a = s && "function" == typeof s.then ? s : null; | |
| if ( o ) o.done( r.resolve ).fail( r.reject ).progress( r.notify ); | |
| else if ( a ) a.then( r.resolve, r.reject ); | |
| else { | |
| const t = e.f ? [ s ] : n; | |
| r[ e.forward ]( t[ 0 ] ) | |
| } | |
| } ) | |
| } ) | |
| } ).promise(), | |
| each: e => { | |
| const t = r(); | |
| return i.then( n => { | |
| const s = Array.isArray( n ) ? n : [ n ]; | |
| r.when( s.map( t => e( t ) ) ).then( t.resolve ) | |
| } ), t.promise() | |
| }, | |
| iterate: e => { | |
| const t = r(); | |
| return i.then( n => { | |
| const s = ( Array.isArray( n ) ? n : [ n ] ).map( t => () => e( t ) ); | |
| r.onebyone( s, !0 ).done( e => { | |
| t.resolve( e ) | |
| } ).fail( t.reject ) | |
| } ), t.promise() | |
| } | |
| }; | |
| return { | |
| get: () => i, | |
| try_resolve: r => ( void 0 === e && ( e = !0, t = r ), a(), i ), | |
| try_reject: function ( r ) { | |
| return void 0 === e && ( e = !1, t = r ), a(), i | |
| }, | |
| do_notify: function ( e ) { | |
| ( e => { | |
| n.forEach( t => t( e ) ) | |
| } )( e ) | |
| } | |
| } | |
| } )(), | |
| n = { | |
| promise: function () { | |
| return t.get() | |
| }, | |
| resolve: function ( e ) { | |
| return t.try_resolve( e ) | |
| }, | |
| reject: function ( e ) { | |
| return t.try_reject( e ) | |
| }, | |
| notify: function ( e ) { | |
| return t.do_notify( e ) | |
| }, | |
| consume: function ( e ) { | |
| return e.promise().done( n.resolve ).fail( n.reject ).progress( n.notify ), n.promise() | |
| } | |
| }; | |
| return e && e( n ), n | |
| }; | |
| t.Deferred = r, r.Pledge = e => { | |
| const t = r(); | |
| return t.resolve( e ), t.promise() | |
| }, r.Breach = e => { | |
| const t = r(); | |
| return t.reject( e ), t.promise() | |
| }, r.onebyone = ( e, t = !0 ) => { | |
| const n = [], | |
| s = r(); | |
| let o = 0; | |
| const a = () => { | |
| if ( o < e.length ) { | |
| const r = ( 0, e[ o++ ] )(); | |
| r && r.promise ? r.promise().done( e => { | |
| n.push( e ), a() | |
| } ).fail( () => { | |
| if ( n.push( null ), t ) return s.reject(); | |
| a() | |
| } ) : ( n.push( r ), | |
| a() ) | |
| } else s.resolve( n ) | |
| }; | |
| return a(), s.promise() | |
| }, r.or = e => { | |
| let t; | |
| const n = r(), | |
| s = () => { | |
| e.length ? ( t = e.shift(), t && r.Pledge().then( t ).done( n.resolve ).fail( s ) ) : n.reject() | |
| }; | |
| return s(), n.promise() | |
| }, r.sidebyside = e => { | |
| e = Array.isArray( e ) ? e : [ e ]; | |
| const t = r(); | |
| let n = e.length; | |
| return n ? e.forEach( e => { | |
| e && e.promise && e.promise().always( () => { | |
| 0 == --n && t.resolve() | |
| } ) | |
| } ) : t.resolve(), t.promise() | |
| }, r.when = e => { | |
| e = Array.isArray( e ) ? e : [ e ]; | |
| const t = r(); | |
| let n = e.length; | |
| const s = []; | |
| return n ? e.forEach( e => { | |
| let r; | |
| if ( e && e.promise ) r = e.promise(); | |
| else { | |
| if ( !e.then ) return void console.warn( "promise: incompatible object given to when()", e ); | |
| r = e | |
| } | |
| r.fail( e => { | |
| t.reject( e ), n = -1 | |
| } ).done( e => { | |
| s.push( e ), 0 == --n && t.resolve( s ) | |
| } ) | |
| } ) : t.resolve( s ), t.promise() | |
| }, r.sleep = e => { | |
| const t = r(); | |
| return window.setTimeout( t.resolve, e ), t.promise() | |
| } | |
| }, function ( e, t ) { | |
| "use strict"; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), t.VERBOSE = t.DEBUG = t.WARN = t.ERROR = t.logger = void 0, t.ERROR = 0, t.WARN = 30, t.DEBUG = 60, t.VERBOSE = 80; | |
| let r = 0; | |
| const n = [], | |
| s = () => { | |
| const e = [ "debug" ], | |
| t = [ "log" ], | |
| n = [ "warn", "info" ], | |
| s = [ "error" ], | |
| a = [ ...e, ...t, ...n, ...s ], | |
| i = s; | |
| r >= 80 && i.push( ...e ), r >= 60 && i.push( ...t ), r >= 30 && i.push( ...n ), a.forEach( e => o[ e ] = i.includes( e ) ? console[ e ].bind( console ) : () => {} ) | |
| }, | |
| o = { | |
| set: e => { | |
| r = e, n.forEach( e => { | |
| e( o, r ) | |
| } ), s() | |
| }, | |
| get: () => r, | |
| verbose: ( console.debug || ( () => {} ) ).bind( console ), | |
| debug: () => {}, | |
| log: () => {}, | |
| warn: () => {}, | |
| info: () => {}, | |
| error: () => {}, | |
| addChangeListener: e => { | |
| n.push( e ) | |
| } | |
| }; | |
| t.logger = o, s() | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| var n = this && this.__importDefault || function ( e ) { | |
| return e && e.__esModule ? e : { | |
| default: e | |
| } | |
| }; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), t.staticVars = t.safeFileName = t.encodeHtml = t.decodeHtml = t.createUUID = t.getDebouncer = t.adiff = t.copy = t.insert = t.each = t.splitSlice = t.toType = t.filterString = t.cPrompt = t.cConfirm = t.cAlert = t.getSource = t.getUrlArgs = t.isLocalImage = t.escapeForRegExp = t.escapeForRegExpURL = t.getStringBetweenTags = t.createUniqueId = void 0; | |
| const s = n( r( 6 ) ), | |
| o = window.rea; | |
| t.createUniqueId = ( e, t ) => s.default.Base64.encode( e + "_" + t ).replace( /[^0-9a-zA-Z_\-]/g, "" ), t.getStringBetweenTags = ( e, t, r ) => { | |
| const n = e.indexOf( t ); | |
| if ( -1 == n ) return ""; | |
| if ( !r ) return e.substr( n + t.length ); | |
| const s = e.substr( n + t.length ).indexOf( r ); | |
| return -1 == s ? "" : e.substr( n + t.length, s ) | |
| }; | |
| const a = ( e, t ) => { | |
| null == t && ( t = [] ); | |
| const r = new RegExp( "(\\" + [ "/", ".", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\" ].concat( t ).join( "|\\" ) + ")", "g" ); | |
| return e.replace( r, "\\$1" ) | |
| }; | |
| t.escapeForRegExpURL = a, t.escapeForRegExp = e => a( e, [ "*" ] ), | |
| t.isLocalImage = e => { | |
| const t = "background.js"; | |
| let r = o.extension.getURL( t ); | |
| return r = r.replace( t, "" ) + "images/", e.length >= r.length && r == e.substr( 0, r.length ) | |
| }, t.getUrlArgs = e => { | |
| const t = {}; | |
| let r = window.location.search.replace( /^\?/, "" ); | |
| const n = window.location.hash.replace( /^#/, "" ); | |
| r ? e && n && ( r = r + "&" + n ) : r = n; | |
| const s = r.split( "&" ); | |
| let o; | |
| for ( let e = 0; e < s.length; e++ ) { | |
| if ( o = s[ e ].split( "=" ), 2 != o.length ) { | |
| const e = o[ 0 ], | |
| t = o.slice( 1 ).join( "=" ); | |
| o = [ e, t ] | |
| } | |
| t[ o[ 0 ] ] = decodeURIComponent( o[ 1 ] ) | |
| } | |
| return t | |
| }, t.cAlert = e => { | |
| window.setTimeout( () => { | |
| alert( e ) | |
| }, 1 ) | |
| }, t.cConfirm = ( e, t ) => { | |
| window.setTimeout( () => { | |
| const r = confirm( e ); | |
| t && t( r ) | |
| }, 1 ) | |
| }, t.cPrompt = ( e, t, r ) => { | |
| window.setTimeout( () => { | |
| const n = prompt( e, t ); | |
| r && r( n ) | |
| }, 1 ) | |
| }; | |
| const i = e => ( ( {}.toString.apply( e ).match( /\s([a-z|A-Z]+)/ ) || [] )[ 1 ] ); | |
| t.toType = i; | |
| const A = ( e, t ) => { | |
| const r = i( e ); | |
| if ( "Array" === r || "NodeList" === r ) { | |
| for ( let r = 0; r < e.length; r++ ) | |
| if ( !1 === t( e[ r ], r ) ) return | |
| } else if ( "XPathResult" === r ) { | |
| let r = e.iterateNext(), | |
| n = 0; | |
| for ( ; r; ) { | |
| if ( !1 === t( r, n++ ) ) return; | |
| r = e.iterateNext() | |
| } | |
| } else | |
| for ( const r in e ) | |
| if ( e.hasOwnProperty( r ) && !1 === t( e[ r ], r ) ) return | |
| }; | |
| t.each = A, t.insert = ( e, t, r, n ) => e.slice( 0, t ) + n + e.slice( t + Math.abs( r ) ); | |
| const l = ( e, t, r, n ) => { | |
| let s; | |
| if ( Array.isArray( r ) ) { | |
| const e = {}; | |
| r.forEach( t => { | |
| e[ t ] = !0 | |
| } ), s = e | |
| } else s = r; | |
| return A( s || e, ( r, o ) => { | |
| if ( !s || s.hasOwnProperty( o ) ) { | |
| let r; | |
| const a = e[ o ], | |
| A = i( a ); | |
| if ( "Undefined" == A ) return; | |
| if ( s && n && ( r = i( s[ o ] ) ) && r !== A && ( "Array" === r || "Object" === r ) ) return; | |
| "Object" == A ? ( t[ o ] = {}, l( a, t[ o ], s ? s[ o ] : null ) ) : "Array" == A ? ( t[ o ] = [], l( a, t[ o ] ) ) : t[ o ] = a | |
| } | |
| } ), t | |
| }; | |
| t.copy = l, | |
| t.decodeHtml = e => e.replace( /(?:&#x([a-fA-F0-9]+);|&#([0-9]+);)/g, ( e, t, r ) => t ? String.fromCharCode( parseInt( t, 16 ) ) : String.fromCharCode( parseInt( r, 10 ) ) ), t.encodeHtml = e => e.replace( /[\u00A0-\u2666<>]/g, e => "&#" + e.charCodeAt( 0 ) + ";" ); | |
| const c = e => document.body ? document.body.innerText : e.childNodes.length > 0 ? c( e.childNodes[ e.childNodes.length - 1 ] ) : e.innerText; | |
| t.getSource = c, t.getDebouncer = e => ( () => { | |
| let t = {}; | |
| const r = e || 1e3, | |
| n = { | |
| clear: () => { | |
| A( t, e => window.clearTimeout( e ) ), t = {} | |
| }, | |
| is: ( e, r ) => { | |
| const s = void 0 !== t[ e ]; | |
| return r && n.add( e ), s | |
| }, | |
| add: ( e, s ) => { | |
| n.is( e ) && window.clearTimeout( t[ e ] ), t[ e ] = window.setTimeout( () => { | |
| delete t[ e ] | |
| }, s || r ) | |
| } | |
| }; | |
| return n | |
| } )(), t.filterString = ( e, t ) => e && t ? ( e.match( t ) || [] ).join( "" ) : "", t.adiff = ( e, t, r ) => { | |
| const n = []; | |
| return "both" == ( r = r || "both" ) ? e.concat( t ).forEach( r => { | |
| e.includes( r ) && t.includes( r ) || n.push( r ) | |
| } ) : "notinfirst" == r && t.forEach( t => { | |
| e.includes( t ) || n.push( t ) | |
| } ), n | |
| }, t.safeFileName = ( e, t, r ) => { | |
| void 0 === r && ( r = "-" ); | |
| const n = t ? /[:<>|~?*\x00-\x1F\uFDD0-\uFDEF"]/g : /[:<>|~?*\x00-\x1F\uFDD0-\uFDEF"\/\\]|^[.]|[.]$/g; | |
| return !t && /^((CON|PRN|AUX|NUL|CLOCK\$|COM[1-9]|LPT[1-9])(\..*)?|device(\..*)?|desktop.ini|thumbs.db)$/i.test( e ) ? ( r || "_" ) + e.replace( n, r ) : e.replace( n, r ) | |
| }, t.createUUID = () => "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace( /[xy]/g, e => { | |
| const t = 16 * Math.random() | 0; | |
| return ( "x" == e ? t : 3 & t | 8 ).toString( 16 ) | |
| } ), t.splitSlice = ( e, t ) => { | |
| const r = []; | |
| for ( let n = 0, s = e.length; n < s; n += t ) r.push( e.slice( n, t + n ) ); | |
| return r | |
| }; | |
| t.staticVars = { | |
| visible: void 0, | |
| invisible: "display: none;", | |
| visible_move: void 0, | |
| invisible_move: "position:absolute; left: -20000px; top: -200000px; width: 1px; height: 1px;" | |
| } | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| r.r( t ); | |
| var n = r( 2 ), | |
| s = r( 3 ), | |
| o = r( 10 ); | |
| const a = "de.net|gb.net|uk.net|dk.org|eu.org|asn.au|conf.au|csiro.au|edu.au|gov.au|id.au|info.au|net.au|org.au|otc.au|oz.au|telememo.au|ac.cn|ah.cn|bj.cn|cq.cn|edu.cn|gd.cn|gov.cn|gs.cn|gx.cn|gz.cn|hb.cn|he.cn|hi.cn|hk.cn|hl.cn|hn.cn|jl.cn|js.cn|ln.cn|mo.cn|net.cn|nm.cn|nx.cn|org.cn|qh.cn|sc.cn|sh.cn|sn.cn|sx.cn|tj.cn|tw.cn|xj.cn|xz.cn|yn.cn|zj.cn|ac.jp|ad.jp|aichi.jp|akita.jp|aomori.jp|chiba.jp|co.jp|ed.jp|ehime.jp|fukui.jp|fukuoka.jp|fukushima.jp|gifu.jp|go.jp|gov.jp|gr.jp|gunma.jp|hiroshima.jp|hokkaido.jp|hyogo.jp|ibaraki.jp|ishikawa.jp|iwate.jp|kagawa.jp|kagoshima.jp|kanagawa.jp|kanazawa.jp|kawasaki.jp|kitakyushu.jp|kobe.jp|kochi.jp|kumamoto.jp|kyoto.jp|lg.jp|matsuyama.jp|mie.jp|miyagi.jp|miyazaki.jp|nagano.jp|nagasaki.jp|nagoya.jp|nara.jp|ne.jp|net.jp|niigata.jp|oita.jp|okayama.jp|okinawa.jp|or.jp|org.jp|osaka.jp|saga.jp|saitama.jp|sapporo.jp|sendai.jp|shiga.jp|shimane.jp|shizuoka.jp|takamatsu.jp|tochigi.jp|tokushima.jp|tokyo.jp|tottori.jp|toyama.jp|utsunomiya.jp|wakayama.jp|yamagata.jp|yamaguchi.jp|yamanashi.jp|yokohama.jp|ac.uk|co.uk|edu.uk|gov.uk|ltd.uk|me.uk|mod.uk|net.uk|nhs.uk|nic.uk|org.uk|plc.uk|police.uk|sch.uk|co.tv|co.th|co.nz|co.za|com.ac|com.af|com.ag|com.ai|com.al|com.ar|com.au|com.aw|com.az|com.ba|com.bb|com.bh|com.bi|com.bm|com.bo|com.br|com.bs|com.bt|com.by|com.bz|com.ci|com.cm|com.cn|com.co|com.cu|com.cw|com.cy|com.dm|com.do|com.dz|com.ec|com.ee|com.eg|com.es|com.et|com.fr|com.ge|com.gh|com.gi|com.gl|com.gn|com.gp|com.gr|com.gt|com.gu|com.gy|com.hk|com.hn|com.hr|com.ht|com.im|com.io|com.iq|com.is|com.jo|com.kg|com.ki|com.km|com.kp|com.ky|com.kz|com.la|com.lb|com.lc|com.lk|com.lr|com.lv|com.ly|com.mg|com.mk|com.ml|com.mo|com.ms|com.mt|com.mu|com.mv|com.mw|com.mx|com.my|com.na|com.nf|com.ng|com.ni|com.nr|com.om|com.pa|com.pe|com.pf|com.ph|com.pk|com.pl|com.pr|com.ps|com.pt|com.py|com.qa|com.re|com.ro|com.rw|com.sa|com.sb|com.sc|com.sd|com.sg|com.sh|com.sl|com.sn|com.so|com.st|com.sv|com.sy|com.tj|com.tm|com.tn|com.to|com.tr|com.tt|com.tw|com.ua|com.ug|com.uy|com.uz|com.vc|com.ve|com.vi|com.vn|com.vu|com.ws|com.zm|com.de|com.se|com.ru", | |
| i = ( ".(" + [ "aaa|aarp|abb|abbott|abogado|ac|academy|accenture|accountant|accountants|aco|active|actor|ad|adac|ads|adult|ae|aeg|aero|af|afl|ag|agency|ai|aig|airforce|airtel|al|alibaba|alipay|allfinanz|alsace|am|amica|amsterdam|an|analytics|android|ao|apartments|app|apple|aq|aquarelle|ar|aramco|archi|army|arpa|arte|as|asia|associates|at|attorney|au|auction|audi|audio|author|auto|autos|aw|ax|axa|az|azure|ba|baidu|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bb|bbc|bbva|bcn|bd|be|beats|beer|bentley|berlin|best|bet|bf|bg|bh|bharti|bi|bible|bid|bike|bing|bingo|bio|biz|bj|bl|black|blackfriday|bloomberg|blue|bm|bms|bmw|bn|bnl|bnpparibas|bo|boats|boehringer|bom|bond|boo|book|boots|bosch|bostik|bot|boutique|bq|br|bradesco|bridgestone|broadway|broker|brother|brussels|bs|bt|budapest|bugatti|build|builders|business|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|cc|cd|ceb|center|ceo|cern|cf|cfa|cfd|cg|ch|chanel|channel|chat|cheap|chloe|christmas|chrome|church|ci|cipriani|circle|cisco|citic|city|cityeats|ck|cl|claims|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|cm|cn|co|coach|codes|coffee|college|cologne|com|commbank|community|company|compare|computer|comsec|condos|construction|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupons|courses|cr|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cu|cuisinella|cv|cw|cx|cy|cymru|cyou|cz|dabur|dad|dance|date|dating|datsun|day|dclk|de|dealer|deals|degree|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dj|dk|dm|dnp|do|docs|dog|doha|domains|doosan|download|drive|dubai|durban|dvag|dz|earth|eat|ec|edeka|edu|education|ee|eg|eh|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|er|erni|es|esq|estate|et|eu|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|fast|feedback|ferrero|fi|film|final|finance|financial|firestone|firmdale|fish|fishing|fit|fitness|fj|fk|flickr|flights|florist|flowers|flsmidth|fly|fm|fo|foo|football|ford|forex|forsale|forum|foundation|fox|fr|fresenius|frl|frogans|frontier|fund|furniture|futbol|fyi|ga|gal|gallery|gallup|game|garden|gb|gbiz|gd|gdn|ge|gea|gent|genting|gf|gg|ggee|gh|gi|gift|gifts|gives|giving|gl|glass|gle|global|globo|gm|gmail|gmo|gmx|gn|gold|goldpoint|golf|goo|goog|google|gop|got|gov|gp|gq|gr|grainger|graphics|gratis|green|gripe|group|gs|gt|gu|gucci|guge|guide|guitars|guru|gw|gy|hamburg|hangout|haus|hdfcbank|health|healthcare|help|helsinki|here|hermes|hiphop|hitachi|hiv|hk|hm|hn|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hr|hsbc|ht|hu|hyundai|ibm|icbc|ice|icu|id|ie|ifm|iinet|il|im|immo|immobilien|in|industries|infiniti|info|ing|ink|institute|insurance|insure|int|international|investments|io|ipiranga|iq|ir|irish|is|iselect|ist|istanbul|it|itau|iwc|jaguar|java|jcb|je|jetzt|jewelry|jlc|jll|jm|jmp|jo|jobs|joburg|jot|joy|jp|jprs|juegos|kaufen|kddi|ke|kfh|kg|kh|ki|kia|kim|kinder|kitchen|kiwi|km|kn|koeln|komatsu|kp|kpn|kr|krd|kred|kw|ky|kyoto|kz|la|lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latrobe|law|lawyer|lb|lc|lds|lease|leclerc|legal|lexus|lgbt|li|liaison|lidl|life|lifeinsurance|lifestyle|lighting|like|limited|limo|lincoln|linde|link|live|living|lixil|lk|loan|loans|lol|london|lotte|lotto|love|lr|ls|lt|ltd|ltda|lu|lupin|luxe|luxury|lv|ly|ma|madrid|maif|maison|makeup|man|management|mango|market|marketing|markets|marriott|mba|mc|md|me|med|media|meet|melbourne|meme|memorial|men|menu|meo|mf|mg|mh|miami|microsoft|mil|mini|mk|ml|mm|mma|mn|mo|mobi|mobily|moda|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mp|mq|mr|ms|mt|mtn|mtpc|mtr|mu|museum|mutuelle|mv|mw|mx|my|mz|na|nadex|nagoya|name|natura|navy|nc|ne|nec|net|netbank|network|neustar|new|news|nexus|nf|ng|ngo|nhk|ni|nico|nikon|ninja|nissan|nl|no|nokia|norton|nowruz|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|office|okinawa|om|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|origins|osaka|otsuka|ovh|pa|page|pamperedchef|panerai|paris|pars|partners|parts|party|pe|pet|pf|pg|ph|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pid|pin|ping|pink|pizza|pk|pl|place|play|playstation|plumbing|plus|pm|pn|pohl|poker|porn|post|pr|praxi|press|pro|prod|productions|prof|promo|properties|property|protection|ps|pt|pub|pw|pwc|py|qa|qpon|quebec|quest|racing|re|read|realtor|realty|recipes|red|redstone|redumbrella|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rexroth|rich|ricoh|rio|rip|ro|rocher|rocks|rodeo|room|rs|rsvp|ru|ruhr|run|rw|rwe|ryukyu|sa|saarland|safe|safety|sakura|sale|salon|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|sas|saxo|sb|sbs|sc|sca|scb|schaeffler|schmidt|scholarships|school|schule|schwarz|science|scor|scot|sd|se|seat|security|seek|select|sener|services|seven|sew|sex|sexy|sfr|sg|sh|sharp|shell|shia|shiksha|shoes|show|shriram|si|singles|site|sj|sk|ski|skin|sky|skype|sl|sm|smile|sn|sncf|so|soccer|social|softbank|software|sohu|solar|solutions|sony|soy|space|spiegel|spreadbetting|sr|srl|ss|st|stada|star|starhub|statefarm|statoil|stc|stcgroup|stockholm|storage|studio|study|style|su|sucks|supplies|supply|support|surf|surgery|suzuki|sv|swatch|swiss|sx|sy|sydney|symantec|systems|sz|tab|taipei|taobao|tatamotors|tatar|tattoo|tax|taxi|tc|tci|td|team|tech|technology|tel|telefonica|temasek|tennis|tf|tg|th|thd|theater|theatre|tickets|tienda|tiffany|tips|tires|tirol|tj|tk|tl|tm|tmall|tn|to|today|tokyo|tools|top|toray|toshiba|tours|town|toyota|toys|tp|tr|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tt|tube|tui|tushu|tv|tvs|tw|tz|ua|ubs|ug|uk|um|unicom|university|uno|uol|us|uy|uz|va|vacations|vana|vc|ve|vegas|ventures|verisign|versicherung|vet|vg|vi|viajes|video|villas|vin|vip|virgin|vision|vista|vistaprint|viva|vlaanderen|vn|vodka|volkswagen|vote|voting|voto|voyage|vu|wales|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam|weber|website|wed|wedding|weir|wf|whoswho|wien|wiki|williamhill|win|windows|wine|wme|wolterskluwer|work|works|world|ws|wtc|wtf|xbox|xerox|xin|测试|कॉम|परीक्षा|佛山|慈善|集团|在线|한국|点看|คอม|ভারত|八卦|موقع|বাংলা|公益|公司|移动|我爱你|москва|испытание|қаз|онлайн|сайт|联通|срб|бел|קום|时尚|테스트|淡马锡|орг|नेट|삼성|சிங்கப்பூர்|商标|商店|商城|дети|мкд|טעסט|ею|ポイント|新闻|工行|كوم|中文网|中信|中国|中國|娱乐|谷歌|భారత్|ලංකා|购物|測試|ભારત|भारत|آزمایشی|பரிட்சை|网店|संगठन|餐厅|网络|ком|укр|香港|诺基亚|δοκιμή|飞利浦|إختبار|台湾|台灣|手表|手机|мон|الجزائر|عمان|ارامكو|ایران|امارات|بازار|پاکستان|الاردن|موبايلي|بھارت|المغرب|السعودية|سودان|همراه|عراق|مليسيا|澳門|닷컴|政府|شبكة|بيتك|გე|机构|组织机构|健康|ไทย|سورية|рус|рф|珠宝|تونس|大拿|みんな|グーグル|ελ|世界|ਭਾਰਤ|网址|닷넷|コム|游戏|vermögensberater|vermögensberatung|企业|信息|مصر|قطر|广东|இலங்கை|இந்தியா|հայ|新加坡|فلسطين|テスト|政务|xperia|xxx|xyz|yachts|yahoo|yamaxun|yandex|ye|yodobashi|yoga|yokohama|youtube|yt|za|zara|zero|zip|zm|zone|zuerich|zw", a ].join( "|" ) + ")" ).replace( /\./gi, "\\." ), | |
| A = Object( o.createCache )( { | |
| timeout: 180, | |
| check_interval: 120, | |
| retimeout_on_get: !0 | |
| } ).init(), | |
| l = ( () => { | |
| const e = e => e.split( "" ).map( e => { | |
| const t = e.toLowerCase(), | |
| r = e.toUpperCase(); | |
| return t != r ? "[" + t + r + "]" : e | |
| } ).join( "" ), | |
| t = [ "protocol", "hostname", "port", "origin" ], | |
| r = [ "pathname" ], | |
| o = [ "search", "hash" ], | |
| l = t.concat( r ).concat( o ); | |
| let c; | |
| const u = ( e, n ) => { | |
| const s = {}; | |
| if ( null == e ) l.forEach( e => { | |
| s[ e ] = "" | |
| } ); | |
| else if ( [ "data:", "view-source:" ].some( t => e.startsWith( t ) ) ) { | |
| s.origin = "null"; | |
| const t = e.indexOf( ":" ); | |
| s.protocol = e.substr( 0, t + 1 ), s.pathname = e.substr( t + 1 ) | |
| } else { | |
| const a = document.createElement( "a" ); | |
| a.href = e; | |
| const i = document.body || document.documentElement || document; | |
| if ( i.appendChild( a ), l.forEach( e => { | |
| s[ e ] = a[ e ] | |
| } ), i.removeChild( a ), !n && s.protocol ) { | |
| if ( 0 !== e.toLowerCase().indexOf( s.protocol ) ) | |
| if ( e.startsWith( "//" ) ) s.origin = "", s.protocol = ""; | |
| else { | |
| if ( ![ "/", "?", "#" ].includes( e[ 0 ] ) ) return u( "/" + e ); | |
| c || ( c = u( "", !0 ) ), o.concat( r ).forEach( e => { | |
| c[ e ] === s[ e ] && ( s[ e ] = "" ) | |
| } ), t.forEach( e => { | |
| s[ e ] = "" | |
| } ) | |
| } | |
| [ "tampermonkey:" ]. includes( s.protocol ) && ( s.pathname = ( ( s.hostname ? "/" + s.hostname : "" ) + ( s.pathname || "" ) ).replace( /^\/+/, "/" ), s.hostname = "" ) | |
| } | |
| } | |
| return "0" === s.port && ( s.port = "" ), Object.defineProperties( s, { | |
| domain: { | |
| get: function () { | |
| const e = s.hostname.split( "." ), | |
| t = e.pop(); | |
| let r = `${e.pop()}.${t}`; | |
| return m.isSecondLevelDomain( r ) && ( r = `${e.pop()}.${r}` ), r | |
| } | |
| } | |
| } ), s | |
| }, | |
| d = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/, | |
| g = /((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/; | |
| let p; | |
| const m = { | |
| isIp: function ( e ) { | |
| return e.match( d ) || e.match( g ) | |
| }, | |
| isIpOrHostname: function ( e ) { | |
| return m.isIp( e ) || !e.includes( "." ) | |
| }, | |
| isSecondLevelDomain: function ( e ) { | |
| return p = p || new RegExp( "^(" + a.replace( /\./g, "\\." ) + ")$" ), e.match( p ) | |
| }, | |
| sanitize: function ( e, t, r ) { | |
| let n = !1; | |
| const s = m.parse( e ); | |
| if ( s ) return "tampermonkey:" == s.protocol ? s.pathname.includes( ".." ) ? n = !0 : e = rea.extension.getURL( e.replace( /^tampermonkey:\/\//, "" ) ) : s.protocol || t && ( e = m.rel2abs( e, t, r || [ "http:", "https:" ] ) ) || ( n = !0 ), n ? null : e | |
| }, | |
| parse: function ( e ) { | |
| if ( null == e ) return; | |
| let t = A.get( e ); | |
| return t || ( t = u( e ), A.set( e, t ), t ) | |
| }, | |
| rel2abs: function ( e, t, r ) { | |
| let n, s, o; | |
| if ( e && t && ( n = m.parse( e ) ) && ( s = m.parse( t ) ) && n && s && s.protocol && ( !r || r.includes( s.protocol ) || !e.includes( ".." ) ) ) return e.startsWith( "//" ) ? s.protocol + "//" + n.hostname + ( n.port ? ":" + n.port : "" ) + n.pathname + n.search : ( "/" === e[ 0 ] ? o = n.pathname : ( t = m.woParams( s ), s = m.parse( t + ( "/" === t[ t.length - 1 ] ? "" : "/" ) + e ), o = s.pathname ), s.protocol + "//" + s.hostname + ( s.port ? ":" + s.port : "" ) + o + n.search ) | |
| }, | |
| toUrl: function ( e, t ) { | |
| return t = t || {}, ( [ "about:" ].includes( e.protocol ) ? e.protocol : e.protocol + "//" ) + e.hostname + ( e.port && e.port > 0 ? ":" + e.port : "" ) + ( t.nopath ? "" : e.pathname + ( t.nosearch ? "" : e.search ) ) | |
| }, | |
| woPath: function ( e ) { | |
| const t = "string" == typeof e ? m.parse( e ) : e; | |
| return m.toUrl( t, { | |
| nopath: !0 | |
| } ) | |
| }, | |
| woParams: function ( e ) { | |
| const t = "string" == typeof e ? m.parse( e ) : e; | |
| return m.toUrl( t, { | |
| nosearch: !0 | |
| } ) | |
| }, | |
| woHash: function ( e ) { | |
| const t = "string" == typeof e ? m.parse( e ) : e; | |
| return m.toUrl( t ) | |
| }, | |
| hash2params: function ( e ) { | |
| return Object.keys( e ).map( t => void 0 === e[ t ] ? null : encodeURIComponent( t ) + "=" + encodeURIComponent( e[ t ] ) ).filter( e => e ).join( "&" ) | |
| }, | |
| params2hash: function ( e ) { | |
| return "string" != typeof e && ( e = e.search ? e.search.substring( 1 ) : e.hash ? e.hash.substring( 1 ) : "" ), e.split( "&" ).reduce( ( e, t ) => { | |
| const r = t.split( "=" ); | |
| return e[ decodeURIComponent( r[ 0 ] ) ] = decodeURIComponent( r[ 1 ] ), e | |
| }, {} ) | |
| }, | |
| getRegExpFromInclude: e => { | |
| let t; | |
| return "*" == e ? t = "^(https?|file)://.*" : ( t = e.includes( ".*/" ) ? e.replace( ".*/", ".tld/" ) : e, | |
| t = "^" + Object( s.escapeForRegExpURL )( t ), t = t.replace( /\*/gi, ".*" ), t = t.replace( Object( s.escapeForRegExpURL )( ".tld/" ), i + "/" ), t = t.replace( /(\^|:\/\/)\.\*/, "$1([^\\?#])*" ), t = t.replace( /<1>/g, "([^\\/#\\?]*\\.)?" ), t = t.replace( /<2>/g, "[^#\\?]*" ), t = t.replace( /<3>/g, "([^\\?#]*\\.)*" ) ), "(" + t + ")" | |
| }, | |
| getRegExpFromMatch: ( t, r ) => { | |
| let o, a, A, l, c, u; | |
| const d = "://", | |
| g = "/"; | |
| if ( o = t.replace( /\$$/, "" ).split( d ), o.length < 2 ? ( a = "", A = t ) : ( a = o[ 0 ].replace( /^\^/, "" ), A = o.slice( 1 ).join( d ) ), l = A.split( g ), | |
| u = l.length < 2 ? "/" : g + l.slice( 1 ).join( g ), c = l[ 0 ], "http*" === a ? a = "https<1>" : a.match( /\*|http|https|file|ftp/ ) || ( n.logger.warn( 'uri: override scheme "' + a + '" with "*"' ), a = "*" ), "file" === a ) c = ""; | |
| else { | |
| const e = c, | |
| t = c.match( /\*$|(\*\.)?[^\/\*]+/ ); | |
| c = ( t ? t[ 0 ] : "" ).replace( /:[0-9]*$/, "" ), c !== e && n.logger.warn( 'uri: override host "' + e + '" with "' + c + '"' ) | |
| } | |
| return u && u.substr( 0, 1 ) === g || ( n.logger.warn( 'uri: prefix path "' + u + '" with "/"' ), u = g + u ), a = Object( s.escapeForRegExpURL )( a ).replace( /\*/gi, "[^:\\/#\\?]*" ), | |
| c = Object( s.escapeForRegExpURL )( c ).replace( /\*\\\./gi, "(*\\.)?" ).replace( /\*/gi, "[^#\\?\\/]*" ), u = Object( s.escapeForRegExpURL )( u ).replace( /\*/gi, ".*" ), a = a.replace( /<1>/g, "?" ), c = c.replace( new RegExp( Object( s.escapeForRegExpURL )( ".tld" ) + "$" ), i ), r || ( a = e( a ), c = e( c ) ), c += "(:[0-9]{1,5})?", "(^" + a + Object( s.escapeForRegExpURL )( d ) + c + u + "$)" | |
| } | |
| }; | |
| return m | |
| } )(); | |
| t.default = l | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ); | |
| const n = r( 1 ), | |
| s = r( 2 ), | |
| o = window.rea, | |
| a = o.FEATURES, | |
| i = a.HTML5.LOCALSTORAGE, | |
| A = []; | |
| let l = !0; | |
| const c = ( () => { | |
| const e = [ a.CONSTANTS.STORAGE.VERSION, a.CONSTANTS.STORAGE.TYPE ], | |
| t = {}; | |
| return e.forEach( e => { | |
| t[ e ] = !0 | |
| } ), { | |
| keys: e, | |
| has: function ( e ) { | |
| return !!t[ e ] | |
| } | |
| } | |
| } )(), | |
| u = () => o.other.openDatabase( "tmStorage", "1.0", "TM Storage", 31457280 ), | |
| d = ( e, t ) => { | |
| if ( !e ) return t; | |
| const r = e[ 0 ]; | |
| switch ( e = e.substring( 1 ), r ) { | |
| case "b": | |
| return "true" == e; | |
| case "n": | |
| return Number( e ); | |
| case "o": | |
| try { | |
| return JSON.parse( e ) | |
| } catch ( e ) { | |
| s.logger.error( "Storage: getValue ERROR: " + e.message ) | |
| } | |
| return t; | |
| default: | |
| return e | |
| } | |
| }, | |
| g = e => { | |
| const t = ( typeof e )[ 0 ]; | |
| switch ( t ) { | |
| case "o": | |
| try { | |
| e = t + JSON.stringify( e ) | |
| } catch ( r ) { | |
| s.logger.error( "Storage: setValue ERROR: " + r.message ), e = t + JSON.stringify( {} ) | |
| } | |
| break; | |
| default: | |
| e = t + e | |
| } | |
| return e | |
| }, | |
| p = function ( e, t ) { | |
| const r = n.Deferred(); | |
| let o; | |
| return e == a.DB.USE && "clean" == t ? s.logger.warn( "Storage: can't clean currently active storage" ) : o = v[ e ][ t ], o ? o().then( () => { | |
| r.resolve() | |
| }, () => { | |
| r.reject() | |
| } ) : r.resolve(), r.promise() | |
| }, | |
| m = ( e, t ) => { | |
| const r = n.Deferred(), | |
| s = []; | |
| return Object.getOwnPropertyNames( t ).forEach( r => { | |
| void 0 !== t[ r ] && s.push( e.setValue( r, t[ r ] ) ) | |
| } ), n.Deferred.when( s ).done( () => { | |
| r.resolve() | |
| } ), r.promise() | |
| }, | |
| f = ( e, t ) => { | |
| const r = {}; | |
| for ( const n of t ) { | |
| const t = e.getValue( n ); | |
| void 0 !== t && ( r[ n ] = t ) | |
| } | |
| return r | |
| }, | |
| h = ( () => { | |
| const e = "s_", | |
| t = t => { | |
| document.cookie = e + t + "=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/" | |
| }, | |
| r = { | |
| setValue: ( t, r ) => { | |
| const s = n.Deferred(); | |
| return ( ( t, r ) => { | |
| const n = new Date; | |
| n.setTime( n.getTime() + 47304e7 ); | |
| const s = "expires=" + n.toUTCString(); | |
| document.cookie = e + t + "=" + r + ";" + s + ";path=/" | |
| } )( t, g( r ) ), s.resolve(), s.promise() | |
| }, | |
| setValues: e => { | |
| const t = []; | |
| return Object.keys( e ).forEach( n => { | |
| t.push( r.setValue( n, e[ n ] ) ) | |
| } ), n.Deferred.sidebyside( t ) | |
| }, | |
| getValue: ( t, r ) => d( ( t => { | |
| const r = e + t + "=", | |
| n = document.cookie.split( ";" ); | |
| for ( let e = 0; e < n.length; e++ ) { | |
| let t = n[ e ]; | |
| for ( ; | |
| " " == t.charAt( 0 ); ) t = t.substring( 1 ); | |
| if ( 0 == t.indexOf( r ) ) return t.substring( r.length, t.length ) | |
| } | |
| return null | |
| } )( t ), r ), | |
| deleteAll: () => { | |
| const e = n.Deferred(); | |
| return r.listValues().forEach( e => { | |
| t( e ) | |
| } ), e.resolve(), e.promise() | |
| }, | |
| deleteValue: e => { | |
| const r = n.Deferred(); | |
| return t( e ), r.resolve(), r.promise() | |
| }, | |
| listValues: () => ( () => { | |
| const t = document.cookie.split( ";" ), | |
| r = []; | |
| for ( let n = 0; n < t.length; n++ ) { | |
| const s = t[ n ].trim(), | |
| o = s.indexOf( "=" ), | |
| a = s.substr( 0, o ); | |
| a.substr( 0, e.length ) == e && r.push( a.substr( e.length ) ) | |
| } | |
| return r | |
| } )().map( e => e ) | |
| }; | |
| return r | |
| } )(); | |
| let R; | |
| const v = { | |
| localStorage: ( () => { | |
| const e = a.HTML5.LOCALSTORAGE, | |
| t = { | |
| setValue: ( t, r ) => { | |
| const s = n.Deferred(), | |
| o = t, | |
| a = g( r ); | |
| return l && void 0 !== a && e.setItem( o, a ), s.resolve(), s.promise() | |
| }, | |
| setValues: e => { | |
| const r = []; | |
| return Object.keys( e ).forEach( n => { | |
| r.push( t.setValue( n, e[ n ] ) ) | |
| } ), n.Deferred.sidebyside( r ) | |
| }, | |
| getValue: ( t, r ) => { | |
| const n = t; | |
| return d( e.getItem( n ), r ) | |
| }, | |
| deleteAll: () => { | |
| const r = n.Deferred(); | |
| return l && t.listValues().forEach( t => { | |
| c.has( t ) || e.removeItem( t ) | |
| } ), r.resolve(), r.promise() | |
| }, | |
| deleteValue: t => { | |
| const r = n.Deferred(), | |
| s = t; | |
| return l && e.removeItem( s ), r.resolve(), r.promise() | |
| }, | |
| listValues: () => { | |
| const t = []; | |
| for ( let r = 0; r < e.length; r++ ) { | |
| const n = e.key( r ); | |
| null !== n && t.push( n ) | |
| } | |
| return t | |
| } | |
| }; | |
| return { | |
| options: {}, | |
| methods: t | |
| } | |
| } )(), | |
| sql: ( () => { | |
| let e, t = !1, | |
| r = {}; | |
| const a = () => { | |
| const t = n.Deferred(); | |
| return null == e || e.db.transaction( r => { | |
| r.executeSql( "CREATE TABLE IF NOT EXISTS config(ID INTEGER PRIMARY KEY ASC, name TEXT, value TEXT)", [], () => t.resolve(), null == e ? void 0 : e.onError ) | |
| } ), t.promise() | |
| }, | |
| i = { | |
| setValue: ( t, a ) => { | |
| const i = n.Deferred(), | |
| A = t, | |
| c = g( a ); | |
| return l && ( r[ A ] ? null == e || e.db.transaction( t => { | |
| t.executeSql( "UPDATE config SET value=? WHERE name=?", [ c, A ], () => { | |
| o.runtime.lastError && s.logger.warn( o.runtime.lastError ), i.resolve() | |
| }, null == e ? void 0 : e.onError ) | |
| } ) : null == e || e.db.transaction( t => { | |
| t.executeSql( "INSERT INTO config(name, value) VALUES (?,?)", [ A, c ], () => { | |
| o.runtime.lastError && s.logger.warn( o.runtime.lastError ), i.resolve() | |
| }, null == e ? void 0 : e.onError ) | |
| } ) ), r[ A ] = c, l || i.resolve(), i.promise() | |
| }, | |
| setValues: e => { | |
| const t = []; | |
| return Object.keys( e ).forEach( r => { | |
| t.push( i.setValue( r, e[ r ] ) ) | |
| } ), | |
| n.Deferred.sidebyside( t ) | |
| }, | |
| getValue: ( e, t ) => d( r[ e ], t ), | |
| deleteAll: () => { | |
| const t = n.Deferred(), | |
| s = f( i, c.keys ); | |
| r = {}; | |
| for ( const e of Object.keys( s ) ) r[ e ] = g( s[ e ] ); | |
| return l ? null == e || e.db.transaction( n => { | |
| n.executeSql( "DROP TABLE config", [], () => { | |
| a().done( () => { | |
| m( i, r ).done( t.resolve ) | |
| } ) | |
| }, null == e ? void 0 : e.onError ) | |
| } ) : t.resolve(), t.promise() | |
| }, | |
| deleteValue: t => { | |
| const s = n.Deferred(), | |
| o = t; | |
| return delete r[ o ], l ? null == e || e.db.transaction( t => { | |
| t.executeSql( "DELETE FROM config WHERE name=?", [ o ], () => s.resolve(), null == e ? void 0 : e.onError ) | |
| } ) : s.resolve(), s.promise() | |
| }, | |
| listValues: () => { | |
| const e = []; | |
| return Object.getOwnPropertyNames( r ).forEach( t => { | |
| e.push( t ) | |
| } ), e | |
| }, | |
| isWorking: () => n.Deferred.Pledge() | |
| }; | |
| return { | |
| init: () => { | |
| const o = n.Deferred(), | |
| i = ( e, t ) => { | |
| if ( r = {}, t ) | |
| for ( let e = 0; e < t.rows.length; e++ ) r[ t.rows.item( e ).name ] = t.rows.item( e ).value; | |
| o.resolve() | |
| }, | |
| A = () => { | |
| t ? o.resolve() : ( t = !0, null == e || e.db.transaction( t => { | |
| t.executeSql( "SELECT * FROM config", [], i, null == e ? void 0 : e.onError ) | |
| } ) ) | |
| }; | |
| return e ? A() : ( () => { | |
| const t = n.Deferred(); | |
| return e = { | |
| db: u(), | |
| onSuccess: () => {}, | |
| onError: ( e, t ) => ( s.logger.error( "webSQL: localDB Error ", t ), !1 ) | |
| }, e.db ? a().done( t.resolve ) : ( e = null, t.reject() ), t.promise() | |
| } )().done( A ).fail( o.reject ), o.promise() | |
| }, | |
| clean: () => ( t = !1, r = {}, n.Deferred.Pledge() ), | |
| options: {}, | |
| methods: i | |
| } | |
| } )(), | |
| chromeStorage: ( () => { | |
| let e = !1, | |
| t = {}, | |
| r = !1, | |
| a = !1; | |
| const i = o.extension.inIncognitoContext ? "incognito" : "normal", | |
| A = ( e, r ) => { | |
| l && a && "local" == r && e && Object.keys( e ).forEach( r => { | |
| const n = e[ r ]; | |
| n.newValue ? n.newValue.origin !== i && ( n.newValue.value && ( t[ r ] = n.newValue.value ), b.notifyDifferentOriginChangeListeners( r, n.newValue.value ) ) : n.oldValue && n.oldValue.origin !== i && delete t[ r ] | |
| } ) | |
| }, | |
| u = { | |
| setValue: ( e, r ) => { | |
| const s = n.Deferred(), | |
| a = e; | |
| if ( t[ a ] = r, l ) { | |
| const e = {}; | |
| e[ a ] = { | |
| origin: i, | |
| value: r | |
| }, o.storage.local.set( e, s.resolve ) | |
| } else s.resolve(); | |
| return s.promise() | |
| }, | |
| setValues: e => { | |
| const r = n.Deferred(), | |
| s = {}; | |
| return Object.keys( e ).forEach( r => { | |
| const n = r, | |
| o = e[ r ]; | |
| t[ n ] = o, l && ( s[ n ] = { | |
| origin: i, | |
| value: o | |
| } ) | |
| } ), l ? o.storage.local.set( s, r.resolve ) : r.resolve(), r.promise() | |
| }, | |
| getValue: ( e, r ) => { | |
| const n = e; | |
| return void 0 === t[ n ] ? r : t[ n ] | |
| }, | |
| deleteAll: () => { | |
| const e = n.Deferred(), | |
| r = f( u, c.keys ); | |
| return t = r, l ? o.storage.local.clear( () => { | |
| m( u, r ).done( e.resolve ) | |
| } ) : e.resolve(), e.promise() | |
| }, | |
| deleteValue: e => { | |
| const r = n.Deferred(), | |
| s = e; | |
| return delete t[ s ], l ? o.storage.local.remove( s, r.resolve ) : r.resolve(), r.promise() | |
| }, | |
| listValues: () => { | |
| const e = []; | |
| return Object.getOwnPropertyNames( t ).forEach( t => { | |
| e.push( t ) | |
| } ), e | |
| }, | |
| setTemporary: e => { | |
| l = !e, a = !0 | |
| }, | |
| isWorking: () => { | |
| const e = n.Deferred(); | |
| let t = 0; | |
| const r = Date.now(), | |
| a = "foo", | |
| i = {}; | |
| i[ a ] = { | |
| origin: "normal", | |
| value: r | |
| }; | |
| const A = () => { | |
| u && window.clearTimeout( u ), u = null | |
| }, | |
| l = e => { | |
| ++t <= 5 ? ( s.logger.warn( "storage:", e || "storage set/get test failed!" ), window.setTimeout( d, t * t * 100 ) ) : ( s.logger.warn( "storage: storage set/get test finally failed!" ), c() ) | |
| }, | |
| c = () => { | |
| u && ( A(), e.reject() ) | |
| }; | |
| let u = window.setTimeout( () => { | |
| u = null, c() | |
| }, 18e4 ); | |
| const d = () => { | |
| s.logger.log( "Storage: test -> start" ); | |
| const t = Date.now(); | |
| o.storage.local.set( i, () => { | |
| s.logger.log( "Storage: test -> set after " + ( Date.now() - t ) + "ms" ), o.storage.local.get( a, n => ( s.logger.log( "Storage: test -> get after " + ( Date.now() - t ) + "ms" ), n && n[ a ] ? n[ a ].value !== r ? l( "read value is different " + JSON.stringify( n[ a ] ) + " != " + JSON.stringify( r ) ) : o.runtime.lastError ? l( o.runtime.lastError && o.runtime.lastError.message || "lastError is set" ) : void o.storage.local.remove( a, () => { | |
| s.logger.log( "Storage: test -> remove after " + ( Date.now() - t ) + "ms" ), u && ( A(), e.resolve() ) | |
| } ) : l( "read value is" + JSON.stringify( n ) ) ) ) | |
| } ) | |
| }; | |
| return d(), e.promise() | |
| } | |
| }; | |
| return { | |
| init: () => { | |
| const s = n.Deferred(); | |
| if ( e ) s.resolve(); | |
| else { | |
| e = !0; | |
| const n = e => { | |
| t = {}, e && Object.keys( e ).forEach( r => { | |
| const n = e[ r ]; | |
| n && n.hasOwnProperty( "origin" ) && n.hasOwnProperty( "value" ) ? t[ r ] = n.value : t[ r ] = n | |
| } ), r || ( o.storage.onChanged.addListener( A ), r = !0 ), s.resolve() | |
| }; | |
| o.storage.local.get( null, n ) | |
| } | |
| return s.promise() | |
| }, | |
| clean: () => { | |
| const r = n.Deferred(); | |
| return e = !1, t = {}, r.resolve(), r.promise() | |
| }, | |
| options: {}, | |
| methods: u | |
| } | |
| } )() | |
| }, | |
| b = { | |
| secure: { | |
| cookie: h | |
| }, | |
| setValue: ( e, t ) => R.setValue( e, t ), | |
| setValues: e => R.setValues( e ), | |
| getValue: ( e, t ) => R.getValue( e, t ), | |
| deleteAll: () => R.deleteAll(), | |
| deleteValue: e => R.deleteValue( e ), | |
| listValues: () => R.listValues(), | |
| isWorking: () => ( R.isWorking || n.Deferred.Pledge )(), | |
| migrate: ( e, t, r ) => { | |
| const o = n.Deferred(), | |
| a = v[ e ], | |
| i = v[ t ]; | |
| return r = r || {}, a && i ? p( e, "init" ).then( () => p( t, "init" ) ).then( () => { | |
| const e = n.Deferred(), | |
| t = []; | |
| return a.methods.listValues().forEach( e => { | |
| const n = a.methods.getValue( e ); | |
| r.drop && t.push( a.methods.deleteValue( e ) ), void 0 !== n && t.push( i.methods.setValue( e, n ) ) | |
| } ), n.Deferred.when( t ).done( () => { | |
| e.resolve() | |
| } ), e.promise() | |
| } ).then( () => p( t, "clean" ) ).then( () => p( e, "clean" ) ).done( () => { | |
| o.resolve() | |
| } ).fail( () => { | |
| o.reject() | |
| } ) : ( s.logger.error( "Migration: unknown storage implementation(s) ", e, t ), o.reject() ), o.promise() | |
| }, | |
| setTemporary: e => { | |
| l = !e | |
| }, | |
| init: () => { | |
| s.logger.debug( "Storage: use " + a.DB.USE ); | |
| const e = v[ a.DB.USE ]; | |
| return R = e.methods, e.init ? e.init() : n.Deferred.Pledge() | |
| }, | |
| factoryReset: () => ( i && i.removeItem( a.CONSTANTS.STORAGE.LEGACY_VERSION ), b.deleteAll() ), | |
| isWiped: () => { | |
| if ( "localStorage" === a.DB.USE || !i ) return n.Deferred.Pledge( !1 ); | |
| const e = n.Deferred(), | |
| t = b.getValue( a.CONSTANTS.STORAGE.VERSION ); | |
| let r = !1; | |
| return i.getItem( a.CONSTANTS.STORAGE.LEGACY_VERSION ) && !t && ( b.listValues().length ? s.logger.warn( "storage: unable to find version information" ) : r = !0 ), e.resolve( r ), e.promise() | |
| }, | |
| setVersion: ( e, t ) => { | |
| const r = n.Deferred(); | |
| return l ? ( i && i.setItem( a.CONSTANTS.STORAGE.LEGACY_VERSION, e ), b.setValue( a.CONSTANTS.STORAGE.VERSION, e ).then( () => t ? b.setValue( a.CONSTANTS.STORAGE.SCHEMA, t ) : n.Deferred.Pledge() ).always( r.resolve ) ) : r.resolve(), r.promise() | |
| }, | |
| getVersion: e => { | |
| const t = n.Deferred(); | |
| let r = b.getValue( a.CONSTANTS.STORAGE.VERSION ) || b.getValue( a.CONSTANTS.STORAGE.LEGACY_VERSION ) || ( i ? i.getItem( a.CONSTANTS.STORAGE.LEGACY_VERSION ) : null ); | |
| if ( r ) t.resolve( r ); | |
| else { | |
| const n = "sql"; | |
| p( n, "init" ).then( () => ( r = v.sql.methods.getValue( a.CONSTANTS.STORAGE.LEGACY_VERSION ) || e, p( n, "clean" ) ) ).always( () => { | |
| t.resolve( r || e ) | |
| } ) | |
| } | |
| return t.promise() | |
| }, | |
| getSchemaVersion: () => b.getValue( a.CONSTANTS.STORAGE.SCHEMA, "3.5" ), | |
| addDifferentOriginChangeListener: ( e, t ) => { | |
| A.push( { | |
| search: e, | |
| cb: t | |
| } ) | |
| }, | |
| notifyDifferentOriginChangeListeners: ( e, t ) => { | |
| A.forEach( r => { | |
| 0 == e.indexOf( r.search ) && r.cb( e, t ) | |
| } ) | |
| }, | |
| recover: e => { | |
| const t = n.Deferred(); | |
| "string" == typeof e && ( e = { | |
| method: e, | |
| storages: [ "sql", "chromeStorage" ] | |
| } ); | |
| const r = {}; | |
| if ( e.storages.forEach( e => { | |
| r[ e ] = !0 | |
| } ), "log" == e.method ) { | |
| let e, n, a, i; | |
| const A = [ { | |
| method: "sql", | |
| fn: t => { | |
| s.logger.debug( "check sql storage for data..." ); | |
| try { | |
| if ( i = u(), o.runtime.lastError || !i ) return e = o.runtime.lastError, t(); | |
| i.transaction( r => { | |
| r.executeSql( "CREATE TABLE IF NOT EXISTS config(ID INTEGER PRIMARY KEY ASC, name TEXT, value TEXT)", [], () => { | |
| s.logger.debug( "sql table found/created" ), t() | |
| }, ( r, n ) => ( e = n, t(), !1 ) ) | |
| } ) | |
| } catch ( r ) { | |
| e = r, window.setTimeout( t, 1 ) | |
| } | |
| } | |
| }, { | |
| method: "sql", | |
| fn: t => { | |
| const r = {}; | |
| i.transaction( s => { | |
| s.executeSql( "SELECT * FROM config", [], ( e, s ) => { | |
| if ( s ) | |
| for ( let e = 0; e < s.rows.length; e++ ) r[ s.rows.item( e ).name ] = s.rows.item( e ).value; | |
| n = r, window.setTimeout( t, 1 ) | |
| }, ( r, n ) => ( e = n, t(), !1 ) ) | |
| } ) | |
| } | |
| }, { | |
| method: "sql", | |
| fn: e => { | |
| const t = n ? Object.getOwnPropertyNames( n ) : []; | |
| n && t.length ? ( s.logger.debug( "found values:" ), t.forEach( e => { | |
| var t; | |
| const r = null === ( t = n[ e ] ) || void 0 === t ? void 0 : t.toString(); | |
| s.logger.debug( " ", e, r && r.length > 30 ? r.substr( 0, 30 ) : r ) | |
| } ) ) : ( s.logger.warn( "no data found" ), r.sql = !1 ), window.setTimeout( e, 1 ) | |
| } | |
| }, { | |
| method: "chromeStorage", | |
| fn: e => { | |
| s.logger.debug( "check chromeStorage for data..." ), o.storage.local.get( null, t => { | |
| a = t, e() | |
| } ) | |
| } | |
| }, { | |
| method: "chromeStorage", | |
| fn: e => { | |
| const t = a ? Object.getOwnPropertyNames( a ) : []; | |
| a && t.length ? ( s.logger.debug( "found values:" ), t.forEach( e => { | |
| var t; | |
| const r = null === ( t = a[ e ] ) || void 0 === t ? void 0 : t.toString(); | |
| s.logger.debug( " ", e, r && r.length > 30 ? r.substr( 0, 30 ) : r ) | |
| } ) ) : ( s.logger.warn( "no data found" ), r.chromeStorage = !1, window.setTimeout( e, 1 ) ) | |
| } | |
| } ], | |
| l = () => { | |
| if ( e ) return s.logger.warn( "error:", e ), | |
| void t.resolve(); | |
| for ( const e of A ) | |
| if ( r[ e.method ] ) return void e.fn( l ); | |
| t.resolve() | |
| }; | |
| l() | |
| } else t.resolve(); | |
| return t.promise() | |
| } | |
| }; | |
| t.default = b | |
| }, function ( e, t ) { | |
| "use strict"; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ); | |
| const r = { | |
| encode: e => window.unescape( window.encodeURIComponent( e ) ), | |
| decode: e => window.decodeURIComponent( window.escape( e ) ) | |
| }, | |
| n = ( e, t ) => { | |
| try { | |
| let n; | |
| n = "object" == typeof t ? t.encoding : t, n && "utf-8" == n.toLowerCase() && ( e = r.encode( e ) ); | |
| const s = new window.Uint8Array( e.length ); | |
| for ( let t = 0; t < e.length; t++ ) s[ t ] = 255 & e.charCodeAt( t ); | |
| return s.buffer | |
| } catch ( e ) { | |
| window.console.warn( e ) | |
| } | |
| return new window.Uint8Array( 0 ).buffer | |
| }, | |
| s = { | |
| UTF8: r, | |
| Base64: { | |
| encode: e => { | |
| let t = ""; | |
| for ( let r = 0; r < e.length; r++ ) t += window.String.fromCharCode( 255 & e.charCodeAt( r ) ); | |
| return window.btoa( t ) | |
| }, | |
| decode: e => window.atob( e ) | |
| }, | |
| encode: e => window.escape( e ), | |
| decode: e => window.unescape( e ), | |
| encodeR: e => e, | |
| decodeR: e => e, | |
| encodeS: e => window.btoa( r.encode( e ) ), | |
| decodeS: e => r.decode( window.atob( e ) ), | |
| MD5: ( e, t ) => { | |
| const n = ( e, t ) => e << t | e >>> 32 - t, | |
| s = ( e, t ) => { | |
| const r = 2147483648 & e, | |
| n = 2147483648 & t, | |
| s = 1073741824 & e, | |
| o = 1073741824 & t, | |
| a = ( 1073741823 & e ) + ( 1073741823 & t ); | |
| return s & o ? 2147483648 ^ a ^ r ^ n : s | o ? 1073741824 & a ? 3221225472 ^ a ^ r ^ n : 1073741824 ^ a ^ r ^ n : a ^ r ^ n | |
| }, | |
| o = ( e, t, r, o, a, i, A ) => ( e = s( e, s( s( ( ( e, t, r ) => e & t | ~e & r )( t, r, o ), a ), A ) ), s( n( e, i ), t ) ), | |
| a = ( e, t, r, o, a, i, A ) => ( e = s( e, s( s( ( ( e, t, r ) => e & r | t & ~r )( t, r, o ), a ), A ) ), s( n( e, i ), t ) ), | |
| i = ( e, t, r, o, a, i, A ) => ( e = s( e, s( s( ( ( e, t, r ) => e ^ t ^ r )( t, r, o ), a ), A ) ), | |
| s( n( e, i ), t ) ), | |
| A = ( e, t, r, o, a, i, A ) => ( e = s( e, s( s( ( ( e, t, r ) => t ^ ( e | ~r ) )( t, r, o ), a ), A ) ), s( n( e, i ), t ) ), | |
| l = e => { | |
| let t, r, n = "", | |
| s = ""; | |
| for ( r = 0; r <= 3; r++ ) t = e >>> 8 * r & 255, s = "0" + t.toString( 16 ), n += s.substr( s.length - 2, 2 ); | |
| return n | |
| }; | |
| let c, u, d, g, p, m, f, h, R, v = []; | |
| for ( t && "utf-8" == t.toLowerCase() && ( e = r.encode( e ) ), v = ( e => { | |
| let t; | |
| const r = e.length, | |
| n = r + 8, | |
| s = 16 * ( ( n - n % 64 ) / 64 + 1 ), | |
| o = Array( s - 1 ); | |
| let a = 0, | |
| i = 0; | |
| for ( ; i < r; ) t = ( i - i % 4 ) / 4, a = i % 4 * 8, o[ t ] = o[ t ] | e.charCodeAt( i ) << a, i++; | |
| return t = ( i - i % 4 ) / 4, a = i % 4 * 8, o[ t ] = o[ t ] | 128 << a, o[ s - 2 ] = r << 3, o[ s - 1 ] = r >>> 29, o | |
| } )( e ), | |
| m = 1732584193, f = 4023233417, h = 2562383102, R = 271733878, c = 0; c < v.length; c += 16 ) u = m, d = f, g = h, p = R, m = o( m, f, h, R, v[ c + 0 ], 7, 3614090360 ), R = o( R, m, f, h, v[ c + 1 ], 12, 3905402710 ), h = o( h, R, m, f, v[ c + 2 ], 17, 606105819 ), f = o( f, h, R, m, v[ c + 3 ], 22, 3250441966 ), m = o( m, f, h, R, v[ c + 4 ], 7, 4118548399 ), R = o( R, m, f, h, v[ c + 5 ], 12, 1200080426 ), h = o( h, R, m, f, v[ c + 6 ], 17, 2821735955 ), f = o( f, h, R, m, v[ c + 7 ], 22, 4249261313 ), m = o( m, f, h, R, v[ c + 8 ], 7, 1770035416 ), R = o( R, m, f, h, v[ c + 9 ], 12, 2336552879 ), h = o( h, R, m, f, v[ c + 10 ], 17, 4294925233 ), f = o( f, h, R, m, v[ c + 11 ], 22, 2304563134 ), | |
| m = o( m, f, h, R, v[ c + 12 ], 7, 1804603682 ), R = o( R, m, f, h, v[ c + 13 ], 12, 4254626195 ), h = o( h, R, m, f, v[ c + 14 ], 17, 2792965006 ), f = o( f, h, R, m, v[ c + 15 ], 22, 1236535329 ), m = a( m, f, h, R, v[ c + 1 ], 5, 4129170786 ), R = a( R, m, f, h, v[ c + 6 ], 9, 3225465664 ), h = a( h, R, m, f, v[ c + 11 ], 14, 643717713 ), f = a( f, h, R, m, v[ c + 0 ], 20, 3921069994 ), m = a( m, f, h, R, v[ c + 5 ], 5, 3593408605 ), R = a( R, m, f, h, v[ c + 10 ], 9, 38016083 ), h = a( h, R, m, f, v[ c + 15 ], 14, 3634488961 ), f = a( f, h, R, m, v[ c + 4 ], 20, 3889429448 ), m = a( m, f, h, R, v[ c + 9 ], 5, 568446438 ), R = a( R, m, f, h, v[ c + 14 ], 9, 3275163606 ), | |
| h = a( h, R, m, f, v[ c + 3 ], 14, 4107603335 ), f = a( f, h, R, m, v[ c + 8 ], 20, 1163531501 ), m = a( m, f, h, R, v[ c + 13 ], 5, 2850285829 ), R = a( R, m, f, h, v[ c + 2 ], 9, 4243563512 ), h = a( h, R, m, f, v[ c + 7 ], 14, 1735328473 ), f = a( f, h, R, m, v[ c + 12 ], 20, 2368359562 ), m = i( m, f, h, R, v[ c + 5 ], 4, 4294588738 ), R = i( R, m, f, h, v[ c + 8 ], 11, 2272392833 ), h = i( h, R, m, f, v[ c + 11 ], 16, 1839030562 ), f = i( f, h, R, m, v[ c + 14 ], 23, 4259657740 ), m = i( m, f, h, R, v[ c + 1 ], 4, 2763975236 ), R = i( R, m, f, h, v[ c + 4 ], 11, 1272893353 ), h = i( h, R, m, f, v[ c + 7 ], 16, 4139469664 ), f = i( f, h, R, m, v[ c + 10 ], 23, 3200236656 ), | |
| m = i( m, f, h, R, v[ c + 13 ], 4, 681279174 ), R = i( R, m, f, h, v[ c + 0 ], 11, 3936430074 ), h = i( h, R, m, f, v[ c + 3 ], 16, 3572445317 ), f = i( f, h, R, m, v[ c + 6 ], 23, 76029189 ), m = i( m, f, h, R, v[ c + 9 ], 4, 3654602809 ), R = i( R, m, f, h, v[ c + 12 ], 11, 3873151461 ), h = i( h, R, m, f, v[ c + 15 ], 16, 530742520 ), f = i( f, h, R, m, v[ c + 2 ], 23, 3299628645 ), m = A( m, f, h, R, v[ c + 0 ], 6, 4096336452 ), R = A( R, m, f, h, v[ c + 7 ], 10, 1126891415 ), h = A( h, R, m, f, v[ c + 14 ], 15, 2878612391 ), f = A( f, h, R, m, v[ c + 5 ], 21, 4237533241 ), m = A( m, f, h, R, v[ c + 12 ], 6, 1700485571 ), R = A( R, m, f, h, v[ c + 3 ], 10, 2399980690 ), | |
| h = A( h, R, m, f, v[ c + 10 ], 15, 4293915773 ), f = A( f, h, R, m, v[ c + 1 ], 21, 2240044497 ), m = A( m, f, h, R, v[ c + 8 ], 6, 1873313359 ), R = A( R, m, f, h, v[ c + 15 ], 10, 4264355552 ), h = A( h, R, m, f, v[ c + 6 ], 15, 2734768916 ), f = A( f, h, R, m, v[ c + 13 ], 21, 1309151649 ), m = A( m, f, h, R, v[ c + 4 ], 6, 4149444226 ), R = A( R, m, f, h, v[ c + 11 ], 10, 3174756917 ), h = A( h, R, m, f, v[ c + 2 ], 15, 718787259 ), f = A( f, h, R, m, v[ c + 9 ], 21, 3951481745 ), m = s( m, u ), f = s( f, d ), h = s( h, g ), R = s( R, p ); | |
| return ( l( m ) + l( f ) + l( h ) + l( R ) ).toLowerCase() | |
| }, | |
| ab2strSync: ( e, t ) => { | |
| try { | |
| let n, s; | |
| if ( "object" == typeof t ? ( n = t.encoding, | |
| s = t.array ) : n = t, window.TextDecoder && !s && n ) return new window.TextDecoder( n ).decode( e ); { | |
| let t = 0; | |
| const s = [], | |
| o = e.byteLength; | |
| for ( ; t < o; t += 16384 ) s.push( window.String.fromCharCode.apply( null, new Uint8Array( e, t, Math.min( 16384, o - t ) ) ) ); | |
| let a = s.join( "" ); | |
| return n && "utf-8" == n.toLowerCase() && ( a = r.decode( a ) ), a | |
| } | |
| } catch ( e ) { | |
| window.console.warn( e ) | |
| } | |
| return null | |
| }, | |
| str2abSync: n, | |
| ab2str: ( e, t ) => new Promise( ( r, n ) => { | |
| const s = t && t.encoding ? "text/plain" : "binary/octet-stream", | |
| o = new Blob( [ e ], { | |
| type: s | |
| } ), | |
| a = new FileReader; | |
| a.onload = e => { | |
| e.target ? r( e.target.result ) : n( new Error( "Could not convert array to string!" ) ) | |
| }, t && t.encoding ? a.readAsText( o, t.encoding ) : a.readAsBinaryString( o ) | |
| } ), | |
| str2ab: ( e, t ) => new Promise( r => { | |
| r( n( e, t ) ) | |
| } ), | |
| dataUri2Blob: e => { | |
| let t; | |
| t = e.split( "," )[ 0 ].includes( "base64" ) ? window.atob( e.split( "," )[ 1 ] ) : window.unescape( e.split( "," )[ 1 ] ); | |
| const r = e.split( "," )[ 0 ].split( ":" )[ 1 ].split( ";" )[ 0 ], | |
| n = new Uint8Array( t.length ); | |
| for ( let e = 0; e < t.length; e++ ) n[ e ] = t.charCodeAt( e ); | |
| return new window.Blob( [ n ], { | |
| type: r | |
| } ) | |
| }, | |
| blob2dataUri: ( e, t ) => { | |
| const r = new window.FileReader; | |
| r.onload = e => { | |
| var r; | |
| t( ( null === ( r = e.target ) || void 0 === r ? void 0 : r.result ) || null ) | |
| }, r.readAsDataURL( e ) | |
| }, | |
| blob2str: async ( e, t ) => new Promise( r => { | |
| const n = new FileReader; | |
| n.onload = () => { | |
| r( n.result || "" ) | |
| }, n.onerror = e => { | |
| console.warn( "unable to decode data " + e ), r( "" ) | |
| }, t ? n.readAsText( e, t ) : n.readAsBinaryString( e ) | |
| } ) | |
| }; | |
| t.default = s | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), | |
| t.determineOriginOfUrl = t.HEADER_STOP = t.HEADER_START = t.versionCmp = t.createScriptFromSrc = t.processHeader = t.processMetaHeader = t.createScript = t.init = void 0; | |
| const n = r( 3 ), | |
| s = r( 10 ), | |
| o = r( 0 ), | |
| a = r( 2 ); | |
| let i; | |
| const A = {}, | |
| l = e => { | |
| const t = null == e ? void 0 : e.keys, | |
| r = { | |
| keys: t, | |
| default: () => [], | |
| set: ( e, t ) => ( e.push( t ), e ) | |
| }; | |
| return ( null == t ? void 0 : t.length ) && t.forEach( e => A[ e ] = r ), r | |
| }, | |
| c = e => { | |
| const t = null == e ? void 0 : e.keys, | |
| r = { | |
| keys: t, | |
| default: () => null, | |
| set: ( t, r ) => { | |
| const n = ( null == e ? void 0 : e.convert ) ? e.convert( r ) : r; | |
| return null === t ? n : t | |
| } | |
| }; | |
| return ( null == t ? void 0 : t.length ) && t.forEach( e => A[ e ] = r ), r | |
| }, | |
| u = e => { | |
| const t = null == e ? void 0 : e.keys, | |
| r = { | |
| keys: t, | |
| default: () => ( {} ), | |
| set: ( t, r, n ) => { | |
| n = n ? o.normalizeLocale( n ) : "default"; | |
| const s = ( null == e ? void 0 : e.convert ) ? e.convert( r ) : r; | |
| return t[ n ] = t[ n ] || s, t | |
| } | |
| }; | |
| return ( null == t ? void 0 : t.length ) && t.forEach( e => A[ e ] = r ), r | |
| }, | |
| d = { | |
| name: u( { | |
| convert: e => null == e ? void 0 : e.replace( /\s\s+/g, " " ) | |
| } ), | |
| version: c( { | |
| convert: e => ( null == e ? void 0 : e.replace( /\s/g, "" ) ) || e | |
| } ), | |
| grants: l( { | |
| keys: [ "grant" ] | |
| } ), | |
| icon: c( { | |
| keys: [ "icon", "iconURL", "iconUrl", "defaulticon" ] | |
| } ), | |
| icon64: c( { | |
| keys: [ "icon64", "iconURL64" ] | |
| } ), | |
| supportURL: c( { | |
| keys: [ "supportURL", "supportUrl" ] | |
| } ), | |
| fileURL: c(), | |
| downloadURL: c( { | |
| keys: [ "downloadURL", "downloadUrl" ] | |
| } ), | |
| updateURL: c( { | |
| keys: [ "updateURL", "updateUrl" ] | |
| } ), | |
| namespace: c( { | |
| convert: e => "" === e ? null : e | |
| } ), | |
| author: c(), | |
| copyright: c(), | |
| homepage: c( { | |
| keys: [ "homepage", "homepageURL", "homepageUrl", "website", "source" ] | |
| } ), | |
| description: u(), | |
| includes: l( { | |
| keys: [ "include" ] | |
| } ), | |
| excludes: l( { | |
| keys: [ "exclude" ] | |
| } ), | |
| matches: l( { | |
| keys: [ "match" ] | |
| } ), | |
| requires: l( { | |
| keys: [ "require" ] | |
| } ), | |
| resources: ( e => { | |
| const t = null == e ? void 0 : e.keys, | |
| r = { | |
| keys: t, | |
| default: () => ( {} ), | |
| set: ( t, r ) => { | |
| const n = r.match( /^(\S*)\s+(.*)/ ); | |
| if ( n && void 0 === t[ n[ 1 ] ] ) { | |
| const r = ( null == e ? void 0 : e.convert ) ? e.convert( n[ 2 ] ) : n[ 2 ]; | |
| t[ n[ 1 ] ] = r | |
| } | |
| return t | |
| } | |
| }; | |
| return ( null == t ? void 0 : t.length ) && t.forEach( e => A[ e ] = r ), r | |
| } )( { | |
| keys: [ "resource" ] | |
| } ), | |
| noframes: ( () => { | |
| const e = void 0, | |
| t = { | |
| default: () => null, | |
| set: () => !0 | |
| }; | |
| return ( null == e ? void 0 : e.length ) && e.forEach( e => A[ e ] = t ), t | |
| } )(), | |
| connects: l( { | |
| keys: [ "connect", "connect-src", "domain" ] | |
| } ), | |
| webRequest: l(), | |
| "run-at": c(), | |
| antifeatures: ( e => { | |
| const t = null == e ? void 0 : e.keys, | |
| r = { | |
| keys: t, | |
| default: () => ( {} ), | |
| set: ( t, r, n ) => { | |
| var s; | |
| n = n ? o.normalizeLocale( n ) : "default"; | |
| const a = r.match( /^(\S*)\s+(.*)/ ); | |
| if ( a ) { | |
| const r = t[ s = a[ 1 ] ] || ( t[ s ] = {} ), | |
| o = ( null == e ? void 0 : e.convert ) ? e.convert( a[ 2 ] ) : a[ 2 ]; | |
| r[ n ] = o | |
| } | |
| return t | |
| } | |
| }; | |
| return ( null == t ? void 0 : t.length ) && t.forEach( e => A[ e ] = r ), r | |
| } )( { | |
| keys: [ "antifeature" ] | |
| } ) | |
| }, | |
| g = {}; | |
| Object.entries( d ).forEach( ( [ e, t ] ) => { | |
| t.keys ? t.keys.forEach( t => { | |
| g[ t ] = e | |
| } ) : g[ e ] = e | |
| } ); | |
| const p = "==UserScript=="; | |
| t.HEADER_START = p; | |
| const m = "==/UserScript=="; | |
| t.HEADER_STOP = m; | |
| const f = /(?:^|\n)\s*\/\/\x20*==UserScript==([\s\S]*?\n)\s*\/\/\x20*==\/UserScript==|$/, | |
| h = () => ( { | |
| ...{ | |
| ...Object.fromEntries( Object.keys( d ).map( e => [ e, d[ e ].default() ] ) ) | |
| } | |
| } ), | |
| R = e => { | |
| const t = e.match( f ), | |
| r = ( t ? t[ 1 ] : "" ) || "", | |
| n = {}; | |
| return r.replace( /(?:^|\n)\s*\/\/\s*(@\S+)(.*)/g, ( e, t, r ) => { | |
| const [ s, o ] = t.slice( 1 ).split( ":" ), a = g[ s ], i = A[ a ] || d[ a ] || void 0; | |
| if ( i ) { | |
| const e = r.trim(); | |
| let t = n[ a ]; | |
| void 0 === t && ( t = i.default() ), | |
| n[ a ] = i.set( t, e, o ) | |
| } else( null == n ? void 0 : n.name ) && ( null == n ? void 0 : n.name ).default; | |
| return "" | |
| } ), { | |
| ...h(), | |
| ...n | |
| } | |
| }, | |
| v = e => { | |
| const { | |
| name: t, | |
| description: r, | |
| version: n, | |
| grants: s, | |
| fileURL: o, | |
| requires: a, | |
| resources: i, | |
| webRequest: A, | |
| namespace: l, | |
| noframes: c, | |
| author: u, | |
| copyright: d, | |
| antifeatures: g | |
| } = e; | |
| let { | |
| icon: p, | |
| icon64: m, | |
| updateURL: f, | |
| downloadURL: h, | |
| supportURL: R, | |
| homepage: v, | |
| includes: b, | |
| matches: w, | |
| excludes: k, | |
| connects: _ | |
| } = e; | |
| const y = e[ "run-at" ] || null, | |
| E = ( e, { | |
| [ e ]: t, | |
| ...r | |
| } ) => r, | |
| I = s.filter( e => e ); | |
| p = p || null, m = m || null, f = f || null, h = h || null, R = R || null, | |
| v = v || null; | |
| const x = t.default, | |
| T = r.default, | |
| M = E( "default", t ), | |
| S = E( "default", r ); | |
| b = b.filter( e => e ), w = w.filter( e => e ), k = k.filter( e => e ), _ = _.filter( e => e ); | |
| const G = Object.entries( i ).map( ( [ e, t ] ) => ( { | |
| name: e, | |
| url: t, | |
| loaded: !1 | |
| } ) ).filter( e => e.url ); | |
| return { | |
| name: x, | |
| description: T, | |
| version: n || "0.0", | |
| grant: I, | |
| icon: p, | |
| icon64: m, | |
| supportURL: R, | |
| fileURL: o, | |
| downloadURL: h, | |
| updateURL: f, | |
| namespace: l, | |
| requires: a.filter( e => e ).map( e => ( { | |
| url: e, | |
| loaded: !1, | |
| textContent: "" | |
| } ) ), | |
| includes: b, | |
| matches: w, | |
| excludes: k, | |
| homepage: v, | |
| resources: G, | |
| connects: _, | |
| webRequest: A.map( e => { | |
| const t = JSON.parse( e ); | |
| return Array.isArray( t ) ? t : [ t ] | |
| } ).reduce( ( e, t ) => e.concat( t ), [] ), | |
| author: u, | |
| copyright: d, | |
| antifeatures: g, | |
| name_i18n: M, | |
| description_i18n: S, | |
| uuid: null, | |
| system: !1, | |
| enabled: !0, | |
| position: 0, | |
| blockers: [], | |
| lastModified: 0, | |
| sync: { | |
| imported: !1 | |
| }, | |
| options: { | |
| check_for_updates: !0, | |
| comment: null, | |
| compatopts_for_requires: !0, | |
| compat_wrappedjsobject: !1, | |
| compat_metadata: !1, | |
| compat_foreach: !1, | |
| compat_prototypes: !1, | |
| noframes: c, | |
| run_at: y, | |
| override: { | |
| use_includes: [], | |
| orig_includes: [], | |
| merge_includes: !0, | |
| use_matches: [], | |
| orig_matches: [], | |
| merge_matches: !0, | |
| use_excludes: [], | |
| orig_excludes: [], | |
| merge_excludes: !0, | |
| use_connects: [], | |
| merge_connects: !0, | |
| use_blockers: [], | |
| orig_run_at: null, | |
| orig_noframes: null | |
| } | |
| }, | |
| textContent: null, | |
| header: null | |
| } | |
| }, | |
| b = ( () => { | |
| const e = e => { | |
| const t = e.split( "." ); | |
| return t.slice( 0, 3 ).concat( [ t.slice( 3 ).join( "." ) ] ).concat( [ 0, 0, 0, 0 ] ).slice( 0, 4 ).map( e => { | |
| const t = e.toString().match( /((?:\-?[0-9]+)?)([^0-9\-]*)((?:\-?[0-9]+)?)(.*)/ ); | |
| return t ? [ Number( t[ 1 ] ), t[ 2 ], Number( t[ 3 ] ), t[ 4 ] ] : [] | |
| } ).reduce( ( e, t ) => e.concat( t ) ) | |
| }, | |
| t = ( r, n ) => { | |
| const s = Array.isArray( r ) ? r : e( r ), | |
| o = Array.isArray( n ) ? n : e( n ); | |
| for ( let e = 0; e < 16; e++ ) { | |
| const r = s[ e ], | |
| n = o[ e ]; | |
| if ( e % 2 == 1 ) { | |
| if ( !r && n ) return t.eNEWER; | |
| if ( r && !n ) return t.eOLDER; | |
| const e = r.match( /\w/g ) || [], | |
| s = n.match( /\w/g ) || []; | |
| for ( let r = 0; r < Math.min( e.length, s.length ); r++ ) { | |
| if ( e[ r ].charCodeAt( 0 ) > s[ r ].charCodeAt( 0 ) ) return t.eNEWER; | |
| if ( e[ r ].charCodeAt( 0 ) < s[ r ].charCodeAt( 0 ) ) return t.eOLDER | |
| } | |
| if ( e.length > s.length ) return t.eNEWER; | |
| if ( e.length < s.length ) return t.eOLDER | |
| } else { | |
| if ( Number( r ) > Number( n ) ) return t.eNEWER; | |
| if ( Number( r ) < Number( n ) ) return t.eOLDER | |
| } | |
| } | |
| return t.eEQUAL | |
| }; | |
| return t.eERROR = -2, t.eOLDER = -1, t.eEQUAL = 0, t.eNEWER = 1, t | |
| } )(); | |
| t.versionCmp = b, t.createScriptFromSrc = e => { | |
| const t = ( e => { | |
| const t = n.getStringBetweenTags( e, p, m ); | |
| if ( !t ) return null; | |
| const r = e.indexOf( p ), | |
| s = e.indexOf( "<html>" ), | |
| o = e.indexOf( "<body>" ); | |
| return s > 0 && s < r || o > 0 && o < r ? null : [ "// ", p, t, m ].join( "" ) | |
| } )( e ); | |
| if ( !t ) return null; | |
| const r = w( t ); | |
| return r ? ( r.textContent = e, r.header = t, | |
| r.options.compat_wrappedjsobject = e != i.unWrappedJsObjectify( e ), r.options.compat_metadata = e != i.unMetaDataify( e ), r ) : null | |
| }; | |
| const w = e => { | |
| const t = ( e => R( e ) )( e = ( e = ( e = ( e = ( e || "" ).replace( /(\r\n|\n|\r)/gm, "\n" ) ).replace( /\t/g, " " ) ).replace( /\n\n+/g, "\n" ) ).replace( /[^|\n][ \t]+\/\//g, "//" ) ); | |
| if ( t ) return v( t ) | |
| }; | |
| t.processHeader = w, t.processMetaHeader = e => R( e ), t.createScript = () => v( h() ) || {}, t.init = e => { | |
| i = e | |
| }; | |
| const k = "try to take over the world!", | |
| _ = "This script was deleted from Greasy Fork, and due to its negative effects, it has been automatically removed from your browser.", | |
| y = s.createCache( { | |
| timeout: 600, | |
| retimeout_on_get: !0 | |
| } ); | |
| t.determineOriginOfUrl = e => { | |
| if ( e ) { | |
| let t; | |
| const r = e.match( new RegExp( "https?://userscripts\\.org/scripts/(source|version)/([0-9]{1,9})\\.user\\.js" ) ) || e.match( new RegExp( "https?://userscripts-mirror\\.org/scripts/(source|version)/([0-9]{1,9})\\.user\\.js" ) ); | |
| if ( r && 3 == r.length ) return { | |
| id: r[ 2 ], | |
| token: "uso", | |
| updates: !1, | |
| meta_url: !0, | |
| url: "http://userscripts-mirror.org/scripts/show/" + r[ 2 ], | |
| code_url: "http://userscripts-mirror.org/scripts/review/" + r[ 2 ], | |
| issue_url: "http://contactbyweb.com/userscripts-mirror" | |
| }; | |
| const n = e.match( new RegExp( "https?://greasyfork\\.org/(?:[^/]+/)?scripts/([^/-]+).*/code.*\\.user\\.js" ) ); | |
| if ( n && 2 == n.length ) return t = n[ 1 ], { | |
| id: t, | |
| token: "gf", | |
| updates: !0, | |
| meta_url: !0, | |
| url: "https://greasyfork.org/scripts/" + t, | |
| issue_url: "https://greasyfork.org/scripts/" + t + "/feedback", | |
| code_url: "https://greasyfork.org/scripts/" + t + "/code", | |
| updates_allowed: function ( e ) { | |
| return !e.match( new RegExp( "https?://greasyfork\\.org/scripts/([^/]+)/code/.*\\.user\\.js.*version=[0-9]+.*" ) ) | |
| }, | |
| convert: async e => { | |
| var t; | |
| let r, n = e; | |
| if ( n ) { | |
| const s = null === ( t = e.description ) || void 0 === t ? void 0 : t.trim(); | |
| s === k ? n.description = "" : s === _ && ( n = null, r = "deleted by hoster" ) | |
| } | |
| return { | |
| script: n, | |
| warning: r | |
| } | |
| } | |
| }; | |
| const s = e.match( new RegExp( "https?://sleazyfork\\.org/(?:[^/]+/)?scripts/([^/-]+).*/code.*\\.user\\.js" ) ); | |
| if ( s && 2 == s.length ) return t = s[ 1 ], { | |
| id: t, | |
| token: "sf", | |
| updates: !0, | |
| meta_url: !0, | |
| url: "https://sleazyfork.org/scripts/" + t, | |
| issue_url: "https://sleazyfork.org/scripts/" + t + "/feedback", | |
| code_url: "https://sleazyfork.org/scripts/" + t + "/code", | |
| updates_allowed: function ( e ) { | |
| return !e.match( new RegExp( "https?://sleazyfork\\.org/scripts/([^/]+)/code/.*\\.user\\.js.*version=[0-9]+.*" ) ) | |
| }, | |
| convert: async e => { | |
| var t; | |
| let r, n = e; | |
| if ( n ) { | |
| const s = null === ( t = e.description ) || void 0 === t ? void 0 : t.trim(); | |
| s === k ? n.description = "" : s === _ && ( n = null, r = "deleted by hoster" ) | |
| } | |
| return { | |
| script: n, | |
| warning: r | |
| } | |
| } | |
| }; | |
| const o = e.match( new RegExp( "https?://openuserjs\\.org/install/([^/]+)+/(.+?)(?:\\.min)?\\.user\\.js" ) ); | |
| if ( o && 3 == o.length ) return o.shift(), { | |
| id: o.join( "/" ), | |
| token: "ouj", | |
| updates: !0, | |
| meta_header: !0, | |
| url: "https://openuserjs.org/scripts/" + o[ 0 ] + "/" + o[ 1 ], | |
| issue_url: "https://openuserjs.org/scripts/" + o[ 0 ] + "/" + o[ 1 ] + "/issues", | |
| code_url: "https://openuserjs.org/scripts/" + o[ 0 ] + "/" + o[ 1 ] + "/source", | |
| convert: async e => { | |
| var t; | |
| const r = e; | |
| return r && ( null === ( t = e.description ) || void 0 === t ? void 0 : t.trim() ) === k && ( r.description = "" ), { | |
| script: r, | |
| warning: void 0 | |
| } | |
| } | |
| }; | |
| const i = e.match( new RegExp( "https?://raw\\.githubusercontent\\.com/([^/]+)/([^/]+)/[^/]+/(.*)\\.user\\.js" ) ) || e.match( new RegExp( "https?://github\\.com/([^/]+)/([^/]+)/raw/[^/]+/(.*)\\.user\\.js" ) ) || e.match( new RegExp( "https?://raw.github\\.com/([^/]+)/([^/]+)/[^/]+/(.*)\\.user\\.js" ) ) || e.match( new RegExp( "https?://github\\.com/([^/]+)/([^/]+)/releases/download/[^/]+/(.*)\\.user\\.js" ) ), | |
| A = e.match( new RegExp( "https?://(([^\\.]+).github\\.io)/(.*)\\.user\\.js" ) ); | |
| if ( i && 4 == i.length || A && 4 == A.length ) { | |
| let e; | |
| if ( i ) { | |
| i.shift(); | |
| const [ r, n, s ] = i; | |
| e = [ r, n ].join( "/" ), t = [ r, n ].concat( n == s ? [] : s ).join( "/" ) | |
| } else { | |
| if ( !A ) throw new Error( "Should never happen!" ); { | |
| A.shift(); | |
| const [ r, n, s ] = A; | |
| e = [ n, r ].join( "/" ), t = [ n, r ].concat( r == s ? [] : s ).join( "/" ) | |
| } | |
| } | |
| return { | |
| id: t, | |
| token: "gh", | |
| updates: !0, | |
| url: "https://github.com/" + e, | |
| issue_url: "https://github.com/" + e + "/issues" | |
| } | |
| } | |
| const l = e.match( new RegExp( "https?://gist\\.github\\.com/([^/]+)/([^/]+)/raw/(.*/)?.*\\.user\\.js" ) ) || e.match( new RegExp( "https?://gist\\.githubusercontent\\.com/([^/]+)/([^/]+)/raw/(.*/)?.*\\.user\\.js" ) ); | |
| if ( l && ( 3 == l.length || 4 == l.length ) ) { | |
| const e = l[ 1 ], | |
| r = l[ 2 ]; | |
| return t = `${e}/${r}`, { | |
| id: t, | |
| token: "gst", | |
| updates: 4 == l.length, | |
| url: "https://gist.github.com/" + t, | |
| issue_url: `https://gist.github.com/${t}#new_comment_field`, | |
| code_url: "https://gist.github.com/" + t, | |
| precheck: async () => { | |
| const t = y.get( e ); | |
| let n; | |
| if ( t ) { | |
| if ( n = t.json, !n ) return "cache error" | |
| } else { | |
| const t = await fetch( `https://api.github.com/users/${e}/gists`, { | |
| method: "GET", | |
| mode: "cors", | |
| cache: "no-cache", | |
| credentials: "same-origin", | |
| headers: { | |
| Accept: "application/vnd.github.v3+json" | |
| }, | |
| redirect: "follow", | |
| referrerPolicy: "no-referrer" | |
| } ); | |
| if ( 200 !== t.status ) { | |
| a.logger.warn( `Unable to load gists of "${e}" -> SKIPPING` ); | |
| const t = "unable to load gists of user"; | |
| return y.set( e, { | |
| error: t | |
| } ), t | |
| } | |
| n = await t.json(), y.set( e, { | |
| error: null, | |
| json: n | |
| } ) | |
| } | |
| return n ? n.reduce( ( e, t ) => ( e[ t.id ] = t.public, e ), {} )[ r ] ? null : "secret gist" : "unable to decode gists of user" | |
| } | |
| } | |
| } | |
| const c = e.match( new RegExp( "https?://gitlab\\.com/([^/]+)/([^/]+)/(?:-/)?(?:raw|blob)/[^/]+/(.*)\\.user\\.js" ) ); | |
| if ( c && 4 == c.length ) { | |
| c.shift(); | |
| const [ e, r, n ] = c; | |
| t = [ e, r ].concat( r == n ? [] : n ).join( "/" ); | |
| const s = [ e, r ].join( "/" ); | |
| return { | |
| id: t, | |
| token: "gl", | |
| updates: !0, | |
| url: "https://gitlab.com/" + s, | |
| issue_url: "https://gitlab.com/" + s + "/issues" | |
| } | |
| } | |
| const u = e.match( new RegExp( "https?://bitbucket\\.org/([^/]+)/([^/]+)/raw/[^/]+/(.*)\\.user\\.js" ) ) || e.match( new RegExp( "https?://bitbucket\\.org/([^/]+)/([^/]+)/downloads/(.*)\\.user\\.js" ) ); | |
| if ( u && 4 == u.length ) { | |
| u.shift(); | |
| const [ e, r, n ] = u; | |
| t = [ e, r ].concat( r == n ? [] : n ).join( "/" ); | |
| const s = [ e, r ].join( "/" ); | |
| return { | |
| id: t, | |
| token: "bb", | |
| updates: !0, | |
| url: "https://bitbucket.org/" + s, | |
| issue_url: "https://bitbucket.org/" + s + "/issues" | |
| } | |
| } | |
| const d = e.match( new RegExp( "https?://userstyles\\.org/styles/userjs/([^/]+)/.*\\.user\\.js" ) ); | |
| if ( d && 2 == d.length ) return d.shift(), { | |
| id: d[ 0 ], | |
| token: "usty", | |
| updates: !0, | |
| url: "https://userstyles.org/styles/" + d[ 0 ], | |
| issue_url: "https://forum.userstyles.org/post/discussion?Discussion/StyleID=" + d[ 0 ], | |
| convert: async e => { | |
| let t, r, n, s; | |
| const o = [ { | |
| tag: "includes", | |
| re: /(?: \|\| \(new RegExp\("\^)([^$]+)(?:\$"\)\)\.test\(document\.location\.href\))/g, | |
| idx: 1, | |
| value: e => "/^" + e.replace( /\\\\(.)/g, "\\$1" ) + "$/" | |
| }, { | |
| tag: "includes", | |
| re: /(?: \|\| \(document\.location\.href\.indexOf\(")([^\"]+)"(?:\) == 0\))/g, | |
| idx: 1, | |
| value: e => e + "*" | |
| }, { | |
| tag: "matches", | |
| re: /(?: \|\| \(document\.domain == ")([^\"]+)"(?: \|\| document\.domain\.substring\(document\.domain\.indexOf\("[^\"]+"\) \+ 1\) == "[^\"]+"\))/g, | |
| idx: 1, | |
| value: e => "*." + e | |
| } ], | |
| a = new RegExp( "(?:if \\(false)(" + o.map( e => "(?:" + e.re.source + ")" ).join( "|" ) + ")+", "g" ); | |
| return e.textContent && 0 === e.includes.length && 0 === e.matches.length && 0 === e.excludes.length && e.options && e.options.override && e.options.override.orig_includes && 0 === e.options.override.orig_includes.length && e.options.override.orig_matches && 0 === e.options.override.orig_matches.length && ( r = e.textContent.match( a ) ) && ( r.forEach( t => { | |
| o.forEach( r => { | |
| for ( ; n = r.re.exec( t ); ) | |
| if ( n.length > r.idx ) { | |
| const t = r.value( n[ r.idx ] ); | |
| e.options.override[ "orig_" + r.tag ].push( t ), e[ r.tag ].push( t ), s = !0 | |
| } | |
| } ) | |
| } ), s && ( t = "includes added" ) ), { | |
| script: e, | |
| info: t | |
| } | |
| } | |
| }; | |
| const g = e.match( new RegExp( "https://static\\.iitc\\.me/build/release/(plugins/)?(.*)\\.user\\.js" ) ); | |
| if ( g && 3 === g.length ) { | |
| g.shift(); | |
| const [ e, r ] = g, n = "iitc-project/ingress-intel-total-conversion"; | |
| return t = [ n ].concat( e ? [ e, r ] : [] ).join( "/" ).replace( /\/\//g, "/" ), { | |
| id: t, | |
| token: "gh", | |
| updates: !0, | |
| url: "https://github.com/" + n, | |
| issue_url: "https://github.com/" + n + "/issues" | |
| } | |
| } | |
| const p = e.match( new RegExp( "https://iitc\\.app/build/release/(plugins/)?(.*)\\.user\\.js" ) ); | |
| if ( p && 3 === p.length ) { | |
| p.shift(); | |
| const [ e, r ] = p, n = "IITC-CE/ingress-intel-total-conversion"; | |
| return t = [ n ].concat( e ? [ e, r ] : [] ).join( "/" ).replace( /\/\//g, "/" ), { | |
| id: t, | |
| token: "gh", | |
| updates: !0, | |
| url: "https://github.com/" + n, | |
| issue_url: "https://github.com/" + n + "/issues" | |
| } | |
| } | |
| if ( e.match( new RegExp( "https?://socialfixer\\.com/socialfixer\\.user\\.js" ) ) ) return { | |
| id: "socialfixer", | |
| token: "web", | |
| updates: !0, | |
| url: "http://socialfixer.com", | |
| issue_url: "https://www.facebook.com/groups/SocialFixerUsersSupport/" | |
| }; | |
| if ( e.match( new RegExp( "https?://www\\.fbpurity\\.com/.*\\.user\\.js" ) ) ) return { | |
| id: "fbpurity", | |
| token: "web", | |
| updates: !0, | |
| url: "https://www.fbpurity.com/", | |
| issue_url: "https://www.facebook.com/fluffbustingpurity" | |
| } | |
| } | |
| } | |
| }, , function ( e, t, r ) { | |
| "use strict"; | |
| const n = rea.FEATURES; | |
| let s = null, | |
| o = n.PINGPONG.RETRIES; | |
| const a = ( e, t ) => { | |
| const r = () => { | |
| null != s && window.clearTimeout( s ), s = null | |
| }, | |
| n = t => { | |
| t ? ( r(), e && ( e( t ), e = null ) ) : console.log( "pp: Warn: got pseudo response!" ) | |
| }; | |
| s = window.setTimeout( () => { | |
| if ( r(), o-- > 0 ) return a( e, t ), | |
| void( e = t = null ); | |
| t && t() | |
| }, 5e3 ); | |
| const i = { | |
| method: "ping" | |
| }; | |
| try { | |
| rea.extension.sendMessage( i, n ) | |
| } catch ( e ) {} | |
| }; | |
| var i = a, | |
| A = r( 0 ); | |
| const l = rea.FEATURES; | |
| var c = []; | |
| let u = null; | |
| const d = ( () => { | |
| const e = l.HTML5.LOCALSTORAGE; | |
| let t, r; | |
| return { | |
| cache: function () { | |
| const t = document.documentElement, | |
| r = location.pathname; | |
| if ( e && t && r ) try { | |
| const n = JSON.parse( e.getItem( "background" ) || "{}" ); | |
| n[ r ] = { | |
| class: t.getAttribute( "class" ) | |
| }, e.setItem( "background", JSON.stringify( n ) ) | |
| } catch ( e ) {} | |
| }, | |
| reset: function () { | |
| r = !0; | |
| const e = document.documentElement; | |
| "string" == typeof t && e && e.setAttribute( "class", t ) | |
| }, | |
| restore: function () { | |
| if ( r ) return; | |
| const n = location.pathname; | |
| if ( e && n ) try { | |
| let r; | |
| const s = e.getItem( "background" ); | |
| if ( s && ( r = JSON.parse( s ) ) && ( r = r[ n ] ) && r.class ) { | |
| const e = document.documentElement; | |
| if ( !e ) return; | |
| t = e.getAttribute( "class" ) || "", e.setAttribute( "class", t + " " + r.class ) | |
| } | |
| } catch ( e ) {} | |
| } | |
| } | |
| } )(), | |
| g = e => { | |
| const t = () => { | |
| e(), d.restore() | |
| }; | |
| R ? document.body ? t() : window.addEventListener( "DOMContentLoaded", t ) : ( h = h || [] ).push( () => { | |
| g( e ) | |
| } ), u && ( window.clearTimeout( u ), u = null ) | |
| }; | |
| c = [ { | |
| name: A.I18N.getMessage( "Default" ), | |
| layout: "default" | |
| }, { | |
| name: A.I18N.getMessage( "Default_Light" ), | |
| layout: "default", | |
| theme: "light" | |
| }, { | |
| name: A.I18N.getMessage( "Default_Dark" ), | |
| layout: "default", | |
| theme: "dark" | |
| }, { | |
| name: A.I18N.getMessage( "Default_Darker" ), | |
| layout: "default", | |
| theme: "darker", | |
| footer: 'Theme by <a href="https://github.com/narcolepticinsomniac" target="blank">narcolepticinsomniac</a> from the <a href="https://github.com/openstyles/stylus" target="blank">Stylus</a> project.' | |
| } ]; | |
| let p = !1; | |
| const m = { | |
| default: A.I18N.getMessage( "Default" ), | |
| monokai: "Monokai", | |
| solarized: "Solarized", | |
| "mdn-like": "MDN-like", | |
| eclipse: "Eclipse", | |
| railscasts: "RailsCasts", | |
| zenburn: "ZenBurn" | |
| }, | |
| f = () => ( p || ( c = c.map( e => ( e.value = e.theme ? [ e.layout, e.theme ].join( "#" ) : e.layout, e ) ), p = !0 ), c ); | |
| var h, R = !1; | |
| const v = { | |
| init: e => { | |
| R = !0, h && ( h.forEach( e => { | |
| e() | |
| } ), h = null ), d.restore(), i( t => { | |
| let r, n, s; | |
| var o; | |
| t && ( r = t.config ) && ( n = r.layout ) && ( r.dark && !n.includes( "#" ) && ( n += "#dark" ), ( o = ( e => { | |
| let t; | |
| return f().some( r => { | |
| if ( r.value === e ) return t = r, !0 | |
| } ), t | |
| } )( n ) ).theme && "light" !== o.theme ? ( o.footer && $( ".footer" ).html( o.footer ), s = o.theme ) : s = "default", d.reset(), $( document.documentElement ).addClass( [ rea.FEATURES.RUNTIME.MOBILE ? "mobile" : "desktop", s ].join( " " ) ), window.setTimeout( d.cache, 500 ) ), e.suc && e.suc() | |
| }, e.fail ) | |
| }, | |
| images: { | |
| origin: function ( e ) { | |
| return "gst" == e && ( e = "gh" ), { | |
| unknown: "data:image/png;base64,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", | |
| uso: "data:image/png;base64,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", | |
| gf: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3ggEBCQHM3fXsAAAAVdJREFUOMudkz2qwkAUhc/goBaGJBgUtBCZyj0ILkpwAW7Bws4yO3AHLiCtEFD8KVREkoiFxZzX5A2KGfN4F04zMN+ce+5c4LMUgDmANYBnrnV+plBSi+FwyHq9TgA2LQpvCiEiABwMBtzv95RSfoNEHy8DYBzHrNVqVEr9BWKcqNFoxF6vx3a7zc1mYyC73a4MogBg7vs+z+czO50OW60Wt9stK5UKp9Mpj8cjq9WqDTBHnjAdxzGQZrPJw+HA31oulzbAWgLoA0CWZVBKIY5jzGYzdLtdE9DlcrFNrY98zobqOA6TJKHW2jg4nU5sNBpFDp6mhVe5rsvVasUwDHm9Xqm15u12o+/7Hy0gD8KatOd5vN/v1FozTVN6nkchxFuI6hsAAIMg4OPxMJCXdtTbR7JJCMEgCJhlGUlyPB4XfumozInrupxMJpRSRtZlKoNYl+m/6/wDuWAjtPfsQuwAAAAASUVORK5CYII=", | |
| gh: "data:image/png;base64,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F/8VFRf/FRUX/xMTFKsAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRMTFKsVFRf/FRUX/xUVF/8VFRf/FRUX/xUVF/8TExT1AAAADQ4OFFkVFRf/FRUX/xUVF/8VFRf/FRUX/xUVF/8TExOPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMTE48VFRf/FRUX/xUVF/8VFRf/FRUX/xUVF/8ODhRZExMTnRUVF/8VFRf/FRUX/xUVF/8VFRf/EREU0QAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBERFNEVFRf/FRUX/xUVF/8VFRf/FRUX/xMTE50RERTQFRUX/xUVF/8VFRf/FRUX/xUVF/8SEhJeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhISXhUVF/8VFRf/FRUX/xUVF/8VFRf/EREU0BISFPIVFRf/FRUX/xUVF/8VFRf/FRUX/wAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFRUX/xUVF/8VFRf/FRUX/xUVF/8SEhTyFRUX/xUVF/8VFRf/FRUX/xUVF/8SEhTyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhTyFRUX/xUVF/8VFRf/FRUX/xUVF/8VFRf/FRUX/xUVF/8VFRf/FRUX/xMTFNsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMTFNwVFRf/FRUX/xUVF/8VFRf/FRUX/xMTFPYVFRf/FRUX/xUVF/8VFRf/FBQU4QAA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AAAAAAAADAwMFA8PD2MRERSkFBQU0hMTFPMVFRf/FRUX/xMTFPMUFBTSEREUpA8PD2MMDAwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", | |
| gl: "data:image/png;base64,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", | |
| bb: "data:image/png;base64,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", | |
| ouj: "data:image/x-icon;base64,AAABAAEAQEAAAAEACAAoFgAAFgAAACgAAABAAAAAgAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwTwoAclEOAHVWAABzUhAAdlcAAHdYAAB0UxIAdVQTAHhZAgB2VRUAe1sJAH1dDgB3XB0AeF0eAHpfIQB7YCIAfGEjAH1iJAB+YyYAf2QnAIFmKQCEah8AgmcrAIVpLgCHbSQAhmovAIhuJQCJbyYAh3EzAIhyNACJczYAi3U4AIx2OQCNdzoAjng7AI95PACQej0Aknw/AJN9QQCXgUUAlYROAJaFTwCXhlAAnItWAKCPWgChkFsAo5FcAJ2RYQCekmIAn5NjAKKWZgCkmGgAp5pyAKqdbQCrnXUArJ52AK+hegCpoX4AraWCALOqhwC0q4gAtayJALatigC3r4sAuLCMALmxjQC3tJQAuLWVALm2lgC7uJgAvbqaAL67mwC/vJwAwb6eAMbBqQDHwqoAwsOuAMXGsgDHyLQAyMm1AM7PugDP0LsA0NG8ANLTvwDT1MAAztXEANDWxQDR18YA0tnHANTbyQDV3MoA19zTANfezQDZ4M8A2t/VANvg1gDc4dcA3eLYAN7j2QDf5NoA4OXbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjYl9dXFlZWVlcXV9iY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY2FcVU9JQDo2NDQ2OkBJTlVcYWNkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiXVZMPTIpIRoUDg0NDhQaISgyPUxWXWJkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGNfVEk0JxgLCAIDAQAAAAABAwIFCxgnNElTX2NkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGJZSzQkEQUDAQAAAAAAAAAAAAAAAAEDBREjNEpZYmRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY2BSPykUBQEAAAAAAAAAAAAAAAAAAAAAAAABBBMoP1JfY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY11NNB0MAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDB00TV1jZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY11MMBYEAQAAAAAAAAEDBwIJBAQJAgcDAQAAAAAAAAEEFC5MW2NkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY11MLBMHAAAAAAABAwcIERccHyIiHxwXEQgHAwEAAAAAAAcTLExdY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGBNMBMHAAAAAAABCQ4YJi84PURGRkQ+OC8mGA4JAQAAAAAABxMuTV9kZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGJSNBYHAAAAAAEDChgqOEVNUlhcW1tcWFJNRTkqGAoGAQAAAAAHFjRRYmRkZGRkZGRkZGRkZGRkZGRkZGRkZGNZPx0EAAAAAAECDyM0SFBcYGJiY2RkY2JiYFxRSTQjDwIBAAAAAAQdP1ljZGRkZGRkZGRkZGRkZGRkZGRkZGRfSykMAQAAAAEEFCk7TlphY2RkZGRkZGRkZGRjYVpPPCkUBAEAAAABDChKX2RkZGRkZGRkZGRkZGRkZGRkZGRiVDQUAwAAAAECFCtDUl5iZGRkZGRkZGRkZGRkZGRiXlNDKxQCAQAAAAMTNFNiZGRkZGRkZGRkZGRkZGRkZGRkXUkkBQAAAAADDypDVGBjZGRkZGRkZGRkZGRkZGRkZGNgVUMqEAYAAAAABSRJXWRkZGRkZGRkZGRkZGRkZGRkY1Y1EgMAAAABCiM8UmBjZGRkZGRkZGRkZGRkZGRkZGRkY2BTPCMKAQAAAAERNFZjZGRkZGRkZGRkZGRkZGRkZGFMJwgAAAABCRg0Tl5jZGRkZGRkZGRkZGRkZGRkZGRkZGRjXk80GAkBAAAABSdMYWRkZGRkZGRkZGRkZGRkZGRcPRgHAAAAAw4qSFpiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGJaSCoOAwAAAAMYPVxkZGRkZGRkZGRkZGRkZGRjVTMOAQAAAAcYOFBhZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYVE5GAcAAAABCzJVY2RkZGRkZGRkZGRkZGRkYk8pCAAAAAEIJkVaYmRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGNcRSYIAQAAAAgpTmJkZGRkZGRkZGRkZGRkZGBJIgQAAAADES1NX2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYE0vEQMAAAACIUlfZGRkZGRkZGRkZGRkZGRdQRsHAAAABhc4UmJkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGJSOBcHAAAABxpAXWRkZGRkZGRkZGRkZGRkXDoUAwAAAAccPVdiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiWD4cAgAAAAEUOlxkZGRkZGRkZGRkZGRkZFo2DwEAAAACH0RcY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY1xEIAkAAAABDjZZZGRkZGRkZGRkZGRkZGRZNA0BAAAACSJGW2NkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRbRiIJAAAAAA00WWRkZGRkZGRkZGRkZGRkWTQNAQAAAAkiRltjZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkW0YiCQAAAAANNFlkZGRkZGRkZGRkZGRkZFo3DwEAAAACH0RcY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY1xEIAkAAAABDzZZZGRkZGRkZGRkZGRkZGRcOhQDAAAABxw9V2JkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGJYPRwCAAAAARQ6XGRkZGRkZGRkZGRkZGRkXUEbBwAAAAYXOFJiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiUjgXBwAAAAcaQF1kZGRkZGRkZGRkZGRkZGBJIgQAAAADES1NX2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYE0vEQMAAAACIklfZGRkZGRkZGRkZGRkZGRiTykIAAAAAQgmRVpiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY1xFJggBAAAACClOYmRkZGRkZGRkZGRkZGRkY1UzDgEAAAAHGDhQYGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGFQORgHAAAAAQsyVWNkZGRkZGRkZGRkZGRkZGRcPhoHAAAAAQ4qSFpiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGJaSCoOAwAAAAMYPVxkZGRkZGRkZGRkZGRkZGRkYUwnCAAAAAEJGTROXmNkZGRkZGRkZGRkZGRkZGRkZGRkZGNeTjQYCQEAAAAFJ0xhZGRkZGRkZGRkZGRkZGRkZGNWNRIDAAAAAQgjO1JgY2RkZGRkZGRkZGRkZGRkZGRkZGNgUzwjCgEAAAABETRWY2RkZGRkZGRkZGRkZGRkZGRkXUkkBQAAAAADDylCVGBjZGRkZGRkZGRkZGRkZGRkZGNgVEMpDwMAAAAABSRJXWRkZGRkZGRkZGRkZGRkZGRkZGJUNRQDAAAAAQIUK0NSXmJkZGRkZGRkZGRkZGRkZGJeUkMrFAIBAAAAAxM0VGJkZGRkZGRkZGRkZGRkZGRkZGRkX0spDAEAAAABBBQpO05aYWJkZGRkZGRkZGRkYmFaTjspFAQBAAAAAQwoS19kZGRkZGRkZGRkZGRkZGRkZGRkZGNZQB4EAAAAAAECDyI0R1BaYGJiY2NjY2JiYFxQSDQjDwIBAAAAAAQdP1ljZGRkZGRkZGRkZGRkZGRkZGRkZGRkYlI0FQIAAAAAAQMIGCo4RU1SV1xbW1xXUk1FOSoYCAMBAAAAAAcWNFJiZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgTTEUBwAAAAAAAQkOGSUtOD1ERkZEPTgvJhgOCQEAAAAAAAcTME1gZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY15MLxQHAAAAAAABAwcIERccHyIiHxwXEQgHAwEAAAAAAAcTLExeY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjXUwxFQUBAAAAAAAAAQMGBwIJCQIHBgMBAAAAAAAAAQQWMExdY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGNeTTQeDAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwwdNE1dY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY2BSQCkUBQMAAAAAAAAAAAAAAAAAAAAAAAADBRMpP1JgY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYllLNSQSCAcBAAAAAAAAAAAAAAAAAQcIEiQ0SlliZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjX1RJNScaDggCBwMBAQEBAwcCCA4aJzVJVF9jZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiXVZMPjMqIhsUDwsLDxQbIikzPkxWXWJkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjYVxVT0lBOjc0NDc6QElPVVxhY2RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkY2JgXVxaWVlaXF1gYmNkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", | |
| usty: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PHRpdGxlPjlDMzAwNDI3LTg4Q0QtNDI2RC05QkZELUFEMUU2RUI2RjRDNjwvdGl0bGU+PGRlZnM+PHBhdGggZD0iTTAgNS42MjNBNS42MjMgNS42MjMgMCAwIDEgNS42MjMgMGgxMi43NTRBNS42MjMgNS42MjMgMCAwIDEgMjQgNS42MjN2MTIuNzU0QTUuNjIzIDUuNjIzIDAgMCAxIDE4LjM3NyAyNEg1LjYyM0E1LjYyMyA1LjYyMyAwIDAgMSAwIDE4LjM3N1Y1LjYyM3oiIGlkPSJhIi8+PC9kZWZzPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PG1hc2sgaWQ9ImIiIGZpbGw9IiNmZmYiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48L21hc2s+PHVzZSBmaWxsLW9wYWNpdHk9IjAiIGZpbGw9IiNGRkYiIHhsaW5rOmhyZWY9IiNhIi8+PHBhdGggZmlsbD0iIzJFQ0M3MSIgbWFzaz0idXJsKCNiKSIgZD0iTTExLjI1IDB2MTQuNjI1SDBWMHoiLz48cGF0aCBmaWxsPSIjRTc0QzNDIiBtYXNrPSJ1cmwoI2IpIiBkPSJNMjQgMHY3Ljg3NUgxMi43NVYweiIvPjxwYXRoIGZpbGw9IiNGMzlDMTIiIG1hc2s9InVybCgjYikiIGQ9Ik0xMS4yNSAxNi4xMjVWMjRIMHYtNy44NzV6Ii8+PHBhdGggZmlsbD0iIzM0OThEQiIgbWFzaz0idXJsKCNiKSIgZD0iTTI0IDkuNTYzdjE0LjYyNEgxMi43NVY5LjU2M3oiLz48L2c+PC9zdmc+" | |
| } [ e ] | |
| }, | |
| brand: function ( e ) { | |
| return "data:image/svg+xml," + encodeURI( { | |
| tampermonkey: "<?xml version='1.0' encoding='utf-8'?><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 400'><g id='XMLID_273_'><g id='XMLID_78_'><path id='XMLID_83_' class='st0' d='M304.8,0H95.2C42.6,0,0,42.6,0,95.2v209.6C0,357.4,42.6,400,95.2,400h209.6 c52.6,0,95.2-42.6,95.2-95.2V95.2C400,42.6,357.4,0,304.8,0z M106.3,375C61.4,375,25,338.6,25,293.8c0-44.9,36.4-81.3,81.3-81.3 c44.9,0,81.3,36.4,81.3,81.3C187.5,338.6,151.1,375,106.3,375z M293.8,375c-44.9,0-81.3-36.4-81.3-81.3 c0-44.9,36.4-81.3,81.3-81.3c44.9,0,81.3,36.4,81.3,81.3C375,338.6,338.6,375,293.8,375z'/></g><g id='XMLID_67_' class='st2'><path id='XMLID_74_' class='st3' d='M304.8,0H95.2C42.6,0,0,42.6,0,95.2v209.6C0,357.4,42.6,400,95.2,400h209.6 c52.6,0,95.2-42.6,95.2-95.2V95.2C400,42.6,357.4,0,304.8,0z M106.3,375C61.4,375,25,338.6,25,293.8c0-44.9,36.4-81.3,81.3-81.3 c44.9,0,81.3,36.4,81.3,81.3C187.5,338.6,151.1,375,106.3,375z M293.8,375c-44.9,0-81.3-36.4-81.3-81.3 c0-44.9,36.4-81.3,81.3-81.3c44.9,0,81.3,36.4,81.3,81.3C375,338.6,338.6,375,293.8,375z'/></g></g></svg>", | |
| webdav: "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 512'><path d='M537.585 226.56C541.725 215.836 544 204.184 544 192c0-53.019-42.981-96-96-96-19.729 0-38.065 5.954-53.316 16.159C367.042 64.248 315.288 32 256 32c-88.366 0-160 71.634-160 160 0 2.728.07 5.439.204 8.133C40.171 219.845 0 273.227 0 336c0 79.529 64.471 144 144 144h368c70.692 0 128-57.308 128-128 0-61.93-43.983-113.586-102.415-125.44z'/></svg>", | |
| yandex: "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 512'><path d='M153.1 315.8L65.7 512H2l96-209.8c-45.1-22.9-75.2-64.4-75.2-141.1C22.7 53.7 90.8 0 171.7 0H254v512h-55.1V315.8h-45.8zm45.8-269.3h-29.4c-44.4 0-87.4 29.4-87.4 114.6 0 82.3 39.4 108.8 87.4 108.8h29.4V46.5z'/></svg>", | |
| firefox: "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 496 512'><path d='M496 262.5C497.6 380.8 388.9 504 248 504c-106.7 0-190.9-62.5-229.8-151.7-43-97.7-5.7-251.6 70.3-320.3l-2.7 69.7c3.9-5 32.5-6.4 37.1 0C139 71 190.7 48 232.1 47.2c-15.8 13.3-52.2 61.6-49.2 86.2 20.2 6.4 51.1 6.6 67.4 7.7 5 2.8 4.1 19.6-5.8 33.4 0 0-13 18-48.1 24.3l2.7 41.1-37-7.4c-12.4 31.5 17.4 59.4 48.4 54.2 34.3-5.8 45.9-32 70-30.6 23.8 1.4 33.2 14.6 30.1 27.1 0 0-3.9 14.9-29.6 12.4-21.8 34.5-50.4 53.5-97.3 49.4 71.3 59.1 168.3 5.5 192.6-42.8 24.3-48.1 8-122.1-16.3-142.3 28.7 12.4 43.7 27.6 54.2 55.5 5.5-61.9-22.9-132.1-73.8-173.3C436 70.1 494.3 144.2 496 262.5z'/></svg>", | |
| chrome: "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 496 512'><path d='M131.5 217.5L55.1 100.1c47.6-59.2 119-91.8 192-92.1 42.3-.3 85.5 10.5 124.8 33.2 43.4 25.2 76.4 61.4 97.4 103L264 133.4c-58.1-3.4-113.4 29.3-132.5 84.1zm32.9 38.5c0 46.2 37.4 83.6 83.6 83.6s83.6-37.4 83.6-83.6-37.4-83.6-83.6-83.6-83.6 37.3-83.6 83.6zm314.9-89.2L339.6 174c37.9 44.3 38.5 108.2 6.6 157.2L234.1 503.6c46.5 2.5 94.4-7.7 137.8-32.9 107.4-62 150.9-192 107.4-303.9zM133.7 303.6L40.4 120.1C14.9 159.1 0 205.9 0 256c0 124 90.8 226.7 209.5 244.9l63.7-124.8c-57.6 10.8-113.2-20.8-139.5-72.5z'/></svg>", | |
| onedrive: "<svg xmlns='http://www.w3.org/2000/svg' id='Layer_1' data-name='Layer 1' viewBox='0 0 24 24'><title>Artboard 1</title><g id='Templates'><path d='M17,10.57a3,3,0,0,1,1.18.23,3.11,3.11,0,0,1,1,.64,2.82,2.82,0,0,1,.65,1,3,3,0,0,1-1.6,3.95,3.08,3.08,0,0,1-1.16.23H8a4,4,0,0,1-1.56-.31,4,4,0,0,1,0-7.38A4,4,0,0,1,8,8.57a3.54,3.54,0,0,1,.73.07,4.63,4.63,0,0,1,.72-.87,4.72,4.72,0,0,1,.89-.65,4.58,4.58,0,0,1,1-.41,4.79,4.79,0,0,1,1.13-.14,4.37,4.37,0,0,1,1.64.3,4.55,4.55,0,0,1,1.36.84,4.39,4.39,0,0,1,1,1.27A4.66,4.66,0,0,1,17,10.57Z'/></g></svg>", | |
| gdrive: "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><path d='M339 314.9L175.4 32h161.2l163.6 282.9H339zm-137.5 23.6L120.9 480h310.5L512 338.5H201.5zM154.1 67.4L0 338.5 80.6 480 237 208.8 154.1 67.4z'/></svg>", | |
| dropbox: "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><path d='M256 87.2l-151.9 93.9L0 97.5 150.6 0 256 87.2zM0 265.3l150.6 98.3 105.4-88L104.1 181 0 265.3zm256 10.3l105.4 88L512 265.3l-104.1-84.2L256 275.6zM512 97.5L361.4 0 256 87.2l151.9 93.9L512 97.5zM256.3 294.6l-105.7 87.7-45.2-29.5V385l150.9 90.5L407.2 385v-32.2L362 382.3l-105.7-87.7z'/></svg>", | |
| instagram: "<svg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='5 4 44 44' style='enable-background:new 5 4 44 44;' xml:space='preserve'><style type='text/css'>.st0{fill:none;}</style><g><rect x='-0.2' y='0.1' class='st0' width='53.8' height='53.4'/><path d='M48.1,26.3c0,4.3,0,7.2-0.1,8.8c-0.2,3.9-1.3,6.9-3.5,9s-5.1,3.3-9,3.5c-1.6,0.1-4.6,0.1-8.8,0.1c-4.3,0-7.2,0-8.8-0.1 c-3.9-0.2-6.9-1.3-9-3.5c-2.1-2.1-3.3-5.1-3.5-9c-0.1-1.6-0.1-4.6-0.1-8.8s0-7.2,0.1-8.8c0.2-3.9,1.3-6.9,3.5-9 c2.1-2.1,5.1-3.3,9-3.5c1.6-0.1,4.6-0.1,8.8-0.1c4.3,0,7.2,0,8.8,0.1c3.9,0.2,6.9,1.3,9,3.5s3.3,5.1,3.5,9 C48,19.1,48.1,22,48.1,26.3z M28.8,8.7c-1.3,0-2,0-2.1,0c-0.1,0-0.8,0-2.1,0c-1.3,0-2.3,0-2.9,0c-0.7,0-1.6,0-2.7,0.1 c-1.1,0-2.1,0.1-2.9,0.3c-0.8,0.1-1.5,0.3-2,0.5c-0.9,0.4-1.7,0.9-2.5,1.6c-0.7,0.7-1.2,1.5-1.6,2.5c-0.2,0.5-0.4,1.2-0.5,2 s-0.2,1.7-0.3,2.9c0,1.1-0.1,2-0.1,2.7c0,0.7,0,1.7,0,2.9c0,1.3,0,2,0,2.1s0,0.8,0,2.1c0,1.3,0,2.3,0,2.9c0,0.7,0,1.6,0.1,2.7 c0,1.1,0.1,2.1,0.3,2.9s0.3,1.5,0.5,2c0.4,0.9,0.9,1.7,1.6,2.5c0.7,0.7,1.5,1.2,2.5,1.6c0.5,0.2,1.2,0.4,2,0.5 c0.8,0.1,1.7,0.2,2.9,0.3s2,0.1,2.7,0.1c0.7,0,1.7,0,2.9,0c1.3,0,2,0,2.1,0c0.1,0,0.8,0,2.1,0c1.3,0,2.3,0,2.9,0 c0.7,0,1.6,0,2.7-0.1c1.1,0,2.1-0.1,2.9-0.3c0.8-0.1,1.5-0.3,2-0.5c0.9-0.4,1.7-0.9,2.5-1.6c0.7-0.7,1.2-1.5,1.6-2.5 c0.2-0.5,0.4-1.2,0.5-2c0.1-0.8,0.2-1.7,0.3-2.9c0-1.1,0.1-2,0.1-2.7c0-0.7,0-1.7,0-2.9c0-1.3,0-2,0-2.1s0-0.8,0-2.1 c0-1.3,0-2.3,0-2.9c0-0.7,0-1.6-0.1-2.7c0-1.1-0.1-2.1-0.3-2.9c-0.1-0.8-0.3-1.5-0.5-2c-0.4-0.9-0.9-1.7-1.6-2.5 c-0.7-0.7-1.5-1.2-2.5-1.6c-0.5-0.2-1.2-0.4-2-0.5c-0.8-0.1-1.7-0.2-2.9-0.3c-1.1,0-2-0.1-2.7-0.1C31.1,8.7,30.1,8.7,28.8,8.7z M34.4,18.5c2.1,2.1,3.2,4.7,3.2,7.8s-1.1,5.6-3.2,7.8c-2.1,2.1-4.7,3.2-7.8,3.2c-3.1,0-5.6-1.1-7.8-3.2c-2.1-2.1-3.2-4.7-3.2-7.8 s1.1-5.6,3.2-7.8c2.1-2.1,4.7-3.2,7.8-3.2C29.7,15.3,32.3,16.3,34.4,18.5z M31.7,31.3c1.4-1.4,2.1-3.1,2.1-5s-0.7-3.7-2.1-5.1 c-1.4-1.4-3.1-2.1-5.1-2.1c-2,0-3.7,0.7-5.1,2.1s-2.1,3.1-2.1,5.1s0.7,3.7,2.1,5c1.4,1.4,3.1,2.1,5.1,2.1 C28.6,33.4,30.3,32.7,31.7,31.3z M39.9,13c0.5,0.5,0.8,1.1,0.8,1.8c0,0.7-0.3,1.3-0.8,1.8c-0.5,0.5-1.1,0.8-1.8,0.8 s-1.3-0.3-1.8-0.8c-0.5-0.5-0.8-1.1-0.8-1.8c0-0.7,0.3-1.3,0.8-1.8c0.5-0.5,1.1-0.8,1.8-0.8S39.4,12.5,39.9,13z'/></g></svg>", | |
| facebook: "<svg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 30 30' style='enable-background:new 0 0 30 30;' xml:space='preserve'><style type='text/css'>.f{}.c{fill:none;}</style><g><circle class='c' cx='15' cy='15' r='13' stroke='black' stroke-width='3'/><path class='f' d='M16.4,23.9v-8.1h2.7l0.4-3.2h-3.1v-2c0-0.9,0.3-1.5,1.6-1.5l1.7,0V6.2c-0.3,0-1.3-0.1-2.4-0.1c-2.4,0-4.1,1.5-4.1,4.2v2.3h-2.7v3.2h2.7v8.1H16.4z'/></g></svg>" | |
| } [ e ] ).replace( /%20/g, " " ) | |
| }, | |
| empty: "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" | |
| }, | |
| render: g, | |
| getLayouts: f, | |
| getEditorThemes: () => Object.keys( m ).map( e => ( { | |
| name: m[ e ] || e, | |
| value: e | |
| } ) ) | |
| }; | |
| t.a = v | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| var n = this && this.__importDefault || function ( e ) { | |
| return e && e.__esModule ? e : { | |
| default: e | |
| } | |
| }; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), t.createQueue = t.createCache = t.sleepEvery = t.sleep = void 0; | |
| const s = r( 1 ), | |
| o = n( r( 18 ) ); | |
| t.sleep = e => new o.default( t => setTimeout( t, e ) ); | |
| let a = 0; | |
| t.sleepEvery = ( e, t ) => { | |
| const r = Date.now(); | |
| if ( a + e < r ) return new o.default( e => window.setTimeout( () => { | |
| a = Date.now(), e() | |
| }, t || 0 ) ) | |
| }, t.createQueue = e => { | |
| const t = [], | |
| r = [], | |
| n = () => { | |
| let o; | |
| if ( r.length < e.threads && t.length && ( o = t.shift() ) ) { | |
| const e = o.fn(); | |
| let t; | |
| if ( void 0 !== e.catch ) { | |
| const r = s.Deferred(); | |
| e.then( r.resolve ).catch( r.reject ), t = r.promise() | |
| } else t = e; | |
| r.push( t ), t.always( () => { | |
| let e; | |
| ( e = r.indexOf( t ) ) > -1 && r.splice( e, 1 ), n() | |
| } ), o.p.consume( t ) | |
| } | |
| }; | |
| return { | |
| add: function ( e ) { | |
| const r = s.Deferred(); | |
| return t.push( { | |
| fn: e, | |
| p: r | |
| } ), n(), r.promise() | |
| } | |
| } | |
| }, t.createCache = e => { | |
| let t = {}; | |
| const r = ( null == e ? void 0 : e.retimeout_on_get ) || !1, | |
| n = ( null == e ? void 0 : e.timeout ) || 300, | |
| s = ( null == e ? void 0 : e.check_interval ) || 120; | |
| let o; | |
| const a = () => { | |
| o && clearInterval( o ), o = null | |
| }, | |
| i = e => { | |
| delete t[ e ] | |
| }, | |
| A = () => { | |
| const e = Date.now() - 1e3 * n; | |
| Object.entries( t ).forEach( ( [ t, r ] ) => { | |
| r.ts < e && setTimeout( () => i( t ), 1 ) | |
| } ) | |
| }, | |
| l = { | |
| init: () => ( o || ( a(), o = setInterval( A, 1e3 * s ) ), l ), | |
| set: ( e, r ) => { | |
| t[ e ] = { | |
| value: r, | |
| ts: Date.now() | |
| } | |
| }, | |
| get: ( e, n ) => { | |
| let s = n; | |
| return t[ e ] && ( r && ( t[ e ].ts = Date.now() ), | |
| s = t[ e ].value ), s | |
| }, | |
| remove: i, | |
| removeAll: () => { | |
| t = {} | |
| } | |
| }; | |
| return l | |
| } | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| r.r( t ); | |
| var n = r( 3 ), | |
| s = r( 10 ), | |
| o = r( 2 ), | |
| a = r( 6 ), | |
| i = r.n( a ); | |
| let A; | |
| const l = e => [ "https:", "http:", "data:", "blob" ].some( t => e.startsWith( t ) ), | |
| c = [ "internal", "user-agent", "accept-charset", "accept-encoding", "access-control-request-headers", "access-control-request-method", "connection", "content-length", "cookie", "cookie2", "date", "dnt", "expect", "host", "keep-alive", "origin", "referer", "te", "trailer", "transfer-encoding", "upgrade", "via" ], | |
| u = { | |
| "cache-control": "no-cache", | |
| pragma: "no-cache" | |
| }, | |
| d = { | |
| "cache-control": "max-age=0, must-revalidate" | |
| }, | |
| g = e => { | |
| if ( e ) { | |
| const t = {}; | |
| return Object.keys( e ).forEach( r => { | |
| let n = r, | |
| s = e[ r ]; | |
| if ( A.prefix ) o = r.toLowerCase(), ( c.includes( o ) || 0 === o.indexOf( "proxy-" ) || 0 === o.indexOf( "sec-" ) ) && ( n = A.prefix + r, s = null === s ? "" : i.a.encodeS( s ) ); | |
| else if ( null === s ) return; | |
| var o; | |
| t[ n ] = s | |
| } ), t | |
| } | |
| }, | |
| p = e => ( { | |
| responseXML: "", | |
| responseText: "", | |
| response: null, | |
| readyState: 4, | |
| responseHeaders: "", | |
| status: 0, | |
| statusText: "", | |
| error: e = e || "Forbidden" | |
| } ), | |
| m = e => { | |
| if ( "Blob" === e.type ) return new Blob( [ i.a.str2abSync( e.value ) ] ); | |
| if ( "File" === e.type ) return new File( [ i.a.str2abSync( e.value ) ], e.name, { | |
| type: e.meta, | |
| lastModified: e.lastModified || Date.now() | |
| } ); | |
| if ( "FormData" == e.type ) { | |
| const t = new FormData; | |
| return Object.keys( e.value ).forEach( r => { | |
| const n = "Array" === e.value[ r ].type, | |
| s = m( e.value[ r ] ), | |
| o = n ? s : [ s ]; | |
| o.forEach( ( e, n ) => { | |
| t.append( r, o[ n ] ) | |
| } ) | |
| } ), t | |
| } | |
| if ( "Array" === e.type || "Object" === e.type ) { | |
| let t, r, n; | |
| "Object" === e ? ( n = Object.keys( e.value ), r = e => e < n.length ? n[ e ] : null, t = {} ) : ( r = t => t < e.value.length ? t : null, t = [] ); | |
| for ( let n, s = 0; null !== ( n = r( s ) ); s++ ) t[ n ] = m( e.value[ n ] ); | |
| return t | |
| } | |
| return e.value | |
| }, | |
| f = e => { | |
| const t = {}; | |
| return e && e.split( "\n" ).forEach( e => { | |
| const r = e.match( /^([^:]+): ?(.*)/ ); | |
| if ( r ) { | |
| const e = r[ 1 ].toLowerCase(); | |
| t[ e ] = ( void 0 !== t[ e ] ? ", " : "" ) + ( r[ 2 ] || "" ).replace( /,/g, "%2C" ) | |
| } | |
| } ), t | |
| }, | |
| h = "tm-finalurl" + rea.runtime.short_id.toLowerCase(), | |
| R = "tm-setcookie" + rea.runtime.short_id.toLowerCase(); | |
| var v = ( e, t, r, s, a ) => { | |
| const A = e.responseType ? e.responseType.toLowerCase() : "", | |
| l = e => { | |
| const t = []; | |
| let r, n; | |
| return e.headers && ( r = e.headers.get( h ) || e.url, e.headers.forEach( ( e, r ) => { | |
| const n = r.toLowerCase(); | |
| [ h, R ].includes( n ) || t.push( n + ":" + e ) | |
| } ), ( n = e.headers.get( R ) ) && t.push( "set-cookie:" + n ) ), { | |
| readyState: 4, | |
| responseHeaders: t.join( "\n" ), | |
| finalUrl: r, | |
| status: e.status, | |
| statusText: e.statusText | |
| } | |
| }; | |
| let c = !1; | |
| let u, b, w; | |
| const k = e => { | |
| e && ( w = !0 ), y ? y.abort() : w ? _() : _( { | |
| name: "AbortError", | |
| message: "Aborted by user" | |
| } ) | |
| }, | |
| _ = e => { | |
| let t; | |
| b || ( w ? ( t = l( { | |
| status: 408, | |
| statusText: "Request Timeout" | |
| } ), | |
| s( "ontimeout" ) ) : "AbortError" == e.name ? ( t = p( "aborted" ), s( "onabort" ) ) : ( t = l( { | |
| status: 408, | |
| statusText: e.message || "Request Timeout" | |
| } ), s( "onerror", t ) ), b = !0, s( "ondone", t ) ) | |
| }; | |
| try { | |
| const p = {}; | |
| let h; | |
| p.method = e.method || "GET", p.redirect = "follow", e.headers && ( h = g( e.headers ) ), e.nocache ? p.cache = "reload" : e.revalidate && ( p.cache = "default", h = h || {}, h = { | |
| ...h, | |
| ...d | |
| } ), e.anonymous ? p.credentials = "omit" : p.credentials = "include", e.user && e.password && ( h = h || {}, h.Authorization = "Basic " + btoa( e.user + ":" + e.password ) ), | |
| h && ( p.headers = new window.Headers( h ) ), void 0 !== e.data && ( "typified" === e.data_type ? p.body = m( e.data ) : "string" == typeof e.data ? p.body = e.data : p.body = JSON.stringify( e.data ) ); | |
| var y = window.AbortController ? new window.AbortController : null; | |
| y && ( p.signal = y.signal ), window.fetch( e.url, p ).then( d => { | |
| if ( u && ( window.clearTimeout( u ), u = null ), b ) return; | |
| let g = l( d ); | |
| if ( ( 0 !== g.status || g.status < 200 || g.status >= 300 ) && e.retries > 0 ) return e.retries--, void v( e, t, r, s, a ); | |
| ( async () => { | |
| if ( d.ok ) | |
| if ( e.partialSize ) { | |
| let t; | |
| [ "arraybuffer", "blob" ].includes( A ) || void 0 !== e.overrideMimeType ? ( g.response = await d.blob(), t = !1 ) : ( g.response = await d.text(), t = !0 ), g = await ( async ( t, s ) => { | |
| if ( e.partialSize ) { | |
| const o = t.response; | |
| [ "response", "responseText", "responseXML" ].forEach( e => { | |
| delete t[ e ] | |
| } ), !c && o && ( c = !0, await ( async ( t, s ) => { | |
| if ( !s ) { | |
| if ( rea.FEATURES.RUNTIME.SHARED_OBJECT_URLS && !r.foreign_context ) { | |
| const e = { | |
| url: URL.createObjectURL( t ), | |
| type: t.type | |
| }; | |
| return a( "onpartial", { | |
| objurl: e | |
| } ), void window.setTimeout( () => URL.revokeObjectURL( e.url ), 3e5 ) | |
| } | |
| t = await i.a.blob2str( t ) | |
| } | |
| const o = Object( n.splitSlice )( t, parseInt( e.partialSize ) ); | |
| o.forEach( ( e, t ) => { | |
| a( "onpartial", { | |
| partial: e, | |
| index: t, | |
| length: o.length | |
| } ) | |
| } ) | |
| } )( o, s ) ) | |
| } | |
| return t | |
| } )( g, t ) | |
| } else if ( void 0 !== e.responseType ) { | |
| let e; | |
| if ( "arraybuffer" == A ) g.response = await d.arrayBuffer(); | |
| else if ( "blob" == A ) g.response = await d.blob(); | |
| else if ( "document" == A ) { | |
| e = ( f( g.responseHeaders )[ "content-type" ] || "text/xml" ).split( ";" )[ 0 ]; | |
| const t = new window.DOMParser; | |
| g.response = t.parseFromString( await d.text(), e ) | |
| } else if ( "json" == A ) { | |
| const e = await d.text(); | |
| g.response = JSON.parse( e ) | |
| } else o.logger.warn( "xhr: responseType", A, " is not implemented!" ), g.response = await d.text() | |
| } else if ( void 0 !== e.overrideMimeType && window.TextDecoder ) { | |
| const t = await d.arrayBuffer(), | |
| r = e.overrideMimeType.toLowerCase().match( /charset=([^;]+)/ )[ 1 ]; | |
| g.response = new window.TextDecoder( r ).decode( t ) | |
| } else { | |
| const e = await d.text(); | |
| g.response = e | |
| } else g.responseXML = null, g.responseText = "", g.response = null | |
| } )().then( () => { | |
| s( "onload", g ), s( "ondone", g ) | |
| } ) | |
| } ).catch( _ ), | |
| void 0 !== e.timeout && ( u = setTimeout( () => { | |
| u = null, k( !0 ) | |
| }, e.timeout ) ) | |
| } catch ( e ) { | |
| o.logger.error( e.stack ); | |
| const t = p( e.message ); | |
| s( "onerror", t ), s( "ondone", t ) | |
| } | |
| return { | |
| abort: () => k() | |
| } | |
| }, | |
| b = ( e, t, r, a, c ) => { | |
| const R = e.responseType ? e.responseType.toLowerCase() : ""; | |
| let v, w, k; | |
| e.anonymous && ( v = A.mozAnon ? { | |
| mozAnon: !0 | |
| } : { | |
| anonymous: !0 | |
| } ); | |
| const _ = new XMLHttpRequest( v ), | |
| y = t => { | |
| let r = "", | |
| n = e.url; | |
| if ( _.readyState >= 2 ) { | |
| let e; | |
| r = _.getAllResponseHeaders(), r && ( r = r.replace( /tm-finalurl[0-9a-zA-Z]*\: .*[\r\n]{1,2}/i, "" ), | |
| r = r.replace( /tm-setcookie[0-9a-zA-Z]*\:/i, "set-cookie:" ) ), ( e = _.getResponseHeader( h ) || _.responseURL ) && ( n = e ) | |
| } | |
| const s = { | |
| readyState: _.readyState, | |
| responseHeaders: r, | |
| finalUrl: n, | |
| status: _.readyState >= 2 ? _.status : 0, | |
| statusText: _.readyState >= 2 ? _.statusText : "" | |
| }; | |
| return t && 4 == _.readyState ? _.responseType ? ( s.responseXML = null, s.responseText = null, s.responseType = _.responseType, s.response = _.response ) : ( s.responseXML = _.responseXML, s.responseText = _.responseText, s.response = _.response ) : ( s.responseXML = null, | |
| s.responseText = "", s.response = null ), s | |
| }; | |
| let E = !1; | |
| const I = async t => { | |
| if ( e.partialSize ) { | |
| const s = t.response, | |
| o = ![ "arraybuffer", "blob" ].includes( R ); | |
| [ "response", "responseText", "responseXML" ].forEach( e => { | |
| delete t[ e ] | |
| } ), !E && s && ( E = !0, await ( async ( t, s ) => { | |
| if ( !s ) { | |
| if ( rea.FEATURES.RUNTIME.SHARED_OBJECT_URLS && !r.foreign_context ) { | |
| const e = { | |
| url: URL.createObjectURL( t ), | |
| type: t.type | |
| }; | |
| return c( "onpartial", { | |
| objurl: e | |
| } ), void window.setTimeout( () => URL.revokeObjectURL( e.url ), 3e5 ) | |
| } | |
| t = await i.a.blob2str( t ) | |
| } | |
| const o = Object( n.splitSlice )( t, parseInt( e.partialSize ) ); | |
| o.forEach( ( e, t ) => { | |
| c( "onpartial", { | |
| partial: e, | |
| index: t, | |
| length: o.length | |
| } ) | |
| } ) | |
| } )( s, o ) ) | |
| } | |
| return t | |
| }, x = Object( s.createQueue )( { | |
| threads: 1 | |
| } ), T = e => ( ...t ) => x.add( async () => e( ...t ) ), M = { | |
| onload: T( async () => { | |
| let n = y( !0 ); | |
| if ( ( 0 !== n.status || n.status < 200 || n.status >= 300 ) && e.retries > 0 ) return e.retries--, void b( e, t, r, a, c ); | |
| e.partialSize && ( n = await I( n ) ), await a( "onload", n ), 4 == n.readyState && await a( "ondone", n ) | |
| } ), | |
| onerror: T( async () => { | |
| const n = y(); | |
| if ( 4 == n.readyState && 200 != n.status && 0 != n.status && e.retries > 0 ) return e.retries--, void b( e, t, r, a, c ); | |
| await a( "onerror", n ), await a( "ondone", n ) | |
| } ), | |
| onloadstart: T( async () => { | |
| await c( "onloadstart", () => y() ) | |
| } ), | |
| onreadystatechange: T( async () => { | |
| await c( "onreadystatechange", async () => { | |
| let e = y(); | |
| return e = await I( e ), e | |
| } ) | |
| } ), | |
| onprogress: T( async e => { | |
| await c( "onprogress", async () => { | |
| let t = y(); | |
| return t = await I( t ), G( e, t, t ) | |
| } ) | |
| } ), | |
| ontimeout: T( async () => { | |
| const e = y(); | |
| await a( "ontimeout" ), await a( "ondone", e ) | |
| } ), | |
| onabort: T( async () => { | |
| const e = p( "aborted" ); | |
| await a( "onabort" ), await a( "ondone", e ) | |
| } ) | |
| }, S = 0 == Object.keys( M ).concat( [ "ondone" ] ).filter( e => !!t[ e ] ).length; | |
| if ( S ) throw new Error( "Synchronous XHR is not supported anymore" ); | |
| var G = ( e, t, r ) => { | |
| void 0 === r && ( r = {} ); | |
| try { | |
| let n = null, | |
| s = null; | |
| if ( e.lengthComputable || e.total > 0 ) n = e.loaded, s = e.total; | |
| else { | |
| const r = !_.responseType || [ "", "text" ].includes( _.responseType ) ? _.responseText : null; | |
| let o = Number( f( t.responseHeaders )[ "content-length" ] || "" ); | |
| const a = t.readyState > 2 && r ? r.length : 0; | |
| 0 == o && ( o = -1 ), | |
| n = e.loaded || a, s = e.total || o | |
| } | |
| r.lengthComputable = e.lengthComputable, r.loaded = n, r.done = n, r.position = n, r.total = s, r.totalSize = s | |
| } catch ( e ) {} | |
| return r | |
| }; | |
| Object.keys( M ).forEach( e => { | |
| ( t[ e ] || [ "ontimeout", "onload", "onerror", "onabort" ].includes( e ) ) && ( _[ e ] = M[ e ] ) | |
| } ); | |
| try { | |
| if ( !r.internal && !l( e.url ) ) throw new Error( "Invalid scheme of url: " + e.url ); | |
| _.open( e.method || "GET", e.url, !S, e.user, e.password ); | |
| let n = g( e.headers ); | |
| ( e.nocache || e.revalidate ) && ( n = n || {}, e.nocache ? n = { | |
| ...n, | |
| ...u | |
| } : e.revalidate && ( n = { | |
| ...n, | |
| ...d | |
| } ) ), | |
| n && Object.keys( n ).forEach( e => { | |
| try { | |
| _.setRequestHeader( e, n[ e ] ) | |
| } catch ( t ) { | |
| o.logger.warn( "xhr: rejected header", e, n[ e ] ) | |
| } | |
| } ), void 0 !== e.overrideMimeType && _.overrideMimeType( e.overrideMimeType ), e.partialSize ? [ "arraybuffer", "blob" ].includes( R ) ? _.responseType = e.responseType = "blob" : delete e.responseType : void 0 !== e.responseType && ( w = e.responseType.toLowerCase(), [ "document", "json" ].includes( w ) || ( _.responseType = w ) ), void 0 !== e.timeout && ( _.timeout = e.timeout ), | |
| void 0 !== e.data ? ( "typified" === e.data_type ? _.send( m( e.data ) ) : "string" == typeof e.data ? _.send( e.data ) : _.send( JSON.stringify( e.data ) ), t.onprogress && _.upload && ( _.upload.onprogress = M.onprogress ) ) : _.send() | |
| } catch ( e ) { | |
| o.logger.error( e.stack ); | |
| const t = p( e.message ); | |
| a( "onerror", t ), a( "ondone", t ) | |
| } | |
| return k = k || {}, Object( n.copy )( { | |
| abort: function () { | |
| _.abort() | |
| } | |
| }, k ) | |
| }; | |
| const w = { | |
| run: ( e, t, r ) => { | |
| const n = { | |
| ...t || {} | |
| }, | |
| s = async ( e, t ) => { | |
| n[ e ] && await n[ e ]( "function" == typeof t ? await t() : t ) | |
| }, a = async ( e, t ) => { | |
| n[ e ] && ( await s( e, t ), n[ e ] = null ) | |
| }; | |
| if ( !( r = r || {} ).internal && !l( e.url ) ) { | |
| o.logger.warn( "xhr: invalid scheme of url:", e.url ); | |
| const t = p( "Invalid scheme" ); | |
| return a( "onerror", t ), void a( "ondone", t ) | |
| } | |
| const i = window.fetch && e.url && "http" == e.url.substr( 0, 4 ), | |
| c = !A.mozAnon && e.anonymous, | |
| u = e.fetch; | |
| return i && ( c || u ) ? v( e, n, r, a, s ) : b( e, n, r, a, s ) | |
| }, | |
| setConfig: function ( e ) { | |
| A = e | |
| }, | |
| getConfig: function () { | |
| return A | |
| }, | |
| makeErrorResponse: p, | |
| parseCookie: e => { | |
| const t = e.split( ";" ).filter( e => "string" == typeof e && !!e.trim() ), | |
| r = t.shift().split( "=" ), | |
| n = r.shift(), | |
| s = r.join( "=" ), | |
| o = { | |
| name: n, | |
| value: decodeURIComponent( s ) | |
| }; | |
| return t.forEach( ( function ( e ) { | |
| var t = e.split( "=" ), | |
| r = t.shift().trimLeft().toLowerCase(), | |
| n = t.join( "=" ); | |
| if ( "expires" === r ) { | |
| const e = new Date( decodeURIComponent( n ) ); | |
| isNaN( e.getTime() ) || ( o.expires = e ) | |
| } else "max-age" === r ? o.maxAge = parseInt( n, 10 ) : "secure" === r ? o.secure = !0 : "httponly" === r ? o.httpOnly = !0 : "samesite" === r ? o.sameSite = n : o[ r ] = n | |
| } ) ), o | |
| }, | |
| parseHeaders: f | |
| }; | |
| t.default = w | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| var n = this && this.__importDefault || function ( e ) { | |
| return e && e.__esModule ? e : { | |
| default: e | |
| } | |
| }; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ); | |
| const s = n( r( 4 ) ), | |
| o = ( r( 2 ), "mtm_visitor" ), | |
| a = "default", | |
| i = "pageview", | |
| A = "script_update", | |
| l = "script", | |
| c = "cloud", | |
| u = "event", | |
| d = "pageview", | |
| g = "ping", | |
| p = "https://a.tampermonkey.net/matomo.php", | |
| m = window.rea, | |
| f = m.FEATURES.HTML5.LOCALSTORAGE; | |
| let h, R, v, b = !1, | |
| w = !1; | |
| const k = () => ( { | |
| url: p, | |
| siteId: 5, | |
| tracker: { | |
| [ a ]: { | |
| enabled: U( 5, 10 ) | |
| }, | |
| [ l ]: { | |
| enabled: !0 | |
| }, | |
| [ A ]: { | |
| enabled: U( 5, 10 ) | |
| }, | |
| [ c ]: { | |
| enabled: U( 5, .001 ) | |
| } | |
| } | |
| } ), | |
| _ = () => ( { | |
| url: p, | |
| siteId: 6, | |
| tracker: { | |
| [ a ]: { | |
| enabled: U( 6, 50 ) | |
| }, | |
| [ l ]: { | |
| enabled: !0 | |
| }, | |
| [ A ]: { | |
| enabled: U( 6, 10 ) | |
| }, | |
| [ c ]: { | |
| enabled: U( 6, .01 ) | |
| } | |
| } | |
| } ), | |
| y = { | |
| default: k, | |
| gcal: k, | |
| iikm: () => ( { | |
| url: p, | |
| siteId: 4, | |
| tracker: { | |
| [ a ]: { | |
| enabled: U( 4, 1 ) | |
| }, | |
| [ l ]: { | |
| enabled: !0 | |
| }, | |
| [ A ]: { | |
| enabled: U( 4, 10 ) | |
| }, | |
| [ c ]: { | |
| enabled: U( 4, 5e-4 ) | |
| } | |
| } | |
| } ), | |
| saap: () => ( { | |
| url: p, | |
| siteId: 7, | |
| tracker: { | |
| [ a ]: { | |
| enabled: !0 | |
| }, | |
| [ l ]: { | |
| enabled: !0 | |
| }, | |
| [ A ]: { | |
| enabled: U( 7, 10 ) | |
| }, | |
| [ c ]: { | |
| enabled: U( 7, .01 ) | |
| } | |
| } | |
| } ), | |
| fire: _, | |
| firb: _, | |
| dhdg: () => ( { | |
| url: p, | |
| siteId: 3, | |
| tracker: { | |
| [ a ]: { | |
| enabled: U( 3, 1 ) | |
| }, | |
| [ l ]: { | |
| enabled: !0 | |
| }, | |
| [ A ]: { | |
| enabled: U( 3, 10 ) | |
| }, | |
| [ c ]: { | |
| enabled: U( 3, 5e-4 ) | |
| } | |
| } | |
| } ), | |
| mfdh: k, | |
| heif: () => ( { | |
| url: "http://a.userscript.grobilan:8081/matomo.php", | |
| siteId: 2, | |
| tracker: { | |
| [ a ]: { | |
| enabled: !0 | |
| } | |
| } | |
| } ) | |
| }; | |
| let E; | |
| const I = [ { | |
| msg: "a disconnected port" | |
| }, { | |
| msg: "Function.prototype.apply: Arguments list has wrong type", | |
| url: "event_bindings" | |
| }, { | |
| msg: "Script error." | |
| } ], | |
| x = e => [ ...Array( e ) ].map( () => Math.floor( 16 * Math.random() ).toString( 16 ) ).join( "" ), | |
| T = e => { | |
| if ( !f ) return; | |
| const t = [ e.uuid, e.createTs, e.visitCount, e.currentVisitTs, e.lastVisitTs ].join( "." ); | |
| f.setItem( o, t ) | |
| }, | |
| M = e => { | |
| const t = e || a, | |
| r = E.tracker[ t ] || E.tracker.default; | |
| return r.enabled ? { | |
| url: E.url, | |
| siteId: E.siteId, | |
| options: r | |
| } : null | |
| }, | |
| S = x( 6 ), | |
| G = async ( e, t, r ) => { | |
| if ( !e ) return; | |
| const n = ( () => { | |
| if ( !f ) return; | |
| const e = f.getItem( o ); | |
| if ( !e ) return; | |
| const t = e.split( "." ); | |
| if ( t.length >= 5 ) { | |
| t.unshift( "0" ); | |
| const [ e, r, n, s, o, a ] = t; | |
| return { | |
| createdNow: !1, | |
| newVisitor: e, | |
| uuid: r, | |
| createTs: n, | |
| visitCount: s, | |
| currentVisitTs: o, | |
| lastVisitTs: a | |
| } | |
| } | |
| } )() || ( () => { | |
| const e = Math.floor( Date.now() / 1e3 ).toString(), | |
| t = { | |
| createdNow: !0, | |
| newVisitor: "1", | |
| uuid: x( 16 ), | |
| createTs: e, | |
| visitCount: "0", | |
| currentVisitTs: e, | |
| lastVisitTs: "" | |
| }; | |
| return T( t ), t | |
| } )(); | |
| let a; | |
| const i = new Date, | |
| A = { | |
| idsite: e.siteId, | |
| rec: 1, | |
| action_name: document.title || m.runtime.short_id, | |
| url: location.href, | |
| _id: n.uuid, | |
| rand: x( 4 ), | |
| apiv: 1, | |
| h: i.getHours(), | |
| m: i.getMinutes(), | |
| s: i.getSeconds(), | |
| cookie: 1, | |
| pv_id: S | |
| }, | |
| l = { | |
| ...A, | |
| _idts: Number( n.createTs ), | |
| _idvc: Number( n.visitCount ), | |
| _viewts: Number( n.lastVisitTs ), | |
| res: `${screen.width}x${screen.height}` | |
| }; | |
| if ( t == d ) { | |
| const e = R ? { | |
| gt_ms: R | |
| } : {}, | |
| t = { | |
| ...A, | |
| ...l, | |
| ...e, | |
| new_visit: 1 | |
| }; | |
| T( ( e => { | |
| const t = Math.floor( Date.now() / 1e3 ).toString(); | |
| return e.newVisitor = "0", e.visitCount = ( Number( e.visitCount ) + 1 ).toString(), e.lastVisitTs = e.currentVisitTs, e.currentVisitTs = t, e | |
| } )( n ) ), a = t | |
| } else if ( t == u ) { | |
| if ( !r ) return; | |
| a = { | |
| ...A, | |
| ca: 1, | |
| e_c: r.category, | |
| e_a: r.action, | |
| e_n: r.name, | |
| e_v: r.value | |
| } | |
| } else { | |
| if ( t != g ) return; | |
| a = { | |
| ...A, | |
| ...l, | |
| ping: 1 | |
| } | |
| } | |
| a = Object.assign( A, a ); | |
| const c = `${e.url}?${s.default.hash2params(a)}`, | |
| p = document.createElement( "img" ); | |
| p.src = c, p.onload = () => { | |
| var e; | |
| null === ( e = p.parentNode ) || void 0 === e || e.removeChild( p ) | |
| }, | |
| p.onerror = () => { | |
| var e; | |
| null === ( e = p.parentNode ) || void 0 === e || e.removeChild( p ) | |
| }, ( document.body || document.head || document.documentElement ).appendChild( p ) | |
| }, U = ( e, t ) => { | |
| let r = 100 * Math.random() < t; | |
| if ( f ) try { | |
| let n, s; | |
| const o = [ "wsr", e, t ].join( "_" ), | |
| a = Date.now(), | |
| i = 864e7; | |
| if ( n = f.getItem( o ) ) { | |
| try { | |
| s = JSON.parse( n ) | |
| } catch ( e ) {}( !s || s.ts + i < a ) && ( s = { | |
| ts: a, | |
| w: r | |
| } ) | |
| } else s = { | |
| ts: a, | |
| w: r | |
| }; | |
| r = s.w, f.setItem( o, JSON.stringify( s ) ) | |
| } catch ( e ) {} | |
| return r | |
| }, N = e => { | |
| b && ( w = e, w ? h && O && ( O(), O = void 0 ) : v && ( clearInterval( v ), v = void 0 ) ) | |
| }; | |
| let O = () => { | |
| G( M( i ), d ), | |
| v = window.setInterval( () => G( M( i ), g ), 864e5 ) | |
| }; | |
| const Z = ( e, t, r ) => { | |
| if ( !w || !e.search ) return; | |
| void 0 === t && ( t = "" ), void 0 === r && ( t += " " + window.location.href, r = "" ); | |
| let n = !1; | |
| I.forEach( r => { | |
| ( r.msg || r.url ) && ( r.msg && -1 == e.indexOf( r.msg ) || r.url && -1 == t.indexOf( r.url ) || ( n = !0 ) ) | |
| } ), n || G( M( "error" ), u, { | |
| category: "Error", | |
| action: e, | |
| name: t + ":" + r | |
| } ) | |
| }, | |
| C = { | |
| init: ( e, t, r ) => { | |
| const n = ( ( null == r ? void 0 : r.version ) || "" ) + " ", | |
| s = m.runtime.short_id; | |
| E = ( y[ s ] || y.default )(), window.onerror = ( t, r, s, o, a ) => { | |
| let i = ""; | |
| if ( a ) try { | |
| i = a.stack || "" | |
| } catch ( e ) {} | |
| Z( t.toString(), n + e + "@" + m.extension.urls.prepareForReport( r || "" ), [ s + ":" + o, i ].join( ";" ) ) | |
| }, document.onsecuritypolicyviolation = t => { | |
| let r = ""; | |
| if ( t ) try { | |
| r = t.stack | |
| } catch ( e ) {} | |
| Z( "CSP violation of " + t.effectiveDirective, n + e + "@" + m.extension.urls.prepareForReport( t.documentURI ), [ t.sourceFile, " -> ", t.lineNumber + ":" + t.columnNumber, r ].join( ";" ) ) | |
| }, ( null == r ? void 0 : r.started ) && ( R = Date.now() - r.started.getTime() ), b = !0, h = !!( null == r ? void 0 : r.trackView ), N( t ) | |
| }, | |
| setEnabled: N, | |
| isActive: function ( e ) { | |
| return w && !!M( e ) | |
| }, | |
| tC: ( e, t, r ) => { | |
| if ( !w ) return; | |
| let n = "", | |
| s = ""; | |
| "init" === t ? ( s = "Initialized", n = e ) : "error" === t && ( s = "Error", n = e + " -> " + r ), G( M( c ), u, { | |
| category: "Cloud", | |
| action: s, | |
| name: n | |
| } ) | |
| }, | |
| tS: ( e, t, r ) => { | |
| if ( !w ) return; | |
| const n = `${e}${r?` <${r}> `:""}`; | |
| let s = "", | |
| o = null; | |
| if ( "i" === t ) s = "Installed"; | |
| else if ( "u" === t ) s = "Updated", o = M( A ); | |
| else if ( "m" === t ) s = "Revealed"; | |
| else { | |
| if ( "r" !== t ) return; | |
| s = "Removed" | |
| } | |
| G( o || M( l ), u, { | |
| category: "Script", | |
| action: s, | |
| name: n | |
| } ) | |
| }, | |
| tE: Z, | |
| tG: ( e, t, r ) => { | |
| if ( !w ) return; | |
| let n = "", | |
| s = ""; | |
| "clicked" === e ? ( s = "Click", | |
| n = t + ":" + r ) : "button" === e ? ( s = "Button", n = t ) : "dialog" === e && ( s = "Dialog" ), G( M( "begging" ), u, { | |
| category: "Begging", | |
| action: s, | |
| name: n | |
| } ) | |
| } | |
| }; | |
| t.default = C | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| r.d( t, "a", ( function () { | |
| return m | |
| } ) ), r.d( t, "b", ( function () { | |
| return f | |
| } ) ); | |
| var n = r( 1 ), | |
| s = r( 2 ), | |
| o = r( 15 ), | |
| a = r.n( o ); | |
| let i = 0; | |
| const A = { | |
| ePASTEBIN: 1, | |
| eCHROMESYNC: 2, | |
| eSYNCFS: 3, | |
| eGDRIVE: 4, | |
| eDROPBOX: 5, | |
| eWEBDAV: 6, | |
| eYANDEX: 7, | |
| eONEDRIVE: 8 | |
| }; | |
| let l = [], | |
| c = !1; | |
| const u = e => { | |
| const t = Object( n.Deferred )(), | |
| r = new FileReader; | |
| return r.onloadend = function () { | |
| t.resolve( this.result ) | |
| }, r.onerror = t.reject, r.onabort = t.reject, r.readAsText( e ), t.promise() | |
| }, | |
| d = ( () => { | |
| const e = e => { | |
| const t = e.type, | |
| r = e.id, | |
| o = ".meta.json", | |
| A = ".user.js"; | |
| let c, d = null; | |
| const g = e => { | |
| let t; | |
| return n.Deferred.Pledge().then( () => { | |
| if ( !d ) return t = !0, p() | |
| } ).then( () => { | |
| if ( d && void 0 === d[ e ] && !t ) return p() | |
| } ).then( () => d ? ( d[ e ] = d[ e ] || null, d[ e ] ) : ( s.logger.warn( "si: unable to list remote list!" ), n.Deferred.Breach() ) ) | |
| }, | |
| p = e => c.list( e ).then( e => { | |
| d = {}; | |
| const t = {}, | |
| r = {}; | |
| let n, o; | |
| const a = Date.now(); | |
| return e.forEach( e => { | |
| d[ e.name ] = e; | |
| const i = new RegExp( ".meta.json$" ), | |
| A = new RegExp( ".user.js$" ); | |
| var l; | |
| e.modified > a ? s.logger.log( "si: ignore future list item", a, e ) : ( ( n = e.name.match( i ) ) || ( o = e.name.match( A ) ) ) && ( n ? ( e.uuid = l = e.name.replace( i, "" ), e.lastModified = e.modified, t[ l ] = e ) : o && ( l = e.name.replace( A, "" ), r[ l ] = e ) ) | |
| } ), Object.keys( t ).map( e => { | |
| let n; | |
| if ( n = t[ e ] ) return n.source = r[ e ], n.options = n.options || {}, n | |
| } ).filter( e => e ) | |
| } ); | |
| let m; | |
| return { | |
| init: function ( e ) { | |
| return c = a.a[ t ]( { | |
| ...e, | |
| path: "sync" | |
| } ), n.Deferred.Pledge().then( () => { | |
| if ( !c.credentials && !e.basic_auth ) return c.list() | |
| } ).then( () => ( m || ( m = c.changes.listen(), m.progress( e => { | |
| ( ( e, t ) => { | |
| if ( t != i ) return; | |
| const r = e.name, | |
| n = new RegExp( ".meta.json$" ), | |
| o = new RegExp( ".user.js$" ); | |
| s.logger.log( "si: cloud file changed", r, e ), ( r.match( n ) || r.match( o ) ) && l.forEach( e => { | |
| e( r ) | |
| } ) | |
| } )( e, r ) | |
| } ) ), !0 ) ) | |
| }, | |
| list: p, | |
| setSource: ( e, t ) => { | |
| const r = e + A; | |
| return g( r ).then( e => { | |
| let o; | |
| return n.Deferred.Pledge( !1 ).then( () => { | |
| if ( e && c.compare ) return c.compare( e, t ) | |
| } ).then( a => a ? ( s.logger.log( "si: remote source data matches, skip upload of", r ), n.Deferred.Pledge() ) : ( o = new Blob( [ t ], { | |
| type: "text/plain" | |
| } ), delete d[ r ], c.put( e || r, o ) ) ) | |
| } ) | |
| }, | |
| getSource: ( e, t ) => { | |
| const r = e + A; | |
| return g( r ).then( o => o ? n.Deferred.Pledge( !1 ).then( () => { | |
| if ( t && c.compare ) return c.compare( o, t ) | |
| } ).then( e => e ? ( s.logger.log( "si: remote source data matches, skip download of", r ), n.Deferred.Pledge( t ) ) : c.get( o ).then( u ) ) : ( s.logger.warn( "si: list cache does not contain this UUID", e ), n.Deferred.Breach() ) ) | |
| }, | |
| getMeta: e => g( e + o ).then( t => t ? c.get( t ).then( u ).then( r => { | |
| let n; | |
| if ( ( n = ( e => { | |
| let t = null; | |
| try { | |
| t = JSON.parse( e ) | |
| } catch ( e ) {} | |
| return t && t.uuid ? t : ( s.logger.log( "si: unable to parse extended info of " + void 0 ), null ) | |
| } )( r ) ) && ( n.uuid = e ) ) return n.lastModified = t.modified || n.lastModified, n.precision = t.precision, n.options = n.options || {}, n | |
| } ) : n.Deferred.Breach() ), | |
| setMeta: ( e, t ) => { | |
| const r = new Blob( [ JSON.stringify( e ) ], { | |
| type: "text/plain" | |
| } ), | |
| n = e.uuid + o; | |
| return g( n ).then( e => c.put( e || n, r, t ) ) | |
| }, | |
| remove: e => { | |
| const t = e.uuid + o; | |
| e.options.removed = !0; | |
| const r = new Blob( [ JSON.stringify( e ) ], { | |
| type: "text/plain" | |
| } ); | |
| return c.put( t, r ).then( () => { | |
| const t = e.uuid + A; | |
| return g( t ).then( e => { | |
| if ( e ) return delete d[ t ], c.delete( e ) | |
| } ) | |
| } ) | |
| }, | |
| reset: () => c.list( !0 ).then( e => e.filter( e => { | |
| const t = new RegExp( ".meta.json$" ), | |
| r = new RegExp( ".user.js$" ); | |
| return e.name.match( t ) || e.name.match( r ) | |
| } ) ).then( e => { | |
| const t = []; | |
| return e.forEach( e => { | |
| t.push( ( () => { | |
| const t = Object( n.Deferred )(); | |
| return c.delete( e ).always( () => { | |
| t.resolve() | |
| } ), t.promise() | |
| } )() ) | |
| } ), | |
| n.Deferred.when( t ).always( () => { | |
| d = null | |
| } ) | |
| } ), | |
| getRemoteUrl: function ( e ) { | |
| if ( c.getRemoteUrl ) return c.getRemoteUrl( e.uuid + A ) | |
| }, | |
| getRemoteDomains: function () { | |
| if ( c.getRemoteDomains ) return c.getRemoteDomains() | |
| } | |
| } | |
| }, | |
| t = e( { | |
| type: "drive", | |
| id: A.eGDRIVE | |
| } ), | |
| r = e( { | |
| type: "dropbox", | |
| id: A.eDROPBOX | |
| } ), | |
| o = e( { | |
| type: "onedrive", | |
| id: A.eONEDRIVE | |
| } ), | |
| c = e( { | |
| type: "webdav", | |
| id: A.eWEBDAV | |
| } ), | |
| d = e( { | |
| type: "yandex", | |
| id: A.eYANDEX | |
| } ), | |
| p = ( () => { | |
| let e, t = !1; | |
| const r = ( t, r ) => { | |
| i == A.eCHROMESYNC && "sync" == r && n.Deferred.Pledge().then( () => { | |
| const n = new RegExp( e + "$" ); | |
| t && Object.keys( t ).forEach( e => { | |
| const o = t[ e ]; | |
| if ( s.logger.log( 'si: storage key "%s" in namespace "%s" changed. Old value was "%s", new value is "%s".', e, r, o.oldValue, o.newValue ), -1 != e.search( n ) ) | |
| for ( let t = 0; t < l.length; t++ ) | |
| if ( p[ e ] ); | |
| else { | |
| const r = c( o.newValue, e ); | |
| r && l[ t ]( e, r ) | |
| } | |
| } ) | |
| } ) | |
| }, | |
| o = e => { | |
| const t = Object( n.Deferred )(); | |
| let r = []; | |
| return e ? a().done( n => { | |
| r = n.filter( t => t.item && t.item.uuis == e ), t.resolve( r ) | |
| } ).fail( e => { | |
| t.reject( e ) | |
| } ) : t.resolve( r ), t.promise() | |
| }; | |
| var a = () => g( () => { | |
| const t = Object( n.Deferred )(), | |
| r = new RegExp( e + "$" ); | |
| return rea.storage.sync.get( null, e => { | |
| const n = []; | |
| e && Object.keys( e ).forEach( t => { | |
| -1 != t.search( r ) && n.push( { | |
| key: t, | |
| item: c( e[ t ], t ) | |
| } ) | |
| } ), t.resolve( n ) | |
| } ), t.promise() | |
| } ), | |
| c = ( e, t ) => { | |
| let r = null; | |
| try { | |
| r = JSON.parse( e ) | |
| } catch ( e ) {} | |
| return r && ( r.url || r.options ) ? r : ( s.logger.log( "si: unable to parse extended info of " + t ), null ) | |
| }; | |
| const u = e => e.then( e => { | |
| const t = {}; | |
| if ( ( e = e.filter( e => { | |
| if ( !t[ e.key ] ) return t[ e.key ] = !0, !0 | |
| } ) ).length > 1 ) { | |
| const t = Object( n.Deferred )(), | |
| r = [], | |
| s = e.pop(); | |
| return e.forEach( e => { | |
| r.push( m( e.key ) ) | |
| } ), n.Deferred.when( r ).done( () => { | |
| t.resolve( s ) | |
| } ), t.promise() | |
| } | |
| return n.Deferred.Pledge( e[ 0 ] ) | |
| } ); | |
| let d = null; | |
| var p = {}, | |
| m = e => { | |
| const t = Object( n.Deferred )(); | |
| return rea.storage.sync.remove( e, () => { | |
| const e = rea.runtime.lastError; | |
| e ? t.reject( e ) : t.resolve() | |
| } ), t.promise() | |
| }, | |
| f = () => { | |
| const e = Object( n.Deferred )(); | |
| return rea.storage.sync.set( p, () => { | |
| const t = rea.runtime.lastError; | |
| t ? e.reject( t ) : ( p = {}, e.resolve() ) | |
| } ), e.promise() | |
| }; | |
| return { | |
| init: function () { | |
| let o = !0; | |
| if ( !t ) try { | |
| rea.storage.onChanged.addListener( r ), t = !0 | |
| } catch ( e ) { | |
| s.logger.warn( "si: error registering sync callback: " + e.message ), o = !1 | |
| } | |
| return e = "@v2", n.Deferred.Pledge( o ) | |
| }, | |
| list: () => n.Deferred.Pledge().then( () => a() ).then( t => { | |
| const r = new RegExp( e + "$" ), | |
| s = []; | |
| return t.forEach( e => { | |
| const t = e.key, | |
| n = e.item, | |
| o = t.replace( r, "" ); | |
| let a = null; | |
| if ( a = p[ t ] ? c( p[ t ], t ) : n, !a ) return; | |
| const i = a.options || {}, | |
| A = !!i.removed; | |
| s.push( { | |
| id: o, | |
| uuid: A ? o : a.uuid, | |
| lastModified: A ? i.removed : a.lastModified, | |
| url: a.url, | |
| options: i | |
| } ) | |
| } ), n.Deferred.Pledge( s ) | |
| } ), | |
| setMeta: ( t, r ) => { | |
| const s = Object( n.Deferred )(); | |
| return u( o( t.uuid ) ).done( n => { | |
| let o, a; | |
| n ? ( o = n.key, a = n.item ) : ( o = t.uuid + e, a = {} ), a.url = t.url, a.options = t.options || {}, a.uuid = t.uuid, r.lastModified && ( a.lastModified = r.lastModified ), p[ o ] = JSON.stringify( a ), d && window.clearTimeout( d ), d = window.setTimeout( f, 3e3 ), s.resolve() | |
| } ), s.promise() | |
| }, | |
| remove: t => { | |
| const r = Object( n.Deferred )(); | |
| return u( o( t.uuid ) ).done( n => { | |
| let s, o; | |
| n ? ( s = n.key, o = n.item ) : ( s = t.uuid + e, o = {} ), o.options = o.options || {}, o.options.removed = !0, | |
| p[ s ] = JSON.stringify( o ), d && window.clearTimeout( d ), d = window.setTimeout( f, 3e3 ), r.resolve() | |
| } ), r.promise() | |
| }, | |
| reset: () => g( () => { | |
| const e = Object( n.Deferred )(); | |
| return rea.storage.sync.clear( () => { | |
| p = {}, e.resolve() | |
| } ), e.promise() | |
| } ) | |
| } | |
| } )(), | |
| m = {}; | |
| return rea.storage.sync.supported && ( m[ A.eCHROMESYNC ] = p ), m[ A.eGDRIVE ] = t, m[ A.eDROPBOX ] = r, m[ A.eONEDRIVE ] = o, m[ A.eWEBDAV ] = c, m[ A.eYANDEX ] = d, m | |
| } )(); | |
| var g = ( e, t ) => { | |
| const r = Object( n.Deferred )(); | |
| void 0 === t && ( t = 3 ); | |
| const o = () => { | |
| if ( c ) window.setTimeout( o, 500 ); | |
| else { | |
| c = !0; | |
| try { | |
| e().always( () => { | |
| c = !1 | |
| } ).done( ( function () { | |
| r.resolve.apply( this, arguments ) | |
| } ) ).fail( () => { | |
| --t > 0 ? ( s.logger.log( "si: some retries left, wait for", 6e4, "ms" ), window.setTimeout( o, 6e4 ) ) : ( s.logger.warn( "si: no retries left, skipping this sync request!" ), r.reject( "no retries left" ) ) | |
| } ) | |
| } catch ( e ) { | |
| s.logger.warn( e ), c = !1, r.reject( e ) | |
| } | |
| } | |
| }; | |
| return o(), r.promise() | |
| }; | |
| const p = { | |
| init: ( e, t ) => ( l = [], i = e, d[ i ] ? d[ i ].init( t ) : n.Deferred.Breach() ), | |
| debug: function () {}, | |
| addChangeListener: function ( e ) { | |
| l.push( e ) | |
| }, | |
| getRemoteUrl: function ( e ) { | |
| if ( d[ i ] && d[ i ].getRemoteUrl ) return d[ i ].getRemoteUrl( e ) | |
| }, | |
| getRemoteDomains: function () { | |
| if ( d[ i ] && d[ i ].getRemoteDomains ) return d[ i ].getRemoteDomains() | |
| }, | |
| caps: ( () => { | |
| const e = {}; | |
| return Object.defineProperties( e, { | |
| specialMeta: { | |
| get: function () { | |
| return d[ i ] && !!d[ i ].getMeta | |
| }, | |
| enumerable: !0 | |
| }, | |
| syncsSource: { | |
| get: function () { | |
| return d[ i ] && !!d[ i ].getSource | |
| }, | |
| enumerable: !0 | |
| } | |
| } ), e | |
| } )(), | |
| types: A | |
| }; | |
| [ "list", "setMeta", "getMeta", "setSource", "getSource", "reset", "remove" ].forEach( e => { | |
| p[ e ] = function () { | |
| return d[ i ] && d[ i ][ e ] ? d[ i ][ e ].apply( this, arguments ) : n.Deferred.Pledge() | |
| } | |
| } ); | |
| const m = e => ( a.a.init( t => { | |
| let r = Object( n.Deferred )(); | |
| const s = e.openAndWatch( { | |
| url: t.url | |
| }, e => { | |
| e ? r && r.notify( e ) : r && ( r.resolve( "tab closed" ), r = null ) | |
| } ); | |
| return { | |
| promise: r.promise(), | |
| close: function () { | |
| s.cancel() | |
| } | |
| } | |
| } ), p ), | |
| f = A | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| r.r( t ), r.d( t, "vendor", ( function () { | |
| return d | |
| } ) ), r.d( t, "getRaw", ( function () { | |
| return p | |
| } ) ), r.d( t, "require", ( function () { | |
| return g | |
| } ) ), r.d( t, "get", ( function () { | |
| return f | |
| } ) ); | |
| let n = []; | |
| const s = {}, | |
| o = {}, | |
| a = ( e, t, r ) => { | |
| var a = () => { | |
| e.every( e => !!i[ e ] ) ? r() : n.push( a ) | |
| }; | |
| ( e = "string" == typeof e ? [ e ] : e ).forEach( e => { | |
| if ( void 0 === i[ e ] && void 0 === s[ e ] ) { | |
| const r = window.setTimeout( () => { | |
| o[ e ] || ( delete s[ e ], c( e ), m( rea.extension.getURL( e + ".js" ), () => { | |
| t ? u( e, null, {} ) : console.log( "registry: finished loading " + e + ".js " ) | |
| } ) ) | |
| }, 0 ); | |
| s[ e ] = () => { | |
| window.clearTimeout( r ), delete s[ e ] | |
| } | |
| } | |
| } ), a() | |
| }; | |
| var i = {}; | |
| const A = {}, | |
| l = {}, | |
| c = e => { | |
| o[ e ] = !0 | |
| }, | |
| u = ( e, t, r, a ) => { | |
| if ( !i[ e ] || a ) { | |
| let a; | |
| A[ e ] = t, i[ e ] = r, delete o[ e ], ( a = s[ e ] ) && a(), ( () => { | |
| const e = n; | |
| for ( n = []; e.length; ) e.pop()() | |
| } )() | |
| } | |
| }, | |
| d = ( e, t ) => a( e, !0, t ), | |
| g = ( e, t ) => a( e, !1, t ), | |
| p = ( e, t ) => { | |
| let r; | |
| if ( void 0 !== ( r = l[ e ] ) ) t && t( r ); | |
| else { | |
| const n = rea.extension.getURL( e ); | |
| try { | |
| const s = new XMLHttpRequest; | |
| if ( XMLHttpRequest.onlyasync ) { | |
| if ( !t ) return void console.warn( "registry: async xhr without a callback!" ); | |
| s.open( "GET", n ), s.onload = () => { | |
| t( s.responseText ) | |
| }, s.onerror = () => { | |
| t() | |
| }, s.send( null ) | |
| } else s.open( "GET", n, !1 ), s.send( null ), r = s.responseText, r || console.warn( "registry: content of " + e + " is null!" ), t && t( r ) | |
| } catch ( e ) { | |
| console.log( "getRawContent " + e ) | |
| } | |
| } | |
| return r | |
| }, | |
| m = ( e, t ) => { | |
| let r = 1; | |
| const n = () => { | |
| 0 == --r && t && t() | |
| }; | |
| ( e = "string" == typeof e ? [ e ] : e ).forEach( e => { | |
| r++; | |
| try { | |
| rea.page.addScript( e, t => { | |
| t || console.warn( "registry: self.load " + e + " failed! " ), n() | |
| } ) | |
| } catch ( t ) { | |
| console.warn( "registry: self.load " + e + " failed! ", t ), n() | |
| } | |
| } ), n() | |
| }, | |
| f = ( e, ...t ) => { | |
| let r; | |
| const n = i[ e ]; | |
| return "function" == typeof n ? r = n.apply( void 0, t ) : n && ( r = n ), r | |
| } | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| var n = this && this.__importDefault || function ( e ) { | |
| return e && e.__esModule ? e : { | |
| default: e | |
| } | |
| }; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ); | |
| const s = r( 1 ), | |
| o = n( r( 4 ) ), | |
| a = r( 3 ), | |
| i = r( 2 ), | |
| A = n( r( 6 ) ), | |
| l = n( r( 12 ) ), | |
| c = n( r( 11 ) ), | |
| u = r( 10 ), | |
| d = window.rea, | |
| g = window.forge_sha256, | |
| p = d.FEATURES, | |
| m = c.default; | |
| let f, h; | |
| const R = u.createQueue( { | |
| threads: 1 | |
| } ), | |
| v = ( e, t ) => { | |
| const r = ( e ? e.split( "/" ) : [] ).concat( t ? [ t ] : [] ).join( "/" ); | |
| return r ? ( "/" == r.substr( 0, 1 ) ? "" : "/" ) + r : "" | |
| }, | |
| b = e => { | |
| const t = { | |
| type: e, | |
| request: e => { | |
| const t = () => { | |
| const t = s.Deferred(), | |
| r = e => { | |
| i.logger.log( "rest service: request failed", e ), t.reject( e ) | |
| }, | |
| n = "xml" === e.responseType, | |
| o = "headers" === e.responseType; | |
| return ( n || o ) && delete e.responseType, f( e, { | |
| onload: s => { | |
| if ( [ 200, 201, 204, 207 ].includes( s.status ) ) { | |
| let r; | |
| r = n ? e.anonymous || e.fetch ? ( new window.DOMParser ).parseFromString( s.responseText || "", "text/xml" ) : s.responseXML : o ? m.parseHeaders( s.responseHeaders ) : s.response, t.resolve( { | |
| result: r | |
| } ) | |
| } else r( s ) | |
| }, | |
| onerror: r, | |
| ontimeout: r, | |
| onprogress: e => t.notify( e ) | |
| }, { | |
| internal: !0 | |
| } ), t.promise() | |
| }; | |
| return e.no_queue ? t() : R.add( t ) | |
| }, | |
| error: t => { | |
| const r = t; | |
| let n; | |
| if ( void 0 !== r.status ) { | |
| n = r.status.toString(); | |
| try { | |
| n = n + " | " + r.responseText | |
| } catch ( e ) {} | |
| } else n = t; | |
| l.default.tC( e, "error", "request: " + n ) | |
| }, | |
| wait: e => ( ...t ) => e( ...t ).then( e => e, e => ( e => s.Deferred.Breach( e ? e.responseText || e.statusText : void 0 ) )( e ) ), | |
| changes: ( () => { | |
| let e; | |
| return { | |
| listen: () => ( e || ( e = s.Deferred(), t.watch && t.watch.start() ), e.promise() ), | |
| notify: t => { | |
| e.notify( t ) | |
| } | |
| } | |
| } )() | |
| }; | |
| return t | |
| }, | |
| w = e => { | |
| const t = Object.assign( {}, e ), | |
| r = t.type; | |
| if ( void 0 === r ) throw new Error( "Internal error" ); | |
| let n, i = []; | |
| const A = Object.assign( e, { | |
| ...t, | |
| config: { | |
| ...t.config, | |
| auth_prefix: "Bearer", | |
| storage_key: "" | |
| }, | |
| credentials: {}, | |
| request: e => ( e.no_auth || ( e.headers = e.headers || {}, e.headers.Authorization = A.config.auth_prefix + " " + A.credentials.access_token ), t.request( e ) ), | |
| oauth: ( () => { | |
| let e; | |
| const t = { | |
| run: () => { | |
| if ( n ) return n; | |
| let o = s.Deferred(); | |
| const i = n = o.promise(); | |
| e = "!!" + r + "-" + a.createUUID(); | |
| let c = A.credentials ? A.credentials.refresh_token : null; | |
| const u = ( e, t ) => { | |
| A.credentials = t, null == o || o.resolve(), o = void 0, e && e.close() | |
| }; | |
| return ( () => { | |
| if ( !A.config.refresh_supported || !c ) return s.Deferred.Pledge(); | |
| const e = s.Deferred(), | |
| n = () => { | |
| c = null, delete A.credentials.refresh_token | |
| }; | |
| return f( { | |
| url: t.getRefreshUrl( c ), | |
| fetch: !p.RUNTIME.SAFARI | |
| }, { | |
| onload: e => { | |
| if ( !e.finalUrl ) return l.default.tC( r, "error", "auth refresh token: !finalUrl" ), void n(); | |
| const s = t.onUrl( e.finalUrl ); | |
| s && ( s.error || !s.access_token ? ( l.default.tC( r, "error", "auth refresh token: " + ( s.error || "!access_token" ) ), n() ) : u( null, s ) ) | |
| }, | |
| onerror: n, | |
| ondone: () => e.resolve() | |
| } ), e.promise() | |
| } )().then( () => { | |
| if ( !o ) return; | |
| if ( !A.config.refresh_supported ) return s.Deferred.Pledge(); | |
| const e = s.Deferred(), | |
| n = h( { | |
| url: t.getRefreshUrl() | |
| } ); | |
| return n.promise.progress( e => { | |
| let s; | |
| o && ( s = t.onUrl( e.url ) ) && ( s.error || !s.access_token ? ( l.default.tC( r, "error", "auth refresh: " + ( s.error || "!access_token" ) ), A.config.refresh_supported = !1 ) : u( n, s ) ) | |
| } ).always( e.resolve ), e.promise() | |
| } ).then( () => { | |
| if ( !o ) return; | |
| const e = s.Deferred(), | |
| n = h( { | |
| url: t.getAuthUrl() | |
| } ); | |
| return n.promise.progress( e => { | |
| let s; | |
| o && ( s = t.onUrl( e.url ) ) && ( s.error || !s.access_token ? l.default.tC( r, "error", "auth: " + ( s.error || "!access_token" ) ) : u( n, s ) ) | |
| } ).always( e.resolve ), e.promise() | |
| } ).done( () => { | |
| n = void 0, o && o.reject( "auth_failed" ) | |
| } ), i | |
| }, | |
| getAuthUrl: () => A.config.request_uri + "?" + o.default.hash2params( { | |
| response_type: A.config.response_type, | |
| client_id: A.config.client_id, | |
| redirect_uri: A.config.redirect_uri, | |
| state: e, | |
| scope: A.config.scope | |
| } ), | |
| getRefreshUrl: t => { | |
| const r = { | |
| client_id: A.config.client_id, | |
| redirect_uri: A.config.redirect_uri, | |
| state: e, | |
| scope: A.config.scope, | |
| refresh_token: t | |
| }; | |
| return A.config.redirect_uri + "?" + o.default.hash2params( r ) | |
| }, | |
| onUrl: t => { | |
| let r, n; | |
| if ( t && 0 === t.indexOf( A.config.redirect_uri ) && ( n = o.default.parse( t ) ) && ( r = o.default.params2hash( n ) ) && ( r.access_token || r.error ) && r.state === e ) return { | |
| uid: r.uid, | |
| access_token: r.access_token, | |
| refresh_token: r.refresh_token, | |
| error: r.error | |
| } | |
| } | |
| }; | |
| return t | |
| } )(), | |
| wait: e => t.wait( ( ...t ) => { | |
| if ( A.credentials.access_token ) return e( ...t ); { | |
| const r = s.Deferred(); | |
| return i.push( () => r.consume( e( ...t ) ) ), | |
| A.oauth.run().done( () => { | |
| i.forEach( e => e() ), i = [] | |
| } ).fail( e => { | |
| r.reject( e ) | |
| } ), r.promise() | |
| } | |
| } ) | |
| } ), | |
| c = p.HTML5.LOCALSTORAGE; | |
| let u; | |
| return Object.defineProperty( A, "credentials", { | |
| get: () => { | |
| if ( void 0 === u ) { | |
| if ( l.default.tC( r, "init" ), c ) try { | |
| const e = JSON.parse( c.getItem( A.config.storage_key ) || "" ); | |
| u = { | |
| uid: e.uid, | |
| access_token: e.access_token, | |
| refresh_token: e.refresh_token | |
| } | |
| } catch ( e ) {} | |
| u = u || {} | |
| } | |
| return u | |
| }, | |
| set: e => { | |
| if ( c ) try { | |
| c.setItem( A.config.storage_key, JSON.stringify( { | |
| uid: e.uid, | |
| access_token: e.access_token, | |
| refresh_token: e.refresh_token | |
| } ) ) | |
| } catch ( e ) {} | |
| u = e | |
| }, | |
| enumerable: !1 | |
| } ), A | |
| }, | |
| k = e => { | |
| let t, r, n, A, l, c, d, g, p, m = null, | |
| f = null; | |
| const h = Object.assign( {}, e ), | |
| R = e => { | |
| var t; | |
| let r; | |
| return e && ( r = ( null === ( t = e.firstChild ) || void 0 === t ? void 0 : t.nextSibling ) ? e.firstChild.nextSibling : e.firstChild ), r | |
| }, | |
| b = e => h.wait( ( ...t ) => E.init().then( () => e( ...t ) ) ), | |
| w = ( e, t ) => { | |
| let r, n; | |
| if ( ( r = e.getElementsByTagNameNS( "*", t )[ 0 ] ) && ( n = r.firstChild ) ) return n.nodeValue || void 0 | |
| }, | |
| k = e => { | |
| const s = [], | |
| o = e.getElementsByTagNameNS( "*", "response" ); | |
| for ( let e = 0; e < o.length; e++ ) { | |
| const i = o[ e ]; | |
| let A = w( i, "href" ); | |
| if ( null == A ) continue; | |
| A = A.replace( /\/$/, "" ); | |
| const l = i.getElementsByTagNameNS( "*", "propstat" )[ 0 ].getElementsByTagNameNS( "*", "prop" )[ 0 ], | |
| c = w( l, "getlastmodified" ), | |
| u = w( l, "getetag" ), | |
| d = parseInt( w( l, "getcontentlength" ) || "" ), | |
| g = l.getElementsByTagNameNS( "*", "resourcetype" )[ 0 ].getElementsByTagNameNS( "*", "collection" )[ 0 ], | |
| p = A.replace( new RegExp( "^(" + [ a.escapeForRegExpURL( r + t ) + "/?", a.escapeForRegExpURL( n + t ) + "/?" ].join( "|" ) + ")" ), "" ); | |
| if ( g ); | |
| else { | |
| const e = { | |
| etag: u, | |
| name: p, | |
| modifiedTime: new Date( c || 0 ).getTime(), | |
| size: d >= 0 ? d : void 0, | |
| removed: -1 == d | |
| }; | |
| s.push( e ) | |
| } | |
| } | |
| return s | |
| }, | |
| _ = e => w( e, "td:cursor" ), | |
| y = ( e, t ) => { | |
| const r = t || {}; | |
| return r.set_current_list && ( l = {} ), E.request( { | |
| method: "PROPFIND", | |
| url: e, | |
| headers: { | |
| "Content-Type": "text/xml; charset=UTF-8", | |
| Depth: void 0 !== r.depth ? r.depth : 1 | |
| }, | |
| responseType: "xml" | |
| } ).then( e => { | |
| const t = e.result; | |
| let n; | |
| if ( null === t || !( n = R( t ) ) || !n.childNodes ) return s.Deferred.Breach(); | |
| const o = k( n ); | |
| if ( r.set_current_list ) { | |
| const e = _( n ); | |
| e && ( c = e ), o.forEach( e => { | |
| l[ e.name ] = e | |
| } ) | |
| } | |
| return o | |
| } ) | |
| }, | |
| E = Object.assign( e, { | |
| ...e, | |
| config: { | |
| ...e.config, | |
| watch_interval: 36e5, | |
| root: void 0, | |
| path: void 0 | |
| }, | |
| request: e => ( e.headers = e.headers || {}, e.headers[ "User-Agent" ] = "Tampermonkey", e.headers.Cookie = "", h.request( e ).then( e => e, t => { | |
| const r = t; | |
| return !r || [ 403, 500 ].includes( r.status ) ? ( e.backoff = 2 * ( e.backoff || 1e3 ), u.sleep( e.backoff ).then( () => E.request( e ) ) ) : 404 == r.status ? s.Deferred.Pledge( r ) : ( E.error( r ), s.Deferred.Breach( r ) ) | |
| } ) ), | |
| init: () => { | |
| if ( A ) return A; | |
| t = v( E.config.root, E.config.path ), | |
| r = E.config.url || "", "/" == r.slice( -1 ) && ( r = r.slice( 0, -1 ) ), n = o.default.parse( r ).pathname, "/" == n.slice( -1 ) && ( n = n.slice( 0, -1 ) ); | |
| const e = s.Deferred(); | |
| A = e.promise(); | |
| const a = r + t; | |
| return E.request( { | |
| method: "OPTIONS", | |
| url: r, | |
| responseType: "headers" | |
| } ).done( e => { | |
| const t = e.result; | |
| let r; | |
| t && ( r = t[ "access-control-allow-methods" ] ) && r.includes( "EDITOR" ) && ( p = !0 ) | |
| } ).always( () => { | |
| y( a, { | |
| depth: 0 | |
| } ).done( () => e.resolve() ).fail( () => { | |
| const n = []; | |
| s.Deferred.onebyone( t.split( "/" ).filter( e => e ).map( e => { | |
| n.push( e ); | |
| const t = n.join( "/" ); | |
| return () => E.request( { | |
| method: "MKCOL", | |
| url: r + "/" + t, | |
| headers: { | |
| "Content-Type": "text/xml; charset=UTF-8" | |
| }, | |
| responseType: "xml" | |
| } ) | |
| } ) ).done( () => e.resolve() ).fail( e.reject ) | |
| } ) | |
| } ), A | |
| }, | |
| list: b( e => y( r + t, { | |
| set_current_list: !0 | |
| } ).then( t => { | |
| const r = {}; | |
| return t.map( t => { | |
| if ( !e ) { | |
| if ( r[ t.name ] ) return; | |
| r[ t.name ] = !0 | |
| } | |
| return { | |
| name: t.name, | |
| size: t.size || 0, | |
| etag: t.etag, | |
| modified: t.modifiedTime, | |
| precision: 1e3, | |
| removed: t.removed | |
| } | |
| } ).filter( e => e ) | |
| } ) ), | |
| get: b( e => { | |
| const n = e.name || e; | |
| return E.request( { | |
| method: "GET", | |
| url: r + v( t, n ), | |
| headers: { | |
| "Content-Type": "text/xml; charset=UTF-8" | |
| }, | |
| responseType: "arraybuffer" | |
| } ).then( e => { | |
| const t = e.result; | |
| return new Blob( [ t ] ) | |
| } ) | |
| } ), | |
| put: b( ( e, n, s ) => { | |
| const o = e.name || e; | |
| let a, A, l; | |
| const c = { | |
| "Content-Type": "application/octet-stream" | |
| }, | |
| u = null === f; | |
| return s && s.lastModified && ( a = s.lastModified, l = new Date( s.lastModified ).toISOString(), A = s.lastModified / 1e3, ( f || u ) && ( c[ "X-OC-Mtime" ] = A ) ), E.request( { | |
| method: "PUT", | |
| url: r + v( t, o ), | |
| headers: c, | |
| data_type: "typified", | |
| data: { | |
| type: "raw", | |
| value: n | |
| }, | |
| responseType: "headers" | |
| } ).then( e => { | |
| const n = e.result; | |
| if ( n && u ) { | |
| let e; | |
| f = !( "accepted" != n[ "x-oc-mtime" ] && ( !n.date || !( e = new Date( n.date ).getTime() ) || e != a && e != Math.floor( A ) ) ) | |
| } | |
| if ( !f && !m && l ) return E.request( { | |
| method: "PROPPATCH", | |
| url: r + v( t, o ), | |
| headers: { | |
| "Content-Type": "text/xml; charset=UTF-8" | |
| }, | |
| responseType: "xml", | |
| data: [ `<?xml version="1.0"?>\n <d:propertyupdate xmlns:d="DAV:">\n <d:set>\n <d:prop>\n <d:getlastmodified>${l}</d:getlastmodified>\n </d:prop>\n </d:set>\n </d:propertyupdate>` ].join( "" ) | |
| } ).then( e => { | |
| var t; | |
| const r = e.result; | |
| let n, s, o; | |
| r && ( n = r.childNodes[ 0 ] ) && ( s = n.getElementsByTagNameNS( "*", "status" )[ 0 ] ) && ( o = null === ( t = s.firstChild ) || void 0 === t ? void 0 : t.nodeValue ) && -1 != o.search( /HTTP\/[0-9\.]+ 403/ ) && ( i.logger.warn( "WebDAV: no way to set file modification date! This might cause redundant up and downloads." ), m = !0 ) | |
| }, () => { | |
| i.logger.warn( "WebDAV: no way to set file modification date! This might cause redundant up and downloads." ), m = !0 | |
| } ) | |
| } ) | |
| } ), | |
| delete: b( e => { | |
| const n = e.name || e; | |
| return E.request( { | |
| method: "DELETE", | |
| url: r + v( t, n ), | |
| headers: { | |
| "Content-Type": "text/xml; charset=UTF-8" | |
| } | |
| } ) | |
| } ), | |
| watch: { | |
| start: () => { | |
| if ( d ) return; | |
| d = !0; | |
| let e = null; | |
| const n = () => { | |
| if ( g = void 0, d ) | |
| if ( !1 === e ) { | |
| const e = l; | |
| y( r + t, { | |
| set_current_list: !0 | |
| } ).then( () => { | |
| e && ( Object.keys( e ).forEach( t => { | |
| const r = l[ t ], | |
| n = e[ t ]; | |
| r ? n.modifiedTime != r.modifiedTime && h.changes.notify( { | |
| time: r.modifiedTime, | |
| name: r.name | |
| } ) : h.changes.notify( { | |
| time: Date.now(), | |
| name: n.name, | |
| removed: !0 | |
| } ) | |
| } ), Object.keys( l ).forEach( t => { | |
| if ( !e[ t ] ) { | |
| const e = l[ t ]; | |
| h.changes.notify( { | |
| time: e.modifiedTime, | |
| name: e.name | |
| } ) | |
| } | |
| } ) ) | |
| } ).fail( e => { | |
| i.logger.warn( "WebDAV: file changes check failed", e ) | |
| } ).always( () => { | |
| g = window.setTimeout( n, E.config.watch_interval ) | |
| } ) | |
| } else { | |
| let o = 100; | |
| ( ( e, t ) => { | |
| const r = { | |
| "Content-Type": "text/xml; charset=UTF-8", | |
| Depth: 1, | |
| Timeout: 90 | |
| }; | |
| return t && ( r.Cursor = t ), E.request( { | |
| method: "SUBSCRIBE", | |
| url: e, | |
| headers: r, | |
| responseType: "xml", | |
| no_queue: !0 | |
| } ).then( e => { | |
| const t = e.result; | |
| let r; | |
| return null === t ? s.Deferred.Pledge( { | |
| changes: [], | |
| cursor: c | |
| } ) : ( r = R( t ) ) && r.childNodes ? { | |
| changes: k( r ), | |
| cursor: _( r ) | |
| } : s.Deferred.Breach() | |
| } ) | |
| } )( r + t, c ).then( e => { | |
| const t = e.changes; | |
| c = e.cursor, o = 1, t.forEach( e => { | |
| h.changes.notify( { | |
| time: e.modifiedTime, | |
| name: e.name, | |
| removed: e.removed | |
| } ) | |
| } ) | |
| }, () => { | |
| if ( null !== e ) return o *= 2, u.sleep( o ); | |
| e = !1 | |
| } ).always( n ) | |
| } | |
| }; | |
| b( () => d ? ( n(), s.Deferred.Pledge() ) : s.Deferred.Breach() )() | |
| }, | |
| stop: () => { | |
| d = !1, g && ( window.clearTimeout( g ), g = void 0 ) | |
| } | |
| }, | |
| getRemoteUrl: e => { | |
| if ( p ) return r + v( t, e ) + "?method=editor#bypass=true" | |
| }, | |
| getRemoteDomains: () => [ o.default.parse( r ).origin.replace( /^.*:\/\//, "" ) ] | |
| } ); | |
| return E | |
| }, | |
| _ = { | |
| init: e => { | |
| h = e, f = m.run | |
| }, | |
| drive: () => { | |
| let e, t; | |
| ( e = p.HTML5.LOCALSTORAGE ) && ( t = parseInt( e.getItem( "dropbox_poll_interval" ) || "" ) ) || ( t = 18e5 ); | |
| const r = w( b( "drive" ) ), | |
| n = Object.assign( {}, r ), | |
| l = "appDataFolder"; | |
| let c, d; | |
| const g = Object.assign( r, { | |
| ...r, | |
| config: { | |
| ...r.config, | |
| redirect_uri: "https://auth.tampermonkey.net/oauth.php", | |
| refresh_supported: !0, | |
| request_uri: "https://accounts.google.com/o/oauth2/v2/auth", | |
| client_id: "408438522028-3cgn3t3jas3fak7isbnfod1q4h15g2fv.apps.googleusercontent.com", | |
| storage_key: "gd_config", | |
| scope: "https://www.googleapis.com/auth/drive.appdata", | |
| response_type: "token", | |
| watch_interval: t | |
| }, | |
| request: e => n.request( e ).then( e => e, t => { | |
| if ( !t || [ 403, 500 ].includes( t.status ) ) return e.backoff = 2 * ( e.backoff || 1e3 ), u.sleep( e.backoff ).then( () => g.request( e ) ); | |
| if ( [ 400, 401 ].includes( t.status ) ) { | |
| if ( i.logger.warn( "Google Drive: authentication error", t ), delete g.credentials.access_token, !e.retry_auth ) return e.retry_auth = !0, g.oauth.run().then( () => g.request( e ) ) | |
| } else if ( 404 == t.status ) return s.Deferred.Pledge( t ); | |
| return g.error( t ), s.Deferred.Breach( t ) | |
| } ), | |
| list: n.wait( e => { | |
| let t = []; | |
| const r = s.Deferred(), | |
| n = e => "https://www.googleapis.com/drive/v3/files?" + o.default.hash2params( { | |
| spaces: l, | |
| pageToken: e, | |
| orderBy: "modifiedTime desc", | |
| fields: "nextPageToken, files(id, size, name, modifiedTime, md5Checksum)", | |
| pageSize: 500 | |
| } ), | |
| a = e => { | |
| g.request( { | |
| method: "GET", | |
| url: e, | |
| headers: { | |
| "Content-Type": "application/json" | |
| } | |
| } ).then( e => { | |
| const s = e.result, | |
| o = s ? JSON.parse( s ) : { | |
| files: [] | |
| }; | |
| if ( t = t.concat( o.files ), | |
| o.nextPageToken ) return a( n( o.nextPageToken ) ); | |
| r.resolve( t ) | |
| } ) | |
| }; | |
| return a( n() ), r.promise().then( t => { | |
| const r = {}; | |
| return t.map( t => { | |
| if ( !e ) { | |
| if ( r[ t.name ] ) return; | |
| r[ t.name ] = !0 | |
| } | |
| return { | |
| name: t.name, | |
| size: t.size || 0, | |
| id: t.id, | |
| md5: t.md5Checksum, | |
| modified: new Date( t.modifiedTime ).getTime() | |
| } | |
| } ).filter( e => e ) | |
| } ) | |
| } ), | |
| get: n.wait( e => { | |
| const t = e.id || e; | |
| return g.request( { | |
| method: "GET", | |
| url: "https://www.googleapis.com/drive/v3/files/" + t + "?" + o.default.hash2params( { | |
| spaces: l, | |
| alt: "media" | |
| } ), | |
| responseType: "arraybuffer" | |
| } ).then( e => { | |
| const t = e.result; | |
| return new Blob( [ t ] ) | |
| } ) | |
| } ), | |
| put: n.wait( ( e, t, r ) => { | |
| const n = e, | |
| i = n.name || e, | |
| c = n.id, | |
| u = a.createUUID(); | |
| return s.Deferred.Pledge().then( () => { | |
| if ( t ) return A.default.blob2str( t ) | |
| } ).then( e => { | |
| const t = r && r.lastModified ? new Date( r.lastModified ).toISOString() : void 0, | |
| n = []; | |
| return n.push( "--" + u ), n.push( "Content-Type: application/json" ), n.push( "" ), n.push( JSON.stringify( { | |
| name: i, | |
| parents: c ? void 0 : [ l ], | |
| modifiedTime: t | |
| } ) ), n.push( "--" + u ), e && ( n.push( "Content-Type: application/octet-stream" ), | |
| n.push( "Content-Transfer-Encoding: base64" ), n.push( "" ), n.push( A.default.Base64.encode( e ) ), n.push( "--" + u + "--" ) ), n.push( "" ), g.request( { | |
| method: c || !e ? "PATCH" : "POST", | |
| url: "https://www.googleapis.com/" + ( e ? "upload/" : "" ) + "drive/v3/files" + ( c ? "/" + c : "" ) + "?" + o.default.hash2params( { | |
| uploadType: "multipart" | |
| } ), | |
| headers: { | |
| "Content-Type": "multipart/related; boundary=" + u | |
| }, | |
| data: n.join( "\r\n" ) | |
| } ) | |
| } ) | |
| } ), | |
| delete: n.wait( e => { | |
| const t = e.id || e; | |
| return g.request( { | |
| method: "DELETE", | |
| url: "https://www.googleapis.com/drive/v3/files/" + t + "?" + o.default.hash2params( { | |
| spaces: l | |
| } ), | |
| headers: { | |
| "Content-Type": " application/json" | |
| } | |
| } ) | |
| } ), | |
| revoke: n.wait( () => { | |
| const e = g.credentials.access_token; | |
| return e ? n.request( { | |
| method: "GET", | |
| url: "https://accounts.google.com/o/oauth2/revoke?" + o.default.hash2params( { | |
| token: e | |
| } ) | |
| } ) : s.Deferred.Breach() | |
| } ), | |
| compare: ( e, t ) => { | |
| const r = s.Deferred(); | |
| let n; | |
| return ( n = e.md5 ) && n == A.default.MD5( t, "utf-8" ) ? r.resolve( !0 ) : r.resolve( !1 ), r.promise() | |
| }, | |
| watch: { | |
| start: () => { | |
| if ( c ) return; | |
| let e; | |
| c = !0; | |
| const t = () => { | |
| d = null, c && g.request( { | |
| method: "GET", | |
| url: "https://www.googleapis.com/drive/v3/changes/?" + o.default.hash2params( { | |
| pageToken: e, | |
| spaces: "appDataFolder", | |
| pageSize: 1e3, | |
| includeRemoved: !0 | |
| } ), | |
| headers: { | |
| "Content-Type": " application/json" | |
| } | |
| } ).then( t => { | |
| const r = t.result; | |
| if ( !c ) return s.Deferred.Breach(); | |
| const n = r ? JSON.parse( r ) : {}; | |
| if ( !( e = n.newStartPageToken ) ) return i.logger.warn( "Google Drive: watch token error", r ), g.watch.stop(); | |
| n.nextPageToken && i.logger.warn( "Google Drive: too much changes", r ), | |
| ( n.changes || [] ).forEach( e => { | |
| let t; | |
| const r = e.file; | |
| "file" === e.type && r && ( t = Date.parse( e.time ), isNaN( t ) && ( t = Date.now() ), g.changes.notify( { | |
| id: r.id, | |
| time: t, | |
| name: r.name, | |
| removed: e.removed | |
| } ) ) | |
| } ) | |
| } ).fail( e => { | |
| i.logger.warn( "Google Drive: file changes check failed", e ) | |
| } ).always( () => { | |
| d = window.setTimeout( t, g.config.watch_interval ) | |
| } ) | |
| }; | |
| n.wait( () => c ? g.request( { | |
| method: "GET", | |
| url: "https://www.googleapis.com/drive/v3/changes/startPageToken", | |
| headers: { | |
| "Content-Type": " application/json" | |
| } | |
| } ).then( r => { | |
| const n = r.result, | |
| s = n ? JSON.parse( n ) : {}; | |
| if ( !( e = s.startPageToken ) ) return i.logger.warn( "Google Drive: watch token error", n ), g.watch.stop(); | |
| t() | |
| } ) : s.Deferred.Breach() )() | |
| }, | |
| stop: () => { | |
| c = !1, d && ( window.clearTimeout( d ), d = null ) | |
| } | |
| } | |
| } ); | |
| return g | |
| }, | |
| dropbox: e => { | |
| const t = e.path || "", | |
| r = p.HTML5.LOCALSTORAGE; | |
| let n; | |
| r && ( n = parseInt( r.getItem( "dropbox_poll_interval" ) || "" ) ) || ( n = 18e5 ); | |
| const o = w( b( "dropbox" ) ), | |
| a = Object.assign( {}, o ); | |
| let l, c, g, m, f = !0; | |
| const h = e => { | |
| let r = []; | |
| const n = s.Deferred(), | |
| o = e => { | |
| R.request( { | |
| method: "POST", | |
| url: "https://api.dropboxapi.com/2/files/list_folder" + ( e ? "/continue" : "" ), | |
| headers: { | |
| "Content-Type": " application/json" | |
| }, | |
| data: { | |
| path: e ? void 0 : v( t ), | |
| cursor: e | |
| } | |
| } ).then( e => { | |
| const t = e.result, | |
| s = t ? JSON.parse( t ) : { | |
| entries: [] | |
| }; | |
| if ( r = r.concat( s.entries ), s.has_more && s.cursor ) return o( s.cursor ); | |
| n.resolve( { | |
| list: r, | |
| cursor: s.cursor | |
| } ) | |
| } ).fail( n.reject ) | |
| }; | |
| return f ? ( f = !1, R.put( ".version", new Blob( [ d.extension.manifest.version ] ) ).then( () => { | |
| o( e ) | |
| } ).fail( n.reject ) ) : o( e ), n.promise() | |
| }, | |
| R = Object.assign( o, { | |
| ...o, | |
| config: { | |
| ...o.config, | |
| redirect_uri: "https://auth.tampermonkey.net/oauth.php", | |
| request_uri: "https://www.dropbox.com/oauth2/authorize", | |
| client_id: "gq3auc9yym0e21y", | |
| storage_key: "db_config", | |
| response_type: "token", | |
| watch_interval: n ? Number( n ) : 0 | |
| }, | |
| request: e => a.request( e ).then( e => e, t => !t || [ 500, 429 ].includes( t.status ) ? ( e.backoff = 2 * ( e.backoff || 1e3 ), u.sleep( e.backoff ).then( () => R.request( e ) ) ) : [ 401 ].includes( t.status ) && ( i.logger.warn( "Dropbox: authentication error", t ), delete R.credentials.access_token, !e.retry_auth ) ? ( e.retry_auth = !0, | |
| R.oauth.run().then( () => R.request( e ) ) ) : ( R.error( t ), s.Deferred.Breach( t ) ) ), | |
| list: a.wait( e => h().then( t => { | |
| const r = {}; | |
| return c = t.cursor, t.list.map( t => { | |
| if ( !e ) { | |
| if ( r[ t.name ] ) return; | |
| r[ t.name ] = !0 | |
| } | |
| return { | |
| name: t.name, | |
| size: t.size, | |
| dropbox_hash: t.content_hash, | |
| modified: new Date( t.client_modified ).getTime(), | |
| precision: 1e3 | |
| } | |
| } ).filter( e => e ) | |
| } ).always( () => { | |
| l && c && ( l(), l = null ) | |
| } ) ), | |
| get: a.wait( e => { | |
| const r = e.name || e; | |
| return R.request( { | |
| method: "POST", | |
| url: "https://content.dropboxapi.com/2/files/download", | |
| headers: { | |
| "Dropbox-API-Arg": JSON.stringify( { | |
| path: v( t, r ) | |
| } ) | |
| }, | |
| responseType: "arraybuffer" | |
| } ).then( e => { | |
| const t = e.result; | |
| return new Blob( [ t ] ) | |
| } ) | |
| } ), | |
| put: a.wait( ( e, r, n ) => { | |
| const s = e.name || e, | |
| o = n && n.lastModified ? ( new Date( n.lastModified ).toISOString().match( /[^:]*:[^:]*:[^:.a-zA_Z]*/ ) || "" )[ 0 ] + "Z" : void 0; | |
| return R.request( { | |
| method: "POST", | |
| url: "https://content.dropboxapi.com/2/files/upload", | |
| headers: { | |
| "Dropbox-API-Arg": JSON.stringify( { | |
| path: v( t, s ), | |
| client_modified: o, | |
| mode: "overwrite" | |
| } ), | |
| "Content-Type": "application/octet-stream" | |
| }, | |
| data_type: "typified", | |
| data: { | |
| type: "raw", | |
| value: r | |
| } | |
| } ) | |
| } ), | |
| delete: a.wait( e => { | |
| const r = e.name || e; | |
| return R.request( { | |
| method: "POST", | |
| url: "https://api.dropboxapi.com/2/files/delete", | |
| headers: { | |
| "Content-Type": " application/json" | |
| }, | |
| data: { | |
| path: v( t, r ) | |
| } | |
| } ) | |
| } ), | |
| compare: ( e, t ) => { | |
| const r = s.Deferred(); | |
| if ( window.crypto && window.ArrayBuffer ) { | |
| const n = 4194304, | |
| s = A.default.str2abSync( t, { | |
| encoding: "utf-8" | |
| } ), | |
| o = [], | |
| a = s.byteLength; | |
| let l = 1; | |
| const c = ( e, t ) => { | |
| const r = new Uint8Array( e.byteLength + t.byteLength ); | |
| return r.set( new Uint8Array( e ), 0 ), | |
| r.set( new Uint8Array( t ), e.byteLength ), r.buffer | |
| }, | |
| u = () => { | |
| if ( 0 == --l ) { | |
| let t = new window.ArrayBuffer( o.map( e => ( null == e ? void 0 : e.byteLength ) || 0 ).reduce( ( e, t ) => e + t, 0 ) ); | |
| o.forEach( e => { | |
| e && ( t = c( t, e ) ) | |
| } ), window.crypto.subtle.digest( "SHA-256", t ).then( t => { | |
| const n = Array.from( new Uint8Array( t ) ).map( e => ( "00" + e.toString( 16 ) ).slice( -2 ) ).join( "" ); | |
| r.resolve( n == e.dropbox_hash ) | |
| } ) | |
| } | |
| }; | |
| for ( let e = 0, t = 0; t < a; t += n, e++ )( e => { | |
| o.push( null ), l++, window.crypto.subtle.digest( "SHA-256", s.slice( t, t + Math.min( n, a - t ) ) ).then( t => { | |
| o[ e ] = t, u() | |
| }, () => { | |
| i.logger.warn( "Dropbox: unable to calculate SHA-256 hashes" ), r.reject() | |
| } ) | |
| } )( e ); | |
| u() | |
| } else i.logger.warn( "Dropbox: unable to calculate SHA-256 hashes" ), r.reject(); | |
| return r.promise() | |
| }, | |
| watch: { | |
| start: () => { | |
| if ( g ) return; | |
| g = !0; | |
| let e = 0; | |
| const t = () => { | |
| if ( m = null, e = 0, g ) return c ? void R.request( { | |
| method: "POST", | |
| url: "https://notify.dropboxapi.com/2/files/list_folder/longpoll", | |
| headers: { | |
| "Content-Type": " application/json" | |
| }, | |
| no_auth: !0, | |
| no_queue: !0, | |
| data: { | |
| cursor: c, | |
| timeout: 180 | |
| } | |
| } ).then( t => { | |
| const r = t.result; | |
| if ( !g ) return s.Deferred.Breach(); | |
| const n = r ? JSON.parse( r ) : {}; | |
| return n.backoff && ( e = 1e3 * n.backoff ), n.changes ? u.sleep( 6e4 ).then( () => h( c ) ).then( e => ( c = e.cursor ) ? e.list : ( i.logger.warn( "Dropbox: watch token error", r ), R.watch.stop() ) ) : null | |
| } ).then( e => { | |
| e && e.forEach( e => { | |
| let t; | |
| const r = e[ ".tag" ]; | |
| [ "file", "deleted" ].includes( r ) && ( t = Date.parse( e.server_modified ), R.changes.notify( { | |
| id: e.id, | |
| time: t, | |
| name: e.name, | |
| removed: "deleted" == r | |
| } ) ) | |
| } ) | |
| } ).fail( e => { | |
| i.logger.warn( "Dropbox: file changes check failed", e ) | |
| } ).always( () => { | |
| m = window.setTimeout( t, e + R.config.watch_interval ) | |
| } ) : ( i.logger.warn( "Dropbox: watch token error", c ), R.watch.stop() ) | |
| }; | |
| a.wait( () => g ? ( c ? t() : l = t, s.Deferred.Pledge() ) : s.Deferred.Breach() )() | |
| }, | |
| stop: () => { | |
| g = !1, m && ( window.clearTimeout( m ), m = null ) | |
| } | |
| }, | |
| getRemoteDomains: () => [ "dropbox.com", "dropboxapi.com" ] | |
| } ); | |
| return R | |
| }, | |
| onedrive: e => { | |
| const t = e.path || ""; | |
| let r, n, o; | |
| ( r = p.HTML5.LOCALSTORAGE ) && ( n = parseInt( r.getItem( "onedrive_poll_interval" ) || "" ) ) || ( n = 18e5 ); | |
| const a = w( b( "onedrive" ) ), | |
| A = Object.assign( {}, a ); | |
| let l, c; | |
| const d = e => { | |
| const r = s.Deferred(); | |
| let n = []; | |
| const a = s => { | |
| g.request( { | |
| method: "GET", | |
| url: s || "https://api.onedrive.com/v1.0/drive/special/approot:" + v( t ) + ":/children", | |
| headers: { | |
| "Content-Type": " application/json" | |
| } | |
| } ).then( t => { | |
| const s = t.result, | |
| i = s ? JSON.parse( s ) : { | |
| value: [] | |
| }; | |
| if ( n = n.concat( i.value.map( e => { | |
| var t, r, n; | |
| const s = ( null === ( t = null == e ? void 0 : e.fileSystemInfo ) || void 0 === t ? void 0 : t.lastModifiedDateTime ) || 0, | |
| o = ( null === ( n = null === ( r = null == e ? void 0 : e.file ) || void 0 === r ? void 0 : r.hashes ) || void 0 === n ? void 0 : n.sha1Hash ) || void 0; | |
| return { | |
| id: e.id, | |
| name: e.name, | |
| size: e.size, | |
| sha1: o, | |
| modified: new Date( s ).getTime() | |
| } | |
| } ) ), i[ "@odata.nextLink" ] ) return a( i[ "@odata.nextLink" ] ); | |
| e.set_current_list && ( o = n ), r.resolve( n ) | |
| } ) | |
| }; | |
| return a(), r.promise() | |
| }, | |
| g = Object.assign( a, { | |
| ...a, | |
| config: { | |
| ...a.config, | |
| redirect_uri: "https://auth.tampermonkey.net/oauth.php", | |
| request_uri: "https://login.live.com/oauth20_authorize.srf", | |
| client_id: "000000004C1A3122", | |
| storage_key: "od_config", | |
| response_type: "token", | |
| scope: "onedrive.appfolder", | |
| watch_interval: n | |
| }, | |
| getRemoteDomains: () => [ "onedrive.live.com" ], | |
| request: e => A.request( e ).then( e => e, t => { | |
| if ( !t || [ 403, 500 ].includes( t.status ) ) return e.backoff = 2 * ( e.backoff || 1e3 ), u.sleep( e.backoff ).then( () => g.request( e ) ); | |
| if ( [ 401 ].includes( t.status ) ) { | |
| if ( i.logger.warn( "OneDrive: authentication error", t ), delete g.credentials.access_token, !e.retry_auth ) return e.retry_auth = !0, g.oauth.run().then( () => g.request( e ) ) | |
| } else if ( 404 == t.status ) return s.Deferred.Pledge( t ); | |
| return g.error( t ), s.Deferred.Breach( t ) | |
| } ), | |
| list: A.wait( () => d( { | |
| set_current_list: !0 | |
| } ) ), | |
| get: A.wait( e => { | |
| const r = e.name || e; | |
| return g.request( { | |
| method: "GET", | |
| url: "https://api.onedrive.com/v1.0/drive/special/approot:" + v( t, encodeURIComponent( r ) ) + ":/content", | |
| responseType: "arraybuffer" | |
| } ).then( e => { | |
| const t = e.result; | |
| return new Blob( [ t ] ) | |
| } ) | |
| } ), | |
| put: A.wait( ( e, r, n ) => { | |
| const s = e.name || e, | |
| o = encodeURIComponent( s.replace( /[#%<>:"|\?\*\/\\]/g, "-" ) ); | |
| return g.request( { | |
| method: "PUT", | |
| url: "https://api.onedrive.com/v1.0/drive/special/approot:" + v( t, o ) + ":/content", | |
| headers: { | |
| "Content-Type": "application/octet-stream" | |
| }, | |
| data_type: "typified", | |
| data: { | |
| type: "raw", | |
| value: r | |
| } | |
| } ).then( e => { | |
| const t = n && n.lastModified ? new Date( n.lastModified ).toISOString() : void 0; | |
| if ( !t ) return e; | |
| const r = e.result, | |
| s = JSON.parse( r ); | |
| return g.request( { | |
| method: "PATCH", | |
| url: "https://api.onedrive.com/v1.0/drive/items/" + s.id, | |
| headers: { | |
| "Content-Type": "application/json" | |
| }, | |
| data: JSON.stringify( { | |
| fileSystemInfo: { | |
| lastModifiedDateTime: t | |
| } | |
| } ) | |
| } ) | |
| } ) | |
| } ), | |
| delete: A.wait( e => { | |
| const r = e.name || e; | |
| return g.request( { | |
| method: "DELETE", | |
| url: "https://api.onedrive.com/v1.0/drive/special/approot:" + v( t, encodeURIComponent( r ) ) | |
| } ) | |
| } ), | |
| watch: { | |
| start: () => { | |
| if ( l ) return; | |
| l = !0; | |
| const e = () => { | |
| if ( c = null, !l ) return; | |
| const t = o; | |
| d( { | |
| set_current_list: !0 | |
| } ).then( () => { | |
| if ( !t ) return; | |
| const e = {}, | |
| r = {}; | |
| o.forEach( t => { | |
| e[ t.id ] = t | |
| } ), t.forEach( e => { | |
| r[ e.id ] = e | |
| } ), Object.keys( r ).forEach( t => { | |
| const n = e[ t ], | |
| s = r[ t ]; | |
| n ? s.modified != n.modified && g.changes.notify( { | |
| time: n.modified, | |
| name: n.name | |
| } ) : g.changes.notify( { | |
| time: Date.now(), | |
| name: s.name, | |
| removed: !0 | |
| } ) | |
| } ), Object.keys( e ).forEach( t => { | |
| if ( !r[ t ] ) { | |
| const r = e[ t ]; | |
| g.changes.notify( { | |
| time: r.modified, | |
| name: r.name | |
| } ) | |
| } | |
| } ) | |
| } ).fail( e => { | |
| i.logger.warn( "OneDrive: file changes check failed", e ) | |
| } ).always( () => { | |
| c = window.setTimeout( e, g.config.watch_interval ) | |
| } ) | |
| }; | |
| A.wait( () => l ? ( e(), | |
| s.Deferred.Pledge() ) : s.Deferred.Breach() )() | |
| }, | |
| stop: () => { | |
| l = !1, c && ( window.clearTimeout( c ), c = null ) | |
| } | |
| } | |
| } ); | |
| return g | |
| }, | |
| yandex: () => { | |
| let e, t; | |
| ( e = p.HTML5.LOCALSTORAGE ) && ( t = parseInt( e.getItem( "yandex_poll_interval" ) || "" ) ) || ( t = 18e5 ); | |
| const r = w( b( "yandex" ) ), | |
| n = k( r ), | |
| o = Object.assign( {}, n ); | |
| let a; | |
| const l = Object.assign( n, { | |
| ...r, | |
| ...n, | |
| config: { | |
| ...n.config, | |
| root: "/Programs/Tampermonkey", | |
| url: "https://webdav.yandex.ru", | |
| redirect_uri: "https://auth.tampermonkey.net/oauth.php", | |
| refresh_supported: !0, | |
| request_uri: "https://oauth.yandex.com/authorize", | |
| client_id: "a591fcd2ccd248f0baa84222898065f4", | |
| storage_key: "ya_config", | |
| response_type: "token", | |
| auth_prefix: "OAuth", | |
| watch_interval: t | |
| }, | |
| init: () => { | |
| if ( a ) return a; | |
| const e = s.Deferred(); | |
| return a = e.promise(), l.request( { | |
| method: "GET", | |
| url: "https://cloud-api.yandex.net/v1/disk/" | |
| } ).done( e => { | |
| const t = e.result, | |
| r = t ? JSON.parse( t ) : {}; | |
| r.total_space && r.used_space && ( r.used_space + 5e7 > r.total_space ? i.logger.warn( "Yandex: low disk space warning, only " + ( r.total_space - r.used_space ) + " bytes available" ) : i.logger.log( "Yandex: " + ( r.total_space - r.used_space ) + " bytes on disk available!" ) ) | |
| } ).always( () => { | |
| e.consume( o.init() ) | |
| } ), a | |
| }, | |
| getRemoteDomains: () => [ "disk.yandex.com" ], | |
| list: e => o.list( e ).then( e => e.map( e => ( e.md5 = e.etag, e ) ) ), | |
| request: e => ( () => { | |
| const t = e.headers = e.headers || {}; | |
| if ( t[ "X-Requested-With" ] = "XMLHttpRequest", | |
| g && "PUT" == e.method && e.data && "raw" == e.data.type && e.data.value ) { | |
| const r = s.Deferred(); | |
| return A.default.blob2str( e.data.value ).then( e => { | |
| t.Etag = A.default.MD5( e ), t.Sha256 = g( e, "ASCII" ) | |
| } ).always( r.resolve ), r.promise() | |
| } | |
| return s.Deferred.Pledge() | |
| } )().then( () => o.request( e ).then( e => e, t => t && [ 401 ].includes( t.status ) && ( i.logger.warn( "Yandex: authentication error", t ), delete l.credentials.access_token, !e.retry_auth ) ? ( e.retry_auth = !0, l.oauth.run().then( () => o.request( e ) ) ) : t ) ), | |
| compare: ( e, t ) => { | |
| const r = s.Deferred(); | |
| let n; | |
| return ( n = e.md5 ) && n == A.default.MD5( t, "utf-8" ) ? r.resolve( !0 ) : r.resolve( !1 ), r.promise() | |
| } | |
| } ); | |
| return l | |
| }, | |
| webdav: e => { | |
| let t, r; | |
| ( t = p.HTML5.LOCALSTORAGE ) && ( r = parseInt( t.getItem( "webdav_poll_interval" ) || "" ) ) || ( r = 18e5 ); | |
| const n = e.url; | |
| if ( n ) { | |
| const t = n.toLowerCase(); | |
| t.startsWith( "webdav" ) ? e.url = n.replace( /^webdav/i, "http" ) : t.startsWith( "http" ) || ( e.url = "http://" + n ) | |
| } | |
| const o = k( ( e => { | |
| const t = Object.assign( {}, e ), | |
| r = t.type; | |
| if ( void 0 === r ) throw new Error( "Internal error" ); | |
| const n = Object.assign( e, { | |
| ...t, | |
| config: { | |
| ...t.config | |
| }, | |
| credentials: {}, | |
| request: e => n.credentials.basic_auth ? ( e.no_auth || ( e.headers = e.headers || {}, e.headers.Authorization = "Basic " + n.credentials.basic_auth ), t.request( e ) ) : s.Deferred.Breach( "Authentication failed" ), | |
| wait: e => t.wait( ( ...t ) => e( ...t ) ) | |
| } ); | |
| let o; | |
| return Object.defineProperty( n, "credentials", { | |
| get: () => ( void 0 === o && ( l.default.tC( r, "init" ), o = { | |
| basic_auth: n.config.basic_auth | |
| } ), o ), | |
| set: e => { | |
| o = e | |
| }, | |
| enumerable: !1 | |
| } ), n | |
| } )( b( "webdav" ) ) ); | |
| return Object.assign( o, { | |
| ...o, | |
| config: { | |
| ...o.config, | |
| root: "Tampermonkey", | |
| watch_interval: r, | |
| ...e | |
| } | |
| } ) | |
| } | |
| }; | |
| t.default = _ | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| var n = this && this.__importDefault || function ( e ) { | |
| return e && e.__esModule ? e : { | |
| default: e | |
| } | |
| }; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), t.Notify = void 0; | |
| const s = r( 1 ), | |
| o = r( 3 ), | |
| a = r( 2 ), | |
| i = n( r( 32 ) ), | |
| A = window.rea, | |
| l = A.FEATURES, | |
| c = window.webkitNotifications, | |
| u = ( () => { | |
| const e = {}; | |
| let t, r = null; | |
| return { | |
| create: ( n, i, c, u ) => { | |
| let d = 0; | |
| return ( () => { | |
| if ( t ) return t; | |
| const n = s.Deferred(), | |
| o = e => { | |
| r = e || "unknown", | |
| a.logger.log( "notify: chronos level", e ), n.resolve() | |
| }; | |
| return A.notifications.supported ? ( A.notifications.getPermissionLevel( o ), A.notifications.onPermissionLevelChanged.addListener( o ), A.notifications.onClicked.addListener( t => { | |
| a.logger.log( "notify: chronos click", t ); | |
| const r = e[ t ]; | |
| if ( !r ) return; | |
| const n = r.cb; | |
| n && n.click && n.click(), r.cancel(), delete e[ t ] | |
| } ), A.notifications.onClosed.addListener( t => { | |
| a.logger.log( "notify: chronos close", t ); | |
| const r = e[ t ]; | |
| if ( !r ) return; | |
| const n = r.cb; | |
| n && n.close && n.close(), | |
| delete e[ t ] | |
| } ) ) : o( "unsupported" ), t = n.promise() | |
| } )().then( () => { | |
| const t = s.Deferred(); | |
| let g = 10; | |
| const p = () => { | |
| if ( r ) | |
| if ( "granted" == r ) { | |
| const r = {}, | |
| s = { | |
| cb: r, | |
| on: ( e, t ) => { | |
| r[ e ] = t | |
| }, | |
| cancel: () => {}, | |
| show: () => { | |
| const r = { | |
| type: "basic", | |
| title: i || "", | |
| message: c || "" | |
| }; | |
| r.iconUrl = 0 == d ? n : "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==", ( l.RUNTIME.CHROME && l.RUNTIME.BROWSER_VERSION >= 70 || l.RUNTIME.SAFARI ) && void 0 !== u.silent && ( r.silent = u.silent ), | |
| l.RUNTIME.CHROME && l.RUNTIME.BROWSER_VERSION >= 50 && ( r.requireInteraction = !0 ); | |
| const g = o.createUUID(); | |
| A.notifications.create( g, r, () => { | |
| if ( A.runtime.lastError ) { | |
| if ( d < 1 ) return a.logger.log( "notify: chronos creating failed, retry...", A.runtime.lastError ), d++, void s.show(); | |
| a.logger.log( "notify: chronos creating finally failed", A.runtime.lastError ), t.reject() | |
| } else a.logger.log( "notify: chronos created", g ), s.cancel = () => { | |
| e[ g ] && A.notifications.clear( g, () => {} ) | |
| }, e[ g ] = s | |
| } ) | |
| } | |
| }; | |
| t.resolve( s ) | |
| } else t.resolve(); | |
| else { | |
| const e = () => { | |
| r ? p() : g-- ? window.setTimeout( e, 200 ) : t.resolve() | |
| }; | |
| e() | |
| } | |
| }; | |
| return p(), t.promise() | |
| } ) | |
| } | |
| } | |
| } )(), | |
| d = ( () => { | |
| const e = {}; | |
| let t, r = null; | |
| return { | |
| create: ( n, i, A, c ) => ( () => { | |
| if ( t ) return t; | |
| const e = e => { | |
| r = e || "unknown", a.logger.log( "notify: notification level", e ) | |
| }; | |
| return window.Notification ? e( Notification.permission ) : e( "unsupported" ), t = s.Deferred.Pledge() | |
| } )().then( () => { | |
| const t = s.Deferred(), | |
| u = () => { | |
| if ( "granted" == r || "default" == r ) { | |
| const r = { | |
| cb: {}, | |
| on: ( e, t ) => { | |
| r.cb[ e ] = t | |
| }, | |
| cancel: () => {}, | |
| show: () => { | |
| const t = { | |
| body: A || "", | |
| icon: n | |
| }; | |
| l.RUNTIME.CHROME && ( l.RUNTIME.BROWSER_VERSION >= 43 && void 0 !== c.silent && ( t.silent = c.silent ), t.requireInteraction = !0 ); | |
| const s = o.createUUID(), | |
| u = new window.Notification( i || "", t ); | |
| u.onclick = () => { | |
| a.logger.log( "notify: notification click", s ); | |
| const t = e[ s ]; | |
| t && ( t.cb && t.cb.click && t.cb.click(), t.cancel(), delete e[ s ] ) | |
| }, u.onclose = u.onerror = t => { | |
| a.logger.log( "notify: notification close", s, t ); | |
| const r = e[ s ]; | |
| r && r.cb && r.cb.close && r.cb.close(), delete e[ s ] | |
| }, r.cancel = () => { | |
| e[ s ] && u.close() | |
| }, e[ s ] = r | |
| } | |
| }; | |
| t.resolve( r ) | |
| } else if ( "denied" == r ) t.resolve(); | |
| else if ( "unsupported" == r ) t.resolve(); | |
| else { | |
| const e = e => { | |
| r = "granted" == e ? "granted" : "denied", u() | |
| }; | |
| l.RUNTIME.SAFARI ? Notification.requestPermission( e ) : Notification.requestPermission().then( e ) | |
| } | |
| }; | |
| return u(), t.promise() | |
| } ) | |
| } | |
| } )(), | |
| g = ( e, t, r ) => { | |
| let n = void 0; | |
| if ( c ) try { | |
| const s = c.createNotification( e, t || "", r || "" ); | |
| n = { | |
| on: ( e, t ) => { | |
| s[ "on" + e ] = t | |
| }, | |
| cancel: () => { | |
| closed || s.cancel() | |
| }, | |
| show: () => { | |
| s.show() | |
| } | |
| } | |
| } catch ( e ) { | |
| a.logger.warn( "notify: webkitNotifications creation failed with: " + e.message ) | |
| } | |
| return s.Deferred.Pledge( n ) | |
| }, | |
| p = ( e, t, r, n ) => { | |
| const o = { | |
| cb: {}, | |
| on: ( e, t ) => { | |
| o.cb && ( o.cb[ e ] = t ) | |
| }, | |
| cancel: () => {}, | |
| show: () => { | |
| n.informational || window.setTimeout( () => { | |
| const e = confirm( ( t ? t + "\n\n" : "" ) + r ); | |
| o.cb && ( e ? o.cb.click && o.cb.click() : o.cb.close && o.cb.close() ) | |
| }, 1 ) | |
| } | |
| }; | |
| return s.Deferred.Pledge( o ) | |
| }, | |
| m = { | |
| notify: ( e, t, r, n, o ) => { | |
| const l = ( n = n || {} ).timeout; | |
| let c, m = null, | |
| f = !1, | |
| h = null; | |
| const R = () => { | |
| h && window.clearTimeout( h ), !f && o && o( {} ) | |
| }, | |
| v = () => { | |
| f = !0, o && o( { | |
| clicked: f | |
| } ), m && m.cancel() | |
| }; | |
| return r = r || A.extension.getURL( "images/icon128.png" ), i.default.getDataUriFromUrl( r ).then( e => ( c = e || r, s.Deferred.Pledge() ) ).then( () => u.create( c, e, t, n ) ).then( r => r || g( c, e, t, n ) ).then( r => r || d.create( c, e, t, n ) ).then( r => r || p( c, e, t, { | |
| informational: !o | |
| } ) ).then( n => { | |
| n && ( m = n, n.on( "close", R ), n.on( "click", v ), h = window.setTimeout( () => { | |
| h = null, n.cancel() | |
| }, l || 6e5 ), a.logger.log( "notify:", e, t, r, l ), n.show && n.show() ) | |
| } ), { | |
| cancel: () => { | |
| m && m.cancel() | |
| } | |
| } | |
| }, | |
| showUpdate: ( e, t, r, n ) => m.notify( e, t, r, { | |
| timeout: 3e5 | |
| }, n ), | |
| show: ( e, t, r, n, s ) => m.notify( e, t, r, n, s ), | |
| highlight: ( e, t ) => { | |
| A.tabs.highlight( { | |
| tabs: e | |
| }, t ) | |
| } | |
| }; | |
| t.Notify = m | |
| }, , function ( e, t ) { | |
| "use strict"; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), Object.defineProperties( Promise.prototype, { | |
| done: { | |
| value: function ( e ) { | |
| return this.then( ( ...t ) => e.apply( this, t ) ) | |
| } | |
| }, | |
| fail: { | |
| value: function ( e ) { | |
| return this.then( () => {}, ( ...t ) => e.apply( this, t ) ) | |
| } | |
| }, | |
| always: { | |
| value: function ( e ) { | |
| return this.then( ( ...t ) => e.apply( this, t ), ( ...t ) => e.apply( this, t ) ) | |
| } | |
| } | |
| } ), t.default = Promise | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| var n = r( 1 ), | |
| s = r( 3 ), | |
| o = r( 14 ); | |
| const a = rea.FEATURES; | |
| let i; | |
| const A = a.RUNTIME.BROWSER_VERSION; | |
| let l = !0; | |
| i = a.RUNTIME.CHROME ? A >= 83 ? 2020 : A >= 64 ? 2018 : A >= 59 ? 2017 : A >= 47 ? 2015 : 5 : a.RUNTIME.SAFARI ? A >= 14 ? 2020 : A >= 11 ? 2018 : A >= 10 ? 2017 : A >= 6 ? 2015 : 3 : a.RUNTIME.EDGE ? A >= 83 ? 2020 : A >= 16 ? 2017 : 2016 : a.RUNTIME.FIREFOX ? A >= 77 ? 2020 : A >= 58 ? 2018 : A >= 52 ? 2017 : 2016 : 5; | |
| const c = {}; | |
| a.RUNTIME.CHROME && A < 77 ? ( l = !1, | |
| console.warn( "hint: disable inline ESLint config due to web worker CSP issues", "https://bugs.chromium.org/p/chromium/issues/detail?id=777076", "https://bugs.chromium.org/p/chromium/issues/detail?id=159303" ) ) : a.RUNTIME.EDGE ? ( l = !1, console.warn( "hint: disable inline ESLint config due to web worker CSP issues" ) ) : window.Worker || ( l = !1, | |
| console.warn( "hint: disable inline ESLint config because web workers are unavailable and this extension's CSP doesn't allow unsafe eval, which is required for ESLint's dynamic reconfigration" ) ); | |
| const u = { | |
| env: { | |
| es6: i >= 2015, | |
| browser: !0 | |
| }, | |
| parserOptions: { | |
| ecmaVersion: i, | |
| sourceType: "script", | |
| ecmaFeatures: { | |
| globalReturn: !0 | |
| } | |
| }, | |
| rules: { | |
| curly: [ 1, "multi-line" ], | |
| "dot-location": 0, | |
| "dot-notation": [ 1, { | |
| allowKeywords: !0 | |
| } ], | |
| "no-caller": 1, | |
| "no-case-declarations": 2, | |
| "no-div-regex": 0, | |
| "no-empty-pattern": 2, | |
| "no-eq-null": 0, | |
| "no-eval": 1, | |
| "no-extra-bind": 1, | |
| "no-fallthrough": 1, | |
| "no-implicit-globals": 2, | |
| "no-implied-eval": 1, | |
| "no-lone-blocks": 1, | |
| "no-loop-func": 1, | |
| "no-multi-spaces": 1, | |
| "no-multi-str": 1, | |
| "no-native-reassign": 1, | |
| "no-octal-escape": 2, | |
| "no-octal": 2, | |
| "no-proto": 1, | |
| "no-redeclare": 2, | |
| "no-return-assign": 1, | |
| "no-sequences": 1, | |
| "no-undef": 1, | |
| "no-useless-call": 1, | |
| "no-useless-concat": 1, | |
| "no-with": 1 | |
| } | |
| }, | |
| d = {}; | |
| let g; | |
| Object( s.each )( [ "uneval", "unsafeWindow", "TM_info", "GM_info", "GM", "GM_addStyle", "GM_deleteValue", "GM_listValues", "GM_getValue", "GM_download", "GM_log", "GM_registerMenuCommand", "GM_unregisterMenuCommand", "GM_openInTab", "GM_setValue", "GM_addValueChangeListener", "GM_removeValueChangeListener", "GM_xmlhttpRequest", "GM_getTab", "GM_setTab", "GM_saveTab", "GM_getTabs", "GM_setClipboard", "GM_notification", "GM_getResourceText", "GM_getResourceURL", "GM_screenShot" ], e => { | |
| d[ e ] = "writeable" | |
| } ), u.globals = d; | |
| const p = {}; | |
| let m; | |
| const f = { | |
| hint: function ( e, t, r ) { | |
| const i = Object( n.Deferred )(), | |
| A = i.promise(), | |
| f = r || c; | |
| let h; | |
| if ( t ? ( h = t, h.globals = { | |
| ...h.globals || {}, | |
| ...d | |
| } ) : h = u, window.Worker && !a.RUNTIME.SAFARI ) { | |
| const t = () => { | |
| g = new Worker( "worker/lint.js" ), g.onmessage = e => { | |
| const t = e.data, | |
| r = t.id; | |
| let n, s, o; | |
| r && ( n = p[ r ] ) && ( s = n.d ) && ( delete p[ r ], ( o = t.results ) ? ( l || ( o = o.map( e => { | |
| let t; | |
| return e.message && ( t = e.message.match( /Configuration for rule "([^"]+)"[\s\S]*evaluate a string as JavaScript[\s\S]*/ ) ) && ( e.message = 'Rule "' + t[ 1 ] + '": ESLint inline configuration is not supported by this browser.', e.severity = 1 ), e | |
| } ) ), s.resolve( o ) ) : s.reject( t.error || "Unknown error" ) ), R( r ) | |
| }, g.postMessage( { | |
| method: "base_uri", | |
| value: rea.extension.getURL( "/" ) | |
| } ), m = null | |
| }; | |
| var R = e => { | |
| if ( g || t(), e ) m = null; | |
| else if ( m ) return; | |
| let r, n = Date.now(); | |
| Object.keys( p ).forEach( e => { | |
| p[ e ].ts <= n && ( r = p[ e ], n = r.ts ) | |
| } ), r && ( m = r.id, | |
| g.postMessage( { | |
| method: r.method, | |
| id: r.id, | |
| config: r.c, | |
| options: r.o, | |
| text: r.t | |
| } ) ) | |
| }; | |
| A.abort = () => { | |
| g && ( g.terminate(), g = null, R() ) | |
| }, g || t(); | |
| const r = Object( s.createUUID )(); | |
| p[ r ] = { | |
| method: "lint", | |
| id: r, | |
| d: i, | |
| t: e, | |
| c: h, | |
| o: f, | |
| ts: Date.now() | |
| }, R() | |
| } else Object( o.vendor )( "vendor/eslint/eslint", () => { | |
| try { | |
| const t = { | |
| problem: "error", | |
| layout: 1, | |
| suggestion: 1 | |
| }, | |
| r = new window.eslint.Linter; | |
| h.extends && h.extends.includes( "eslint:recommended" ) && ( h.rules = h.rules || [], r.getRules().forEach( ( function ( e, r ) { | |
| let n, s, o, a, i; | |
| if ( !( e && ( s = e.meta ) && void 0 === h.rules[ r ] && ( n = s.docs ) && n.recommended ) ) return; | |
| const A = [ ( s.type ? t[ s.type ] : null ) || 1 ]; | |
| ( o = s.schema ) && ( a = {}, o.forEach( e => { | |
| "object" == e.type && Object.keys( e.properties ).forEach( t => { | |
| const r = e.properties[ t ].default; | |
| void 0 !== r && !1 !== r && ( a[ t ] = e.properties[ t ].default, i = !0 ) | |
| } ) | |
| } ), i && A.push( a ) ), h.rules[ r ] = A | |
| } ) ) ); | |
| const n = r.verify( e, h, f ); | |
| i.resolve( n || [] ) | |
| } catch ( e ) { | |
| i.reject( e ) | |
| } | |
| } ); | |
| return A | |
| }, | |
| globals: d, | |
| config: u, | |
| options: c, | |
| autoHintMaxLength: 5e4 | |
| }; | |
| t.a = f | |
| }, , function ( e, t, r ) { | |
| "use strict"; | |
| var n = this && this.__importDefault || function ( e ) { | |
| return e && e.__esModule ? e : { | |
| default: e | |
| } | |
| }; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), t.SRI = void 0; | |
| const s = n( r( 6 ) ), | |
| o = n( r( 4 ) ), | |
| a = r( 1 ), | |
| i = r( 2 ), | |
| A = window.forge_sha256, | |
| l = [ "md5", "sha256", "sha1", "sha384", "sha512" ], | |
| c = ( () => { | |
| const e = e => { | |
| const t = [], | |
| r = new DataView( e ); | |
| for ( let e = 0; e < r.byteLength; e += 4 ) { | |
| const n = "00000000", | |
| s = ( n + r.getUint32( e ).toString( 16 ) ).slice( -n.length ); | |
| t.push( s ) | |
| } | |
| return t.join( "" ) | |
| }, | |
| t = t => { | |
| try { | |
| return e( s.default.str2abSync( s.default.Base64.decode( t ) ) ) | |
| } catch ( e ) { | |
| return null | |
| } | |
| }, | |
| r = { | |
| md5: ( e, t ) => a.Deferred.Pledge( s.default.MD5( e, t ) ), | |
| sha256: ( e, t ) => a.Deferred.Pledge( A( e, t ) ) | |
| }, | |
| n = {}; | |
| [ "SHA-1", "SHA-384", "SHA-512" ].forEach( t => { | |
| const r = t.toLowerCase().replace( "-", "" ); | |
| n[ r ] = () => { | |
| const r = ( r, n ) => { | |
| const o = a.Deferred(); | |
| return window.crypto.subtle.digest( t, s.default.str2abSync( r, { | |
| encoding: n | |
| } ) ).then( t => { | |
| o.resolve( e( t ) ) | |
| }, () => { | |
| o.reject() | |
| } ), o.promise() | |
| }; | |
| try { | |
| return r( "" ).then( e => e && e.substr( 0, 4 ).toLowerCase().match( /[0-9a-f]{4,4}/ ) ? r : a.Deferred.Breach() ) | |
| } catch ( e ) { | |
| return a.Deferred.Breach() | |
| } | |
| } | |
| } ); | |
| const c = e => Object.keys( r ).includes( e ), | |
| u = e => ( ...t ) => { | |
| if ( !1 !== d ) { | |
| const r = a.Deferred(); | |
| return d.push( () => r.consume( e( ...t ) ) ), r.promise() | |
| } | |
| return e( ...t ) | |
| }; | |
| let d = []; | |
| return { | |
| init: () => ( i.logger.get() >= i.DEBUG && Object.keys( r ).forEach( e => i.logger.log( "sri:", e, "is supported" ) ), a.Deferred.sidebyside( Object.keys( n ).map( e => n[ e ]().done( t => { | |
| i.logger.log( "sri:", e, "is supported" ), r[ e ] = t | |
| } ).fail( () => { | |
| i.logger.log( "sri:", e, "is unsupported" ) | |
| } ) ) ).always( () => { | |
| if ( !1 === d ) return; | |
| const e = d; | |
| d = !1, e.forEach( e => e() ) | |
| } ) ), | |
| isSupported: u( e => a.Deferred.Pledge( c( e ) ) ), | |
| getHash: u( ( e, r ) => { | |
| const n = a.Deferred(); | |
| if ( "string" == typeof e && ( e = o.default.parse( e ) ), e && e.hash ) { | |
| let s; | |
| const o = e.hash.replace( /^#/, "" ).split( /,|;/g ); | |
| for ( let e = 0; e < o.length; e++ ) { | |
| const r = o[ e ].match( /([^=|:|-]+)[=|:|-](.+)/ ); | |
| if ( !r || 3 != r.length || !c( r[ 1 ] ) ) continue; | |
| let n = r[ 2 ]; | |
| /^[0-9a-fA-F]+$/.exec( n ) || ( n = t( decodeURIComponent( n ) ) || n ); | |
| const a = r[ 1 ]; | |
| l.includes( a ) && ( s = { | |
| type: a, | |
| value: n | |
| } ) | |
| } | |
| n.resolve( s || ( r ? s : { | |
| type: "unsupported", | |
| value: "" | |
| } ) ) | |
| } else n.resolve(); | |
| return n.promise() | |
| } ), | |
| check: u( ( e, t, n ) => t && e && c( e.type ) ? r[ e.type ]( t, n ).then( t => t === e.value ? a.Deferred.Pledge( !0 ) : a.Deferred.Breach( { | |
| type: e.type, | |
| value: t | |
| } ) ) : a.Deferred.Breach() ) | |
| } | |
| } )(); | |
| t.SRI = c | |
| }, function ( e, t, r ) { | |
| "use strict"; | |
| var n = this && this.__importDefault || function ( e ) { | |
| return e && e.__esModule ? e : { | |
| default: e | |
| } | |
| }; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), t.Promise = t.fromEntries = void 0; | |
| const s = r( 23 ); | |
| Object.defineProperty( t, "fromEntries", { | |
| enumerable: !0, | |
| get: function () { | |
| return s.fromEntries | |
| } | |
| } ); | |
| const o = n( r( 18 ) ); | |
| t.Promise = o.default | |
| }, function ( e, t ) { | |
| "use strict"; | |
| let r; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ), t.fromEntries = void 0, t.fromEntries = r, Object.fromEntries ? t.fromEntries = r = Object.fromEntries : ( t.fromEntries = r = e => [ ...e ].reduce( ( e, [ t, r ] ) => ( e[ t ] = r, e ), {} ), Object.fromEntries = r ) | |
| }, , , , , , , , , function ( e, t, r ) { | |
| "use strict"; | |
| Object.defineProperty( t, "__esModule", { | |
| value: !0 | |
| } ); | |
| const n = r( 1 ), | |
| s = window.rea; | |
| let o, a; | |
| const i = ( e, t, r, n ) => { | |
| const s = "rgba(" + n.join( "," ) + ", 1)"; | |
| o.fillStyle = s, o.beginPath(), o.arc( e, t, r, 0, 2 * Math.PI, !0 ), o.fill() | |
| }, | |
| A = ( e, t, r, n, s, a ) => { | |
| null == s && ( s = !0 ), s ? ( o.fillStyle = "rgba(" + a.join( "," ) + ", 0.99)", o.fillRect( e, t, r, n ) ) : ( o.fillStyle = "rgb(" + a.join( "," ) + ", 1)", o.beginPath(), o.moveTo( e, t ), o.lineTo( e + r, t ), o.lineTo( e + r, t + n ), o.lineTo( e, t + n ), o.lineTo( e, t ), o.stroke() ) | |
| }, | |
| l = ( e, t, r, n, s, o ) => { | |
| const a = s; | |
| i( e + a, t + a, s, o ), i( r - a, t + a, s, o ), i( e + a, n - a, s, o ), i( r - a, n - a, s, o ), A( e + s, t, r - e - 2 * s, n - t, !0, o ), A( e, t + s, r - e, n - t - 2 * s, !0, o ) | |
| }, | |
| c = { | |
| toPNG: () => a.toDataURL(), | |
| getDataUriFromUrl: e => { | |
| const t = n.Deferred(), | |
| r = document.createElement( "img" ); | |
| let s = !1, | |
| o = null; | |
| const a = document.body || document.documentElement || document; | |
| a.appendChild( r ); | |
| const i = () => { | |
| o && window.clearTimeout( o ), s || t.reject() | |
| }; | |
| return o = window.setTimeout( () => { | |
| o = null, i(), s = !0 | |
| }, 5e3 ), r.onload = () => { | |
| var e; | |
| let n, i; | |
| o && window.clearTimeout( o ); | |
| try { | |
| i = document.createElement( "canvas" ), i.width = r.width, i.height = r.height, null === ( e = i.getContext( "2d" ) ) || void 0 === e || e.drawImage( r, 0, 0 ), n = i.toDataURL(), a.removeChild( r ) | |
| } catch ( e ) {} | |
| s || t.resolve( n ) | |
| }, r.onerror = i, r.src = e, t.promise() | |
| }, | |
| createIconEx: e => { | |
| const t = n.Deferred(); | |
| return ( ( e, t, r, n, s, i, A ) => { | |
| const l = document.createElement( "img" ); | |
| l.onload = () => { | |
| ( ( e, t ) => { | |
| let r = null; | |
| r = a || document.createElement( "canvas" ), r.height = t, r.width = e, ( e => { | |
| a = e; | |
| const t = a.getContext( "2d" ); | |
| t && ( o = t ) | |
| } )( r ) | |
| } )( 140, 140 ), o.scale( 1, 1 ), | |
| o.drawImage( l, 6, 6 ), l.parentNode && l.parentNode.removeChild( l ), A && A() | |
| }, l.src = e | |
| } )( s.extension.getURL( "images/icon128.png" ), 0, 0, 0, 0, 0, () => { | |
| const r = 116 - ( e > 10 ? 14 : 0 ) - ( e > 100 ? 14 : 0 ) - ( e > 1e3 ? 14 : 0 ) - ( e > 1e4 ? 14 : 0 ); | |
| l( r, 0, 140, 25, 4, [ 200, 0, 0 ] ), l( r + 3, 3, 137, 22, 4, [ 190, 0, 0 ] ), ( ( e, t, r ) => { | |
| o.font = "22pt Arial bold", o.fillStyle = "rgba(" + [ 240, 250, 240 ].join( "," ) + ", 1)", o.fillText( r.toString(), e, 22 ) | |
| } )( r + 4, 0, e ), t.resolve( a.toDataURL() ) | |
| } ), t.promise() | |
| } | |
| }; | |
| t.default = c | |
| }, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , function ( e, t, r ) { | |
| "use strict"; | |
| r.r( t ), r( 22 ); | |
| var n = r( 18 ), | |
| s = r.n( n ), | |
| o = r( 1 ), | |
| a = r( 12 ), | |
| i = r.n( a ), | |
| A = r( 3 ), | |
| l = r( 5 ), | |
| c = r.n( l ), | |
| u = r( 16 ); | |
| let d = {}, | |
| g = null; | |
| const p = () => { | |
| const e = Date.now(), | |
| t = d; | |
| d = {}; | |
| const r = Object.keys( t ); | |
| r.forEach( r => { | |
| const n = t[ r ]; | |
| n && e - n.ts < m ? d[ r ] = n : n.com.reject() | |
| } ), g && 0 === r.length && ( window.clearInterval( g ), g = null ) | |
| }, | |
| m = 15e3; | |
| let f = !1; | |
| const h = ( e, t ) => { | |
| f || R.init(), null === g && ( g = window.setInterval( p, 5e3 ) ); | |
| const r = Object( o.Deferred )(); | |
| return ( ( e, t ) => { | |
| const r = Object( o.Deferred )(); | |
| return void 0 === t && ( t = !0 ), rea.tabs.getSelected( null, n => { | |
| const s = n ? n.index + 1 : void 0; | |
| rea.tabs.create( { | |
| url: rea.extension.getURL( "ask.html" ) + "?aid=" + e, | |
| active: t, | |
| index: s, | |
| parent: n | |
| }, e => { | |
| if ( !e ) { | |
| const e = "rea.tabs.create failed -> giving up now!"; | |
| console.error( e ), r.reject( { | |
| error: e | |
| } ) | |
| } | |
| r.resolve( { | |
| id: e.id, | |
| close: function () { | |
| rea.tabs.remove( e.id ) | |
| } | |
| } ) | |
| } ) | |
| } ), r.promise() | |
| } )( ( e => { | |
| const t = Object( A.createUUID )(); | |
| return d[ t ] = e, t | |
| } )( { | |
| ts: Date.now(), | |
| com: r, | |
| preparat: t, | |
| type: e | |
| } ), t.active ).then( e => r.promise().done( t => { | |
| ( t.ok || t.aborted ) && e.close() | |
| } ) ) | |
| }, | |
| R = { | |
| init: function () { | |
| f || ( f = !0 ) | |
| }, | |
| onMessage: function ( e ) { | |
| const t = Object( o.Deferred )(), | |
| r = e.aid, | |
| n = d[ r ]; | |
| if ( n ) | |
| if ( n.aborter && ( window.clearTimeout( n.aborter ), delete n.aborter ), "ping" == e.method ) d[ r ].ts = Date.now(), t.resolve( { | |
| pong: !0 | |
| } ); | |
| else if ( "preparat" == e.method ) t.resolve( { | |
| preparat: n.preparat, | |
| type: n.type | |
| } ); | |
| else if ( "install" == e.method ) n.com.resolve( { | |
| ok: !0 | |
| } ), t.resolve( {} ), delete d[ r ]; | |
| else if ( "import" == e.method ) n.com.resolve( { | |
| ok: !0, | |
| externals_ids: e.externals_ids, | |
| storage_ids: e.storage_ids, | |
| import_ids: e.import_ids, | |
| global_settings: e.global_settings | |
| } ), t.resolve( {} ), delete d[ r ]; | |
| else if ( "permission" == e.method ) n.com.resolve( { | |
| ok: !0, | |
| granted: e.granted, | |
| permissions: e.permissions, | |
| origins: e.origins | |
| } ), t.resolve( {} ), delete d[ r ]; | |
| else if ( "unload" == e.method || "abort" == e.method ) { | |
| t.resolve( {} ); | |
| const s = () => { | |
| n.com.resolve( { | |
| ok: !1, | |
| aborted: !0 | |
| } ), delete d[ r ] | |
| }; | |
| "abort" == e.method ? s() : n.aborter = window.setTimeout( s, 3e3 ) | |
| } else "connect" == e.method && ( n.com.resolve( e ), t.resolve( {} ), delete d[ r ] ); | |
| else t.reject( { | |
| error: "unknown_id", | |
| please_close: !0 | |
| } ); | |
| return t.promise() | |
| }, | |
| install: function ( e ) { | |
| return h( "install", e ) | |
| }, | |
| import: function ( e ) { | |
| return h( "import", e ) | |
| }, | |
| askForPermission: function ( e, t, r ) { | |
| return h( "permission", { | |
| permissions: e.permissions, | |
| origins: e.origins, | |
| title: t, | |
| message: r | |
| } ) | |
| }, | |
| installError: function ( e ) { | |
| return h( "install_error", e ) | |
| }, | |
| askForConnect: function ( e ) { | |
| return h( "connect", e ) | |
| } | |
| }; | |
| var v = R; | |
| let b = !1, | |
| w = null, | |
| k = null; | |
| const _ = () => b || o.Deferred.Pledge(), | |
| y = e => { | |
| rea.permissions.supported && ( rea.permissions.onAdded.addListener( t => { | |
| e( { | |
| added: t | |
| } ) | |
| } ), rea.permissions.onRemoved.addListener( t => { | |
| e( { | |
| removed: t | |
| } ) | |
| } ) ) | |
| }, | |
| E = { | |
| permDownloads: "downloads", | |
| get: function () { | |
| const e = Object( o.Deferred )(); | |
| return w = {}, k = {}, b = e.promise(), rea.permissions.supported ? rea.permissions.getAll( t => { | |
| t.permissions && Object( A.each )( t.permissions, e => { | |
| w[ e ] = !0 | |
| } ), t.origins && Object( A.each )( t.origins, e => { | |
| k[ e ] = !0 | |
| } ), b = null, e.resolve() | |
| } ) : e.resolve(), e.promise() | |
| }, | |
| has: function ( e ) { | |
| return _().then( () => !rea.permissions.supported || ( w ? !!w[ e ] || !!k[ e ] : ( y( () => { | |
| _().then( E.get ) | |
| } ), | |
| E.get().then( () => E.has( e ) ) ) ) ) | |
| }, | |
| hasOrigin: function ( e ) { | |
| return Array.isArray( e ) || ( e = [ e ] ), _().then( () => { | |
| const t = Object( o.Deferred )(); | |
| return rea.permissions.supported ? rea.permissions.contains( { | |
| origins: e | |
| }, e => { | |
| t.resolve( e ) | |
| } ) : t.resolve( !0 ), t.promise() | |
| } ) | |
| }, | |
| ask: function ( e, t, r ) { | |
| Array.isArray( e ) || ( e = [ e ] ); | |
| const n = Object( o.Deferred )(); | |
| return rea.permissions.supported ? v.askForPermission( { | |
| permissions: e | |
| }, t, r ).done( t => { | |
| t.granted && ( w || ( w = {} ), w[ e ] = !0 ), n.resolve( t.granted ) | |
| } ) : n.resolve( !1 ), n.promise() | |
| }, | |
| askOrigin: function ( e, t, r ) { | |
| Array.isArray( e ) || ( e = [ e ] ); | |
| const n = Object( o.Deferred )(); | |
| return rea.permissions.supported ? v.askForPermission( { | |
| origins: e | |
| }, t, r ).done( e => { | |
| n.resolve( e.granted ) | |
| } ) : n.resolve( !1 ), n.promise() | |
| }, | |
| remove: function ( e ) { | |
| return _().then( () => { | |
| const t = Object( o.Deferred )(); | |
| return rea.permissions.supported ? ( b = t.promise(), rea.permissions.remove( { | |
| permissions: [ e ] | |
| }, r => { | |
| b = null, w && ( w[ e ] = !1 ), t.resolve( r ) | |
| } ) ) : t.resolve( !0 ), t.promise() | |
| } ) | |
| }, | |
| addListener: y | |
| }; | |
| var I = E, | |
| x = r( 9 ), | |
| T = r( 4 ), | |
| M = r( 0 ), | |
| S = r( 21 ), | |
| G = r( 2 ), | |
| U = r( 10 ), | |
| N = r( 11 ), | |
| O = r( 6 ), | |
| Z = r.n( O ), | |
| C = r( 14 ); | |
| const D = rea.FEATURES, | |
| j = { | |
| DEFAULT: "default", | |
| OFF: "off", | |
| NATIVE: "native", | |
| CHROME: "chrome", | |
| NOT_ENABLED: "not_enabled", | |
| NOT_WHITELISTED: "not_whitelisted", | |
| NOT_PERMITTED: "not_permitted", | |
| NOT_SUPPORTED: "not_supported", | |
| NOT_SUCCEEDED: "not_succeeded" | |
| }, | |
| F = N.default.run; | |
| let B = j.OFF, | |
| L = [], | |
| P = null, | |
| V = !1; | |
| const Q = {}; | |
| let H, X = !1, | |
| q = Object( U.createQueue )( { | |
| threads: 6 | |
| } ), | |
| z = () => { | |
| H = Object( U.createQueue )( { | |
| threads: 3 | |
| } ); | |
| const e = Object( o.Deferred )(); | |
| return Object( C.vendor )( [ "vendor/saveas/filesaver" ], () => { | |
| z = o.Deferred.Pledge, e.resolve() | |
| } ), e.promise() | |
| }; | |
| const Y = () => null !== P ? o.Deferred.Pledge( P ) : !rea.permissions.supported && rea.downloads.supported ? ( P = !0, o.Deferred.Pledge( P ) ) : I.has( I.permDownloads ).then( e => ( P = e, G.logger.log( "downs: permission to use rea.downloads ->", e ), Y() ) ), | |
| W = function ( e, t ) { | |
| this[ e ] && this[ e ]( "function" == typeof t ? t() : t ) | |
| }, | |
| J = function ( e ) { | |
| this[ e ] && ( W.apply( this, arguments ), this[ e ] = null ) | |
| }; | |
| let K = 0; | |
| var $ = ( e, t, r ) => { | |
| var n = Object( o.Deferred )(); | |
| te(); | |
| const s = { | |
| filename: e.name | |
| }; | |
| let a; | |
| if ( D.RUNTIME.FIREFOX && D.RUNTIME.BROWSER_VERSION < 52 ) a = [ "url" ]; | |
| else { | |
| a = [ "url", "method", "saveAs" ], s.body = e.data; | |
| const t = e.headers; | |
| t && ( Array.isArray( t ) ? G.logger.warn( "downs: invalid type of headers property", t ) : s.headers = Object.keys( t ).map( e => ( { | |
| name: e, | |
| value: t[ e ] | |
| } ) ) ) | |
| } | |
| a.forEach( t => { | |
| s[ t ] = e[ t ] | |
| } ); | |
| const i = Q[ t.download_id ] = { | |
| callbacks: { | |
| onprogress: r.onprogress, | |
| onload: e => { | |
| n.resolve(), A( "onload", e ) | |
| }, | |
| onerror: e => { | |
| n.reject( e ), A( "onerror", e ) | |
| } | |
| }, | |
| url: e.url, | |
| name: e.name | |
| }, | |
| A = ( ...e ) => J.apply( r, e ); | |
| if ( rea.downloads.download( s, ( e, t ) => { | |
| if ( void 0 === e ) return n.reject( t ), void A( "onerror", { | |
| error: t | |
| } ); | |
| i.id = e; | |
| const r = t => { | |
| rea.downloads.cancel( e, () => { | |
| s(), t && t() | |
| } ) | |
| }; | |
| var s = () => { | |
| rea.downloads.search( { | |
| id: e | |
| }, t => { | |
| let r; | |
| ( r = t[ 0 ] ) ? ee( r ): G.logger.warn( "downs: unable to query download ID", e ) | |
| } ) | |
| }; | |
| !0 === i.cancel ? r() : ( i.cancel = r, i.interval = window.setInterval( s, 1e3 ) ) | |
| } ), rea.runtime.lastError ) { | |
| const e = rea.runtime.lastError.message; | |
| n.reject( e ), A( "onerror", { | |
| error: e | |
| } ) | |
| } | |
| return n.promise() | |
| }, | |
| ee = e => { | |
| const { | |
| item: t, | |
| key: r | |
| } = ( e => { | |
| let t, r; | |
| return Object.keys( Q ).every( n => { | |
| let s; | |
| return !( s = Q[ n ] ) || s.id != e || ( r = n, t = s, !1 ) | |
| } ), { | |
| item: t, | |
| key: r | |
| } | |
| } )( e.id ); | |
| if ( t ) { | |
| const n = t.callbacks, | |
| s = ( ...e ) => J.apply( n, e ), | |
| o = () => { | |
| t.interval && ( window.clearInterval( t.interval ), t.interval = null ), delete Q[ r ] | |
| }; | |
| e.error || [ e.state, e.state && e.state.current ].includes( "interrupted" ) ? ( G.logger.warn( "downs: download of", t.name, "(" + t.url + ")", "failed", e.error ), s( "onerror", { | |
| error: j.NOT_SUCCEEDED, | |
| details: e.error | |
| } ), | |
| o() ) : e.endTime || [ e.state, e.state && e.state.current ].includes( "complete" ) ? ( G.logger.log( "downs: download of", t.name, "(" + t.url + ")", "finished" ), s( "onload", {} ), o() ) : void 0 === e.totalBytes && void 0 === e.bytesReceived || s( "onprogress", { | |
| loaded: e.bytesReceived, | |
| total: e.totalBytes, | |
| estimatedEndTime: e.estimatedEndTime | |
| } ) | |
| } | |
| }, | |
| te = () => { | |
| P && !X && rea.downloads.supported && ( rea.downloads.onChanged.addListener( ee ), X = !0 ) | |
| }, | |
| re = e => { | |
| let t = !1; | |
| return Object( A.each )( L, r => { | |
| if ( r && r.length ) try { | |
| let n; | |
| if ( "/" === r[ 0 ] ) "$" !== ( r = r.replace( /^\//g, "" ).replace( /\/$/g, "" ) )[ r.length - 1 ] && ( G.logger.log( "downs: patching $ into", r ), r += "$" ), n = new RegExp( r, "i" ); | |
| else if ( "." === r[ 0 ] ) { | |
| const e = [ Object( A.escapeForRegExp )( r ), "$" ].join( "" ); | |
| n = new RegExp( e, "i" ) | |
| } else G.logger.warn( "downs: invalid file extension:", '"' + r + '"', 'starts neither with "." nor with "/"' ); | |
| if ( n && -1 !== e.search( n ) ) return G.logger.log( "downs:", r, "matched @", e ), t = !0, !0 | |
| } catch ( e ) { | |
| G.logger.warn( "downs: can't process", r, e ) | |
| } | |
| } ), t | |
| }, | |
| ne = { | |
| start: function ( e, t, r ) { | |
| r = r || {}; | |
| const n = ++K, | |
| s = ( ...e ) => J.apply( t, e ); | |
| if ( Q[ n ] = {}, G.logger.log( "downs: start", e ), !r.internal ) { | |
| if ( B == j.OFF ) return G.logger.warn( "downs: feature is not enabled" ), void s( "onerror", { | |
| error: j.NOT_ENABLED | |
| } ); | |
| if ( !e.name || !re( e.name ) ) return G.logger.warn( "downs:", e.name, "is not whitelisted" ), void s( "onerror", { | |
| error: j.NOT_WHITELISTED | |
| } ); | |
| if ( !rea.downloads.supported && B == j.CHROME ) return G.logger.warn( "downs: this download mode is not supported" ), void s( "onerror", { | |
| error: j.NOT_SUPPORTED | |
| } ) | |
| } | |
| const a = () => { | |
| if ( Q[ n ].cancel ) return s( "onerror", { | |
| error: "aborted" | |
| } ), o.Deferred.Breach( "aborted" ) | |
| }, | |
| i = e.name; | |
| let l; | |
| return i && ( e.name = Object( A.safeFileName )( i, !0 ), i != e.name && G.logger.warn( `downs: changed file name from ${i} to ${e.name} for safety` ) ), o.Deferred.Pledge().then( () => { | |
| if ( rea.downloads.supported && ( r.internal || B == j.CHROME || B == j.DEFAULT ) ) return Y().then( e => l = e ).then( a ); | |
| l = !1 | |
| } ).then( () => "data:" == T.default.parse( e.url ).protocol ? Z.a.dataUri2Blob( e.url ) : !l || !r.internal && ( D.RUNTIME.FIREFOX || D.RUNTIME.SAFARI ) && B == j.DEFAULT ? ( ( e, t, r ) => q.add( () => { | |
| var n = Object( o.Deferred )(); | |
| void 0 === r && ( r = {} ); | |
| const s = ( ...e ) => J.apply( r, e ); | |
| e.responseType = "blob", e.method = e.method || "GET"; | |
| const a = F( e, { | |
| onload: t => { | |
| if ( 4 != t.readyState || 200 != t.status && 0 != t.status || t.error ) { | |
| const e = t.error || t.statusText || "xhr_failed"; | |
| n.reject( e ), s( "onerror", { | |
| error: e | |
| } ) | |
| } else { | |
| const r = N.default.parseHeaders( t.responseHeaders )[ "content-type" ], | |
| o = new Blob( [ t.response ], { | |
| type: e.overrideMimeType || r || "binary/octet-stream" | |
| } ); | |
| n.resolve( o ), s( "onload", {} ) | |
| } | |
| }, | |
| onerror: e => { | |
| n.reject(), s( "onerror", e ) | |
| }, | |
| onabort: () => { | |
| n.reject(), s( "onerror", { | |
| error: "aborted" | |
| } ) | |
| }, | |
| ontimeout: e => { | |
| n.reject(), s( "ontimeout", e ) | |
| }, | |
| onprogress: r.onprogress | |
| }, { | |
| internal: t.internal | |
| } ); | |
| return Q[ t.download_id ] = { | |
| cancel: a ? a.abort : () => {} | |
| }, n.promise() | |
| } ) )( e, { | |
| internal: r.internal, | |
| download_id: n | |
| }, { | |
| onerror: t.onerror, | |
| ontimeout: t.ontimeout, | |
| onprogress: t.onprogress | |
| } ) : void 0 ).then( a => { | |
| if ( a && l ) { | |
| let r; | |
| return o.Deferred.Pledge().then( () => { | |
| if ( D.RUNTIME.SHARED_OBJECT_URLS ) return r = URL.createObjectURL( a ); | |
| var e = Object( o.Deferred )(); | |
| return Z.a.blob2dataUri( a, e.resolve ), e.promise() | |
| } ).then( s => $( { | |
| url: s, | |
| name: e.name, | |
| saveAs: e.saveAs | |
| }, { | |
| download_id: n | |
| }, { | |
| onerror: t.onerror, | |
| onload: t.onload | |
| } ).always( () => { | |
| r && URL.revokeObjectURL( r ) | |
| } ) ) | |
| } | |
| return a ? ( e.name = e.name || "File.download", z().then( async () => H.add( async () => { | |
| saveAs( a, e.name ), | |
| await Object( U.sleep )( 500 ), s( "onload", {} ) | |
| } ) ) ) : l ? $( e, { | |
| download_id: n | |
| }, t ) : void( r.internal || B != j.CHROME ? ( G.logger.warn( "downs: download failed" ), s( "onerror", { | |
| error: "failed" | |
| } ) ) : ( G.logger.warn( "downs: download permission is missing" ), s( "onerror", { | |
| error: j.NOT_PERMITTED | |
| } ) ) ) | |
| } ).always( () => { | |
| delete Q[ n ], window.setTimeout( () => s( "ondone", {} ), 1 ) | |
| } ), n | |
| }, | |
| cancel: e => { | |
| let t; | |
| if ( t = Q[ e ] ) return t.cancel ? "function" == typeof t.cancel && t.cancel() : t.cancel = !0, !0 | |
| }, | |
| set_mode: e => { | |
| B = e, B == j.CHROME && Y().done( e => { | |
| e || I.has( I.permDownloads ).then( e => { | |
| const t = Object( o.Deferred )(); | |
| return V || e ? t.resolve( { | |
| permission: e, | |
| asked: !1 | |
| } ) : I.ask( I.permDownloads, M.I18N.getMessage( "Browser_API_Downloads" ), M.I18N.getMessage( "Click_here_to_allow_TM_to_start_downloads" ) ).done( e => { | |
| t.resolve( { | |
| permission: e, | |
| asked: !0 | |
| } ) | |
| } ), V = !0, t.promise() | |
| } ).done( e => { | |
| e.permission && e.asked && rea.page.reload() | |
| } ) | |
| } ) | |
| }, | |
| set_whitelist: e => { | |
| "Array" === Object( A.toType )( e ) && ( L = e ) | |
| }, | |
| is_whitelisted: re, | |
| remove_permission: () => I.remove( I.permDownloads ), | |
| staticVars: j | |
| }, | |
| se = r( 19 ); | |
| const oe = { | |
| mkCompat: function ( e, t, r, n ) { | |
| return t && ( ( t.options.compat_wrappedjsobject || n ) && ( e = oe.unWrappedJsObjectify( e ) ), ( t.options.compat_metadata || n ) && ( e = oe.unMetaDataify( e ) ), ( t.options.compat_foreach || n ) && ( e = oe.unEachify( e ) ) ), r || ( e = e.replace( /([\'\"]{1,1})use strict([\'\"]{1,1})/g, "$1use strict$2" ) ), e | |
| }, | |
| findPrototypes: function ( e ) { | |
| if ( e.includes( ".toSource(" ) ) return !0; | |
| const t = [ "indexOf", "lastIndexOf", "filter", "forEach", "every", "map", "some", "slice" ]; | |
| for ( const r in t ) | |
| if ( e.includes( "Array." + t[ r ] + "(" ) ) return !0; | |
| return !1 | |
| }, | |
| unEachify: function ( e ) { | |
| const t = ( e = e.replace( /for each[ \t]*\(/gi, "for each(" ) ).split( "for each" ); | |
| for ( let e = 1; e < t.length; e++ ) { | |
| const r = t[ e ]; | |
| if ( "(" != r.substr( 0, 1 ) ) { | |
| t[ e ] = " each" + t[ e ]; | |
| continue | |
| } | |
| const n = Object( A.getStringBetweenTags )( r, "(", ")" ), | |
| s = n.split( " " ); | |
| let o = null, | |
| a = null, | |
| i = null; | |
| for ( const e in s ) "" != s[ e ] && "var" != s[ e ] && ( o ? a ? i || ( i = s[ e ] ) : a = s[ e ] : o = s[ e ] ); | |
| if ( !o || !i ) { | |
| t[ e ] = " each" + t[ e ]; | |
| continue | |
| } | |
| const l = "var __kk in " + i; | |
| let c = ""; | |
| c += "{\n if (!" + i + ".hasOwnProperty(__kk)) continue;", c += " \n var " + o + " = " + i + "[__kk];", t[ e ] = t[ e ].replace( n, l ).replace( "{", c ) | |
| } | |
| return t.join( "for" ) | |
| }, | |
| unMetaDataify: function ( e ) { | |
| let t = e, | |
| r = e; | |
| const n = "<><![CDATA[", | |
| s = "]]></>"; | |
| let o = t.indexOf( n ); | |
| for ( ; - 1 != o; ) { | |
| const e = t.substr( 0, o ), | |
| a = e.lastIndexOf( "\n" ); | |
| let i = ""; - 1 != a && ( i = e.substr( a, e.length - a ) ), t = t.substr( o, t.length - o ); | |
| const l = i.indexOf( "/*" ), | |
| c = i.indexOf( "//" ); | |
| if ( -1 == l && -1 == c ) { | |
| const e = Object( A.getStringBetweenTags )( t, n, s ); | |
| let o = e; | |
| o = o.replace( /\\/g, "\\\\" ), o = o.replace( /\"/g, '\\"' ).replace( /\n/g, '\\n" + \n"' ), o = o.replace( /^\n/g, "" ).replace( /\n$/g, "" ), o = o.replace( /\r/g, "" ); | |
| const a = n + e + s; | |
| r = r.replace( a, '(new CDATA("' + o + '"))' ) | |
| } | |
| t = t.substr( 1, t.length - 1 ), o = t.indexOf( n ) | |
| } | |
| return r | |
| }, | |
| unWrappedJsObjectify: function ( e ) { | |
| const t = e.split( "\n" ); | |
| for ( let e = 0; e < t.length; e++ ) { | |
| const r = t[ e ].indexOf( ".wrappedJSObject" ); | |
| if ( -1 == r ) continue; | |
| const n = t[ e ].indexOf( "//" ); - 1 != n && n < r || ( t[ e ] = t[ e ].replace( /\.wrappedJSObject/g, "" ) ) | |
| } | |
| return t.join( "\n" ) | |
| } | |
| }; | |
| var ae = oe, | |
| ie = r( 7 ), | |
| Ae = r( 13 ); | |
| const le = "root", | |
| ce = [ "http://*/*", "https://*/*", "file://*/*" ]; | |
| let ue, de, ge, pe = {}, | |
| me = {}; | |
| const fe = ( e, t ) => { | |
| const r = e.id; | |
| pe[ r ] ? ( delete e.id, rea.contextMenus.update( r, e ) ) : rea.contextMenus.create( e ), me[ r ] = !0, window.setTimeout( t, 1 ) | |
| }, | |
| he = () => { | |
| const e = Object( o.Deferred )(); | |
| return rea.contextMenus.removeAll( () => { | |
| ue = null, pe = {}, e.resolve() | |
| } ), e.promise() | |
| }; | |
| var Re = { | |
| init: ( { | |
| onclick: e | |
| } ) => rea.contextMenus.supported ? ( rea.contextMenus.onClicked.addListener( ( t, r ) => { | |
| console.debug( t, r ), | |
| r && t.menuItemId && t.parentMenuItemId && e && e( { | |
| id: t.menuItemId, | |
| tabId: r.id, | |
| frameId: t.frameId, | |
| url: t.frameUrl || t.pageUrl, | |
| isMenuCommand: t.parentMenuItemId != le | |
| } ) | |
| } ), he() ) : o.Deferred.Pledge(), | |
| clean: e => { | |
| const t = Object( o.Deferred )(); | |
| return e.forEach( e => { | |
| rea.contextMenus.remove( e, () => { | |
| const e = rea.runtime.lastError; | |
| e && console.warn( e.message ), t.resolve() | |
| } ) | |
| } ), t.promise() | |
| }, | |
| update: ( { | |
| contexters: e, | |
| commands: t | |
| } ) => { | |
| if ( de ) { | |
| ge && ge.deferred.reject(); | |
| const r = Object( o.Deferred )(); | |
| return ge = { | |
| contexters: e, | |
| commands: t, | |
| deferred: r | |
| }, r.promise() | |
| } | |
| if ( !e.length && !t.length ) return he(); | |
| const r = Object.keys( pe ); | |
| return me = {}, de = o.Deferred.Pledge().then( () => ue || ( () => { | |
| const e = Object( o.Deferred )(); | |
| return he().then( () => { | |
| ue = rea.contextMenus.create( { | |
| id: le, | |
| contexts: [ "all" ], | |
| title: "Tampermonkey", | |
| type: "normal", | |
| documentUrlPatterns: ce | |
| }, () => { | |
| e.resolve() | |
| } ) | |
| } ), e.promise() | |
| } )() ).then( () => { | |
| if ( t.length ) return o.Deferred.when( t.map( e => { | |
| return t = e.uuid, r = e.scriptName, o.Deferred.Pledge().then( () => { | |
| const e = Object( o.Deferred )(); | |
| return fe( { | |
| id: t, | |
| parentId: le, | |
| contexts: [ "all" ], | |
| title: "🛠 " + r, | |
| type: "normal", | |
| documentUrlPatterns: ce | |
| }, () => e.resolve() ), e.promise() | |
| } ); | |
| var t, r | |
| } ) ) | |
| } ).then( () => ( ( e, t ) => { | |
| const r = []; | |
| return Object( A.each )( e, e => { | |
| const t = Object( o.Deferred )(); | |
| fe( { | |
| id: e.uuid, | |
| contexts: [ "all" ], | |
| parentId: le, | |
| title: "🖱 " + e.name, | |
| type: "normal", | |
| documentUrlPatterns: ce | |
| }, () => t.resolve() ), r.push( t.promise() ) | |
| } ), Object( A.each )( t, e => { | |
| const t = Object( o.Deferred )(); | |
| let n; | |
| try { | |
| const t = new RegExp( "^" + Object( A.escapeForRegExp )( e.scriptName ) + "[ -:+/]*" ); | |
| n = e.name.replace( t, "" ) | |
| } catch ( e ) { | |
| console.warn( e ) | |
| } | |
| fe( { | |
| id: e.menuId, | |
| contexts: [ "all" ], | |
| parentId: e.uuid, | |
| title: "🔧 " + ( n || e.name ), | |
| type: "normal", | |
| documentUrlPatterns: ce | |
| }, () => t.resolve() ), r.push( t.promise() ) | |
| } ), o.Deferred.when( r ) | |
| } )( e, t ) ).always( () => { | |
| const e = Object( A.adiff )( Object.keys( me ), r, "notinfirst" ); | |
| e.length && Re.clean( e ), pe = me; | |
| const t = ge; | |
| de = ge = null, t && Re.update( t ).then( t.deferred.resolve ) | |
| } ), de | |
| } | |
| }, | |
| ve = Re; | |
| const be = Object( U.createCache )( { | |
| timeout: 600, | |
| check_interval: 300, | |
| retimeout_on_get: !0 | |
| } ).init(); | |
| let we, ke, _e, ye; | |
| const Ee = () => ( { | |
| utm_source: "ext", | |
| utm_medium: _e.substr( 0, 3 ), | |
| utm_campaign: rea.runtime.short_id | |
| } ), | |
| Ie = e => we + "/api?" + T.default.hash2params( Object.assign( { | |
| l: ke, | |
| q: e | |
| }, Ee() ) ); | |
| let xe; | |
| var Te = ( e, { | |
| url: t, | |
| mode: r | |
| } ) => { | |
| ye = e.internal, we = t, _e = r, ke = M.I18N.getLocale() || M.I18N.getUiLocale() | |
| }, | |
| Me = e => { | |
| const t = Ie( e ), | |
| r = be.get( t ); | |
| if ( r ) return r; | |
| const n = Object( o.Deferred )(), | |
| s = n.promise(), | |
| a = e => { | |
| n.resolve( { | |
| error: e | |
| } ) | |
| }; | |
| if ( xe && xe > Date.now() ) return a( "rate limit or backoff" ), s; | |
| if ( !e.startsWith( "http" ) ) return a( "unsupported url" ), s; | |
| xe = void 0; | |
| let i = 1; | |
| const A = ye( { | |
| url: t, | |
| headers: { | |
| Accept: "application/json, */*" | |
| }, | |
| fetch: !0, | |
| responseType: "json" | |
| }, { | |
| onload: e => { | |
| if ( 200 == e.status ) { | |
| const { | |
| count: t, | |
| url: r | |
| } = e.response, s = `${we}${r}`; | |
| i = 1, n.resolve( { | |
| count: Number( t || 0 ), | |
| url: s | |
| } ) | |
| } else if ( 429 === e.status ) { | |
| const t = N.default.parseHeaders( e.responseHeaders ), | |
| r = Number( t[ "retry-after" ] || 15 ); | |
| i = 1, r && ( xe = Date.now() + 1e3 * r, a( "rate limit" ) ) | |
| } else i = Math.min( 2 * i, 300 ), xe = Date.now() + 1e3 * i, | |
| a( e.responseText || "unknown error" ) | |
| }, | |
| onerror: e => { | |
| a( e ) | |
| }, | |
| onabort: () => { | |
| a( "aborted" ) | |
| }, | |
| ontimeout: e => { | |
| a( e ) | |
| } | |
| }, { | |
| internal: !0 | |
| } ); | |
| return s.abort = () => A.abort(), be.set( t, s ), s | |
| }, | |
| Se = e => ( e => { | |
| let t, r = "", | |
| n = ""; | |
| return "click" == _e ? ( r = "?" + T.default.hash2params( Object.assign( { | |
| l: ke | |
| }, Ee() ) ), n = "#" + T.default.hash2params( Object.assign( { | |
| q: e | |
| } ) ), t = we + "/" + r + n ) : ( r = "?" + T.default.hash2params( Object.assign( { | |
| l: ke, | |
| q: e | |
| }, Ee() ) ), t = we + "/search?" + r + n ), t | |
| } )( e ), | |
| Ge = () => { | |
| const e = "?" + T.default.hash2params( Object.assign( { | |
| l: ke | |
| }, Ee() ) ); | |
| return we + "/privacy?" + e | |
| }; | |
| const Ue = window.Tests; | |
| const Ne = rea.FEATURES, | |
| Oe = "https://www.userscript.zone", | |
| Ze = new Date, | |
| Ce = ( () => { | |
| const e = [], | |
| t = ( e, t, r ) => { | |
| const n = { | |
| title: e.join( "\n\n" ) | |
| }, | |
| s = t.frag ? "_" + t.frag : ""; | |
| t.path = rea.extension.getURL( "images/icon" + s + ".png" ), G.logger.warn( e.join( "\n" ) ), rea.browserAction.setIcon( { | |
| path: t.path | |
| } ), rea.browserAction.setTitle( n ), r || rea.extension.onMessage.addListener( ( t, r, n ) => { | |
| const s = { | |
| name: "1", | |
| id: "1", | |
| sub_menu_item: !0, | |
| pos: "left", | |
| items: [] | |
| }; | |
| s.items.push( { | |
| name: e[ 0 ], | |
| image: "info" | |
| } ), e.length > 1 && s.items.push( { | |
| name: e[ 1 ] | |
| } ), n( { | |
| items: [ s ], | |
| options: { | |
| enabled: !1 | |
| } | |
| } ) | |
| } ) | |
| }; | |
| return { | |
| run: () => { | |
| if ( "chromeStorage" == Ne.DB.USE && !Ne.DB.NO_WARNING ) { | |
| const e = () => { | |
| if ( !c.a ) return window.setTimeout( e, 2e3 ); | |
| c.a.isWorking().fail( () => { | |
| if ( confirm( "Tampermonkey detected that the extension storage is unreliable!\n\nUnfortunately this means that all your settings and userscripts are inaccessible at the moment.\n\nDo you want to visit the FAQ entry that explains how to recover from that?" ) ) { | |
| const e = { | |
| url: "https://www.tampermonkey.net/faq#Q206" | |
| }; | |
| rea.tabs.create( e, () => {} ) | |
| } | |
| t( [ "Tampermonkey detected that the extension storage is unreliable!" ], { | |
| frag: "paused" | |
| }, !0 ) | |
| } ) | |
| }; | |
| window.setTimeout( e, 1e3 ) | |
| } | |
| return !0 | |
| }, | |
| pause: t, | |
| setWarning: function ( t, r, n ) { | |
| e.push( { | |
| text: t, | |
| description: r, | |
| url: n | |
| } ) | |
| }, | |
| getWarnings: function () { | |
| return e | |
| } | |
| } | |
| } )(); | |
| if ( !Ce.run() ) throw "Quitting now"; | |
| window.uris = T.default, window.down = ne, window.perm = I, window.dast = c.a; | |
| const De = Object( A.createUUID )(), | |
| je = {}; | |
| G.logger.debug( "Starting background fred @" + De ); | |
| const Fe = Object( U.createCache )( { | |
| timeout: 5, | |
| check_interval: 10, | |
| retimeout_on_get: !0 | |
| } ).init(), | |
| Be = Object( U.createCache )( { | |
| timeout: 300, | |
| check_interval: 120, | |
| retimeout_on_get: !0 | |
| } ).init(), | |
| Le = () => { | |
| const e = Object( o.Deferred )(), | |
| t = "0.0.0.0"; | |
| let r, n; | |
| const s = rea.extension.manifest.version, | |
| a = c.a.getSchemaVersion(); | |
| let i = a; | |
| return c.a.getVersion( t ).then( e => ( n = e, r = Object( ie.versionCmp )( s, n ) == ie.versionCmp.eNEWER, c.a.isWiped() ) ).then( ( function ( e ) { | |
| if ( !r && e ) { | |
| const e = [ "Tampermonkey detected inconsistencies that indicate that your browser wiped the extension database!", "You can continue to use Tampermonkey normally, but your settings and scripts might be lost. Click here to get more information.", "https://www.tampermonkey.net/faq.php#Q207" ]; | |
| G.logger.warn( e.join( "\n" ) ), Ce.setWarning.apply( this, e ) | |
| } | |
| } ) ).always( () => { | |
| let l = [], | |
| u = 0; | |
| const d = () => { | |
| if ( u < l.length ) { | |
| const t = () => { | |
| u++, d() | |
| }, | |
| r = l[ u ].schema; | |
| l[ u ].cond( r ) ? l[ u ].fn().done( () => { | |
| r && ( G.logger.info( "Converted database from", i, "to", r ), i = r ), t() | |
| } ).fail( () => { | |
| e.reject() | |
| } ) : t() | |
| } | |
| }, | |
| g = () => { | |
| G.logger.warn( "Incognito mode detected. Database conversion can only be done in non-incognito mode! Stopping now..." ), Ce.pause( [ "Tampermonkey needs to convert its database but this can't be done in incogonito mode!", "Please open a non-incognito mode window and/or restart your browser." ], { | |
| frag: "paused" | |
| } ) | |
| }; | |
| l = [ { | |
| cond: function () { | |
| return r && !Ne.RUNTIME.FIREFOX && !Ne.RUNTIME.EDGE && "chromeStorage" == Ne.DB.USE && !c.a.getValue( Ne.CONSTANTS.STORAGE.LEGACY_VERSION ) && Object( ie.versionCmp )( "3.5.3603", n ) == ie.versionCmp.eNEWER | |
| }, | |
| fn: function () { | |
| const e = Object( o.Deferred )(); | |
| return rea.extension.inIncognitoContext ? ( g(), e.reject() ) : ( G.logger.info( "Update database..." ), i = "3.5.3603", c.a.migrate( "sql", "chromeStorage" ).done( () => { | |
| G.logger.info( "Copied config for default usage of chrome storage" ), e.resolve() | |
| } ).fail( () => { | |
| e.resolve() | |
| } ) ), e.promise() | |
| } | |
| }, { | |
| cond: function () { | |
| return r && Object( ie.versionCmp )( "3.6.3650", i ) == ie.versionCmp.eNEWER && Object( ie.versionCmp )( "3.5.3650", n ) == ie.versionCmp.eNEWER | |
| }, | |
| fn: function () { | |
| const e = Object( o.Deferred )(); | |
| if ( rea.extension.inIncognitoContext ) g(), e.reject(); | |
| else { | |
| i = "3.6.3650"; | |
| const t = []; | |
| [ { | |
| o: "TM_config", | |
| n: Ne.CONSTANTS.STORAGE.CONFIG | |
| }, { | |
| o: "TM_update_check", | |
| n: Ne.CONSTANTS.STORAGE.UPDATE | |
| }, { | |
| o: "TM_version" | |
| }, { | |
| o: "TM_unload_ts" | |
| } ].forEach( e => { | |
| if ( e.n ) { | |
| const r = c.a.getValue( e.o ); | |
| void 0 !== r && t.push( c.a.setValue( e.n, r ) ) | |
| } | |
| t.push( c.a.deleteValue( e.o ) ) | |
| } ); | |
| let r = new RegExp( "@re$" ); | |
| const s = []; | |
| c.a.listValues().forEach( e => { | |
| if ( -1 == e.search( r ) ) return; | |
| const t = e.replace( r, "" ); | |
| s.push( t ) | |
| } ), s.forEach( e => { | |
| const r = c.a.getValue( e + "@st" ), | |
| n = c.a.getValue( e ), | |
| s = c.a.getValue( e + "@re" ), | |
| o = c.a.getValue( e + "@source" ), | |
| a = at.getUidByName( e ) || Object( A.createUUID )(); | |
| t.push( c.a.deleteValue( e + "@st" ) ), t.push( c.a.deleteValue( e ) ), t.push( c.a.deleteValue( e + "@re" ) ), t.push( c.a.deleteValue( e + "@source" ) ), | |
| n && s && o ? ( t.push( c.a.setValue( Ne.CONSTANTS.PREFIX.SCRIPT_UID + a, e ) ), t.push( c.a.setValue( Ne.CONSTANTS.PREFIX.COND + a, s ) ), t.push( c.a.setValue( Ne.CONSTANTS.PREFIX.STORE + a, r ) ), t.push( c.a.setValue( Ne.CONSTANTS.PREFIX.SCRIPT + a, o ) ), t.push( c.a.setValue( Ne.CONSTANTS.PREFIX.META + a, n ) ) ) : G.logger.warn( "invalid script entry", { | |
| source: o, | |
| meta: n, | |
| cond: s | |
| } ) | |
| } ), r = new RegExp( "@st$" ), c.a.listValues().forEach( e => { | |
| -1 != e.search( r ) && t.push( c.a.deleteValue( e ) ) | |
| } ), o.Deferred.when( t ).done( () => { | |
| G.logger.info( "Converted database from", n, "to", i ), e.resolve() | |
| } ) | |
| } | |
| return e.promise() | |
| } | |
| }, { | |
| schema: "3.7.0", | |
| cond: function ( e ) { | |
| return Object( ie.versionCmp )( e, i ) == ie.versionCmp.eNEWER | |
| }, | |
| fn: function () { | |
| const e = Object( o.Deferred )(); | |
| if ( rea.extension.inIncognitoContext ) g(), e.reject(); | |
| else { | |
| const t = [], | |
| r = new RegExp( "^" + Ne.CONSTANTS.PREFIX.META ); | |
| c.a.listValues().forEach( e => { | |
| if ( -1 == e.search( r ) ) return; | |
| const n = c.a.getValue( e ); | |
| n.options && n.options.override && !n.options.override.orig_run_at && ( n.options.override.orig_run_at = n.options.run_at || "document-idle", n.options.run_at = null, t.push( c.a.setValue( e, n ) ) ) | |
| } ), o.Deferred.when( t ).done( () => { | |
| e.resolve() | |
| } ) | |
| } | |
| return e.promise() | |
| } | |
| }, { | |
| schema: "4526", | |
| cond: function ( e ) { | |
| return r && Ne.RUNTIME.SAFARI && "chromeStorage" == Ne.DB.USE && Object( ie.versionCmp )( e, i ) == ie.versionCmp.eNEWER | |
| }, | |
| fn: function () { | |
| const e = Object( o.Deferred )(); | |
| if ( rea.extension.inIncognitoContext ) g(), e.reject(); | |
| else { | |
| G.logger.info( "Update database..." ); | |
| const t = c.a.migrate( "localStorage", "chromeStorage" ).done( () => { | |
| G.logger.info( "Copied config for default usage of setting storage" ) | |
| } ).fail( () => { | |
| e.resolve() | |
| } ); | |
| e.consume( t ) | |
| } | |
| return e.promise() | |
| } | |
| }, { | |
| schema: "4871", | |
| cond: function ( e ) { | |
| return r && Object( ie.versionCmp )( e, i ) == ie.versionCmp.eNEWER | |
| }, | |
| fn: function () { | |
| const e = Object( o.Deferred )(); | |
| let t, r; | |
| const n = c.a.getValue( Ne.CONSTANTS.STORAGE.CONFIG ); | |
| return n && n.scriptTemplate && ( r = We.getDefaults() ) && ( t = r.script_templates ) && t[ 0 ] && t[ 0 ].value && ( t[ 0 ].value = n.scriptTemplate, delete n.scriptTemplate, c.a.setValue( Ne.CONSTANTS.STORAGE.CONFIG, n ) ), e.resolve(), e.promise() | |
| } | |
| }, { | |
| schema: "5465", | |
| cond: function ( e ) { | |
| return Object( ie.versionCmp )( e, i ) == ie.versionCmp.eNEWER | |
| }, | |
| fn: function () { | |
| const e = Object( o.Deferred )(); | |
| if ( rea.extension.inIncognitoContext ) g(), e.reject(); | |
| else { | |
| const t = c.a.getValue( Ne.CONSTANTS.STORAGE.CONFIG ); | |
| t && 1 == t.sync_version && ( t.sync_enabled = !1, | |
| c.a.setValue( Ne.CONSTANTS.STORAGE.CONFIG, t ) ), e.resolve() | |
| } | |
| return e.promise() | |
| } | |
| }, { | |
| cond: function () { | |
| return r || Object( ie.versionCmp )( i, a ) == ie.versionCmp.eNEWER | |
| }, | |
| fn: function () { | |
| const e = Object( o.Deferred )(); | |
| return c.a.setVersion( s, i ).done( () => { | |
| e.resolve() | |
| } ), e.promise() | |
| } | |
| }, { | |
| cond: function () { | |
| return r | |
| }, | |
| fn: function () { | |
| return G.logger.info( "First run of version " + s + "!" ), yt.scheduleNotification( n, n == t ), o.Deferred.Pledge() | |
| } | |
| }, { | |
| cond: function () { | |
| return !0 | |
| }, | |
| fn: function () { | |
| const t = Object( o.Deferred )(); | |
| return e.resolve(), | |
| window.setTimeout( t.resolve, 0 ), t.promise() | |
| } | |
| } ], d() | |
| } ), e.promise() | |
| }, | |
| Pe = function ( e, t, r ) { | |
| const n = ( 0 == e ) + "#" + ( r ? "a" : "e" ) + "#" + t, | |
| s = Fe.get( n ); | |
| let o = s ? JSON.parse( s ) : s; | |
| if ( o ) o = o.oldret; | |
| else { | |
| const s = [], | |
| a = [], | |
| i = [], | |
| A = [], | |
| l = {}; | |
| if ( t ) { | |
| const n = ot.determineScriptsToRun( t, !0, !r || void 0 ); | |
| for ( let r = 0; r < n.length; r++ ) { | |
| const o = n[ r ]; | |
| o.deleted || 0 != e && ( !0 === o.options.noframes || null === o.options.noframes && !0 === o.options.override.orig_noframes ) || ( o.evilness && o.evilness >= Math.min( ze.SEVERITY_MAX, We.values.script_blacklist_severity ) ? i.push( o ) : o.enabled ? ( l[ o.uuid ] = t, ot.isContexter( o ) ? A.push( o ) : s.push( o ) ) : a.push( o ) ) | |
| } | |
| } | |
| o = { | |
| contexters: A, | |
| runners: s, | |
| disabled: a, | |
| evilness: i, | |
| script_map: l | |
| }, t && Fe.set( n, JSON.stringify( { | |
| frameId: e, | |
| oldret: o | |
| } ) ) | |
| } | |
| return o | |
| }, | |
| Ve = function ( e, t ) { | |
| const { | |
| runners: r, | |
| contexters: n | |
| } = e, s = [ { | |
| m: "native", | |
| t: [ ne.staticVars.DEFAULT, ne.staticVars.NATIVE ] | |
| }, { | |
| m: "disabled", | |
| t: [ ne.staticVars.OFF ] | |
| }, { | |
| m: "browser", | |
| t: [ ne.staticVars.CHROME ] | |
| } ].filter( e => { | |
| if ( e.t.includes( We.values.downloads_mode ) ) return !0 | |
| } ).map( e => e.m )[ 0 ] || "disabled", o = !rea.extension.inIncognitoContext && "off" != We.values.external_connect && ot.validUrl( t, ut.externally_connectable_reg ); | |
| return { | |
| scripts: r, | |
| contexters: n.length, | |
| raw: {}, | |
| external_connect: o, | |
| isFirstPartyIsolation: dt.fpi, | |
| downloadMode: s, | |
| enforce_strict_mode: "on" == We.values.runtime_strict_mode, | |
| top_level_await: [ "default", "on" ].includes( We.values.runtime_top_level_await ), | |
| measure_scripts: We.values.debug, | |
| logLevel: We.values.logLevel, | |
| version: rea.extension.manifest.version | |
| } | |
| }, | |
| Qe = ( () => { | |
| const e = {}; | |
| let t = 1; | |
| const r = t++, | |
| n = t++, | |
| s = t++, | |
| a = t++, | |
| i = t++, | |
| l = t++, | |
| c = t++, | |
| u = () => { | |
| const e = { | |
| frames: { | |
| 0: { | |
| state: r | |
| } | |
| }, | |
| tabs: { | |
| reset_ts: Date.now() | |
| }, | |
| scripts: {}, | |
| urls: {}, | |
| maps: {}, | |
| contexts: { | |
| onUnload: {} | |
| }, | |
| stats: { | |
| running: 0, | |
| disabled: 0, | |
| searched: -1 | |
| }, | |
| extra: {} | |
| }; | |
| return Object.defineProperties( e.urls, { | |
| length: { | |
| value: 0, | |
| enumerable: !1, | |
| writable: !0, | |
| configurable: !0 | |
| } | |
| } ), e | |
| }, | |
| d = function ( t, r, n ) { | |
| let s; | |
| qe.isAllowed( n ) ? s = Pe( r, n ) : ( G.logger.log( "This URL is filtered by the security settings:", n, "-> Do nothing!" ), Qe.set.forbidden( t, r ), s = { | |
| contexters: [], | |
| runners: [], | |
| disabled: [], | |
| evilness: [], | |
| script_map: {} | |
| } ), e[ t ].scripts[ n ] = s, s.runners.forEach( e => { | |
| e.webRequest && e.webRequest.length && wt.scripts.set( t, r, e.uuid, e.webRequest ) | |
| } ) | |
| }, | |
| g = ( t, r ) => { | |
| We.values.userscript_search_url && "badge" == We.values.userscript_search_mode && Me( t ).then( n => { | |
| let s, o; | |
| ( s = e[ r ] ) && ( o = s.urls[ t ] ) && 0 === o.frameId && ( s.stats.searched = n.count, vt.setBadge( r ) ) | |
| } ) | |
| }; | |
| const p = {}, | |
| m = {}, | |
| f = {}, | |
| h = {}; | |
| let R, v; | |
| const b = { | |
| getActive: () => ( { | |
| windowId: R, | |
| tabId: v | |
| } ), | |
| listeners: { | |
| once: { | |
| whenReady: function ( t, r ) { | |
| !e[ t ] || e[ t ].frames[ 0 ].state < s ? b.listeners.once.onReady( t, r ) : r() | |
| }, | |
| onReady: function ( e, t ) { | |
| const r = e => { | |
| b.listeners.remove.onCommited( n ), b.listeners.remove.onCompleted( s ), e && t() | |
| }; | |
| var n = b.listeners.add.onCommited( t => { | |
| t === e && r( !0 ) | |
| } ), | |
| s = b.listeners.add.onCompleted( t => { | |
| t === e && r( !0 ) | |
| } ) | |
| } | |
| }, | |
| add: { | |
| onReset: function ( e ) { | |
| const t = Object( A.createUUID )(); | |
| return p[ t ] = e, t | |
| }, | |
| onCommited: function ( e ) { | |
| const t = Object( A.createUUID )(); | |
| return m[ t ] = e, t | |
| }, | |
| onCompleted: function ( e ) { | |
| const t = Object( A.createUUID )(); | |
| return f[ t ] = e, t | |
| }, | |
| onRemoved: function ( e ) { | |
| const t = Object( A.createUUID )(); | |
| return h[ t ] = e, t | |
| } | |
| }, | |
| remove: ( () => { | |
| const e = ( e, t ) => { | |
| delete e[ t ] | |
| }; | |
| return { | |
| onReset: function ( t ) { | |
| e( p, t ) | |
| }, | |
| onCommited: function ( t ) { | |
| e( m, t ) | |
| }, | |
| onCompleted: function ( t ) { | |
| e( f, t ) | |
| }, | |
| onRemoved: function ( t ) { | |
| e( h, t ) | |
| } | |
| } | |
| } )() | |
| }, | |
| events: { | |
| active: ( e, t ) => { | |
| R = t, v = e, | |
| rea.tabs.getSelected( t, t => { | |
| t.id == e && g( t.url, e ) | |
| } ) | |
| }, | |
| reset: function ( t, n ) { | |
| let s; | |
| Ne.RUNTIME.FAST_EXEC_SUPPORT && ( s = e[ t ] ) && Object.keys( s.frames ).forEach( e => { | |
| b.events.clean( t, e ) | |
| } ), s = e[ t ] = u(), s.frames[ 0 ].state = r, Object( A.each )( p, e => { | |
| e && e( t, n ) | |
| } ) | |
| }, | |
| response: function ( t, s, o ) { | |
| if ( !We.values.enabled ) return; | |
| const a = e[ t ] = e[ t ] || u(), | |
| i = a.frames[ s ] = a.frames[ s ] || {}, | |
| A = i.state || r; | |
| 0 === s && ( a.tabs.response_ts = Date.now() ); | |
| const l = T.default.woHash( o ); | |
| A < n && ( d( t, s, l ), i.state = n ); | |
| const c = a.scripts[ l ]; | |
| return c ? c.runners.length + c.contexters.length : 0 | |
| }, | |
| commited: function ( t, o, a ) { | |
| if ( !We.values.enabled ) return; | |
| const i = T.default.parse( a ); | |
| if ( "http:" !== i.protocol && "https:" !== i.protocol && "file:" !== i.protocol ) return; | |
| const l = e[ t ] = e[ t ] || u(), | |
| c = l.frames[ o ] = l.frames[ o ] || {}, | |
| g = c.state || r; | |
| if ( !( g >= s ) ) { | |
| if ( c.state = s, g < n ) { | |
| const e = T.default.woHash( a ); | |
| d( t, o, e ) | |
| } | |
| Object( A.each )( m, e => { | |
| e && e( t ) | |
| } ) | |
| } | |
| }, | |
| loading: function ( t, s, o ) { | |
| if ( !We.values.enabled ) return; | |
| const i = T.default.parse( o ); | |
| if ( ( "http:" === i.protocol || "https:" === i.protocol || "file:" === i.protocol ) && 0 === s && "file:" === i.protocol ) { | |
| const i = e[ t ] = e[ t ] || u(); | |
| i.frames[ s ] = i.frames[ s ] || {}; | |
| const A = i.frames[ s ].state || r; | |
| if ( A >= a ) return; | |
| if ( i.frames[ s ].state = a, A < n ) { | |
| const e = T.default.woHash( o ); | |
| d( t, s, e ) | |
| } | |
| } | |
| }, | |
| run: function ( t, r, n, s, a ) { | |
| if ( !We.values.enabled ) return; | |
| const l = 0 === r || Ne.RUNTIME.FAST_EXEC_SUPPORT ? r : n, | |
| c = e[ t ] = e[ t ] || u(); | |
| c.frames[ l ] = c.frames[ l ] || {}; | |
| const g = T.default.woHash( s ); | |
| let p = c.scripts[ g ]; | |
| if ( !p && ( G.logger.log( "tv: lazy init @ events.run(" + t + ", " + r + ", " + n + ", " + s + ")" ), d( t, r, g ), p = c.scripts[ g ], !p ) ) return void G.logger.warn( "tv: no script run info for tab " + t + " @ " + g, G.logger.D ? c.scripts : "" ); | |
| const m = c.frames[ l ].state; | |
| c.frames[ l ].state = i, m != i && ( function ( t, r, n ) { | |
| let s = 1; | |
| const o = ( r, n ) => { | |
| const o = 1 === s; | |
| void 0 === e[ t ].maps[ n ] && o && ( e[ t ].maps[ n ] = { | |
| count: 0, | |
| all_time: 0, | |
| urls: [] | |
| } ), o && ( e[ t ].maps[ n ].urls.push( r ), e[ t ].maps[ n ].all_time++ ), e[ t ].maps[ n ].count += s | |
| }; | |
| Object( A.each )( n, o ), | |
| e[ t ].contexts.onUnload[ r ] = e[ t ].contexts.onUnload[ r ] || [], e[ t ].contexts.onUnload[ r ].push( () => { | |
| e[ t ] && ( s = -1, Object( A.each )( n, o ) ) | |
| } ) | |
| }( t, l, p.script_map ), function ( t, r, n ) { | |
| const s = s => { | |
| 1 === s && ( void 0 === e[ t ].urls[ n ] ? e[ t ].urls[ n ] = { | |
| frameId: r, | |
| count: 0 | |
| } : 0 === r && ( e[ t ].urls[ n ].frameId = r ) ), e[ t ].urls[ n ].count += s, e[ t ].urls.length = -1 | |
| }; | |
| s( 1 ), e[ t ].contexts.onUnload[ r ] = e[ t ].contexts.onUnload[ r ] || [], e[ t ].contexts.onUnload[ r ].push( () => { | |
| e[ t ] && s( -1 ) | |
| } ) | |
| }( t, l, g ), function ( t, r, n ) { | |
| e[ t ].stats.running += n, | |
| e[ t ].contexts.onUnload[ r ] = e[ t ].contexts.onUnload[ r ] || [], e[ t ].contexts.onUnload[ r ].push( () => { | |
| e[ t ].stats.running -= n | |
| } ), e[ t ].tabs.ts = Date.now() | |
| }( t, l, p.runners.length ) ); | |
| const f = p.contexters, | |
| h = function ( e, t, r, n, s ) { | |
| const a = []; | |
| for ( let e = 0; e < n.length; e++ ) { | |
| const t = n[ e ]; | |
| a.push( tt.bundle( { | |
| url: r | |
| }, t ) ) | |
| } | |
| let i; | |
| return o.Deferred.when( a ).always( e => { | |
| s ? s( e ) : i = e | |
| } ), i | |
| }( 0, 0, g, p.runners, a ? e => { | |
| b.events.clean( t, l, s ), a( e || f && f.length ? { | |
| runners: e, | |
| contexters: f | |
| } : null ) | |
| } : null ); | |
| return h || f && f.length ? { | |
| runners: h, | |
| contexters: f | |
| } : null | |
| }, | |
| clean: function ( t, r, n ) { | |
| if ( !We.values.enabled ) return; | |
| let s, o, a; | |
| ( o = e[ t ] ) && ( n && ( s = T.default.woHash( n ), delete o.scripts[ s ] ), ( a = Qe.get.objurl( t, r ) ) && URL.revokeObjectURL( a ) ) | |
| }, | |
| complete: function ( t, n, s ) { | |
| const o = T.default.parse( s ); | |
| if ( We.values.enabled && ( "http:" === o.protocol || "https:" === o.protocol || "file:" === o.protocol ) ) { | |
| if ( 0 === n ) { | |
| const a = e[ t ] = e[ t ] || u(); | |
| a.frames[ n ] = a.frames[ n ] || {}; | |
| const A = a.frames[ n ].state || r; | |
| if ( a.frames[ n ].state = l, !Qe.get.empty( t ) && Qe.get.stats( t ).running ) { | |
| if ( A < i ) return void G.logger.warn( "tv: no script run info!" ); | |
| "file:" === o.protocol ? window.setTimeout( () => { | |
| rea.tabs.sendMessage( t, { | |
| method: "onLoad" | |
| }, { | |
| frameId: n | |
| } ) | |
| }, 500 ) : rea.tabs.sendMessage( t, { | |
| method: "onLoad" | |
| }, { | |
| frameId: n | |
| } ) | |
| } | |
| v == t && g( s, t ) | |
| } | |
| Object( A.each )( f, e => { | |
| e && e( t ) | |
| } ) | |
| } | |
| }, | |
| unload: function ( t, r, n ) { | |
| const s = 0 === r || Ne.RUNTIME.FAST_EXEC_SUPPORT ? r : n; | |
| Ne.RUNTIME.FAST_EXEC_SUPPORT && b.events.clean( t, r ); | |
| const o = e[ t ] = e[ t ] || u(); | |
| if ( o.frames[ s ] = o.frames[ s ] || {}, o.frames[ s ].state = c, o.contexts.onUnload[ s ] ) { | |
| for ( let e = 0; e < o.contexts.onUnload[ s ].length; e++ ) o.contexts.onUnload[ s ][ e ](); | |
| o.contexts.onUnload[ s ] = [] | |
| } | |
| delete o.frames[ s ] | |
| }, | |
| remove: function ( t ) { | |
| let r; | |
| Ne.RUNTIME.FAST_EXEC_SUPPORT && ( r = e[ t ] ) && Object.keys( r.frames ).forEach( e => { | |
| b.events.clean( t, e ) | |
| } ), delete e[ t ], Object( A.each )( h, e => { | |
| e && e( t ) | |
| } ) | |
| } | |
| }, | |
| set: { | |
| extra: function ( t, r, n, s ) { | |
| const o = e[ t ] = e[ t ] || u(); | |
| null === r ? o.extra[ n ] = s : ( o.extra[ n ] = o.extra[ n ] || {}, o.extra[ n ][ r ] = s ) | |
| }, | |
| objurl: function ( e, t, r ) { | |
| b.set.extra( e, t, "objurl", r ) | |
| }, | |
| blocker: function ( e ) { | |
| b.set.extra( e, null, "blocker", !0 ) | |
| }, | |
| forbidden: function ( e, t ) { | |
| 0 === t && b.set.extra( e, null, "forbidden", !0 ) | |
| }, | |
| requests: function ( t, r, n, s ) { | |
| let o, a, i; | |
| o = e[ t ] = e[ t ] || u(), a = o.frames[ r ] = o.frames[ r ] || {}, i = a.requests = a.requests || {}, i[ n ] = s | |
| } | |
| }, | |
| get: { | |
| extra: function ( t, r, n, s, o ) { | |
| void 0 === s && ( s = null ); | |
| let a = null; | |
| const i = ( e[ t ] ? e[ t ].extra : {} )[ n ]; | |
| return null !== r ? i && ( a = i[ r ], o && delete i[ r ] ) : a = i, a || s | |
| }, | |
| empty: function ( t ) { | |
| let r = !0; | |
| if ( e[ t ] ) | |
| if ( 0 == e[ t ].urls.length ); | |
| else { | |
| if ( -1 == e[ t ].urls.length ) return e[ t ].urls.length = 0, | |
| Object( A.each )( e[ t ].urls, ( r, n ) => { | |
| "length" !== n && r.count > 0 && e[ t ].urls.length++ | |
| } ), b.get.empty( t ); | |
| r = !1 | |
| } return r | |
| }, | |
| urls: function ( t, r ) { | |
| let n; | |
| return r ? ( n = e[ t ].maps[ r ] ) ? n.urls : [] : ( n = e[ t ] ) ? n.urls : {} | |
| }, | |
| history: function ( t ) { | |
| return e[ t ].maps | |
| }, | |
| stats: function ( t, r ) { | |
| const n = {}; | |
| return e[ t ] && ( n.running = e[ t ].stats.running, n.searched = e[ t ].stats.searched, r && ( n.unique = 0, Object.keys( e[ t ].maps ).forEach( r => { | |
| e[ t ].maps[ r ].count > 0 && n.unique++ | |
| } ) ) ), n | |
| }, | |
| tabs: function () { | |
| const t = {}; | |
| return Object( A.each )( e, ( e, r ) => { | |
| t[ r ] = { | |
| ts: e.response_ts | |
| } | |
| } ), t | |
| }, | |
| objurl: function ( e, t ) { | |
| return b.get.extra( e, t, "objurl", null, !0 ) | |
| }, | |
| blocker: function ( e ) { | |
| return b.get.extra( e, null, "blocker" ) | |
| }, | |
| forbidden: function ( e ) { | |
| return b.get.extra( e, null, "forbidden" ) | |
| }, | |
| requests: function ( t, r ) { | |
| return e[ t ] && e[ t ].frames[ r ] ? e[ t ].frames[ r ].requests : null | |
| } | |
| } | |
| }; | |
| return b | |
| } )(), | |
| He = ( () => { | |
| const e = {}; | |
| return { | |
| get: function ( t, r ) { | |
| return e[ t ] || ( e[ t ] = {} ), e[ t ][ r ] || ( e[ t ][ r ] = {} ), e[ t ][ r ] | |
| }, | |
| getAll: function ( t ) { | |
| const r = {}; | |
| return Object.keys( e ).forEach( n => { | |
| r[ n ] = {}, r[ n ] = e[ n ][ t ] | |
| } ), r | |
| }, | |
| set: function ( t, r, n ) { | |
| e[ t ] || ( e[ t ] = {} ); | |
| const s = {}; | |
| n && Object.keys( n ).forEach( e => { | |
| s[ e ] = n[ e ] | |
| } ), e[ t ][ r ] = s | |
| }, | |
| cleanTab: function ( t ) { | |
| delete e[ t ] | |
| } | |
| } | |
| } )(), | |
| Xe = function ( e, t ) { | |
| if ( !e || -1 != e.search( /#bypass=true/ ) || -1 != e.search( Ne.REQUESTS.GET_INTERNAL_PAGE_REGEXP() ) || ![ "https:", "http:", "file:", "ftp:" ].some( t => e.startsWith( t ) ) ) return !1; | |
| const r = t ? e : e.split( /[?#$]/ )[ 0 ], | |
| n = -1 != r.search( /[^/]{1}\.user\.(js#|js\?|js$)/ ) || -1 != r.search( /[^/]{1}\.tamper\.(js#|js\?|js$)/ ); | |
| return n ? !( -1 != r.search( /^htt[ps]{1,2}:\/\/code\.google\.com/ ) || -1 != r.search( /^htt[ps]{1,2}:\/\/(github|gitlab)\.com/ ) && !ot.determineOriginOfUrl( r ) || -1 != r.search( /^htt[ps]{1,2}:\/\/bitbucket\.org/ ) && !ot.determineOriginOfUrl( r ) ) : n | |
| }; | |
| var qe = ( () => { | |
| const e = "PageFilter"; | |
| return { | |
| init: function () { | |
| const t = () => { | |
| Be.remove( e ) | |
| }; | |
| We.addChangeListener( "forbiddenPages", t ), We.addChangeListener( "page_whitelist", t ), We.addChangeListener( "page_filter_mode", t ) | |
| }, | |
| isAllowed: function ( t ) { | |
| let r = !1, | |
| n = !1; | |
| const s = Ye.getSyncRemoteDomains().map( e => "*://" + e + "/*" ), | |
| o = We.values.forbiddenPages.concat( s ), | |
| a = o.length > 0, | |
| i = We.values.page_whitelist.length > 0; | |
| switch ( We.values.page_filter_mode ) { | |
| case "black": | |
| n = a; | |
| break; | |
| case "off": | |
| break; | |
| case "white": | |
| r = i; | |
| break; | |
| default: | |
| r = i, n = a | |
| } | |
| let A; | |
| return ( A = Be.get( e ) ) || ( A = ot.regexify( { | |
| inc: r ? We.values.page_whitelist : void 0, | |
| exc: n ? o : void 0 | |
| } ), Be.set( e, A ) ), !n && !r || ot.validUrl( t, A ) | |
| } | |
| } | |
| } )(), | |
| ze = ( () => { | |
| const e = "https://blacklist.tampermonkey.net/get.php", | |
| t = ( e, t ) => { | |
| let r = !1; | |
| if ( t.length ) return r = "/" == t.substr( 0, 1 ) ? ot.matchUrl( e, ot.convertToRegExp( t ) ) : -1 != e.indexOf( t ), r && G.logger.log( 'black: entry "' + t + '" matched' ), r | |
| }, | |
| r = { | |
| SEVERITY_MAX: 10, | |
| SEVERITY_MANUALLY_DEFINED: 11, | |
| SEVERITY_FOISTED_SCRIPT: 12, | |
| init: function () { | |
| const e = Object( o.Deferred )(), | |
| t = () => { | |
| "server" === We.values.script_blacklist_type && window.setTimeout( r.checkUpdate, 2e4 ) | |
| }; | |
| return t(), We.addChangeListener( "script_blacklist_type", t ), e.resolve(), e.promise() | |
| }, | |
| getWarningsFor: function ( e ) { | |
| const r = []; | |
| return e && Object( A.each )( We.values.script_blacklist_server, n => { | |
| if ( !n ) return; | |
| let s; | |
| if ( Object( A.each )( n.rules, r => ( s |= t( e, r ), 1 != s ) ), s ) | |
| if ( n.reasons ) { | |
| const e = M.I18N.getBestLocale( Object.keys( n.reasons ) ); | |
| r.push( n.reasons[ e || "en" ] ) | |
| } else n.reason && r.push( n.reason ) | |
| } ), r | |
| }, | |
| getEvilnessOf: function ( e ) { | |
| if ( "off" === We.values.script_blacklist_type ) return !1; | |
| if ( !e ) return 0; | |
| let n = !1, | |
| s = 0; | |
| return Object( A.each )( We.values.require_blacklist, r => ( n |= t( e, r ), 1 != n ) ), | |
| n ? s = r.SEVERITY_MANUALLY_DEFINED : "server" === We.values.script_blacklist_type && Object( A.each )( We.values.script_blacklist_server, r => { | |
| if ( r ) return Object( A.each )( r.rules, r => ( n |= t( e, r ), 1 != n ) ), n ? ( s = r.severity, !1 ) : void 0 | |
| } ), Number( s ) | |
| }, | |
| checkUpdate: function ( t ) { | |
| const r = Object( o.Deferred )(); | |
| let n, s = nt.getConfig(); | |
| if ( t || Date.now() - s.black.last > 6048e5 ) { | |
| const a = ( e, t ) => { | |
| const r = Object( o.Deferred )(), | |
| n = { | |
| method: "GET", | |
| url: e, | |
| nocache: t, | |
| retries: Ne.XMLHTTPREQUEST.RETRIES, | |
| overrideMimeType: "text/plain; charset=x-user-defined" | |
| }; | |
| return Je.internal( n, { | |
| ondone: function ( e ) { | |
| r.resolve( e ) | |
| } | |
| } ), r.promise() | |
| }; | |
| a( e + "?version=get" ).then( r => { | |
| if ( 4 == r.readyState && 200 == r.status ) { | |
| try { | |
| const e = JSON.parse( r.responseText ); | |
| n = e.version | |
| } catch ( e ) { | |
| G.logger.warn( "black: unable to parse version response! " + r.responseText ) | |
| } | |
| if ( G.logger.info( "black: local version: " + s.black.version + " remote: " + n ), n > s.black.version || t ) return a( e, !0 ) | |
| } | |
| } ).then( e => { | |
| if ( e && 4 == e.readyState && 200 == e.status ) try { | |
| const t = JSON.parse( e.responseText ); | |
| t && t.blacklist && 1 == t.version && ( We.values.script_blacklist_server = t.blacklist ), G.logger.info( "black: updated blacklist to ", t ) | |
| } catch ( t ) { | |
| G.logger.warn( "black: blacklist update failed! ", e.responseText ) | |
| } | |
| } ).always( () => { | |
| s = nt.getConfig(), s.black.last = Date.now(), s.black.version = n || s.black.version, nt.setConfig( s ), r.resolve() | |
| } ) | |
| } else r.resolve(); | |
| return r.promise() | |
| } | |
| }; | |
| return r | |
| } )(); | |
| window.blak = ze; | |
| var Ye = ( () => { | |
| let e = 0; | |
| const t = [], | |
| r = { | |
| to: null, | |
| force: null, | |
| t: 0 | |
| }, | |
| n = {}, | |
| s = Object( U.createQueue )( { | |
| threads: 1 | |
| } ), | |
| a = {}, | |
| i = ( e, t ) => s.add( () => { | |
| if ( !St.caps.syncsSource ) { | |
| let t; | |
| if ( !e.url || !( t = T.default.parse( e.url ) ) || !t.protocol.match( /https?:/ ) ) return G.logger.log( "sync: skip export due to missing URL", e.name, e.url ), o.Deferred.Pledge( !1 ) | |
| } | |
| return G.logger.log( "sync: export", e.name, e.url ), St.setMeta( e, { | |
| lastModified: e.lastModified | |
| } ).then( () => { | |
| if ( St.setSource && t ) return St.setSource( e.uuid, t ) | |
| } ).then( () => !0 ) | |
| } ), | |
| A = e => { | |
| const t = e.downloadURL ? e.downloadURL.split( "#" )[ 0 ] : null, | |
| r = e.fileURL ? e.fileURL.split( "#" )[ 0 ] : null, | |
| n = [ r, t ].filter( e => { | |
| if ( !e || "file:" !== T.default.parse( e ).protocol ) return e | |
| } )[ 0 ], | |
| s = { | |
| uuid: e.uuid, | |
| name: e.name, | |
| options: {}, | |
| durl: t, | |
| furl: r, | |
| url: n, | |
| lastModified: e.lastModified || e.lastUpdated | |
| }; | |
| for ( const t in d.SYNCED ) !0 === d.SYNCED[ t ] && null !== e.options[ t ] && ( s.options[ t ] = e.options[ t ] ); | |
| return s | |
| }, | |
| l = () => { | |
| const e = []; | |
| return at.getUidList().forEach( t => { | |
| const r = at.getByUid( t ); | |
| if ( r.script && r.cond && !r.script.deleted ) { | |
| const t = A( r.script ); | |
| if ( !t.lastModified && !Ue ) return void G.logger.warn( "sync: script without updated/modified timestamps found", r.script ); | |
| if ( r.script.evilness && r.script.evilness >= Math.min( ze.SEVERITY_MAX, We.values.script_blacklist_severity ) ) return void G.logger.warn( "sync: ignore evil script", r.script ); | |
| e.push( t ) | |
| } | |
| } ), e | |
| }, | |
| c = () => { | |
| d.enabled && d.sync( 500, !0 ) | |
| }; | |
| let u = null; | |
| var d = { | |
| enabled: !1, | |
| SYNCED: { | |
| comment: !0 | |
| }, | |
| configChangeListener: function () { | |
| u || ( u = window.setTimeout( () => { | |
| u = null, d.init().done( () => { | |
| d.enabled && d.sync( 3e3 ) | |
| } ) | |
| }, 3e3 ) ) | |
| }, | |
| init: function () { | |
| const e = Object( o.Deferred )(); | |
| return d.enabled = !1, ( () => { | |
| if ( We.values.sync_enabled && We.values.sync_type ) { | |
| let e; | |
| return We.values.sync_type == Ae.b.eWEBDAV && ( e = { | |
| url: We.values.cloud_url, | |
| basic_auth: Z.a.Base64.encode( We.values.cloud_user + ":" + We.values.cloud_pass ) | |
| } ), St.init( We.values.sync_type, e ).done( e => { | |
| d.enabled = e, d.enabled ? St.addChangeListener( c ) : G.logger.warn( "sync: init failed!" ) | |
| } ).fail( () => { | |
| G.logger.warn( "sync: init failed!" ) | |
| } ) | |
| } | |
| return o.Deferred.Pledge() | |
| } )().always( () => { | |
| e.resolve( d.enabled ) | |
| } ), e.promise() | |
| }, | |
| finalize: function () {}, | |
| reset: function () { | |
| return d.enabled ? St.reset() : o.Deferred.Breach() | |
| }, | |
| addSyncDoneCallback: function ( e ) { | |
| t.push( e ) | |
| }, | |
| sync: function ( A, c ) { | |
| const u = Date.now(); | |
| A = A || 500, c = r.force || c, r.to ? ( window.clearTimeout( r.to ), r.ts < u + A && ( A = r.ts - u ) < 1 && ( A = 1 ) ) : G.logger.log( "sync: schedule sync for run in " + A + " ms" ), r.force = c, r.ts = u + A, r.to = window.setTimeout( () => { | |
| ( r => { | |
| if ( !d.enabled ) return; | |
| if ( e > 0 ) return void( r && d.addSyncDoneCallback( e => { | |
| e && d.sync( 50, r ) | |
| } ) ); | |
| e++; | |
| let A = null, | |
| c = null, | |
| u = 0, | |
| g = 0, | |
| p = !0; | |
| const m = e => { | |
| if ( e ) | |
| for ( let t = 0; t < c.length; t++ ) | |
| if ( c[ t ].uuid == e ) return c[ t ]; | |
| return null | |
| }, | |
| f = ( e, t, r ) => r ? Math.floor( e / r ) * r < Math.floor( t / r ) * r : e < t; | |
| rt.all( "status", { | |
| key: "sync_status", | |
| class: "information", | |
| title: M.I18N.getMessage( "Script_Sync" ), | |
| text: M.I18N.getMessage( "Sync_is_running" ), | |
| timeout: 9e5 | |
| } ), o.Deferred.Pledge().then( () => ( A = l(), St.list().done( e => { | |
| c = e | |
| } ).fail( () => { | |
| G.logger.warn( "sync: unable to get remotelist!" ) | |
| } ) ) ).then( () => { | |
| const e = c.map( e => { | |
| let t; | |
| const r = ( e => { | |
| if ( !e ) return null; | |
| for ( let t = 0; t < A.length; t++ ) | |
| if ( A[ t ].uuid == e ) return A[ t ] | |
| } )( e.uuid ); | |
| let i, l; | |
| if ( r ) { | |
| if ( !e.lastModified && We.values.sync_type == Ae.b.eCHROMESYNC ) | |
| for ( const t in d.SYNCED ) | |
| if ( !0 === d.SYNCED[ t ] && r.options[ t ] != e.options[ t ] ) { | |
| G.logger.log( "sync: importable change detected!", e.name, "key:", t, e ), i = !0; | |
| break | |
| } e.lastModified && f( r.lastModified, e.lastModified, e.precision ) && ( l = e.lastModified, i = !0, | |
| G.logger.log( "sync: importable change detected!", e.name, "local ts:", new Date( r.lastModified ), "remote ts:", new Date( e.lastModified ), e ) ) | |
| } else( t = a[ e.uuid ] ) && e.lastModified && f( t.lastModified, e.lastModified, e.precision ) && ( l = e.lastModified, i = !0, G.logger.log( "sync: changed cache entry detected!", e.name, "local ts:", new Date( t.lastModified ), "remote ts:", new Date( e.lastModified ), e ) ); | |
| if ( !r && !t || i ) return () => o.Deferred.Pledge().then( () => St.caps.specialMeta ? St.getMeta( e.uuid ) : o.Deferred.Pledge( e ) ).then( e => { | |
| if ( !e ) return; | |
| let A; | |
| if ( r ) { | |
| if ( e.options.removed ) u++, G.logger.log( "sync: remove local script", e.uuid, e.name, e.url ), ot.doRemove( r.uuid, !1 ); | |
| else if ( i ) return c = l, g = e.lastModified, ( ( p = e.precision ) ? Math.floor( c / p ) * p != Math.floor( g / p ) * p : c != g ) && ( e.lastModified && G.logger.warn( "sync: list and meta data lastModified differ, this will cause extra traffic!", "file ts:", new Date( l ), "meta ts:", new Date( e.lastModified ), e ), e.lastModified = l ), u++, G.logger.log( "sync: update local script", e.uuid, e.name, e.url ), | |
| o.Deferred.Pledge().then( () => { | |
| if ( St.caps.syncsSource ) { | |
| const t = Object( o.Deferred )(); | |
| return St.getSource( e.uuid, null ).then( t => t ? ot.doSave( { | |
| uuid: e.uuid, | |
| src: t, | |
| ask: !1, | |
| internal: !0, | |
| save: !0 | |
| } ) : o.Deferred.Breach() ).fail( () => { | |
| G.logger.warn( "sync: getting source of", e.uuid, "failed", e ) | |
| } ).always( t.resolve ), t.promise() | |
| } | |
| } ).then( () => { | |
| const t = at.getByUid( r.uuid ); | |
| for ( A in d.SYNCED ) !0 === d.SYNCED[ A ] && ( t.script.options[ A ] = e.options[ A ] ); | |
| return t.script.lastModified = e.lastModified, ot.doModify( t.script.uuid, t.script, !1 ) | |
| } ) | |
| } else if ( r || e.options.removed ) !t && e.options.removed && ( a[ e.uuid ] = e ); | |
| else { | |
| const t = Object( o.Deferred )(); | |
| if ( !( e.url && n[ e.url ] || e.uuid && n[ e.uuid ] ) ) return ( e => s.add( () => { | |
| G.logger.log( "sync: import", e.uuid, e.name, e.url ); | |
| const t = { | |
| imported: We.values.sync_type | |
| }, | |
| r = {}; | |
| for ( const t in d.SYNCED ) !0 === d.SYNCED[ t ] && ( r[ t ] = e.options[ t ] ); | |
| const n = { | |
| uuid: e.uuid, | |
| ask: !1, | |
| internal: !0, | |
| sync: t, | |
| force_meta: { | |
| lastModified: e.lastModified, | |
| fileURL: e.url | |
| }, | |
| force_options: r | |
| }, | |
| s = { | |
| silent_fail: !0 | |
| }; | |
| return ( St.caps.syncsSource ? St.getSource( e.uuid ).then( e => ot.installFromSource( e, n, s ) ) : ot.installFromUrl( e.url, n, s ) ).done( () => { | |
| Fe.removeAll() | |
| } ) | |
| } ) )( e ).done( t => { | |
| t ? u++ : ( G.logger.warn( "sync: unable to import", e ), n[ e.url ] = !0, n[ e.uuid ] = !0 ) | |
| } ).fail( () => { | |
| G.logger.warn( "sync: unable to load", e ), n[ e.url ] = !0, n[ e.uuid ] = !0 | |
| } ).always( t.resolve ), t.promise(); | |
| G.logger.warn( "sync: skip previously failed import", e ) | |
| } | |
| var c, g, p | |
| } ) | |
| } ).filter( e => e ); | |
| return o.Deferred.onebyone( e ) | |
| } ).then( () => ( u && ( ot.reorderScripts(), | |
| rt.all( "status", { | |
| key: "sync", | |
| class: "information", | |
| title: M.I18N.getMessage( "Script_Sync" ), | |
| text: M.I18N.getMessage( "0count0_changes_imported", u ), | |
| timeout: 1e4 | |
| } ) ), A = l(), o.Deferred.Pledge() ) ).then( () => { | |
| const e = []; | |
| for ( let t = 0; t < A.length; t++ ) e.push( ( () => { | |
| const e = A[ t ]; | |
| let r, n; | |
| if ( !St.caps.syncsSource && !e.url ) return o.Deferred.Pledge(); | |
| const s = m( e.uuid ); | |
| var a, l, c; | |
| if ( s ? s.lastModified && ( a = e.lastModified, l = s.lastModified, !( ( c = s.precision ) ? Math.floor( a / c ) * c > Math.floor( l / c ) * c : a > l ) ) || ( r = !0, | |
| G.logger.log( "sync: exportable change detected!", e.name, "remote ts:", new Date( s.lastModified ), "local ts:", new Date( e.lastModified ), e ) ) : G.logger.log( "sync: export because remotely missing!", e.name, "local ts:", new Date( e.lastModified ), e ), !s || r || St.caps.syncsSource && !s.source ) { | |
| if ( St.caps.syncsSource ) { | |
| const t = at.getByUid( e.uuid ); | |
| t.script && t.cond && ( n = t.script.textContent ) | |
| } | |
| return i( e, n ).then( e => { | |
| e && g++ | |
| } ) | |
| } | |
| return o.Deferred.Pledge() | |
| } )() ); | |
| return o.Deferred.when( e ) | |
| } ).fail( () => { | |
| p = !1 | |
| } ).done( () => { | |
| p = !0 | |
| } ).always( () => { | |
| G.logger.log( "sync: finished" ), 0 == --e && ( rt.all( "status", { | |
| key: "sync_status", | |
| class: "information", | |
| title: M.I18N.getMessage( "Script_Sync" ), | |
| text: M.I18N.getMessage( "Sync_finished" ), | |
| timeout: 15e3 | |
| } ), g && rt.all( "status", { | |
| key: "sync", | |
| class: "information", | |
| title: M.I18N.getMessage( "Script_Sync" ), | |
| text: M.I18N.getMessage( "0count0_changes_exported", g ), | |
| timeout: 5e3 | |
| } ), ( e => { | |
| for ( ; t.length; ) t.shift()( e ) | |
| } )( p ) ) | |
| } ) | |
| } )( r.force ), r.to = null, r.force = null | |
| }, A ) | |
| }, | |
| scriptAddedCb: function ( e, t ) { | |
| if ( !d.enabled ) return; | |
| const r = A( t ); | |
| i( r, t.textContent ) | |
| }, | |
| scriptChangedCb: function () { | |
| d.enabled && d.sync( 6e4 ) | |
| }, | |
| scriptRemovedCb: function ( e, t ) { | |
| var r; | |
| d.enabled && ( r = A( t ), G.logger.log( "sync: remove", r.name, r.url ), St.remove( r ) ) | |
| }, | |
| getSyncRemoteUrl: function ( e ) { | |
| if ( d.enabled ) return St.getRemoteUrl( e ) | |
| }, | |
| getSyncRemoteDomains: function () { | |
| return St.getRemoteDomains() || [] | |
| } | |
| }; | |
| return d | |
| } )(); | |
| window.sycl = Ye; | |
| var We = ( () => { | |
| const e = [ { | |
| name: "ECMAScript 5", | |
| value: [ "// ==UserScript==", "// @name New Userscript", "// @namespace http://tampermonkey.net/", "// @version 0.1", "// @description try to take over the world!", "// @author You", "// @match <$URL$>", "// @icon <$ICON$>", "// @grant none", "// ==/UserScript==", "", "(function() {", " 'use strict';", "", " // Your code here...", "})();" ].join( "\n" ) | |
| }, { | |
| name: "ECMAScript 6", | |
| value: [ "// ==UserScript==", "// @name New ES6-Userscript", "// @namespace http://tampermonkey.net/", "// @version 0.1", "// @description shows how to use babel compiler", "// @author You", "// @require https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.18.2/babel.js", "// @require https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.16.0/polyfill.js", "// @match <$URL$>", "// @icon <$ICON$>", "// ==/UserScript==", "", "var inline_src = (<><![CDATA[", "", " // Your code here...", "", "]]></>).toString();", 'var c = Babel.transform(inline_src, { presets: [ "es2015", "es2016" ] });', "eval(c.code);" ].join( "\n" ) | |
| }, { | |
| name: "CoffeeScript", | |
| value: [ "// ==UserScript==", "// @name New Coffee-Userscript", "// @namespace http://tampermonkey.net/", "// @version 0.1", "// @description shows how to use coffeescript compiler", "// @author You", "// @require http://coffeescript.org/browser-compiler/coffeescript.js", "// @match <$URL$>", "// @icon <$ICON$>", "// ==/UserScript==", "", "var inline_src = (<><![CDATA[", "", " // Your code here", "", "]]></>).toString();", "var compiled = this.CoffeeScript.compile(inline_src);", "eval(compiled);" ].join( "\n" ) | |
| } ], | |
| t = {}, | |
| r = { | |
| enabled: !0, | |
| configMode: 0, | |
| debug: !1, | |
| logLevel: 0, | |
| showFixedSrc: !1, | |
| webrequest_modHeaders: "yes", | |
| webrequest_fixCSP: "yes", | |
| webrequest_fixContentCSP: "no", | |
| notification_showUpdate: "changelog", | |
| notification_silentScriptUpdate: !0, | |
| script_templates: e, | |
| scriptUpdateCheckPeriod: 864e5, | |
| scriptUpdateHideNotificationAfter: 15e3, | |
| scriptUpdateCheckDisabled: !1, | |
| scriptUrlDetection: "auto", | |
| script_file_access: Ne.RUNTIME.FIREFOX ? "off" : "externals", | |
| trash_cleanup_after: 6048e5, | |
| runtime_strict_mode: "byscript", | |
| runtime_top_level_await: "default", | |
| runtime_inject_mode: "default", | |
| autoReload: !1, | |
| appearance_badges: "running", | |
| appearance_badge_color: "gcal" === rea.runtime.short_id ? "#444" : "#ee3131", | |
| appearance_badge_text_color: "#ffffff", | |
| context_menu_enabled: !0, | |
| context_menu_scripts: !0, | |
| context_menu_commands: !0, | |
| editor_enabled: !0, | |
| editor_fontSize: 100, | |
| editor_theme: "default", | |
| editor_keyMap: "windows", | |
| editor_indentUnit: 4, | |
| editor_tabSize: 4, | |
| editor_indentWithTabs: "spaces", | |
| editor_tabMode: "indent", | |
| editor_electricChars: !0, | |
| editor_autoSave: !1, | |
| editor_easySave: !0, | |
| editor_autoLint: !0, | |
| editor_autoLintMaxLen: 3e5, | |
| editor_lineWrapping: !1, | |
| userscript_search_url: Oe, | |
| userscript_search_mode: "disabled", | |
| editor_highlightTrailingWhitespace: !0, | |
| editor_trimTrailingSpacesFromModifiedLines: !0, | |
| editor_highlightSelectionMatches: "cursor", | |
| editor_linter_config: null, | |
| favicon_service: "google", | |
| i18n: null, | |
| action_menu_columns: 1, | |
| action_menu_scripts_hide_disabled: !1, | |
| action_menu_scripts_sort: "auto", | |
| incognito_mode: "temporary", | |
| layout: "default", | |
| layout_user_css: "", | |
| sync_enabled: !1, | |
| sync_type: 2, | |
| statistics_enabled: !Ne.RUNTIME.FIREFOX && !Ne.RUNTIME.SAFARI || "firb" == rea.runtime.short_id || null, | |
| downloads_mode: "default", | |
| downloads_extension_whitelist: [ "/^[^\\.]*$/", "/\\.mp[34]$/", ".wav", "/\\.(avi|mkv|flv|divx|mpe?g|webm)$/", "/\\.(ico|gif|png|jpe?g)/", "/\\.(srt|sub|idx)$/", ".txt", ".iso", ".zip", "/\\.r(ar|[0-9]{2,2})$/" ], | |
| external_update_interval: 6048e5, | |
| external_connect: "all", | |
| require_timeout: 2e4, | |
| require_blacklist: [ "/^https?:\\/\\/example.com(:[0-9]{1,5})?\\/.*/" ], | |
| require_sri_mode: "supported", | |
| script_blacklist_server: [], | |
| script_blacklist_type: "server", | |
| script_blacklist_severity: 4, | |
| connect_mode: "ask", | |
| page_filter_mode: "black", | |
| page_whitelist: [ "/https?:\\/\\/greasyfork\\.org\\/.*/", "http://xkcd.com/970/" ], | |
| forbiddenPages: [ "*example.org/*", "*paypal.tld/*", "*stripe.com/*", "https://*deutsche-bank-24.tld/*", "https://*bankofamerica.tld/*", "/^.*:\\/\\/apis\\.google\\.com\\/((?!render)([^\\/]+)\\/)+([^\\/]+)?$/", "*://www.facebook.com/plugins/*", "*://platform.twitter.com/widgets/*" ] | |
| }, | |
| n = { | |
| cloud_url: null, | |
| cloud_user: null, | |
| cloud_pass: null | |
| }, | |
| s = e => { | |
| let t; | |
| return void 0 !== ( t = c.a.getValue( Ne.CONSTANTS.STORAGE.CONFIG, {} )[ e ] ) ? t : "function" == typeof ( t = r[ e ] ) ? t() : t | |
| }, | |
| a = ( e, r ) => { | |
| const n = c.a.getValue( Ne.CONSTANTS.STORAGE.CONFIG, {} ), | |
| o = s( e ); | |
| n[ e ] = r; | |
| const a = c.a.setValue( Ne.CONSTANTS.STORAGE.CONFIG, n ); | |
| return t[ e ] && JSON.stringify( o ) != JSON.stringify( r ) && t[ e ].forEach( t => { | |
| try { | |
| t( e, o, r, a ) | |
| } catch ( e ) { | |
| G.logger.warn( "config: changeListener error", e ) | |
| } | |
| } ), a | |
| }; | |
| let i, A; | |
| if ( Ne.HTML5.LOCALSTORAGE && ( A = Ne.HTML5.LOCALSTORAGE.getItem( Ne.CONSTANTS.STORAGE.SESSION ) ) ) try { | |
| i = JSON.parse( Z.a.Base64.decode( A ) ) | |
| } catch ( e ) {} | |
| i = i || {}; | |
| const l = e => { | |
| let t; | |
| return void 0 !== ( t = i[ e ] ) ? t : n[ e ] | |
| }, | |
| u = ( e, r ) => { | |
| const n = l( e ); | |
| return void 0 === r ? delete i[ e ] : i[ e ] = r, Ne.HTML5.LOCALSTORAGE && Ne.HTML5.LOCALSTORAGE.setItem( Ne.CONSTANTS.STORAGE.SESSION, Z.a.Base64.encode( JSON.stringify( i ) ) ), t[ e ] && JSON.stringify( n ) != JSON.stringify( r ) && t[ e ].forEach( t => { | |
| try { | |
| t( e, n, r ) | |
| } catch ( e ) { | |
| G.logger.warn( "config: changeListener error", e ) | |
| } | |
| } ), o.Deferred.Pledge() | |
| }, | |
| d = { | |
| init: function () { | |
| const e = Object( o.Deferred )(); | |
| return d.values = {}, Object.defineProperty( d, "snapshot", { | |
| get: function () { | |
| return { | |
| ...d.values | |
| } | |
| }, | |
| enumerable: !0 | |
| } ), Object.keys( r ).forEach( e => { | |
| Object.defineProperty( d.values, e, { | |
| get: function () { | |
| return s( e ) | |
| }, | |
| set: function ( t ) { | |
| a( e, t ) | |
| }, | |
| enumerable: !0 | |
| } ) | |
| } ), Object.keys( n ).forEach( e => { | |
| Object.defineProperty( d.values, e, { | |
| get: function () { | |
| return l( e ) | |
| }, | |
| set: function ( t ) { | |
| u( e, t ) | |
| }, | |
| enumerable: !0 | |
| } ) | |
| } ), d.initialized = !0, ( async t => { | |
| const r = Object.keys( t ).map( async e => { | |
| const r = t[ e ]; | |
| await Object( U.sleepEvery )( 1e3 ), ot.doSave( { | |
| url: null, | |
| src: r, | |
| ask: !1, | |
| replace: !0, | |
| internal: !0 | |
| } ) | |
| } ); | |
| await o.Deferred.when( r ), e.resolve() | |
| } )( [] ), e.promise() | |
| }, | |
| getValue: function ( e ) { | |
| return n.hasOwnProperty( e ) ? l( e ) : s( e ) | |
| }, | |
| setValue: function ( e, t ) { | |
| return n.hasOwnProperty( e ) ? u( e, t ) : a( e, t ) | |
| }, | |
| getDefaults: function () { | |
| return r | |
| }, | |
| addChangeListener: function ( e, r ) { | |
| Array.isArray( e ) || ( e = [ e ] ), e.forEach( e => { | |
| t[ e ] || ( t[ e ] = [] ), t[ e ].push( r ) | |
| } ) | |
| } | |
| }; | |
| return d | |
| } )(), | |
| Je = ( () => { | |
| let e, t, r, n, s, a = {}; | |
| const i = "runtime_host_permissions", | |
| A = () => o.Deferred.sleep( 1 ).then( () => !rea.permissions.supported || I.has( Ne.PERMISSIONS.ALL_URLS ).then( e => e, () => !0 ) ).always( e => { | |
| t = e, t ? rt.removeAll( i ) : ( rt.all( "status", { | |
| key: i, | |
| id: i, | |
| class: "warning", | |
| text: M.I18N.getMessage( "Limited_runtime_host_permissions_might_break_some_Tampermonkey_features_" ), | |
| timeout: 31536e6 | |
| } ), l && ( wt.addRedirectListener( l ), l = null ) ), r = null | |
| } ); | |
| let l = e => { | |
| u( e.url, 1e3 ) | |
| }; | |
| let c; | |
| const u = ( e, i ) => { | |
| if ( c || ( c = window.setTimeout( () => { | |
| c = null, o.Deferred.Pledge().then( () => { | |
| if ( void 0 === t ) return s || ( I.addListener( e => { | |
| G.logger.info( "pcx: detected permission change", e ), t = void 0, r = A() | |
| } ), s = !0 ), r = r || A(), r | |
| } ).then( () => n ).then( () => { | |
| const e = Object.values( a ); | |
| if ( a = {}, t ) return e; { | |
| let t; | |
| const r = {}, | |
| s = e.map( e => { | |
| const t = ( n = e.url, T.default.woPath( n ) + "/*" ); | |
| var n; | |
| return I.hasOrigin( t ).then( e => { | |
| e || ( r[ t ] = !0 ) | |
| } ) | |
| } ); | |
| return t = n = o.Deferred.sidebyside( s ).then( () => { | |
| const t = Object.keys( r ); | |
| return t.length ? ( G.logger.info( "pcx: need to ask for some permissions", t ), I.askOrigin( t, M.I18N.getMessage( "Cross_Origin_Request_Permission" ), M.I18N.getMessage( "Click_here_to_allow_TM_to_access_the_following_hosts_0host_list0", t.join( "\n" ) ) ).then( () => ( n = null, e ) ) ) : e | |
| } ).always( () => { | |
| n = null | |
| } ), t | |
| } | |
| } ).always( e => { | |
| e.forEach( e => e.deferred.resolve() ), Object.keys( a ).length && u() | |
| } ) | |
| }, i || 100 ) ), !e ) return o.Deferred.Pledge(); | |
| if ( a[ e ] ) return a[ e ].deferred.promise(); | |
| const l = Object( o.Deferred )(); | |
| return a[ e ] = { | |
| url: e, | |
| deferred: l | |
| }, l.promise() | |
| }, | |
| d = ( t, r, n, s ) => { | |
| let o, a; | |
| return u( t.url ).then( () => { | |
| if ( a ) return r.onabort && r.onabort(), void( r.ondone && r.ondone( {} ) ); | |
| ( n = n || {} ).internal = s, o = e( t, r, n ) | |
| } ), { | |
| abort: function () { | |
| if ( o ) return o.abort(); | |
| a = !0 | |
| } | |
| } | |
| }; | |
| return { | |
| init: function () { | |
| e = N.default.run | |
| }, | |
| internal: ( e, t, r ) => d( e, t, r, !0 ), | |
| external: ( e, t, r ) => d( e, t, r, !1 ) | |
| } | |
| } )(); | |
| const Ke = () => { | |
| const e = Object( o.Deferred )(); | |
| return rea.tabs.getSelected( null, t => { | |
| e.resolve( t ) | |
| } ), e.promise() | |
| }, | |
| $e = ( () => { | |
| const e = {}, | |
| t = e => e && e.includes( "*" ), | |
| r = () => { | |
| const e = e => { | |
| for ( let t = 0; t < s.length; t++ ) | |
| if ( s[ t ].tabId === e ) return s.splice( t, 1 )[ 0 ]; | |
| return s.pop() | |
| }; | |
| let t; | |
| Ke().then( r => { | |
| for ( ; !n && ( t = e( r.id ) ); ) t.fn() | |
| } ) | |
| }; | |
| var n, s = []; | |
| const a = ( i, l, c, u ) => { | |
| const d = ( ( e, t ) => { | |
| const r = e => e ? e.map( e => { | |
| if ( e.match( /^'?self'?$/ ) ) e = T.default.parse( t.url ).hostname || null; | |
| else if ( "'none'" == e ) e = "none"; | |
| else { | |
| if ( [ "none", "localhost", "*" ].includes( e ) ) return e; | |
| if ( T.default.isIpOrHostname( e ) ) return e; | |
| if ( 0 === e.indexOf( "." ) ) return null; | |
| if ( 1 === ( e.match( /\./g ) || [] ).length && T.default.isSecondLevelDomain( e ) ) return null | |
| } | |
| return e | |
| } ) : []; | |
| return { | |
| connects: e.options.override.merge_connects && "paranoid" != We.values.connect_mode ? r( e.connects ) : [], | |
| userconnects: r( e.options.override.use_connects ), | |
| blockers: r( e.options.override.use_blockers ) | |
| } | |
| } )( i, l ); | |
| return ( e => { | |
| const t = Object( o.Deferred )(); | |
| return qe.isAllowed( e ) ? t.resolve( { | |
| allowed: !0 | |
| } ) : t.resolve( { | |
| allowed: !1 | |
| } ), t.promise() | |
| } )( c ).then( r => { | |
| if ( !0 !== r.allowed ) return o.Deferred.Breach( "URL is blacklisted" ); | |
| let n, s; | |
| return ( n = T.default.parse( c ) ) && n.origin && ( s = T.default.parse( l.url ) ) && s.origin && n.origin === s.origin ? o.Deferred.Pledge( { | |
| permitted: !0 | |
| } ) : ( ( r, n, s ) => { | |
| const a = Object( o.Deferred )(), | |
| i = () => { | |
| a.resolve( { | |
| permitted: !0 | |
| } ) | |
| }, | |
| l = e => { | |
| a.resolve( { | |
| permitted: !1, | |
| reason: e | |
| } ) | |
| }, | |
| c = () => { | |
| a.resolve( { | |
| unknown: !0 | |
| } ) | |
| }; | |
| let u, d; | |
| const g = e => t( e ) ? i : null, | |
| p = ( e, t ) => { | |
| let r = null; | |
| const n = T.default.isIpOrHostname( e ); | |
| return t.every( t => { | |
| if ( t.a ) | |
| for ( let s = 0; s < t.a.length; s++ ) | |
| if ( t.a[ s ] && ( n || T.default.isIpOrHostname( t.a[ s ] ) ? t.a[ s ] === e : -1 != e.search( new RegExp( "(^|.+\\.)" + Object( A.escapeForRegExp )( t.a[ s ] ) + "$" ) ) ) ) return r = t.blocker ? l : i, !1; | |
| return !0 | |
| } ), r | |
| }; | |
| return "off" == We.values.connect_mode || s.startsWith( "data:" ) || s.startsWith( "blob:" ) ? i() : ( u = T.default.parse( s ) ) && u.hostname ? ( d = p( u.hostname, [ { | |
| a: e[ r.uuid ] | |
| } ] ) ) || ( d = g( e[ r.uuid ] ) ) ? d() : 0 === n.connects.length && 0 === n.userconnects.length && 0 === n.blockers.length ? "casual" == We.values.connect_mode ? i() : "strict" == We.values.connect_mode ? l( "No @connects given, but strict mode enabled" ) : c() : n.connects.includes( "none" ) ? l( "None value found" ) : ( "casual" == We.values.connect_mode && !t( n.blockers ) && ( d = g( n.connects ) ) || ( d = g( n.userconnects ) ) || ( d = p( u.hostname, [ { | |
| a: n.blockers, | |
| blocker: !0 | |
| }, { | |
| a: n.connects | |
| }, { | |
| a: n.userconnects | |
| } ] ) || c ), d() ) : l( "URL can not be parsed" ), a.promise() | |
| } )( i, d, c ) | |
| } ).then( A => { | |
| if ( !1 === A.permitted ) return o.Deferred.Breach( "URL is not permitted" + ( A.reason ? ": " + A.reason : "" ) ); | |
| if ( !0 === A.permitted ) return o.Deferred.Pledge(); | |
| if ( 0 === d.connects.length || t( d.connects ) ) { | |
| if ( [ "ask", "paranoid" ].includes( We.values.connect_mode ) ) { | |
| if ( t( d.blockers ) ) return o.Deferred.Breach( "URL was permanently blocked by the user" ); | |
| if ( n ) { | |
| G.logger.log( 'cor: queuing access permission check from "' + i.name + '" to', c, l ); | |
| const e = Object( o.Deferred )(); | |
| return s.push( { | |
| tabId: l.tab ? l.tab.id : null, | |
| fn: function () { | |
| e.consume( a.apply( this, [ i, l, c, u ] ) ) | |
| } | |
| } ), e.promise() | |
| } | |
| return ( ( a, i, A, l, c ) => { | |
| let u; | |
| const d = Object( o.Deferred )(), | |
| g = () => { | |
| d.resolve( { | |
| approved: !0 | |
| } ) | |
| }, | |
| p = () => { | |
| d.resolve( { | |
| forbidden: !0 | |
| } ) | |
| }; | |
| if ( G.logger.log( 'cor: "' + a.name + '" is asking for permission to access', l, i ), ( u = T.default.parse( l ) ) && u.hostname ) { | |
| const o = ( e => { | |
| if ( T.default.isIpOrHostname( e ) ) return null; | |
| const t = e.split( "." ); | |
| if ( t.length < 3 ) return e; | |
| const r = T.default.isSecondLevelDomain( t.slice( -2 ).join( "." ) ) ? -3 : -2; | |
| return t.slice( r ).join( "." ) | |
| } )( u.hostname ), | |
| d = i.tab ? i.tab.id : null; | |
| n = !0, Ke().then( e => v.askForConnect( { | |
| src_url: i.url, | |
| hostname: u.hostname, | |
| domain: o, | |
| all_domains: t( A.connects ), | |
| tabid: d, | |
| active: d === e.id, | |
| timeout: c, | |
| url: l, | |
| settings_url: rea.extension.getURL( "options.html" ) + "#nav=" + a.uuid + "+settings", | |
| connect_url: "https://www.tampermonkey.net/documentation.php#_connect", | |
| script: { | |
| name: a.name, | |
| uuid: a.uuid, | |
| icon: a.icon64 || a.icon || x.a.images.origin( "unknown" ) | |
| } | |
| } ) ).done( t => { | |
| let r; | |
| const n = t.whole_domain ? o : u.hostname; | |
| t.allow ? t.once ? ( G.logger.log( 'cor: allowing "' + a.name + '" to access', n, "once" ), g() ) : t.temporary ? ( G.logger.log( 'cor: allowing "' + a.name + '" to access', n, "temporarily" ), void 0 === e[ a.uuid ] && ( e[ a.uuid ] = [] ), e[ a.uuid ].includes( n ) || e[ a.uuid ].push( n ), g() ) : ( r = g, t.all_domains ? ( G.logger.log( 'cor: allowing "' + a.name + '" to access all domains always' ), a.options.override.use_connects.push( "*" ) ) : ( G.logger.log( 'cor: allowing "' + a.name + '" to access', n, "always" ), a.options.override.use_connects.push( n ), | |
| r = g ) ) : t.once || t.aborted ? ( G.logger.log( 'cor: denying "' + a.name + '" to access', n, "once" ), p() ) : ( a.options.override.use_blockers || ( a.options.override.use_blockers = [] ), r = p, t.all_domains ? ( G.logger.log( 'cor: denying "' + a.name + '" to access any domains (additional) domain' ), a.options.override.use_blockers.push( "*" ) ) : ( G.logger.log( 'cor: denying "' + a.name + '" to access', n, "always" ), a.options.override.use_blockers.push( n ) ) ), r && ot.doModify( a.uuid, a, !1 ).always( r ) | |
| } ).fail( p ).always( () => { | |
| n = !1, | |
| s.length && window.setTimeout( r, 1 ) | |
| } ) | |
| } else p(); | |
| return d.promise() | |
| } )( i, l, d, c, u ).then( e => !0 === e.approved ? o.Deferred.Pledge() : o.Deferred.Breach( "Request was blocked by the user" ) ) | |
| } | |
| return o.Deferred.Breach() | |
| } | |
| return o.Deferred.Breach( "URL is not a part of the @connect list" ) | |
| } ) | |
| }; | |
| return { | |
| getSessionConnects: function ( t ) { | |
| return e[ t ] || [] | |
| }, | |
| setSessionConnects: function ( t, r ) { | |
| e[ t ] = r || [] | |
| }, | |
| purgeAppeals: function ( e ) { | |
| s = s.filter( t => t.tabId !== e ) | |
| }, | |
| exec: function ( e, t, r, n, s ) { | |
| let o, i, A, l, c, u = e.url; | |
| const d = [], | |
| g = Math.max( Math.min( e.timeout || 0, 6e4 ), 2e4 ), | |
| p = () => { | |
| let e; | |
| for ( ; !c && ( e = d.shift() ); ) e() | |
| }, | |
| m = ( t, r ) => { | |
| const n = 'Refused to connect to "' + ( r || e.url ) + '": ' + ( t || "Blocked by @connect CORS check" ), | |
| o = N.default.makeErrorResponse( n ); | |
| [ "onerror", "ondone" ].forEach( e => { | |
| s[ e ] && s[ e ]( { | |
| response: o, | |
| exception: n | |
| } ) | |
| } ) | |
| }; | |
| return r && r.url && r.tab && e.url && t && ( i = at.getByUid( t ) ) && i.script && i.cond && !i.script.deleted ? ( a( i.script, r, e.url, g ).done( () => { | |
| if ( l ) return; | |
| const t = {}; | |
| Object.keys( s ).forEach( e => { | |
| t[ e ] = ( n, ...f ) => { | |
| A || ( c ? d.push( ( function () { | |
| t[ e ].apply( this, [ n, ...f ] ) | |
| } ) ) : ( n && n.finalUrl && u !== n.finalUrl ? ( c = !0, a( i.script, r, n.finalUrl, g ).fail( () => { | |
| l || A || ( o && o.abort(), A = !0, m( "Request was redirected to a not whitelisted URL", n.finalUrl ), G.logger.warn( "cor: request to", u, "was redirect to a not whitelisted URL", n.finalUrl ) ) | |
| } ).always( () => { | |
| u = n.finalUrl, c = !1, d.length && window.setTimeout( p, 1 ) | |
| } ) ) : { | |
| always: function ( e ) { | |
| e() | |
| } | |
| } ).always( () => { | |
| A || s[ e ]( { | |
| response: n | |
| } ) | |
| } ) ) | |
| } | |
| } ), o = Je.external( e, t, n ) | |
| } ).fail( e => { | |
| l || ( m( e ), | |
| G.logger.warn( "cor: access to", u, "was denied" ) ) | |
| } ).always( () => { | |
| l && ( s.onabort && s.onabort(), s.ondone && s.ondone( {} ) ) | |
| } ), { | |
| abort: () => { | |
| o ? o.abort() : l = !0 | |
| } | |
| } ) : m() | |
| } | |
| } | |
| } )(), | |
| et = ( () => { | |
| const e = { | |
| key: function ( e, t ) { | |
| return Ne.CONSTANTS.PREFIX.EXTERNAL + [ e, t ? Z.a.MD5( t ) : null ].filter( e => e ).join( ":" ) | |
| }, | |
| list: function ( e ) { | |
| const t = new RegExp( "^" + e ); | |
| return c.a.listValues().filter( e => -1 != e.search( t ) ) | |
| }, | |
| set: function ( t, r, n, s ) { | |
| const o = e.key( t, r ), | |
| a = {}; | |
| Object( A.each )( n, ( e, t ) => { | |
| "content" == t && ( t = "base", e = Z.a.encodeS( e ) ), a[ t ] = e | |
| } ), | |
| c.a.setValue( o, { | |
| ts: Date.now(), | |
| url: r, | |
| resource: a, | |
| modified: s | |
| } ) | |
| }, | |
| get: function ( t, r ) { | |
| const n = e.key( t, r ), | |
| s = c.a.getValue( n ); | |
| let o; | |
| if ( s && s.resource ) { | |
| const e = {}; | |
| Object( A.each )( s.resource, ( t, r ) => { | |
| "base" == r && ( r = "content", t = Z.a.decodeS( t ) ), e[ r ] = t | |
| } ), o = { | |
| ts: s.ts, | |
| url: s.url, | |
| data: e, | |
| modified: s.modified | |
| } | |
| } | |
| return o | |
| }, | |
| clean: function ( t, r ) { | |
| const n = e.key( t, r ); | |
| c.a.deleteValue( n ) | |
| }, | |
| cleanAll: function ( t, r ) { | |
| let n; | |
| const s = e.list( e.key( t ) ); | |
| if ( r ) { | |
| const o = {}; | |
| Object( A.each )( r, r => { | |
| const n = e.key( t, r ); | |
| o[ n ] = !0 | |
| } ), n = [], | |
| Object( A.each )( s, e => { | |
| o[ e ] || n.push( e ) | |
| } ) | |
| } else n = s; | |
| n.forEach( e => { | |
| c.a.deleteValue( e ) | |
| } ) | |
| } | |
| }, | |
| t = Object( A.getDebouncer )( 9e3 ), | |
| r = ( t, r, n, s ) => { | |
| const a = Object( o.Deferred )(), | |
| i = { | |
| sync: !1 | |
| }; | |
| return ( ( e, t ) => { | |
| const r = Object( o.Deferred )(), | |
| n = n => { | |
| const s = { | |
| content: "" | |
| }; | |
| if ( 4 != n.readyState || 200 != n.status && 0 != n.status || n.error ) r.reject( s ); | |
| else { | |
| let o, a; | |
| const i = N.default.parseHeaders( n.responseHeaders )[ "content-type" ]; | |
| i && i.match( "(image/|text/)([.-a-zA-Z0-9]+)" ) && ( o = i ), | |
| o || ( ( a = e.match( ".*.(ico|jpg|jpeg)+($|\\?|#).*" ) ) ? o = "image/x-icon" : ( a = e.match( ".*.(gif|png)+($|\\?|#).*" ) ) ? o = "image/" + a[ 1 ] : -1 != e.search( ".*.(js)+($|\\?|#).*" ) ? o = "text/javascript" : ( a = e.match( ".*.(css|html|xml)+($|\\?|#).*" ) ) ? o = "text/" + a[ 1 ] : Object( A.isLocalImage )( e ) && ( o = "image/x-icon" ) ), s.meta = o, s.content = Z.a.ab2strSync( n.response, t.encoding ) || "", r.resolve( s ) | |
| } | |
| }, | |
| s = () => { | |
| r.reject( {} ) | |
| }, | |
| a = T.default.parse( e ); | |
| if ( [ "file:" ].concat( Ne.REQUESTS.INTERNAL_PAGE_PROTOCOLS ).includes( a.protocol ) ) | |
| if ( "file:" != a.protocol || Ne.RUNTIME.ALLOWS_FILE_SCHEME_ACCESS && [ "externals", "all" ].includes( We.values.script_file_access ) ) rea.file.get( e, e => { | |
| n( { | |
| readyState: 4, | |
| status: 0, | |
| response: e | |
| } ) | |
| }, () => { | |
| s() | |
| } ); | |
| else { | |
| const t = "Access to this local file is forbidden!"; | |
| G.logger.warn( "externals:", t, "Loading the following @resource failed:", e, "-> more info:", "https://www.tampermonkey.net/faq.php#Q204" ), s() | |
| } | |
| else { | |
| const t = { | |
| method: "GET", | |
| url: e, | |
| retries: Ne.XMLHTTPREQUEST.RETRIES, | |
| nocache: !1, | |
| responseType: "arraybuffer" | |
| }; | |
| t.timeout = We.values.require_timeout, Je.internal( t, { | |
| onload: n, | |
| onerror: s, | |
| ontimeout: s | |
| } ) | |
| } | |
| return r.promise() | |
| } )( r, { | |
| encoding: s.encoding | |
| } ).done( o => { | |
| n && ( o.sri = n ); | |
| const A = n => { | |
| const s = T.default.parse( r ); | |
| s.protocol && ![ "file:" ].concat( Ne.REQUESTS.INTERNAL_PAGE_PROTOCOLS ).includes( s.protocol ) && e.set( t, r, n ) | |
| }; | |
| n && [ "supported", "given" ].includes( We.values.require_sri_mode ) ? S.SRI.check( n, o.content, s.encoding ).done( () => { | |
| i.resource = o, | |
| A( i.resource ), a.resolve( i ) | |
| } ).fail( e => { | |
| i.resource = { | |
| forbidden: !0, | |
| sri: { | |
| mode: We.values.require_sri_mode, | |
| type: n.type, | |
| value: "invalid" | |
| }, | |
| determined: e, | |
| content: "" | |
| }, A( i.resource ), a.reject( i ) | |
| } ) : ( i.resource = o, A( i.resource ), a.resolve( i ) ) | |
| } ).fail( e => { | |
| G.logger.log( "externals: get.failed", t, r, e ), i.resource = { | |
| failed: !0, | |
| content: "" | |
| }, a.reject( i ) | |
| } ), a.promise() | |
| }, | |
| n = ( n, s, a ) => { | |
| const i = Object( o.Deferred )(), | |
| A = T.default.parse( s ), | |
| l = { | |
| sync: a.sync | |
| }; | |
| let c; | |
| return s ? ze.getEvilnessOf( s ) >= We.values.script_blacklist_severity ? ( l.resource = { | |
| blacklisted: !0, | |
| content: "" | |
| }, i.reject( l ) ) : S.SRI.getHash( A, "supported" == We.values.require_sri_mode ).done( o => { | |
| if ( "enforce" != We.values.require_sri_mode || o ) | |
| if ( "file:" !== A.protocol && ( c = e.get( n, s ) ) ) { | |
| const A = e.key( n, s ), | |
| u = Date.now(); | |
| We.values.external_update_interval > 0 && u - c.ts > We.values.external_update_interval && ( t.is( A ) || ( We.values.external_update_interval > 1 && t.add( A ), | |
| c.modified ? G.logger.log( "externals: resource is not updated due to user modifications", s, new Date( c.ts ).toISOString(), new Date( u ).toISOString() ) : ( G.logger.log( "externals: resource needs update", s, new Date( c.ts ).toISOString(), new Date( u ).toISOString() ), window.setTimeout( () => { | |
| r( n, s, o, a ) | |
| }, 3e3 ) ) ) ), l.resource = c.data, l.resource.forbidden || l.resource.blacklisted ? i.reject( l ) : i.resolve( l ) | |
| } else i.consume( r( n, s, o, a ) ); | |
| else l.resource = { | |
| forbidden: !0, | |
| sri: { | |
| mode: We.values.require_sri_mode | |
| }, | |
| content: "" | |
| }, | |
| i.reject( l ) | |
| } ) : ( l.resource = { | |
| forbidden: !0, | |
| content: "" | |
| }, i.reject( l ) ), i.promise() | |
| }, | |
| s = { | |
| setElement: function ( t, r, n, s ) { | |
| return e.set( t, r, n, s ) | |
| }, | |
| getElement: function ( t, r ) { | |
| return e.get( t, r ) | |
| }, | |
| cleanElement: function ( t, r ) { | |
| return e.clean( t, r ) | |
| }, | |
| dropAll: function ( t ) { | |
| return e.cleanAll( t ), o.Deferred.Pledge() | |
| }, | |
| dropAllBut: function ( t, r ) { | |
| return e.cleanAll( t, r ), o.Deferred.Pledge() | |
| }, | |
| loadResources: function ( e, t ) { | |
| const r = Object( o.Deferred )(); | |
| return s.getResources( e, t ).always( () => { | |
| r.resolve() | |
| } ), r.promise() | |
| }, | |
| loadRequires: function ( e, t ) { | |
| const r = Object( o.Deferred )(); | |
| return s.getRequires( e, t ).always( () => { | |
| r.resolve() | |
| } ), r.promise() | |
| }, | |
| getResources: function ( e, t ) { | |
| const r = { | |
| elements: [] | |
| }, | |
| s = Object( o.Deferred )(), | |
| a = [], | |
| i = { | |
| sync: !0 | |
| }; | |
| return t.forEach( t => { | |
| const s = t.url || T.default.sanitize( t.unsafe_url, t.abs_url ), | |
| A = { | |
| name: t.name, | |
| url: s | |
| }, | |
| l = n( e, s, i ), | |
| c = Object( o.Deferred )(); | |
| l.done( e => { | |
| const t = e.resource; | |
| A.content = t.content, A.meta = t.meta || "application" | |
| } ).fail( e => { | |
| e.resource && e.resource.forbidden ? e.resource.sri ? G.logger.warn( "externals: can't load @resource", t.name, "from URL", t.unsafe_url, "due to a SRI error" ) : G.logger.warn( "externals: can't load @resource", t.name, "from forbidden URL", t.unsafe_url ) : e.resource && e.resource.blacklisted ? G.logger.warn( "externals: can't load @resource", t.name, "from blacklisted URL", t.unsafe_url ) : ( G.logger.warn( "externals: can't load @resource", t.name, "from URL", t.unsafe_url ), A.failed = !0 ), A.content = null | |
| } ).always( e => { | |
| i.sync &= e.sync, r.elements.push( A ), c.resolve() | |
| } ), a.push( c ) | |
| } ), o.Deferred.when( a ).always( () => { | |
| r.sync = i.sync, s.resolve( r ) | |
| } ), s.promise() | |
| }, | |
| getRequires: function ( e, t ) { | |
| const r = { | |
| elements: [] | |
| }, | |
| s = Object( o.Deferred )(), | |
| a = [], | |
| i = { | |
| encoding: "UTF-8", | |
| sync: !0 | |
| }; | |
| return Object( A.each )( t, ( t, s ) => { | |
| const A = t.url || T.default.sanitize( t.unsafe_url, t.abs_url ), | |
| l = {}, | |
| c = n( e, A, i ), | |
| u = Object( o.Deferred )(); | |
| c.done( e => { | |
| l.textContent = e.resource.content || "" | |
| } ).fail( e => { | |
| let r; | |
| r = e.resource && e.resource.forbidden ? e.resource.sri ? "couldn't load @require from URL " + t.unsafe_url + " due to a SRI error" : "couldn't load @require from forbidden URL " + t.unsafe_url : e.resource && e.resource.blacklisted ? "couldn't load @require from blacklisted URL " + t.unsafe_url : "couldn't load @require from URL " + t.unsafe_url, l.textContent = ( e => 'console.warn("Tampermonkey: " + decodeURIComponent("' + encodeURIComponent( e ) + '"));' )( r ) + "\n", G.logger.warn( "externals: " + r ) | |
| } ).always( e => { | |
| i.sync &= e.sync, | |
| r.elements[ s ] = l, u.resolve() | |
| } ), a.push( u ) | |
| } ), o.Deferred.when( a ).always( () => { | |
| r.sync = i.sync, r.elements = r.elements.filter( e => e ), s.resolve( r ) | |
| } ), s.promise() | |
| } | |
| }; | |
| return s | |
| } )(); | |
| window.exts = et; | |
| var tt = ( () => { | |
| const e = {}; | |
| return { | |
| bundle: function ( t, r ) { | |
| let n, s, a = !0; | |
| if ( n = e[ r.uuid ] ) return n; | |
| const i = {}, | |
| l = [ "includes", "matches", "requires", "resources", "excludes", "connects", "textContent" ]; | |
| return Object.keys( r ).forEach( e => { | |
| l.includes( e ) || ( "options" == e ? ( i[ e ] = JSON.parse( JSON.stringify( r[ e ] ) ), | |
| i[ e ].run_at = i[ e ].run_at || r.options.override.orig_run_at || "document-idle" ) : i[ e ] = r[ e ] ) | |
| } ), n = et.getResources( i.uuid, r.resources ).then( e => ( a && !e.sync && ( G.logger.log( "ri: uncached @external detected -> fast script start disabled" ), a = e.sync ), i.resources = e.elements, et.getRequires( i.uuid, r.requires ) ) ).then( e => { | |
| a && !e.sync && ( G.logger.log( "ri: uncached @external detected -> fast script start disabled" ), a = e.sync ); | |
| const n = e.elements; | |
| return G.logger.log( "run script " + i.name + " @ " + t.url ), ( ( e, t, r ) => { | |
| const n = Object( o.Deferred )(), | |
| s = []; | |
| r.forEach( t => { | |
| let r = t.textContent || ""; | |
| r = ae.mkCompat( r, e.options.compatopts_for_requires ? e : null, "off" != We.values.runtime_strict_mode ), s.push( r ) | |
| } ); | |
| const a = "\n" + s.join( "\n" ) + "\n", | |
| i = at.getStorageByUid( e.uuid ); | |
| let l = ae.mkCompat( t, e, "off" != We.values.runtime_strict_mode ); | |
| if ( We.values.debug ) { | |
| const e = l.split( "\n" ); | |
| let t, r = !1; | |
| for ( let n = 0; n < e.length; n++ ) { | |
| const s = e[ n ]; | |
| if ( !s.match( /^\s*$|^\s*\/\/\s*|^\s*\/\*.*\*\/\s*$|^\s*["']+use strict["']+;*\s*$/ ) ) { | |
| if ( s.match( /^\s*\/\*/ ) && ( r = !0 ), !r ) { | |
| e[ n ] = "debugger;" + e[ n ]; | |
| break | |
| } | |
| if ( s.match( /\*\/\s*$/ ) ) r = !1; | |
| else if ( -1 != ( t = s.search( /\*\// ) ) ) { | |
| e[ n ] = Object( A.insert )( e[ n ], t + 2, 0, "debugger;" ); | |
| break | |
| } | |
| } | |
| } | |
| l = e.join( "\n" ) | |
| } | |
| const c = encodeURIComponent( e.name ) + ".user.js"; | |
| let u; | |
| u = Ne.RUNTIME.FIREFOX ? rea.extension.getURL( "userscripts/" ) + c + "?" + T.default.hash2params( { | |
| id: e.uuid | |
| } ) : rea.extension.getURL( "userscript.html" ) + "?" + T.default.hash2params( { | |
| name: c, | |
| id: e.uuid | |
| } ); | |
| const d = { | |
| header: e.header, | |
| code: l, | |
| requires: a, | |
| storage: i, | |
| script: e, | |
| source_url: u | |
| }; | |
| return n.resolve( d ), n.promise() | |
| } )( i, r.textContent, n ) | |
| } ).always( () => { | |
| s = !0, delete e[ i.uuid ] | |
| } ), s || ( e[ i.uuid ] = n ), n | |
| } | |
| } | |
| } )(), | |
| rt = ( () => { | |
| const e = {}, | |
| t = {}, | |
| r = ( e, t ) => { | |
| let r; | |
| const n = t.key || "general", | |
| s = t.timeout || 3e5, | |
| o = window.setTimeout( () => { | |
| delete e[ n ] | |
| }, s ); | |
| ( r = e[ n ] ) && window.clearTimeout( r.to ), e[ n ] = { | |
| ts: Date.now() + s, | |
| options: t, | |
| to: o | |
| } | |
| }, | |
| n = e => { | |
| const t = Date.now(); | |
| return Object.keys( e ).map( r => { | |
| const n = e[ r ], | |
| s = Object( A.copy )( n.options, {} ); | |
| let o; | |
| if ( o = Math.max( 0, n.ts - t ) ) return s.timeout = o, s | |
| } ).filter( e => e ) | |
| }, | |
| s = { | |
| all: function ( e, t ) { | |
| s.actionPage( e, t ), s.optionsPage( e, t ) | |
| }, | |
| removeAll: function ( r ) { | |
| delete e[ r ], delete t[ r ] | |
| }, | |
| actionPage: function ( t, n ) { | |
| const s = rea.extension.getViews( { | |
| type: "popup" | |
| } ); | |
| s && s.length && rea.extension.sendMessage( { | |
| method: t, | |
| options: n | |
| }, () => {} ), n && r( e, n ) | |
| }, | |
| optionsPage: function ( e, n ) { | |
| const s = rea.extension.getViews( { | |
| type: "tab" | |
| } ); | |
| s && s.length && rea.extension.sendMessage( { | |
| method: e, | |
| options: n | |
| }, () => {} ), n && r( t, n ) | |
| }, | |
| actionStatus: function () { | |
| return n( t ) | |
| }, | |
| optionsStatus: function () { | |
| return n( e ) | |
| } | |
| }; | |
| return s | |
| } )(), | |
| nt = { | |
| getConfig: function () { | |
| const e = { | |
| scripts: 0 | |
| }; | |
| let t = c.a.getValue( Ne.CONSTANTS.STORAGE.UPDATE, e ); | |
| return "object" != typeof t && ( t = e ), t || ( t = e ), null == t.black && ( t.black = { | |
| version: 0, | |
| last: 0 | |
| } ), null == t.scripts && ( t.scripts = 0 ), t | |
| }, | |
| setConfig: function ( e ) { | |
| e && c.a.setValue( Ne.CONSTANTS.STORAGE.UPDATE, e ) | |
| } | |
| }; | |
| const st = ( () => { | |
| let e = null; | |
| const t = 36e5; | |
| var r = { | |
| check: function ( e, n, s ) { | |
| if ( !e && We.values.scriptUpdateCheckPeriod <= 0 ) return o.Deferred.Breach(); | |
| let a, i, A = nt.getConfig(); | |
| return !e && Date.now() - A.scripts < Math.max( We.values.scriptUpdateCheckPeriod, t ) ? o.Deferred.Breach() : o.Deferred.Pledge().then( () => { | |
| const e = () => { | |
| i = null; | |
| const e = M.I18N.getMessage( "Script_Update" ), | |
| t = M.I18N.getMessage( "Waiting_for_sync_to_finish" ) + "..."; | |
| i = u.Notify.show( e, t, x.a.images.brand( "tampermonkey" ), { | |
| timeout: 6e4 | |
| } ) | |
| }; | |
| if ( Ye.enabled ) { | |
| const t = Object( o.Deferred )(); | |
| return Ye.addSyncDoneCallback( t.resolve ), Ye.sync( 50, !1 ), n && ( a = window.setTimeout( e, 500 ) ), t.promise() | |
| } | |
| } ).then( () => { | |
| if ( e ) return; | |
| const t = Object( o.Deferred )(), | |
| r = () => { | |
| rea.idle.queryState( Ne.MISC.IDLE_TIMEOUT, e => { | |
| "active" == e ? window.setTimeout( r, 1e3 * Math.round( Ne.MISC.IDLE_TIMEOUT / 2 ) ) : n() | |
| } ) | |
| }; | |
| var n = () => { | |
| let e; | |
| rea.windows.getAll( {}, n => { | |
| n.forEach( t => { | |
| "fullscreen" === t.state && ( e = !0 ) | |
| } ), e ? window.setTimeout( r, 1e3 * Ne.MISC.IDLE_TIMEOUT ) : t.resolve() | |
| } ) | |
| }; | |
| return r(), t.promise() | |
| } ).then( () => { | |
| const e = Object( o.Deferred )(); | |
| return a && ( window.clearTimeout( a ), a = null ), i && i.cancel(), ( ( e, t ) => { | |
| let n = 0, | |
| s = 0, | |
| a = 0; | |
| const i = M.I18N.getMessage( "Script_Update" ), | |
| A = M.I18N.getMessage( "Check_for_userscripts_updates" ) + "..."; | |
| e && u.Notify.show( i, A, x.a.images.brand( "tampermonkey" ), { | |
| timeout: 1e4 | |
| } ); | |
| const l = at.getUidList().map( e => { | |
| let i, A, l, c; | |
| return ( () => { | |
| if ( i = at.getByUid( e ), !i.script || !i.cond ) return G.logger.warn( "update: inconsistent script entry", e, i ), o.Deferred.Breach(); | |
| if ( i.script.deleted ) return o.Deferred.Breach(); | |
| const r = t && i.script.uuid !== t, | |
| s = !We.values.scriptUpdateCheckDisabled && !i.script.enabled && !t || !i.script.options.check_for_updates; | |
| if ( r || s || !( c = ot.determineSourceURL( i.script ) ) ) return o.Deferred.Breach(); | |
| if ( i.script.evilness && i.script.evilness >= Math.min( ze.SEVERITY_MAX, We.values.script_blacklist_severity ) ) return o.Deferred.Breach(); | |
| let a; | |
| return ( a = ot.determineOrigin( i.script ) ) && a.updates_allowed && !a.updates_allowed( c ) ? o.Deferred.Breach() : ( n++, G.logger.info( "update: check for script updates @", e ), | |
| o.Deferred.Pledge() ) | |
| } )().then( () => { | |
| const e = ot.determineMetaURL( i.script ); | |
| if ( !e ) return o.Deferred.Pledge(); | |
| if ( "none" == e ) return G.logger.debug( "update: ignore non-updatable script", i.script.name ), o.Deferred.Breach(); | |
| const t = Object( o.Deferred )(), | |
| r = { | |
| method: "GET", | |
| retries: Ne.XMLHTTPREQUEST.RETRIES, | |
| timeout: 1e3 * Ne.SCRIPT_DOWNLOAD.TIMEOUT, | |
| revalidate: !0, | |
| headers: { | |
| Accept: "text/x-userscript-meta, */*" | |
| }, | |
| url: e | |
| }; | |
| return Je.internal( r, { | |
| ondone: function ( r ) { | |
| 4 == r.readyState && 200 == r.status ? A = Object( ie.processMetaHeader )( r.responseText ) : G.logger.warn( "update: unable to find meta data @ " + e + " req.status = " + r.status ), t.resolve() | |
| } | |
| } ), t.promise() | |
| } ).then( () => { | |
| const e = !!A, | |
| t = e && !!A.version, | |
| r = t && ( !i.script.version || Object( ie.versionCmp )( A.version, i.script.version ) == ie.versionCmp.eNEWER ); | |
| return e && t && !r ? o.Deferred.Breach() : o.Deferred.Pledge() | |
| } ).then( () => { | |
| let e; | |
| if ( e = T.default.parse( c ) ) { | |
| if ( e.protocol.match( /(https?|file):/ ) ) return r.getScriptFromURL( c ).fail( () => { | |
| G.logger.warn( "update: failed", i.script.name, c ) | |
| } ); | |
| G.logger.warn( "update: can't download URL", i.script.name, c ) | |
| } else G.logger.warn( "update: can't parse URL", i.script.name, c ) | |
| } ).then( e => ( ( e, t ) => { | |
| const r = Object( ie.createScriptFromSrc )( t ); | |
| if ( !r || !r.name || void 0 === r.version ) return ie.versionCmp.eERROR; | |
| let n; | |
| return ( n = at.getMetaByUid( e ) ) ? n.system ? null : r.version == n.version ? ie.versionCmp.eEQUAL : Object( ie.versionCmp )( r.version, n.version ) : ie.versionCmp.eNEWER | |
| } )( i.script.uuid, e ) == ie.versionCmp.eNEWER ? ( s++, l = { | |
| name: i.script.name, | |
| url: c, | |
| code: e | |
| }, o.Deferred.Pledge() ) : o.Deferred.Breach() ).then( () => { | |
| if ( We.values.notification_silentScriptUpdate ) return o.Deferred.Pledge(); { | |
| const e = M.I18N.getMessage( "There_is_an_update_for_0name0_avaiable_", l.name ) + "\n" + M.I18N.getMessage( "Click_here_to_install_it_" ), | |
| t = M.I18N.getMessage( "Just_another_service_provided_by_your_friendly_script_updater_" ) + ":", | |
| r = Object( o.Deferred )(); | |
| return u.Notify.show( t, e, x.a.images.brand( "tampermonkey" ), { | |
| timeout: We.values.scriptUpdateHideNotificationAfter | |
| }, r.resolve ), r.promise() | |
| } | |
| } ).then( t => { | |
| const r = e || i.script.uuid; | |
| return void 0 === t || t.clicked ? ot.doSave( { | |
| url: l.url, | |
| uuid: r, | |
| replace: !r, | |
| src: l.code, | |
| ask: !We.values.notification_silentScriptUpdate | |
| } ).done( e => { | |
| e && e.installed && a++ | |
| } ) : o.Deferred.Breach() | |
| } ) | |
| } ); | |
| return n && rt.all( "status", { | |
| key: "script_update", | |
| class: "information", | |
| title: i, | |
| text: A, | |
| timeout: 1e4 | |
| } ), o.Deferred.sidebyside( l ).then( () => ( l.length && 0 == s && ( G.logger.debug( "No update found" ), e && u.Notify.show( "Narf!", M.I18N.getMessage( "No_update_found__sry_" ), x.a.images.brand( "tampermonkey" ), { | |
| timeout: 1e4 | |
| } ), rt.all( "status", { | |
| key: "script_update", | |
| class: "information", | |
| text: M.I18N.getMessage( "No_update_found__sry_" ), | |
| timeout: 1e4 | |
| } ) ), { | |
| found: s, | |
| installed: a | |
| } ) ) | |
| } )( n, s ).done( t => { | |
| e.resolve( t.installed ) | |
| } ).fail( () => { | |
| e.resolve( null ) | |
| } ), A = nt.getConfig(), A.scripts = Date.now(), nt.setConfig( A ), e.promise() | |
| } ) | |
| }, | |
| getScriptFromURL: function ( e ) { | |
| const t = Object( o.Deferred )(); | |
| if ( [ "file:" ].concat( Ne.REQUESTS.INTERNAL_PAGE_PROTOCOLS ).includes( T.default.parse( e ).protocol ) ) rea.file.get( e, e => { | |
| t.resolve( Z.a.ab2strSync( e, "UTF-8" ) ) | |
| }, e => { | |
| t.reject( { | |
| error: !0, | |
| responseText: e | |
| } ) | |
| } ); | |
| else { | |
| const r = { | |
| method: "GET", | |
| retries: Ne.XMLHTTPREQUEST.RETRIES, | |
| timeout: 1e3 * Ne.SCRIPT_DOWNLOAD.TIMEOUT, | |
| revalidate: !0, | |
| headers: { | |
| Accept: "text/x-userscript, */*" | |
| }, | |
| url: e | |
| }; | |
| Je.internal( r, { | |
| onload: function ( e ) { | |
| 4 != e.readyState || 200 != e.status && 0 != e.status || e.error ? t.reject( { | |
| error: !0, | |
| responseText: e.responseText | |
| } ) : t.resolve( e.responseText ) | |
| }, | |
| onerror: function ( e ) { | |
| t.reject( { | |
| error: !0, | |
| responseText: e.responseText | |
| } ) | |
| }, | |
| ontimeout: function () { | |
| t.reject( { | |
| timeout: !0, | |
| responseText: "" | |
| } ) | |
| } | |
| } ) | |
| } | |
| return t.promise() | |
| }, | |
| init: function () { | |
| const n = () => { | |
| e && ( window.clearTimeout( e ), e = null ), We.values.scriptUpdateCheckPeriod > 0 && ( e = window.setTimeout( () => { | |
| e = null, r.check(), n() | |
| }, t ) ) | |
| }; | |
| n(), We.addChangeListener( "scriptUpdateCheckPeriod", n ) | |
| } | |
| }; | |
| return r | |
| } )(); | |
| window.trup = st; | |
| var ot = ( () => { | |
| const e = e => ( e.sort( ( e, t ) => e.position - t.position ), e ), | |
| t = e => { | |
| void 0 === e.ask && ( e.ask = !0 ), void 0 !== e.url && null != e.url || ( e.url = "" ), "" === e.force_url && ( e.force_url = null ); | |
| let t = Object( ie.createScriptFromSrc )( e.src ), | |
| r = null; | |
| const n = { | |
| heading: null, | |
| errors: [], | |
| info: [], | |
| warnings: [], | |
| flags: {} | |
| }, | |
| a = Object( o.Deferred )(), | |
| i = Date.now(), | |
| l = e.save && !e.ask && We.values.editor_easySave; | |
| let c, u = e.uuid; | |
| return ( t && t.name && null != t.version ? o.Deferred.Pledge() : ( n.errors.push( M.I18N.getMessage( "Invalid_UserScript__Sry_" ) + "\n\n" ), e.name && n.errors.push( M.I18N.getMessage( "Script_name_0name0", e.name ) + "\n\n" ), e.url && n.errors.push( M.I18N.getMessage( "Downloaded_from_0url0", e.url ) ), G.logger.warn( "scriptman: invalid userscript", n, t ), o.Deferred.Breach() ) ).then( () => { | |
| if ( e.replace && !u && ( u = at.getUidsByName( t.name, t.namespace )[ 0 ] ), u ) r = at.getMetaByUid( u ); | |
| else if ( t.uuid ) u = t.uuid; | |
| else { | |
| if ( !e.replace ) return G.logger.warn( "scriptman: neither UUID, @uuid nor replace option set" ), o.Deferred.Breach(); | |
| u = Object( A.createUUID )() | |
| } | |
| return "" !== u.replace( /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}/, "" ) ? ( G.logger.warn( "scriptman: invalid UUID", u ), o.Deferred.Breach() ) : !e.clean && !e.defaultscript && r && r.system ? o.Deferred.Breach() : void 0 | |
| } ).then( () => { | |
| if ( e.clean && e.name && e.name != t.name || -1 != t.name.indexOf( "\n" ) ) return n.errors.push( M.I18N.getMessage( "Invalid_UserScript_name__Sry_" ) ), o.Deferred.Breach() | |
| } ).then( () => { | |
| if ( r ) { | |
| if ( r.name != t.name && ( n.flags.renamed = !0 ), e.internal || r.evilness != ze.SEVERITY_FOISTED_SCRIPT || ( n.warnings.push( M.I18N.getMessage( "This_is_a_possibly_foisted_script_and_a_modification_will_enable_it_" ) ), n.flags.forceAsk = !0 ), r.lastModified && void 0 !== e.lastModTime && r.lastModified !== e.lastModTime ) { | |
| let e = M.I18N.getMessage( "some_secs" ); | |
| try { | |
| const t = Math.max( 1, Math.floor( ( i - r.lastModified ) / 1e3 ) ); | |
| isNaN( t ) || ( e = t ) | |
| } catch ( e ) {} | |
| n.warnings.push( M.I18N.getMessage( "CONFLICT__This_script_was_modified_0t0_seconds_ago_", e ) ), n.flags.forceAsk = !0 | |
| } | |
| t.version == r.version && ( e.save ? n.flags.modification = !0 : n.flags.reset = !0 ), e.clean && ( n.flags.factory = !0 ), c = !e.internal | |
| } else n.flags.first_install = !0, c = !e.internal || e.save; | |
| t.includes.length || t.matches.length || l || e.internal || n.warnings.push( M.I18N.getMessage( "This_script_does_not_provide_any__include_information_" ) ), t.antifeatures && !e.internal && Object.keys( t.antifeatures ).forEach( e => { | |
| const s = t.antifeatures[ e ]; | |
| let o; | |
| o = "ads" == e ? M.I18N.getMessage( "Antifeature_ads" ) : "miner" == e ? M.I18N.getMessage( "Antifeature_miner" ) : "tracking" == e ? M.I18N.getMessage( "Antifeature_tracking" ) : M.I18N.getMessage( "Antifeature_other" ); | |
| const a = s[ M.I18N.getBestLocale( Object.keys( s ) ) || "default" ] || s.en || M.I18N.getMessage( "Antifeature_no_details" ); | |
| let i, A; | |
| r && r.antifeatures && ( A = r.antifeatures[ e ] ) && ( i = A[ M.I18N.getBestLocale( Object.keys( A ) ) || "default" ] || A.en || M.I18N.getMessage( "Antifeature_no_details" ) ), l && i && a === i || n.warnings.push( M.I18N.getMessage( "Antifeature__0name0__0description0", o, a ) ) | |
| } ), n.flags.sync = !!e.sync, n.flags.internal = e.internal, n.flags.ask = e.ask, n.flags.save = e.save, n.flags.whitewash = e.whitewash | |
| } ).then( () => { | |
| if ( t.uuid = u, t.system = e.defaultscript, t.evilness = ot.getEvilness( t ), t.position = ot.determineLastPosition() + 1, t.lastModified = i, e.force_meta ) { | |
| let r; | |
| ( r = e.force_meta.fileURL ) && ( t.fileURL = r ), ( r = e.force_meta.lastModified ) && ( t.lastModified = r ) | |
| } | |
| n.flags.factory || n.flags.reset ? r && ( t.lastModified = r.lastModified ) : ( e.force_url && ( t.updateURL = null, t.downloadURL = e.force_url ), r && ( t.options.override = Object( A.copy )( r.options.override, {} ), t.options.comment = r.options.comment, | |
| e.save && t.textContent != r.textContent ? t.options.check_for_updates = !1 : t.options.check_for_updates = r.options.check_for_updates ) ), [ "includes", "excludes", "matches", "connects" ].forEach( e => { | |
| t.options.override[ "orig_" + e ] = t[ e ] | |
| } ), t.options.override.orig_noframes = t.options.noframes, t.options.override.orig_run_at = t.options.run_at || "document-idle", t.options.noframes = null, t.options.run_at = null | |
| } ).then( () => { | |
| if ( r && ( t.fileURL = r.fileURL, r.deleted || ( t.position = r.position ), r.sync && ( t.sync = r.sync ), | |
| !n.flags.factory && !n.flags.reset ) ) { | |
| t.enabled = r.enabled, t.options.noframes = r.options.noframes, t.options.run_at = r.options.run_at, e.save && !e.force_url && ( t.downloadURL = r.downloadURL || t.downloadURL ); | |
| const o = s.determineSourceURL( r ), | |
| a = s.determineSourceURL( t ), | |
| i = o ? T.default.woHash( o ) : o || M.I18N.getMessage( "_not_set_" ), | |
| c = a ? T.default.woHash( a ) : a || M.I18N.getMessage( "_not_set_" ); | |
| if ( i == c || l || e.internal || n.warnings.push( M.I18N.getMessage( "The_update_url_has_changed_from_0oldurl0_to__0newurl0", [ i, c ] ) ), !e.save ) { | |
| const e = r.options.override.orig_includes || r.includes, | |
| s = r.options.override.orig_matches || r.matches, | |
| o = r.options.override.orig_excludes || r.excludes; | |
| Object( A.adiff )( e, t.includes, "notinfirst" ).length + Object( A.adiff )( s, t.matches, "notinfirst" ).length + Object( A.adiff )( t.excludes, o, "notinfirst" ).length && n.warnings.push( M.I18N.getMessage( "At_least_one_of_the_include_match_or_exclude_statements_was_changed_" ) ), | |
| Object( A.adiff )( r.connects || [], t.connects || [], "notinfirst" ).length && n.warnings.push( M.I18N.getMessage( "At_least_one_new_connect_statement_was_added_" ) ) | |
| } | |
| } | |
| } ).then( () => { | |
| if ( r && !n.flags.factory && t.version == r.version ) { | |
| if ( e.defaultscript ) return o.Deferred.Breach(); | |
| if ( e.noreinstall ) return o.Deferred.Breach() | |
| } | |
| } ).then( () => { | |
| r ? ( n.flags.factory || n.flags.reset ? ( n.flags.reset ? ( n.heading = M.I18N.getMessage( "You_are_about_to_reinstall_a_UserScript_" ), | |
| n.flags.reinstall = !0 ) : ( n.heading = M.I18N.getMessage( "You_are_about_to_install_a_UserScript_" ), n.flags.install = !0 ), e.internal || n.warnings.splice( 0, 0, M.I18N.getMessage( "All_script_settings_will_be_reset_" ) ) ) : n.flags.modification ? n.heading = M.I18N.getMessage( "You_are_about_to_modify_a_UserScript_" ) : Object( ie.versionCmp )( t.version, r.version ) == ie.versionCmp.eOLDER ? ( n.heading = M.I18N.getMessage( "You_are_about_to_downgrade_a_UserScript" ), n.flags.downgrade = !0, | |
| l || e.internal || n.warnings.splice( 0, 0, M.I18N.getMessage( "The_downgraded_script_might_have_problems_to_read_its_stored_data_" ) ) ) : ( n.heading = M.I18N.getMessage( "You_are_about_to_update_a_UserScript_" ), n.flags.update = !0 ), n.info.push( { | |
| label: M.I18N.getMessage( "Installed_Version_" ), | |
| value: "v" + r.version | |
| } ) ) : ( n.heading = M.I18N.getMessage( "You_are_about_to_install_a_UserScript_" ), l || e.internal || ( n.info.splice( 0, 0, M.I18N.getMessage( "Malicious_scripts_can_violate_your_privacy_" ) ), | |
| ze.getWarningsFor( s.determineSourceURL( t ) ).forEach( e => { | |
| n.warnings.splice( 0, 0, e ) | |
| } ) ), n.flags.install = !0 ), n.flags.whitewash ? n.action = M.I18N.getMessage( "Enable" ) : n.flags.install ? n.action = M.I18N.getMessage( "Install" ) : n.flags.reinstall ? n.action = M.I18N.getMessage( "Reinstall" ) : n.flags.modification ? n.action = M.I18N.getMessage( "Modify" ) : n.flags.downgrade ? n.action = M.I18N.getMessage( "Downgrade" ) : n.flags.update && ( n.action = M.I18N.getMessage( "Update" ) ) | |
| } ).then( () => { | |
| e.url && ( t.fileURL = e.url ), | |
| e.sync && ( t.sync = e.sync ), e.force_options && Object( A.copy )( e.force_options, t.options, Object( ie.createScript )().options, !0 ), e.force_settings && Object( A.copy )( e.force_settings, t, [ "enabled", "position" ] ), t = ot.mergeCludes( t ) | |
| } ).then( async () => { | |
| let r, o, a = !1; | |
| for ( const e in t.options ) | |
| if ( -1 != e.indexOf( "compat_" ) && !0 === t.options[ e ] ) { | |
| a = !0; | |
| break | |
| } if ( a && n.info.push( { | |
| label: M.I18N.getMessage( "Note" ), | |
| value: M.I18N.getMessage( "A_recheck_of_the_GreaseMonkey_FF_compatibility_options_may_be_required_in_order_to_run_this_script_" ) | |
| } ), ( r = s.determineOrigin( t ) ) && ( o = r.convert ) ) { | |
| const r = await o( t ); | |
| if ( r.info && ( "includes added" === r.info ? n.info.push( M.I18N.getMessage( "Automatically_added_user_includes_for_compatibility_reasons_" ) ) : G.logger.warn( "scriptman: unknown script convert info", r.info ) ), r.warning ) { | |
| let t; | |
| "deleted by hoster" === r.warning && ( t = M.I18N.getMessage( "This_script_was_deleted_by_the_hoster_" ) ), | |
| t ? e.internal ? n.info.push( t ) : n.warnings.push( t ) : G.logger.warn( "scriptman: unknown script convert warning", r.warning ) | |
| } | |
| t = r.script || t | |
| } | |
| } ).then( () => { | |
| [ "requires", "resources" ].forEach( e => { | |
| t[ e ] = t[ e ].map( e => ( e.unsafe_url = e.url, e.abs_url = t.fileURL ? t.fileURL.split( "/" ).slice( 0, -1 ).join( "/" ) : null, e.url = null, e ) ) | |
| } ) | |
| } ).done( () => { | |
| a.resolve( { | |
| script: t, | |
| oldscript: r, | |
| messages: n, | |
| trigger_sync: !!c, | |
| short_info: [ { | |
| label: M.I18N.getMessage( "Author" ), | |
| prop: "author" | |
| }, { | |
| label: M.I18N.getMessage( "Description" ), | |
| prop: "description" | |
| }, { | |
| label: M.I18N.getMessage( "Source" ), | |
| prop: "fileURL" | |
| } ] | |
| } ) | |
| } ).fail( () => { | |
| a.reject( { | |
| messages: n | |
| } ) | |
| } ), a.promise() | |
| }, | |
| r = e => { | |
| const t = Object( o.Deferred )(), | |
| r = e.messages, | |
| n = e.script, | |
| a = r.warnings.length || r.flags.ask, | |
| A = e.trigger_sync, | |
| l = () => { | |
| r.flags.modification || et.dropAll( n.uuid ), t.notify(); | |
| const e = s.doModify( n.uuid, n, A ) || {}; | |
| return r.flags.save || !r.flags.install && !r.flags.update || r.flags.factory || r.flags.reset || i.a.tS( n.name, r.flags.install ? "i" : "u", n.fileURL ), | |
| ( r.flags.first_install || r.flags.factory ) && at.setStorageByUid( n.uuid, { | |
| ts: Date.now() | |
| } ), e | |
| }, | |
| c = { | |
| uuid: n.uuid, | |
| lastModified: void 0, | |
| installed: !0, | |
| renamed: r.flags.renamed | |
| }; | |
| return a ? ( rea.extension.inIncognitoContext && "temporary" == We.values.incognito_mode && ( e.hints = e.hints || [], e.hints.push( { | |
| globalhint: !0, | |
| options: { | |
| id: "incognito", | |
| image: "critical", | |
| text: M.I18N.getMessage( "All_modifications_are_only_kept_until_this_incognito_session_is_closed_" ) | |
| } | |
| } ) ), v.install( e ).done( e => { | |
| e.ok && l(), c.installed = e.ok, | |
| c.aborted = e.aborted, t.resolve( c ) | |
| } ).fail( e => { | |
| t.reject( e ) | |
| } ) ) : window.setTimeout( () => { | |
| l(), t.resolve( c ) | |
| }, 1 ), t.promise() | |
| }, | |
| n = Object( A.getDebouncer )( 1e3 ); | |
| var s = { | |
| determineSourceURL: function ( e ) { | |
| return e ? [ e.downloadURL, e.fileURL ].filter( e => { | |
| if ( !e || "file:" !== T.default.parse( e ).protocol ) return e | |
| } )[ 0 ] : null | |
| }, | |
| determineMetaURL: function ( e ) { | |
| if ( !e ) return null; | |
| let t; | |
| const r = ot.determineOrigin( e ); | |
| return r && r.meta_header ? t = e.fileURL : !e.fileURL || r && !r.meta_url || ( t = e.fileURL.replace( ".user.js", ".meta.js" ), | |
| e.fileURL == t && ( t = e.fileURL.replace( ".tamper.js", ".meta.js" ) ), e.fileURL == t && ( t = null ) ), [ e.updateURL, e.downloadURL, t ].filter( e => { | |
| if ( !e || "file:" !== T.default.parse( e ).protocol ) return e | |
| } )[ 0 ] | |
| }, | |
| mergeCludes: function ( e ) { | |
| let t, r; | |
| const n = e.options.override; | |
| if ( [ "includes", "excludes", "matches" ].forEach( t => { | |
| e[ t ] = n[ "merge_" + t ] && n[ "orig_" + t ] ? n[ "orig_" + t ].slice() : [] | |
| } ), n.use_includes ) | |
| for ( t = 0; t < n.use_includes.length; t++ ) r = e.excludes.indexOf( n.use_includes[ t ] ), r >= 0 && e.excludes.splice( r, 1 ), | |
| e.includes.push( n.use_includes[ t ] ); | |
| if ( n.use_matches ) | |
| for ( t = 0; t < n.use_matches.length; t++ ) r = e.excludes.indexOf( n.use_matches[ t ] ), r >= 0 && e.excludes.splice( r, 1 ), e.matches.push( n.use_matches[ t ] ); | |
| if ( n.use_excludes ) | |
| for ( t = 0; t < n.use_excludes.length; t++ ) e.excludes.push( n.use_excludes[ t ] ); | |
| return e | |
| }, | |
| doSave: function ( e ) { | |
| return t( e ).then( r ) | |
| }, | |
| doRemove: function ( e, t, r ) { | |
| return r ? ( at.removeByUid( e, t ), at.setStorageByUid( e, null ), et.dropAll( e ) ) : at.softRemoveByUid( e, t ), o.Deferred.Pledge() | |
| }, | |
| doModify: function ( e, t, r ) { | |
| return void 0 === r && ( r = !0 ), at.setByUid( e, t, r ), r ? et.loadResources( e, t.resources ).then( () => et.loadRequires( e, t.requires ) ).then( () => { | |
| const r = [].concat( t.resources ).concat( t.requires ).map( e => T.default.sanitize( e.unsafe_url, e.abs_url ) ); | |
| return et.dropAllBut( e, r ) | |
| } ) : o.Deferred.Pledge() | |
| }, | |
| exportToJson: function ( e, t ) { | |
| const r = Object( o.Deferred )(); | |
| let n = ot.determineScriptsToRun( null ); | |
| n = n.filter( e => !e.deleted ), e && ( n = n.filter( t => e[ t.uuid ] ) ), n = ht( n, { | |
| options_page: !0, | |
| externals: t.externals | |
| } ), | |
| t && !t.storage || n.forEach( e => { | |
| e.storage = at.getStorageByUid( e.uuid ) | |
| } ); | |
| const s = { | |
| scripts: n | |
| }; | |
| return t && !t.global_settings || ( s.global_settings = c.a.getValue( Ne.CONSTANTS.STORAGE.CONFIG, {} ) ), r.resolve( s ), r.promise() | |
| }, | |
| importFromJson: function ( e ) { | |
| if ( !e || !e.scripts || !e.scripts.length ) return o.Deferred.Breach(); | |
| const n = {}, | |
| s = [], | |
| a = [], | |
| i = [], | |
| l = {}, | |
| u = {}; | |
| for ( let r, c = 0; r = e.scripts[ c ]; c++ ) try { | |
| const e = Object( o.Deferred )(); | |
| if ( "new-user-script" == r.uuid ) continue; | |
| r.storage && ( l[ r.uuid ] = r.storage ), | |
| [ "resources", "requires" ].forEach( e => { | |
| let t; | |
| ( t = r[ e ] ) && t.length && ( u[ r.uuid ] = u[ r.uuid ] || { | |
| requires: {}, | |
| resources: {} | |
| }, u[ r.uuid ][ e ] = t ) | |
| } ); | |
| const c = r.file_url || r.update_url; | |
| t( { | |
| uuid: r.uuid, | |
| name: r.name, | |
| src: r.source, | |
| force_settings: { | |
| enabled: r.enabled, | |
| position: r.position | |
| }, | |
| force_options: r.options, | |
| force_meta: { | |
| lastModified: r.lastModified | |
| }, | |
| replace: !0, | |
| url: c, | |
| ask: !1 | |
| } ).done( t => { | |
| const s = Object( A.createUUID )(); | |
| n[ s ] = t, r.storage && r.storage.data && Object.keys( r.storage.data ).length && a.push( s ), u[ r.uuid ] && i.push( s ), | |
| e.resolve() | |
| } ).fail( t => { | |
| G.logger.warn( "import: Error @ script", r.name, t ), e.resolve() | |
| } ), s.push( e.promise() ) | |
| } catch ( e ) { | |
| G.logger.warn( "import: Error while importing script", r.name, e ) | |
| } | |
| const d = ( () => { | |
| const e = Object( o.Deferred )(); | |
| return o.Deferred.when( s ).always( () => { | |
| e.resolve() | |
| } ), e.promise() | |
| } )().then( () => v.import( { | |
| scripts: n, | |
| storage_ids: a, | |
| externals_ids: i, | |
| global_settings: e.global_settings, | |
| hints: rea.extension.inIncognitoContext && "temporary" == We.values.incognito_mode ? [ { | |
| globalhint: !0, | |
| options: { | |
| id: "incognito", | |
| image: "critical", | |
| text: M.I18N.getMessage( "All_modifications_are_only_kept_until_this_incognito_session_is_closed_" ) | |
| } | |
| } ] : [] | |
| } ) ).then( e => { | |
| const t = Object( o.Deferred )(), | |
| s = [], | |
| a = []; | |
| if ( e.ok ) | |
| for ( let t, o = 0; t = e.import_ids[ o ]; o++ )( () => { | |
| const o = t; | |
| if ( n[ o ] ) { | |
| n[ o ].messages.warnings = []; | |
| const t = n[ o ].script.uuid, | |
| i = r( n[ o ] ).progress( () => { | |
| if ( !e.externals_ids.includes( o ) ) return; | |
| let r = u[ t ]; | |
| [ "resources", "requires" ].forEach( e => { | |
| let n; | |
| r && ( n = r[ e ] ) && n.length && n.forEach( e => { | |
| et.setElement( t, e.url, { | |
| content: e.content || "", | |
| meta: e.mimetype || "text/javascript" | |
| }, e.modified ) | |
| } ) | |
| } ) | |
| } ).done( () => { | |
| let r; | |
| e.storage_ids.includes( o ) && l[ t ] && ( r = at.setStorageByUid( t, { | |
| data: l[ t ].data || {}, | |
| ts: Date.now() | |
| } ), a.push( r ) ) | |
| } ); | |
| s.push( i ) | |
| } | |
| } )(); | |
| return o.Deferred.when( s ).always( () => { | |
| ot.reorderScripts(), o.Deferred.when( a ).always( () => { | |
| t.resolve( e ) | |
| } ) | |
| } ), t.promise() | |
| } ).then( t => { | |
| if ( e.global_settings && t.global_settings ) { | |
| const t = c.a.setValue( Ne.CONSTANTS.STORAGE.CONFIG, e.global_settings ).then( () => ( d.done( () => { | |
| window.setTimeout( Rt.reset, 1 ) | |
| } ), | |
| o.Deferred.Pledge( { | |
| global_settings: !0 | |
| } ) ) ); | |
| return c.a.setTemporary( !0 ), t | |
| } | |
| return o.Deferred.Pledge( {} ) | |
| } ); | |
| return d | |
| }, | |
| installFromUrl: function ( e, t, r ) { | |
| const a = Object( o.Deferred )(); | |
| let i; | |
| const l = { | |
| messages: { | |
| errors: [ M.I18N.getMessage( "Unable_to_load_script_from_url_0url0", e ) ], | |
| warnings: [] | |
| } | |
| }; | |
| t = t || {}, r = r || {}; | |
| const c = [ "url", e, JSON.stringify( t ) ].join( "_" ); | |
| return n.is( c ) ? ( G.logger.debug( "scriptman: de-bounced installFromUrl", e ), o.Deferred.Breach() ) : ( n.add( c ), | |
| ( i = T.default.parse( e ) ) && i.protocol.match( /(https?|file):/ ) ? ( "file:" != i.protocol || Ne.RUNTIME.ALLOWS_FILE_SCHEME_ACCESS || G.logger.warn( "scriptman: Access to local files is forbidden! Loading the following script for installation may fail:", e, "-> more info:", "https://www.tampermonkey.net/faq.php#Q204" ), st.getScriptFromURL( e ).then( n => { | |
| const o = { | |
| url: e, | |
| src: n, | |
| ask: !0, | |
| replace: !0 | |
| }; | |
| t && Object( A.each )( t, ( e, r ) => { | |
| o[ r ] = t[ r ] | |
| } ), a.consume( s.installFromSource( n, o, r ) ) | |
| } ).fail( e => { | |
| let t; | |
| e ? ( t = l, | |
| "file:" != i.protocol || Ne.RUNTIME.ALLOWS_FILE_SCHEME_ACCESS || t.messages.warnings.unshift( M.I18N.getMessage( "Tampermonkey_has_no_file_access_permission_" ) ), t.heading = M.I18N.getMessage( "You_are_about_to_install_a_UserScript_" ), r.silent_fail ? a.reject( t ) : v.installError( t ).always( e => { | |
| a.reject( e ) | |
| } ) ) : a.reject() | |
| } ), a.promise() ) : ( G.logger.warn( "scriptman: can't install from ", e ), o.Deferred.Breach( l ) ) ) | |
| }, | |
| installFromSource: function ( e, t, r ) { | |
| const n = Object( o.Deferred )(), | |
| a = { | |
| src: e, | |
| ask: !0, | |
| replace: !0 | |
| }; | |
| return t && Object( A.each )( t, ( e, r ) => { | |
| a[ r ] = t[ r ] | |
| } ), s.doSave( a ).done( e => { | |
| n.resolve( e.installed ) | |
| } ).fail( e => { | |
| e ? ( e.heading = M.I18N.getMessage( "You_are_about_to_install_a_UserScript_" ), r.silent_fail ? n.reject( e ) : v.installError( e ).always( e => { | |
| n.reject( e ) | |
| } ) ) : n.reject() | |
| } ), n.promise() | |
| }, | |
| determineLastPosition: function () { | |
| let e = 0; | |
| return at.getUidList().forEach( t => { | |
| const r = at.getByUid( t ); | |
| r.script && r.cond ? r.script.position && r.script.position != Number.MAX_SAFE_INTEGER && r.script.position > e && ( e = r.script.position ) : G.logger.warn( "scriptman: inconsistent script entry", t ) | |
| } ), e | |
| }, | |
| convertToRegExp: function ( e, t ) { | |
| let r, n; | |
| try { | |
| t || "/" != e.substr( 0, 1 ) ? t ? ( n = T.default.getRegExpFromMatch( e ), r = new RegExp( n ) ) : ( n = T.default.getRegExpFromInclude( e ), r = new RegExp( n, "i" ) ) : ( n = ( "^" == e.substr( 1, 1 ) ? "" : ".*" ) + e.replace( /^\//g, "" ).replace( /\/$/g, "" ) + ( "$" == e.substr( -2, 1 ) ? "" : ".*" ), n = n.replace( /(\.\*){1,}/g, ".*" ), | |
| r = new RegExp( n, "i" ) ) | |
| } catch ( t ) { | |
| return G.logger.warn( "scriptman: invalid regexp ", e ), !1 | |
| } | |
| return r | |
| }, | |
| matchUrl: function ( e, t ) { | |
| return "" === e.replace( t, "" ) | |
| }, | |
| regexify: function ( e, t ) { | |
| const r = {}, | |
| n = { | |
| inc: "rinc", | |
| match: "rinc", | |
| exc: "rexc" | |
| }; | |
| return Object.keys( n ).forEach( o => { | |
| const a = e[ o ] && e[ o ].length ? e[ o ].map( e => s.convertToRegExp( e, "match" === o ) ).filter( e => !1 !== e ) : null; | |
| ( a || t ) && ( r[ n[ o ] ] = ( r[ n[ o ] ] || [] ).concat( a || [] ) ) | |
| } ), r | |
| }, | |
| validUrl: function ( e, t, r ) { | |
| let n = !1; | |
| if ( t.rinc ) { | |
| if ( t.rinc.every( t => !s.matchUrl( e, t ) || ( G.logger.debug( 'scriptman: @include "' + t + '" matched' + ( r ? " (" + r + ")" : '"' ) ), n = !0, !1 ) ), !n ) return n | |
| } else n = !0; | |
| return t.rexc && t.rexc.every( t => !s.matchUrl( e, t ) || ( G.logger.debug( 'scriptman: @exclude "' + t + '" matched' + ( r ? " (" + r + ")" : '"' ) ), n = !1, !1 ) ), n | |
| }, | |
| getEvilness: function ( e ) { | |
| let t = 0; | |
| return e.fileURL && ( t = ze.getEvilnessOf( e.fileURL ) ) || e.downloadURL && ( t = ze.getEvilnessOf( e.downloadURL ) ) || e.updateURL && ( t = ze.getEvilnessOf( e.updateURL ) ) ? ( G.logger.debug( "scriptman: found blacklisted script", e ), t ) : 0 | |
| }, | |
| blackCheckAll: function () { | |
| at.getUidList().forEach( e => { | |
| const t = at.getByUid( e ); | |
| if ( !t.script || !t.cond ) return; | |
| const r = ot.getEvilness( t.script ); | |
| r !== t.script.evilness && ( t.script.evilness = r, s.doModify( e, t.script, !1 ) ) | |
| } ) | |
| }, | |
| reorderScripts: function ( t, r ) { | |
| let n = s.determineScriptsToRun(); | |
| if ( t ) | |
| for ( let e = 0; e < n.length; e++ ) { | |
| const s = n[ e ]; | |
| if ( s.uuid == t ) { | |
| const e = s.position < r ? .5 : -.5; | |
| s.position = Number( r ) + e | |
| } | |
| } | |
| n = e( n ); | |
| let o = 1; | |
| for ( let e = 0; e < n.length; e++ ) { | |
| const t = n[ e ]; | |
| t.deleted ? t.position = Number.MAX_SAFE_INTEGER : t.position = o++, s.doModify( t.uuid, t, !1 ) | |
| } | |
| }, | |
| getScriptHistoryForTab: function ( e ) { | |
| return Qe.get.empty( e.id ) ? ( G.logger.debug( "bg: WARN: Tabs.get.urls[" + e.id + "] is empty!" ), {} ) : Qe.get.history( e.id ) | |
| }, | |
| getUniqueScriptsForTab: function ( e ) { | |
| const t = {}; | |
| if ( Qe.get.empty( e.id ) ) G.logger.debug( "bg: WARN: Tabs.get.urls[" + e.id + "] is empty!" ); | |
| else { | |
| const r = ( e, r ) => { | |
| if ( !qe.isAllowed( r ) ) return; | |
| const { | |
| runners: n, | |
| contexters: s, | |
| disabled: o, | |
| evilness: a | |
| } = Pe( e.frameId, r, !0 ); | |
| [ n, s, o, a ].forEach( e => { | |
| e.forEach( e => { | |
| t[ e.uuid ] = { | |
| script: e | |
| } | |
| } ) | |
| } ) | |
| }; | |
| Object( A.each )( Qe.get.urls( e.id ), r ) | |
| } | |
| return t | |
| }, | |
| scriptWillRun: function ( e, t ) { | |
| if ( !t || !e ) return; | |
| let r = Be.get( e ); | |
| if ( !r ) { | |
| if ( !( r = c.a.getValue( Ne.CONSTANTS.PREFIX.COND + e, null ) ) ) return; | |
| r = s.regexify( r, !0 ), Be.set( e, r ) | |
| } | |
| return !!s.validUrl( t, r, e ) | |
| }, | |
| determineScriptsToRun: function ( t, r, n ) { | |
| const o = []; | |
| return G.logger.log( "scriptman: determineScriptsToRun @" + t ), at.getUidList().forEach( e => { | |
| let a = !0, | |
| i = 0; | |
| const A = at.getByUid( e ); | |
| if ( void 0 === n || !A.script || A.script.enabled === n ) { | |
| if ( t ) { | |
| const r = Date.now(); | |
| a = s.scriptWillRun( e, t ), i = Date.now() - r | |
| } | |
| if ( A.script && A.cond ) { | |
| if ( r && i > 1e3 && ( G.logger.warn( "scriptman: checking " + A.script.name + "'s (" + e + ") includes and excludes took " + i + "ms!" ), rt.all( "status", { | |
| key: "slowdown", | |
| class: "warning", | |
| text: M.I18N.getMessage( "Script_0name0_is_slowing_down_some_page_loads_", A.script.name ), | |
| timeout: 3e5 | |
| } ) ), !a ) return; | |
| o.push( A.script ) | |
| } else G.logger.warn( "scriptman: inconsistent script entry", e, A ) | |
| } | |
| } ), e( o ) | |
| }, | |
| isContexter: function ( e ) { | |
| return e.options && ( "context-menu" === e.options.run_at || null === e.options.run_at && "context-menu" === e.options.override.orig_run_at ) | |
| }, | |
| determineOrigin: function ( e ) { | |
| const t = e.fileURL || e.downloadURL || e.updateURL; | |
| return s.determineOriginOfUrl( t ) | |
| }, | |
| determineOriginOfUrl: function ( e ) { | |
| return Object( ie.determineOriginOfUrl )( e ) | |
| }, | |
| clean: function ( e ) { | |
| const t = Date.now(); | |
| at.getUidList().forEach( r => { | |
| const n = at.getByUid( r ); | |
| if ( n.script && n.cond ) { | |
| if ( !n.script.deleted ) return; { | |
| const e = Math.floor( ( n.script.deleted + We.values.trash_cleanup_after - t ) / 1e3 ); | |
| if ( e >= 0 ) return void G.logger.log( `scriptman: script entry in trash ${r} will be cleaned in ${e}s`, n ); | |
| G.logger.log( `scriptman: script entry in trash ${r} will be cleaned now`, n ) | |
| } | |
| } else G.logger.warn( `scriptman: inconsistent script entry ${r} will be cleaned now`, n ); | |
| e || s.doRemove( r, !0, !0 ) | |
| } ) | |
| } | |
| }; | |
| return s | |
| } )(); | |
| window.scma = ot; | |
| var at = ( () => { | |
| let e = []; | |
| const t = { | |
| init: function () { | |
| c.a.addDifferentOriginChangeListener( Ne.CONSTANTS.PREFIX.STORE, ( e, r ) => { | |
| const n = e.replace( Ne.CONSTANTS.PREFIX.STORE, "" ); | |
| for ( const e in r.data ) r.data.hasOwnProperty( e ) && ( () => { | |
| const s = e, | |
| o = r.data[ e ]; | |
| t.notifyStorageListeners( { | |
| uuid: n | |
| }, null, e => { | |
| const t = { | |
| data: {}, | |
| ts: 0 | |
| }; | |
| t.data[ s ] = o, t.ts = r.data.ts; | |
| const n = { | |
| storage: t | |
| }; | |
| void 0 === t.data[ s ] && ( n.removed = s ), e( n ) | |
| } ) | |
| } )() | |
| } ) | |
| }, | |
| getUidList: function () { | |
| const e = new RegExp( "^" + Ne.CONSTANTS.PREFIX.SCRIPT_UID ), | |
| t = []; | |
| return c.a.listValues().forEach( r => { | |
| -1 != r.search( e ) && t.push( r.replace( e, "" ) ) | |
| } ), t | |
| }, | |
| getUidsByName: function ( e, r ) { | |
| const n = []; | |
| return t.getUidList().forEach( s => { | |
| const o = t.getMetaByUid( s ); | |
| !o || o.name != e || r && r != o.namespace || n.push( s ) | |
| } ), n | |
| }, | |
| getUidByName: function ( e ) { | |
| return t.getUidsByName( e )[ 0 ] | |
| }, | |
| getStorageByUid: function ( e ) { | |
| const t = c.a.getValue( Ne.CONSTANTS.PREFIX.STORE + e, { | |
| ts: 0, | |
| data: {} | |
| } ); | |
| return void 0 === t.ts && ( t.ts = 0 ), void 0 === t.data && ( t.data = {} ), t | |
| }, | |
| setStorageByUid: function ( e, t ) { | |
| return t ? c.a.setValue( Ne.CONSTANTS.PREFIX.STORE + e, t ) : c.a.deleteValue( Ne.CONSTANTS.PREFIX.STORE + e ) | |
| }, | |
| getMetaByUid: function ( e ) { | |
| return c.a.getValue( Ne.CONSTANTS.PREFIX.META + e, null ) | |
| }, | |
| getByUid: function ( e, t ) { | |
| if ( !e ) return G.logger.error( "sb: no UUID set" ), {}; | |
| let r, n = c.a.getValue( Ne.CONSTANTS.PREFIX.META + e, null ); | |
| if ( n ) { | |
| const s = e => { | |
| if ( e ) | |
| for ( let t = 0, r = null; r = e[ t ]; t++ ) delete r.loaded, delete r.textContent, | |
| delete r.resURL, delete r.resText | |
| }; | |
| s( n.requires ), s( n.resources ), n.uuid = e, n.grant = n.grant || [], n.options.override.use_connects || ( n.connects = n.connects || [], n.options.override.merge_connects = !0, n.options.override.use_connects = [] ), void 0 === n.options.check_for_updates && ( n.options.check_for_updates = !0 ), t && ( n = Object( A.copy )( n, {} ) ), n.textContent = c.a.getValue( Ne.CONSTANTS.PREFIX.SCRIPT + e, n.textContent ), n.textContent && ( r = n ) | |
| } | |
| return { | |
| script: r, | |
| cond: c.a.getValue( Ne.CONSTANTS.PREFIX.COND + e, null ) | |
| } | |
| }, | |
| setByUid: function ( e, t, r ) { | |
| const n = {}; | |
| if ( !e ) return G.logger.error( "sb: no UUID set", t ), n; | |
| if ( null === t.textContent || void 0 === t.textContent ) throw new Error( "No script code set!" ); | |
| const s = c.a.getValue( Ne.CONSTANTS.PREFIX.META + e ), | |
| o = !s, | |
| a = {}, | |
| i = Object( A.copy )( t, {} ); | |
| return i.textContent = null, a[ Ne.CONSTANTS.PREFIX.META + e ] = i, a[ Ne.CONSTANTS.PREFIX.SCRIPT_UID + e ] = t.name, a[ Ne.CONSTANTS.PREFIX.COND + e ] = { | |
| inc: t.includes, | |
| match: t.matches, | |
| exc: t.excludes | |
| }, a[ Ne.CONSTANTS.PREFIX.SCRIPT + e ] = t.textContent, c.a.setValues( a ), | |
| r && ( o ? Ye.scriptAddedCb( t.name, t ) : Ye.scriptChangedCb( t.name, t, s ) ), Fe.removeAll(), Be.remove( e ), n | |
| }, | |
| restoreByUid: function ( e, r ) { | |
| const n = t.getByUid( e ); | |
| n.script && n.cond && ( delete n.script.deleted, t.setByUid( e, n.script ), void 0 === r && ( r = !0 ), r && n.script && n.cond && Ye.scriptAddedCb( n.script.name, n.script ) ) | |
| }, | |
| softRemoveByUid: function ( e, r ) { | |
| const n = t.getByUid( e ); | |
| n.script && n.cond && ( n.script.deleted = Date.now(), t.setByUid( e, n.script ), Fe.removeAll(), Be.remove( e ), void 0 === r && ( r = !0 ), | |
| r && n.script && n.cond && Ye.scriptRemovedCb( n.script.name, n.script ) ) | |
| }, | |
| removeByUid: function ( e ) { | |
| const r = t.getByUid( e ); | |
| r && ( c.a.deleteValue( Ne.CONSTANTS.PREFIX.SCRIPT_UID + e ), c.a.deleteValue( Ne.CONSTANTS.PREFIX.COND + e ), c.a.deleteValue( Ne.CONSTANTS.PREFIX.SCRIPT + e ), c.a.deleteValue( Ne.CONSTANTS.PREFIX.META + e ), c.a.deleteValue( Ne.CONSTANTS.PREFIX.STORE + e ), We.values && r.script && i.a.tS( r.script.name, "r" ) ) | |
| }, | |
| addStorageListener: function ( t, r, n, s, o ) { | |
| e.push( { | |
| tabid: t, | |
| id: r, | |
| uuid: n, | |
| time: s, | |
| response: o | |
| } ) | |
| }, | |
| removeStorageListeners: function ( t, r ) { | |
| void 0 === r && ( r = !0 ); | |
| const n = e; | |
| e = [], n.forEach( n => { | |
| try { | |
| void 0 !== t.tabid && t.tabid !== n.tabid || void 0 !== t.uuid && t.uuid !== n.uuid || void 0 !== t.id && t.id !== n.id ? e.push( n ) : r && n.response( {} ) | |
| } catch ( e ) { | |
| G.logger.debug( "sb: listener clear for script", t, "failed! Page reload?!" ) | |
| } | |
| } ) | |
| }, | |
| notifyStorageListeners: function ( t, r, n ) { | |
| t = t || {}, r = r || {}, e.forEach( e => { | |
| try { | |
| void 0 !== r.uuid && e.uuid === r.uuid || void 0 !== r.tabid && e.tabid === r.tabid || void 0 !== r.id && e.id === r.id || void 0 !== t.tabid && t.tabid !== e.tabid || void 0 !== t.uuid && t.uuid !== e.uuid || void 0 !== t.id && t.id !== e.id || n && n( e.response ) | |
| } catch ( e ) { | |
| G.logger.warn( "sb: listener notification for script", t, "failed! Page reload?!" ) | |
| } | |
| } ) | |
| } | |
| }; | |
| return t | |
| } )(); | |
| window.scbr = at; | |
| const it = function () { | |
| return o.Deferred.Pledge() | |
| }, | |
| At = function () { | |
| return o.Deferred.Pledge() | |
| }, | |
| lt = function () { | |
| Ne.DB.SECURE || at.getUidList().forEach( e => { | |
| const t = at.getByUid( e ); | |
| t.script && t.cond && t.script.evilness != ze.SEVERITY_FOISTED_SCRIPT && ( G.logger.warn( "content security: found unfamiliar script", t.script.name ), t.script.evilness = ze.SEVERITY_FOISTED_SCRIPT, ot.doModify( e, t.script, !1 ) ) | |
| } ) | |
| }, | |
| ct = function () {}; | |
| var ut = ( () => { | |
| const e = { | |
| ping: { | |
| allow: { | |
| insecure: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| r( { | |
| pong: !0, | |
| instanceID: De, | |
| config: { | |
| layout: We.values.layout, | |
| dark: rea.runtime.isDarkMode() | |
| } | |
| } ) | |
| } | |
| }, | |
| newTab: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| ( "options" == t.extpage || "options" == e.origin ? o.Deferred.Pledge( t.tab ) : Ke() ).then( t => { | |
| rea.tabs.create( { | |
| url: e.url, | |
| parent: t | |
| }, e => { | |
| r( { | |
| tabId: e.id | |
| } ) | |
| } ) | |
| } ) | |
| } | |
| }, | |
| tabs: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| "get" == e.action ? t.tab && e.uuid ? r( { | |
| data: He.get( t.tab.id, e.uuid ) | |
| } ) : ( G.logger.warn( "bg: unable to process request", t, e ), r( { | |
| data: null | |
| } ) ) : "list" == e.action ? e.uuid ? r( { | |
| data: He.getAll( e.uuid ) | |
| } ) : ( G.logger.warn( "bg: unable to process request", t, e ), r( { | |
| data: null | |
| } ) ) : "set" == e.action ? ( t.tab && e.uuid ? He.set( t.tab.id, e.uuid, e.tab ) : G.logger.warn( "bg: unable to process request", t, e ), r( {} ) ) : r( { | |
| error: "unknown action" | |
| } ) | |
| } | |
| }, | |
| focusTab: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| const n = t && t.tab ? t.tab.id : null; | |
| n ? rea.tabs.update( n, { | |
| active: !0 | |
| }, () => { | |
| const e = rea.runtime.lastError; | |
| r( { | |
| error: e ? e.message : void 0 | |
| } ) | |
| } ) : r( { | |
| error: "internal error" | |
| } ) | |
| } | |
| }, | |
| closeTab: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| const n = t && t.tab ? t.tab.id : null; | |
| n ? rea.tabs.query( { | |
| windowType: "normal" | |
| }, e => { | |
| if ( e.length <= 1 ) { | |
| const e = "refused to close last tab!"; | |
| G.logger.warn( "bg:", e ), r( { | |
| error: e | |
| } ) | |
| } else rea.tabs.remove( n, () => { | |
| const e = rea.runtime.lastError; | |
| r( { | |
| error: e ? e.message : void 0 | |
| } ) | |
| } ) | |
| } ) : r( { | |
| error: "internal error" | |
| } ) | |
| } | |
| }, | |
| setOption: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| const n = "options" == t.extpage || "options" == e.origin; | |
| We.setValue( e.name, e.value ).always( () => { | |
| n ? mt.create( "options.settings" ).done( e => { | |
| r( { | |
| items: e, | |
| options: We.snapshot | |
| } ) | |
| } ).fail( e => { | |
| r( { | |
| error: e, | |
| options: We.snapshot | |
| } ) | |
| } ) : r( {} ) | |
| } ) | |
| } | |
| }, | |
| reportAnIssue: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| ( "options" == t.extpage || "options" == e.origin ? o.Deferred.Pledge( t.tab ) : Ke() ).then( t => { | |
| let n, s, o; | |
| if ( e.uuid && ( n = at.getByUid( e.uuid ) ) && n.script && n.cond ) { | |
| let r; | |
| s = ot.determineOrigin( n.script ), "hoster" == e.to && s ? o = s : ( r = n.script.supportURL || s.issue_url || s.url ) && ( o = { | |
| issue_url: r | |
| } ), o && ( i.a.tS( n.script.name, "m" ), rea.tabs.create( { | |
| url: o.abuse_url || o.issue_url, | |
| active: !0, | |
| parent: t | |
| }, () => {} ) ) | |
| } | |
| r( {} ) | |
| } ) | |
| } | |
| }, | |
| begEvent: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| if ( "dialog" == e.action ) bt.dialog.shown( e.extra ); | |
| else if ( "clicked" == e.action ) { | |
| let t, r; | |
| e.extra && ( t = e.extra.amount, r = e.extra.currency ), bt.clicked( e.type, t, r ) | |
| } else bt.button[ e.action ] ? bt.button[ e.action ]( e.type, e.extra ) : G.logger.warn( "bg: Warning: unknown request ", e ); | |
| r( {} ) | |
| } | |
| }, | |
| buttonPress: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( t, r, n ) { | |
| const { | |
| name: s, | |
| data: o, | |
| scriptuid: a | |
| } = t, i = () => { | |
| n( {} ) | |
| }; | |
| if ( "reset_simple" == s ) Rt.reset( i ); | |
| else if ( "reset_factory" == s ) Rt.factoryReset( i ); | |
| else if ( "reset_sync" == s ) Ye.reset().always( i ); | |
| else if ( "install_tests" == s ) { | |
| const e = Ue.framework.prepare( ot, at, Ne.RUNTIME.BROWSER, Ne.RUNTIME.BROWSER_VERSION, i ); | |
| e && G.logger.error( e ) | |
| } else if ( "enabled" == s ) We.setValue( s, !We.values[ s ] ).always( () => { | |
| n( {} ) | |
| } ); | |
| else if ( "installFromUrl" == s ) ot.installFromUrl( o ).always( () => { | |
| n( {} ) | |
| } ); | |
| else if ( "externals_delete" == s ) et.cleanElement( a, t.safe_url ), mt.create( "options.scripts" ).done( e => { | |
| n( { | |
| items: e, | |
| options: We.snapshot | |
| } ) | |
| } ).fail( e => { | |
| n( { | |
| error: e, | |
| options: We.snapshot | |
| } ) | |
| } ); | |
| else if ( "focus_tab" == s ) e.focusTab.exec( {}, { | |
| tab: { | |
| id: t.tabid | |
| } | |
| }, n ); | |
| else if ( "run_script_updates" == s ) | |
| if ( a ) { | |
| let e; | |
| st.check( !0, !1, a ).done( t => { | |
| e = t | |
| } ).always( () => { | |
| n( { | |
| scriptuid: a, | |
| updatable: e | |
| } ) | |
| } ) | |
| } else st.check( !0, !0 ), n( {} ); | |
| else if ( "blacklist_page" == s ) { | |
| const e = o.domain; | |
| if ( !e ) throw new Error( "Blacklisted domain is missing!" ); | |
| const t = "/" + T.default.getRegExpFromMatch( `*://*.${e}/*`, !0 ) + "/"; | |
| We.setValue( "forbiddenPages", We.values.forbiddenPages.concat( [ t ] ) ).always( () => { | |
| n( {} ) | |
| } ) | |
| } else if ( "script_search" == s ) { | |
| const { | |
| url: e, | |
| result_url: t | |
| } = o; | |
| if ( e ) { | |
| const t = { | |
| url: Se( e ), | |
| active: !0 | |
| }; | |
| rea.tabs.create( t, () => {} ) | |
| } else { | |
| if ( !t ) throw new Error( "Search URL is missing!" ); { | |
| const e = { | |
| url: t, | |
| active: !0 | |
| }; | |
| rea.tabs.create( e, () => {} ) | |
| } | |
| } | |
| } else G.logger.warn( "bg: Warning: unknown button " + s ), n( {} ) | |
| } | |
| }, | |
| loadTree: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| mt.create( e.referrer, { | |
| complete: e.complete, | |
| url: e.url, | |
| uuid: e.uuid, | |
| filter: e.filter, | |
| tabId: e.tabId | |
| } ).done( t => { | |
| const n = { | |
| items: t | |
| }, | |
| s = 1 == mt.level( e.referrer ) ? { | |
| i18n: We.values.i18n, | |
| options: We.snapshot, | |
| xhr: N.default.getConfig(), | |
| begging: bt.needed() | |
| } : {}; | |
| r( Object.assign( n, s ) ) | |
| } ).fail( e => { | |
| r( { | |
| error: e, | |
| options: We.snapshot | |
| } ) | |
| } ) | |
| } | |
| }, | |
| modifyScriptOptions: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( t, r, n ) { | |
| if ( !t.uuid ) return void n( {} ); | |
| const s = "options" == r.extpage || "options" == t.origin; | |
| let o = null == t.reload || 1 == t.reload, | |
| a = !1; | |
| const i = at.getByUid( t.uuid, !0 ), | |
| A = () => { | |
| o ? ( void 0 !== t.position && ot.reorderScripts( t.uuid, t.position ), s ? e.loadTree.exec( { | |
| referrer: "options.scripts" | |
| }, r, n ) : rea.tabs.getSelected( null, e => { | |
| mt.create( "actions" ).done( e => { | |
| n( { | |
| items: e, | |
| i18n: We.values.i18n, | |
| options: { | |
| enabled: We.values.enabled | |
| } | |
| } ) | |
| } ).fail( () => { | |
| n( { | |
| i18n: We.values.i18n, | |
| options: { | |
| enabled: We.values.enabled | |
| } | |
| } ) | |
| } ), !e || e.id < 0 || t.uuid && We.values.autoReload && rea.tabs.sendMessage( e.id, { | |
| method: "reload" | |
| }, { | |
| frameId: 0 | |
| } ) | |
| } ) ) : n( {} ) | |
| }; | |
| if ( i.script && i.cond ) | |
| if ( t.whitewash && i.script.evilness == ze.SEVERITY_FOISTED_SCRIPT ) o = !0, i.script && i.cond ? ot.doSave( { | |
| uuid: t.uuid, | |
| src: i.script.textContent, | |
| force_settings: { | |
| enabled: !0 | |
| }, | |
| whitewash: !0, | |
| save: !0 | |
| } ).always( A ) : ( G.logger.error( M.I18N.getMessage( "fatal_error" ) + " (" + t.uuid + ")!!!" ), A() ); | |
| else { | |
| let e = !1; | |
| const r = Object( ie.createScript )(); | |
| Object.keys( r.options ).forEach( e => { | |
| void 0 !== t[ e ] && ( i.script.options[ e ] = t[ e ], a |= !0 === Ye.SYNCED[ e ] ) | |
| } ), Object.keys( r.options.override ).forEach( r => { | |
| -1 != r.indexOf( "merge_" ) && void 0 !== t[ r ] && ( i.script.options.override[ r ] = t[ r ], e = !0 ) | |
| } ), [ "includes", "excludes", "matches" ].forEach( r => { | |
| void 0 !== t[ r ] && ( e = !0, i.script.options.override[ "use_" + r ] = t[ r ] ) | |
| } ), [ "connects", "blockers" ].forEach( e => { | |
| void 0 !== t[ e ] && ( i.script.options.override[ "use_" + e ] = t[ e ] ) | |
| } ), t.add_excludes && ( i.script.options.override.use_excludes = i.script.options.override.use_excludes.concat( t.add_excludes ), e = !0 ), e && ( i.script = ot.mergeCludes( i.script ) ), | |
| t.temp_connects && $e.setSessionConnects( i.script.uuid, t.temp_connects ), void 0 !== t.enabled && ( i.script.enabled = t.enabled ), a && ( i.script.lastModified = Date.now() ), void 0 !== t.file_url && ( i.script.downloadURL = t.file_url ), ot.doModify( i.script.uuid, i.script, a ).done( A ).fail( () => { | |
| n( {} ) | |
| } ) | |
| } | |
| else n( {} ) | |
| } | |
| }, | |
| purgeScript: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| ot.doRemove( e.uuid, !1, !0 ), ot.reorderScripts(), | |
| o.Deferred.onebyone( [ () => mt.create( "options.scripts" ), () => mt.create( "options.trash" ) ] ).then( e => e.reduce( ( e, t ) => e.concat( t ), [] ).filter( e => e ) ).done( e => { | |
| const t = {}; | |
| t.items = e, t.options = We.snapshot, r( t ) | |
| } ).fail( e => { | |
| r( { | |
| error: e, | |
| options: We.snapshot | |
| } ) | |
| } ) | |
| } | |
| }, | |
| saveScript: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| const n = void 0 === e.reload || !!e.reload, | |
| s = "options" == t.extpage || "options" == e.origin, | |
| a = t => { | |
| s ? n ? o.Deferred.onebyone( [ () => mt.create( "options.scripts" ), () => mt.create( "options.trash" ) ] ).then( e => e.reduce( ( e, t ) => e.concat( t ), [] ).filter( e => e ) ).done( e => { | |
| t.items = e, t.options = We.snapshot, r( t ) | |
| } ).fail( e => { | |
| r( { | |
| error: e, | |
| options: We.snapshot | |
| } ) | |
| } ) : r( {} ) : rea.tabs.getSelected( null, t => { | |
| mt.create( "actions" ).done( e => { | |
| r( { | |
| items: e, | |
| i18n: We.values.i18n, | |
| options: { | |
| enabled: We.values.enabled | |
| } | |
| } ) | |
| } ).fail( () => { | |
| r( { | |
| i18n: We.values.i18n, | |
| options: { | |
| enabled: We.values.enabled | |
| } | |
| } ) | |
| } ), | |
| !t || t.id < 0 || e.uuid && We.values.autoReload && rea.tabs.sendMessage( t.id, { | |
| method: "reload" | |
| }, { | |
| frameId: 0 | |
| } ) | |
| } ) | |
| }; | |
| if ( e.clean ) { | |
| G.logger.debug( "bg: clean userscript " + e.uuid ); | |
| const t = at.getByUid( e.uuid ), | |
| n = t => { | |
| mt.create( "options.scripts" ).done( n => { | |
| r( { | |
| cleaned: t.installed, | |
| items: n, | |
| options: We.snapshot | |
| } ), t.installed && at.notifyStorageListeners( { | |
| uuid: e.uuid | |
| }, null, t => { | |
| t( { | |
| storage: at.getStorageByUid( e.uuid ) | |
| } ) | |
| } ) | |
| } ).fail( e => { | |
| r( { | |
| error: e, | |
| options: We.snapshot | |
| } ) | |
| } ) | |
| }; | |
| t.script && t.cond ? ot.doSave( { | |
| name: e.name, | |
| uuid: e.uuid, | |
| src: t.script.textContent, | |
| clean: !0, | |
| ask: !1, | |
| internal: !0, | |
| save: !0 | |
| } ).always( e => { | |
| n( e || { | |
| installed: !1 | |
| } ) | |
| } ) : ( G.logger.error( M.I18N.getMessage( "fatal_error" ) + " (" + e.uuid + ")!!!" ), n( { | |
| installed: !1 | |
| } ) ) | |
| } else if ( e.code ) { | |
| let t = r; | |
| n && ( t = e => { | |
| ot.reorderScripts(), a( e ) | |
| } ), e.new_script && ( e.uuid = Object( A.createUUID )() ), ot.doSave( { | |
| name: e.name, | |
| uuid: e.uuid, | |
| force_url: e.force_url, | |
| src: e.code, | |
| ask: !We.values.editor_easySave, | |
| lastModTime: e.lastModTime, | |
| save: !0 | |
| } ).always( e => { | |
| t( e || { | |
| installed: !1 | |
| } ) | |
| } ) | |
| } else e.auto_save ? a( {} ) : e.restore ? ( at.restoreByUid( e.uuid ), ot.reorderScripts(), a( {} ) ) : ( ot.doRemove( e.uuid ), ot.reorderScripts(), a( {} ) ) | |
| } | |
| }, | |
| saveExternal: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| et.setElement( e.uuid, e.url, { | |
| content: e.code || "", | |
| meta: e.mimetype || "text/javascript" | |
| }, !0 ), mt.create( "options.scripts" ).done( e => { | |
| r( { | |
| success: !0, | |
| items: e, | |
| options: We.snapshot | |
| } ) | |
| } ).fail( e => { | |
| r( { | |
| error: e, | |
| options: We.snapshot | |
| } ) | |
| } ) | |
| } | |
| }, | |
| saveStorageKey: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| s.saveStorageKey.exec( null, e, t, r ) | |
| } | |
| }, | |
| importFromJson: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| const n = void 0 === e.reload || !!e.reload; | |
| ot.importFromJson( e.json ).fail( e => { | |
| r( { | |
| error: e || M.I18N.getMessage( "An_error_occured_during_import_" ) | |
| } ) | |
| } ).done( e => { | |
| const t = { | |
| reload: e.global_settings | |
| }; | |
| n && !t.reload ? mt.create( "options.scripts" ).done( e => { | |
| t.items = e, t.options = We.snapshot, r( t ) | |
| } ).fail( e => { | |
| r( { | |
| error: e, | |
| options: We.snapshot | |
| } ) | |
| } ) : r( t ) | |
| } ) | |
| } | |
| }, | |
| download: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| s.download.exec( null, e, t, e => { | |
| ( e.error || e.load ) && r( e ) | |
| } ) | |
| } | |
| }, | |
| askCom: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| v.onMessage( e.data ).always( e => { | |
| e.i18n = We.values.i18n, e.options = We.snapshot, r( e ) | |
| } ) | |
| } | |
| }, | |
| installScript: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| if ( t.tab ) { | |
| let t = {}; | |
| ( e.code ? ot.installFromSource( e.code, {}, { | |
| silent_fail: !0 | |
| } ) : ot.installFromUrl( e.url, {}, { | |
| silent_fail: !0 | |
| } ) ).done( e => { | |
| t = { | |
| data: null, | |
| found: !0, | |
| installed: e | |
| } | |
| } ).fail( e => { | |
| e && e.messages && e.messages.errors ? t.err = e.messages.errors[ 0 ] : t.err = M.I18N.getMessage( "Unable_to_parse_this_" ) | |
| } ).always( () => { | |
| r( t ) | |
| } ) | |
| } else G.logger.warn( "bg: Error: unable to install script due to empty tabID!" ) | |
| } | |
| }, | |
| execMenuCmd: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| const n = gt.getById( e.id ); | |
| n ? n.response( { | |
| run: !0, | |
| menuId: n.menuId | |
| } ) : G.logger.warn( "bg: Error: unable to find MC id " + n.menuId ), r( {} ) | |
| } | |
| }, | |
| unLoad: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t ) { | |
| return e.topframe || e.id && t.tab && t.frameId && Qe.events.unload( t.tab.id, t.frameId, e.id ), !1 | |
| } | |
| }, | |
| prepare: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| if ( t.tab ) { | |
| const n = void 0 !== t.frameId ? t.frameId : e.topframe ? 0 : null, | |
| s = T.default.woHash( e.url ); | |
| e.cleanup ? ( Qe.events.clean( t.tab.id, n, s ), vt.setIcon( t.tab.id ), vt.setBadge( t.tab.id ), r( {} ) ) : Qe.events.run( t.tab.id, n, e.id, s, n => { | |
| const s = n ? Ve( n, e.url ) : { | |
| fast: !0 | |
| }; | |
| r( s ), vt.setIcon( t.tab.id ), vt.setBadge( t.tab.id ) | |
| } ) | |
| } else r( {} ) | |
| } | |
| }, | |
| contextmenu: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| const { | |
| tab: n | |
| } = t; | |
| if ( n && We.values.context_menu_enabled ) { | |
| const r = void 0 !== t.frameId ? t.frameId : e.topframe ? 0 : null, | |
| s = T.default.woHash( e.url ); | |
| let o = [], | |
| a = []; | |
| We.values.context_menu_scripts && ( a = Pe( r, s ).contexters ), We.values.context_menu_commands && ( o = gt.listByTabId( n.id ) ), ve.update( { | |
| contexters: a, | |
| commands: o | |
| } ) | |
| } else r( {} ) | |
| } | |
| }, | |
| notification: { | |
| allow: { | |
| script: !0, | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| const n = e.image ? e.image : x.a.images.brand( "tampermonkey" ); | |
| ( () => { | |
| const r = Object( o.Deferred )(); | |
| return e.highlight && t.tab ? u.Notify.highlight( t.tab.id, r.resolve ) : r.resolve(), r.promise() | |
| } )().then( () => { | |
| const t = Object( o.Deferred )(); | |
| return e.text ? u.Notify.show( e.title, e.text, n, { | |
| timeout: e.timeout, | |
| silent: e.silent | |
| }, t.resolve ) : t.resolve(), t.promise() | |
| } ).always( e => { | |
| r( { | |
| clicked: e && e.clicked | |
| } ) | |
| } ) | |
| } | |
| }, | |
| clipboard: { | |
| allow: { | |
| script: !0, | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| rea.clipboard ? rea.clipboard.set( { | |
| mimetype: e.mimetype, | |
| content: e.content | |
| }, () => { | |
| r( { | |
| success: !0 | |
| } ) | |
| } ) : r( { | |
| error: "unsupported" | |
| } ) | |
| } | |
| }, | |
| determineScriptsToRun: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| r( { | |
| scripts: ot.determineScriptsToRun( e.url ).filter( e => !e.deleted ).map( e => e.uuid ) | |
| } ) | |
| } | |
| }, | |
| syntaxCheck: { | |
| allow: { | |
| script: !0, | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| se.a.hint( e.code, We.values.editor_linter_config || void 0 ).always( e => { | |
| r( { | |
| errors: e | |
| } ) | |
| } ) | |
| } | |
| }, | |
| externalMessage: { | |
| allow: { | |
| insecure: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| return n( e.request, t, r ) | |
| } | |
| }, | |
| cookie: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r ) { | |
| const n = [ "expirationDate", "domain", "httpOnly", "secure", "session", "name", "path", "sameSite", "value" ].concat( [ "url" ] ), | |
| s = n.concat( [ "hostOnly" ] ), | |
| o = e.url || t.url || null, | |
| a = e.details.url ? T.default.sanitize( e.details.url, o ) || e.details.url : o, | |
| i = t.tab ? t.tab.cookieStoreId : void 0; | |
| let A; | |
| if ( dt.fpi && ( A = T.default.parse( o ).domain ), Ne.DB.SECURE || "dhdg" != rea.runtime.short_id ) | |
| if ( a ) | |
| if ( qe.isAllowed( T.default.woHash( a ) ) ) | |
| if ( ot.scriptWillRun( e.uuid, a ) ) | |
| if ( "list" == e.action ) dt.getAll( { | |
| url: a, | |
| domain: e.details.domain, | |
| name: e.details.name, | |
| path: e.details.path, | |
| firstPartyDomain: A ? null : void 0, | |
| storeId: i | |
| } ).done( e => { | |
| const t = e.map( e => { | |
| const t = {}; | |
| return s.forEach( r => { | |
| t[ r ] = e[ r ] | |
| } ), t | |
| } ); | |
| r( { | |
| data: { | |
| cookies: t | |
| } | |
| } ) | |
| } ); | |
| else if ( "delete" == e.action ) dt.remove( { | |
| url: a, | |
| name: e.details.name, | |
| firstPartyDomain: A, | |
| storeId: i | |
| } ).done( () => { | |
| r( { | |
| data: { | |
| success: !0 | |
| } | |
| } ) | |
| } ).fail( e => { | |
| r( { | |
| data: { | |
| error: e | |
| } | |
| } ) | |
| } ); | |
| else if ( "set" == e.action ) { | |
| const t = { | |
| firstPartyDomain: A, | |
| storeId: i | |
| }, | |
| s = e.details; | |
| n.forEach( e => { | |
| void 0 !== s[ e ] && ( [ "value", "name" ].includes( e ) ? t[ e ] = String( s[ e ] ) : t[ e ] = s[ e ] ) | |
| } ), t.url = t.url || a, dt.set( t ).done( () => r( { | |
| data: { | |
| success: !0 | |
| } | |
| } ) ).fail( e => r( { | |
| data: { | |
| error: e | |
| } | |
| } ) ) | |
| } else r( { | |
| data: { | |
| error: "unknown action" | |
| } | |
| } ); | |
| else r( { | |
| data: { | |
| error: "the URL needs to be included by the scripts @include or @match tag" | |
| } | |
| } ); | |
| else r( { | |
| data: { | |
| error: "the URL is filtered by the security settings" | |
| } | |
| } ); | |
| else r( { | |
| data: { | |
| error: "invalid URL" | |
| } | |
| } ); | |
| else r( { | |
| data: { | |
| error: "not supported" | |
| } | |
| } ) | |
| } | |
| } | |
| }, | |
| t = e => { | |
| const t = rea.runtime.id, | |
| r = !Ne.REQUESTS.HAS_SENDER_ID && e.tab || e.id === t; | |
| let n = null; | |
| const s = Ne.REQUESTS.INTERNAL_PAGE_PROTOCOLS[ 0 ], | |
| o = s ? s + "//" : null, | |
| a = Ne.REQUESTS.GET_INTERNAL_PAGE_REGEXP(), | |
| i = e.url ? e.url : e.tab ? e.tab.url : null; | |
| let A = r && ( !i || !!o && 0 == i.indexOf( o ) ); | |
| if ( A || !o ) { | |
| if ( i ) { | |
| const e = i.match( a ); | |
| e && 2 == e.length && ( n = e[ 1 ] ) | |
| } else n = "*"; | |
| !o && n && ( A = !0 ) | |
| } | |
| return { | |
| id_valid: r, | |
| url: i, | |
| page: n, | |
| extpage: A | |
| } | |
| }, | |
| r = ( n, s, o ) => { | |
| if ( !kt.late ) return kt.registerLateCallback( () => { | |
| r( n, s, o ) | |
| } ), !0; | |
| const a = e[ n.method ]; | |
| if ( !a ) return G.logger.warn( "mh: unknown method " + n.method ), !1; | |
| if ( !a.allow || !a.exec ) return G.logger.warn( "mh: invalid implementation of " + n.method ), !1; | |
| const i = t( s ), | |
| A = i.extpage, | |
| l = i.page, | |
| c = i.id_valid; | |
| A ? s.extpage = l : delete n.origin; | |
| const u = "options" == l, | |
| d = c && !A; | |
| let g = !0; | |
| if ( "background" == l || a.allow.insecure || a.allow.extpage && A || a.allow.options && u || a.allow.script && d ) { | |
| const e = a.exec( n, s, e => { | |
| g = !1, o( e ) | |
| } ); | |
| return !1 !== g && !1 !== e || void 0 | |
| } | |
| return !1 === n.topframe && ( A || u ) || G.logger.warn( "mh: this context doesn't have the permission to call \"" + n.method + '"' ), !1 | |
| }; | |
| var n = ( e, t, r ) => { | |
| let n, s, o, a, i; | |
| if ( "off" == We.values.external_connect || !( n = t.url ) || !qe.isAllowed( n ) ) return; | |
| const A = Object.keys( l.externally_connectable ); | |
| for ( let t = 0; t < A.length; t++ ) | |
| if ( o = A[ t ], s = l.externally_connectable[ o ], ( a = ot.regexify( { | |
| match: [ o ] | |
| } ) ) && ot.validUrl( n, a ) && ( s.includes( "*" ) || s.includes( e.method ) ) ) { | |
| i = !0; | |
| break | |
| } if ( i ) | |
| if ( "getVersion" == e.method ) r( { | |
| version: rea.extension.manifest.version, | |
| id: rea.runtime.short_id | |
| } ); | |
| else if ( "all" != We.values.external_connect ) G.logger.warn( "mh: calling external method " + e.method + " is not permitted to " + n + " by the user" ); | |
| else if ( "isInstalled" == e.method ) { | |
| let t, n, s, o, a = !1; | |
| const i = e.script.name, | |
| A = e.script.namespace; | |
| ( n = at.getUidsByName( i, A )[ 0 ] ) && ( t = at.getByUid( n ) ) && t.script && ( a = !0, o = t.script.enabled, s = t.script.version ), r( { | |
| name: i, | |
| installed: a, | |
| enabled: o, | |
| version: s | |
| } ) | |
| } else G.logger.warn( "mh: unknown external method " + e.method ); | |
| else G.logger.warn( "mh: calling external method " + e.method + " is not permitted to " + n ) | |
| }, | |
| s = { | |
| xhr: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| let s = !1; | |
| const a = Ne.RUNTIME.FIREFOX && !t.details.anonymous && ( r.tab && r.tab.incognito || dt.fpi ); | |
| let i; | |
| const l = r.tab ? r.tab.cookieStoreId : void 0; | |
| a && ( t.details.anonymous = !0, dt.fpi && r.url && ( i = T.default.parse( r.url ).domain || "" ) ); | |
| const c = r => { | |
| e.disconnect(); | |
| const n = r.response, | |
| s = n ? n.responseHeaders : null; | |
| if ( a && s ) { | |
| const e = N.default.parseHeaders( s )[ "set-cookie" ]; | |
| if ( !e ) return; | |
| e.split( "," ).forEach( e => { | |
| const r = N.default.parseCookie( e ); | |
| if ( !r ) return; | |
| const { | |
| expires: s, | |
| httpOnly: o, | |
| name: a, | |
| path: A, | |
| sameSite: c, | |
| secure: u, | |
| value: d | |
| } = r; | |
| dt.set( { | |
| expirationDate: s ? s.getTime() : void 0, | |
| httpOnly: o, | |
| name: a, | |
| path: A, | |
| sameSite: c, | |
| secure: u, | |
| storeId: l, | |
| url: n.finalUrl || t.details.url, | |
| value: d, | |
| firstPartyDomain: i | |
| } ) | |
| } ) | |
| } | |
| }; | |
| t.details.partialSize = t.details.partialSize || Ne.XMLHTTPREQUEST.PARTIAL_SIZE; | |
| const u = {}; | |
| let d; | |
| Object.keys( t.callbacks ).forEach( e => { | |
| const r = "ondone" === e; | |
| ( t.callbacks[ e ] || r || "onload" === e ) && ( u[ e ] = t => { | |
| t = t || {}, r && t.response && delete t.response.response_data; | |
| const s = { | |
| data: t.response, | |
| exception: t.exception | |
| }; | |
| s[ e ] = !0, n( s ), r && c( t ) | |
| } ) | |
| } ), u.ondone || ( u.ondone = c ); | |
| const g = t.url || r.url || null; | |
| t.details.url = T.default.sanitize( t.details.url, g ) || t.details.url, Ne.RUNTIME.WEBREQUEST_XHR_SUPPORT && "no" != We.values.webrequest_modHeaders && ( t.details.headers = t.details.headers || {}, t.details.headers.internal = t.uuid, | |
| Ne.REQUESTS.SENDS_ORIGIN && !Object.keys( t.details.headers ).map( e => e.toLowerCase() ).includes( "origin" ) && ( t.details.headers.origin = null ) ), ( ( t.details.cookie || a ) && t.details.url ? dt.getAll( { | |
| url: t.details.url, | |
| storeId: l, | |
| firstPartyDomain: i ? null : void 0 | |
| } ).then( e => { | |
| const r = e.map( e => e.name + "=" + encodeURIComponent( e.value ) ).concat( [ t.details.cookie ] ).join( ";" ); | |
| delete t.details.cookie, t.details.headers = t.details.headers || {}, t.details.headers.cookie = r | |
| } ) : o.Deferred.Pledge() ).then( () => { | |
| if ( s ) return u.onabort && u.onabort(), void u.ondone( {} ); | |
| let e; | |
| if ( t.details.url && ( e = T.default.parse( t.details.url ).protocol ) && [ "file:" ].concat( Ne.REQUESTS.INTERNAL_PAGE_PROTOCOLS ).includes( e ) ) { | |
| const r = e => { | |
| const r = 'Refused to connect to "' + t.details.url + '": ' + e, | |
| n = N.default.makeErrorResponse( r ); | |
| [ "onerror", "ondone" ].forEach( e => { | |
| u[ e ] && u[ e ]( { | |
| response: n, | |
| exception: r | |
| } ) | |
| } ) | |
| }; | |
| if ( "file:" == e ) { | |
| let e, n; | |
| if ( Ne.RUNTIME.ALLOWS_FILE_SCHEME_ACCESS && ( "all" == We.values.script_file_access ? e = !0 : "externals" != We.values.script_file_access || ( n = at.getByUid( t.uuid ) ) && n.script && n.cond && [].concat( n.script.resources ).concat( n.script.requires ).map( e => T.default.sanitize( e.unsafe_url, e.abs_url ) ).includes( t.details.url ) && ( e = !0 ) ), !e ) return r( "Access to this local file is forbidden!" ) | |
| } | |
| rea.file.get( t.details.url, e => { | |
| const t = Z.a.ab2strSync( e ); | |
| if ( u.onpartial ) { | |
| const e = Object( A.splitSlice )( t, Ne.XMLHTTPREQUEST.PARTIAL_SIZE ); | |
| e.forEach( ( t, r ) => { | |
| u.onpartial( { | |
| response: { | |
| partial: t, | |
| index: r, | |
| length: e.length | |
| } | |
| } ) | |
| } ) | |
| } | |
| const r = { | |
| readyState: 4, | |
| responseHeaders: "", | |
| status: 0, | |
| statusText: "" | |
| }; | |
| [ "onload", "ondone" ].forEach( e => { | |
| u[ e ] && u[ e ]( { | |
| response: r | |
| } ) | |
| } ) | |
| }, r ) | |
| } else { | |
| const e = { | |
| foreign_context: Ne.RUNTIME.FIREFOX && r.tab && ( r.tab.incognito || r.tab.cookieStoreId != rea.cookies.DEFAULT_STORE_ID ) | |
| }; | |
| d = $e.exec( t.details, t.uuid, r || {}, e, u ) | |
| } | |
| } ); | |
| const p = () => { | |
| s || ( d ? d.abort() : s = !0 ) | |
| }; | |
| return e && e.onMessage.addListener( e => { | |
| e.cancel && p() | |
| } ), p | |
| } | |
| }, | |
| download: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| const s = t.details; | |
| let o = ne.start( s, { | |
| onload: e => { | |
| n && n( { | |
| load: !0, | |
| data: e | |
| } ) | |
| }, | |
| onprogress: e => { | |
| n && n( { | |
| progress: !0, | |
| data: e | |
| } ) | |
| }, | |
| onerror: e => { | |
| n && n( { | |
| error: !0, | |
| data: e | |
| } ) | |
| }, | |
| ontimeout: e => { | |
| n && n( { | |
| timeout: !0, | |
| data: e | |
| } ) | |
| }, | |
| ondone: () => { | |
| e && e.disconnect(), e = null | |
| } | |
| }, { | |
| internal: null === e | |
| } ); | |
| return e && void 0 !== o && e.onMessage.addListener( e => { | |
| e.cancel && null !== o && ( ne.cancel( o ), o = null ) | |
| } ), () => { | |
| e = null, n = null | |
| } | |
| } | |
| }, | |
| webRequest: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| const s = r.tab.id, | |
| o = r.frameId; | |
| ( void 0 !== s && void 0 !== o || !t.uuid ) && wt.scripts.set( s, o, t.uuid, t.rules, e => { | |
| n( e ) | |
| } ) | |
| } | |
| }, | |
| addStorageListener: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| if ( r.tab ) return at.addStorageListener( r.tab.id, t.id, t.uuid, Date.now(), n ), () => { | |
| at.removeStorageListeners( { | |
| uuid: t.uuid, | |
| id: t.id | |
| }, !1 ) | |
| }; | |
| n( { | |
| error: !0 | |
| } ) | |
| } | |
| }, | |
| saveStorageKey: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| if ( r.tab ) { | |
| if ( t.uuid ) { | |
| const e = at.getStorageByUid( t.uuid ), | |
| r = t.value, | |
| n = t.key; | |
| e.data[ n ] = r, e.ts = t.ts, at.setStorageByUid( t.uuid, e ), at.notifyStorageListeners( { | |
| uuid: t.uuid | |
| }, { | |
| id: t.id | |
| }, e => { | |
| const s = { | |
| data: {}, | |
| ts: t.ts | |
| }, | |
| o = { | |
| storage: s | |
| }; | |
| void 0 === r ? o.removed = n : s.data[ n ] = r, e( o ) | |
| } ) | |
| } | |
| } else G.logger.warn( "storage: unable to save storage due to empty tabID!" ); | |
| n( {} ) | |
| } | |
| }, | |
| exportToJson: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| ot.exportToJson( t.ids, t.options ).done( e => { | |
| const t = JSON.stringify( e ); | |
| Object( A.splitSlice )( t, parseInt( Ne.XMLHTTPREQUEST.PARTIAL_SIZE ) ).forEach( e => n( { | |
| partial: e | |
| } ) ), n( { | |
| done: !0 | |
| } ) | |
| } ).fail( () => { | |
| n( { | |
| error: !0 | |
| } ) | |
| } ) | |
| } | |
| }, | |
| screenShot: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| return rea.tabs.captureVisibleTab( r.tab.windowId, { | |
| format: 'png' | |
| }, ( dataUrl ) => { | |
| e.postMessage( dataUrl ); | |
| } ); | |
| } | |
| }, | |
| openInTab: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| let s; | |
| const o = [ "active" ], | |
| a = { | |
| url: t.details.url | |
| }; | |
| let i = null; | |
| if ( s = t.details.options ) { | |
| for ( let e = 0; e < o.length; e++ ) void 0 !== s[ o[ e ] ] && ( a[ o[ e ] ] = s[ o[ e ] ] ); | |
| s.incognito ? a.incognito = !0 : ( s.insert && ( a.index = r.tab.index + 1 ), s.setParent ? a.parent = r.tab : a.parent = { | |
| windowId: r.tab.windowId | |
| } ) | |
| } | |
| return rea.tabs.create( a, t => { | |
| t && ( i = t.id, e && ( je[ i ] = { | |
| onClose: function () { | |
| e && n( { | |
| closed: !0 | |
| } ) | |
| } | |
| }, n( { | |
| success: !0, | |
| tabId: i | |
| } ) ) ) | |
| } ), e.onMessage.addListener( e => { | |
| if ( null !== i ) | |
| if ( e.close ) rea.tabs.remove( i, () => { | |
| const e = rea.runtime.lastError; | |
| e ? G.logger.warn( "tab.close", e.message ) : i = null | |
| } ); | |
| else if ( void 0 !== e.name ) { | |
| const t = 5; | |
| let r = 0; | |
| const s = () => { | |
| Qe.listeners.once.whenReady( i, () => { | |
| rea.tabs.sendMessage( i, { | |
| method: "setForeignAttr", | |
| attr: "name", | |
| value: e.name | |
| }, { | |
| frameId: 0 | |
| }, o => { | |
| o ? n( { | |
| name: e.name | |
| } ) : r++ < t ? window.setTimeout( s, 100 * r ) : G.logger.warn( "foreignAttr: error setting attr" ) | |
| } ) | |
| } ) | |
| }; | |
| s() | |
| } | |
| } ), () => { | |
| null !== i && delete je[ i ], e = null | |
| } | |
| } | |
| }, | |
| registerMenuCommand: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| if ( r.tab ) { | |
| const { | |
| name: e, | |
| uuid: s, | |
| accessKey: o, | |
| menuId: a | |
| } = t, i = r.tab.id; | |
| let A; | |
| const l = at.getByUid( s ); | |
| return A = l.script && l.cond ? M.I18N.getTranslation( l.script, "name" ) : M.I18N.getMessage( "This_script_was_deleted" ), gt.add( { | |
| tabId: i, | |
| name: e, | |
| uuid: s, | |
| accessKey: o, | |
| menuId: a, | |
| scriptName: A | |
| }, n ), rt.actionPage( "update" ), () => { | |
| gt.clearById( t.menuId ), rt.actionPage( "update" ) | |
| } | |
| } | |
| G.logger.warn( "Unable to register menu cmd due to empty tabID!" ), e.disconnect() | |
| } | |
| }, | |
| observeUrlChanges: { | |
| allow: { | |
| script: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| const s = r.frameId, | |
| o = r.tab.id, | |
| a = e => { | |
| e.tabId == o && e.frameId == s && n( { | |
| url: e.url | |
| } ) | |
| }; | |
| return It.addListener( o, a ), () => { | |
| It.removeListener( o, a ) | |
| } | |
| } | |
| }, | |
| tabWatch: { | |
| allow: { | |
| extpage: !0 | |
| }, | |
| exec: function ( e, t, r, n ) { | |
| let s; | |
| const o = xt.openAndWatch( { | |
| url: t.url, | |
| index: ( r.tab.index || 0 ) + 1, | |
| parent: r.tab | |
| }, t => { | |
| t ? ( s = s || t.id, n( { | |
| tab: t | |
| } ) ) : ( a(), e.disconnect() ) | |
| } ); | |
| var a = () => { | |
| o.cancel() | |
| }; | |
| return a | |
| } | |
| } | |
| }; | |
| const a = e => { | |
| kt.late ? e.onMessage.addListener( r => { | |
| void 0 !== r.method && ( ( e, r ) => { | |
| const n = e.sender, | |
| o = s[ r.method ]; | |
| if ( !o ) return G.logger.warn( "mh: unknown method " + r.method ), !1; | |
| if ( !o.allow || !o.exec ) return G.logger.warn( "mh: invalid implementation of " + r.method ), !1; | |
| const a = t( n ), | |
| i = a.extpage, | |
| A = a.page, | |
| l = "options" == A, | |
| c = a.id_valid && !i; | |
| if ( !( "background" == A || o.allow.insecure || o.allow.extpage && i || o.allow.options && l || o.allow.script && c ) ) return !1 === r.topframe && ( i || l ) || G.logger.warn( "mh: this context doesn't have the permission to call \"" + r.method + '"' ), !1; { | |
| const t = o.exec( e, r, n, t => { | |
| try { | |
| e.postMessage( t ) | |
| } catch ( r ) { | |
| G.logger.debug( "bg: Error sending port (" + e.name + ") message", t ) | |
| } | |
| } ); | |
| t && e.onDisconnect.addListener( t ) | |
| } | |
| } )( e, r ) | |
| } ) : kt.registerLateCallback( () => { | |
| a( e ) | |
| } ) | |
| }; | |
| var l = { | |
| init: function () { | |
| l.externally_connectable_reg = ot.regexify( { | |
| match: Object.keys( l.externally_connectable ) | |
| } ), rea.extension.onMessage.addListener( r ), rea.extension.onConnect.addListener( a ), rea.extension.onConnectExternal.addListener( e => { | |
| e.disconnect() | |
| } ) | |
| }, | |
| externally_connectable: { | |
| "*://www.tampermonkey.net/*": [ "getVersion" ], | |
| "https://greasyfork.org/*": [ "*" ], | |
| "https://userstyles.org/*": [ "*" ], | |
| "*://*.userscript.zone/*": [ "*" ] | |
| } | |
| }; | |
| return l | |
| } )(), | |
| dt = ( () => { | |
| const e = ( e, t ) => ( Ne.RUNTIME.FPI ? void 0 !== t && ( e.firstPartyDomain = e.firstPartyDomain || t ) : delete e.firstPartyDomain, e ); | |
| let t; | |
| const r = { | |
| getAll: function ( t ) { | |
| const r = Object( o.Deferred )(); | |
| return rea.cookies.getAll( e( t, null ), r.resolve ), r.promise() | |
| }, | |
| remove: function ( t ) { | |
| const r = Object( o.Deferred )(); | |
| return rea.cookies.remove( e( t ), e => { | |
| if ( e ) r.resolve(); | |
| else { | |
| const e = rea.runtime.lastError; | |
| r.reject( e ? e.message : "unknown error" ) | |
| } | |
| } ), r.promise() | |
| }, | |
| set: function ( t ) { | |
| const r = Object( o.Deferred )(); | |
| return rea.cookies.set( e( t ), e => { | |
| if ( e ) r.resolve(); | |
| else { | |
| const e = rea.runtime.lastError; | |
| r.reject( e ? e.message : "unknown error" ) | |
| } | |
| } ), r.promise() | |
| } | |
| }; | |
| return Object.defineProperties( r, { | |
| fpi: { | |
| get: () => t | |
| } | |
| } ), Ne.RUNTIME.FPI && rea.cookies.remove( { | |
| url: "https://www.tampermonkey.net", | |
| name: "doesnotexist" | |
| }, () => { | |
| rea.runtime.lastError && ( t = !0 ) | |
| } ), r | |
| } )(), | |
| gt = ( () => { | |
| let e = []; | |
| return { | |
| add: function ( { | |
| tabId: t, | |
| name: r, | |
| uuid: n, | |
| accessKey: s, | |
| menuId: o, | |
| scriptName: a | |
| }, i ) { | |
| e.push( { | |
| tabId: t, | |
| name: r, | |
| uuid: n, | |
| accessKey: s, | |
| menuId: o, | |
| scriptName: a, | |
| response: i | |
| } ) | |
| }, | |
| list: function () { | |
| return e | |
| }, | |
| listByTabId: function ( t ) { | |
| const r = {}; | |
| return e.filter( e => { | |
| const n = e.uuid + e.name; | |
| return e.tabId == t && !r[ n ] && ( r[ n ] = !0 ) | |
| } ) | |
| }, | |
| clearByTabId: function ( t ) { | |
| e = e.filter( e => e.tabId != t ) | |
| }, | |
| getByTabId: function ( t ) { | |
| return e.filter( e => e.tabId == t )[ 0 ] | |
| }, | |
| clearById: function ( t ) { | |
| e = e.filter( e => e.menuId != t ) | |
| }, | |
| getById: function ( t ) { | |
| return e.filter( e => e.menuId == t )[ 0 ] | |
| } | |
| } | |
| } )(); | |
| const pt = function () { | |
| let e, t, r, n, s, o, a, i, A, l, c, u, d, g, p, m, f, h, R = null; | |
| e = { | |
| id: "general", | |
| name: M.I18N.getMessage( "General" ), | |
| sub_menu_item: !0, | |
| items: [] | |
| }, e.items.push( { | |
| name: M.I18N.getMessage( "Config_Mode" ), | |
| id: "configMode", | |
| level: 0, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Novice" ), | |
| value: 0 | |
| }, { | |
| name: M.I18N.getMessage( "Beginner" ), | |
| value: 50 | |
| }, { | |
| name: M.I18N.getMessage( "Advanced" ), | |
| value: 100 | |
| } ], | |
| value: We.values.configMode, | |
| desc: M.I18N.getMessage( "Changes_the_number_of_visible_config_options" ) | |
| } ), e.items.push( { | |
| name: M.I18N.getMessage( "Language" ), | |
| id: "i18n", | |
| level: 0, | |
| option: !0, | |
| reload: !0, | |
| warning: M.I18N.getMessage( "A_reload_is_required" ), | |
| select: [ { | |
| name: "Browser Default", | |
| value: null | |
| } ].concat( M.I18N.supported ), | |
| value: We.values.i18n, | |
| validation: { | |
| image: "info", | |
| opacity: .9, | |
| msg: M.I18N.getMessage( "Your_language_is_not_supported__Click_here_to_get_intructions_how_to_translate_TM_" ), | |
| url: "https://www.tampermonkey.net/faq.php#Q500" | |
| } | |
| } ), | |
| e.items.push( { | |
| name: M.I18N.getMessage( "Auto_reload_on_script_enabled" ), | |
| level: 20, | |
| id: "autoReload", | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.autoReload, | |
| desc: M.I18N.getMessage( "Auto_reload_on_script_enabled_desc" ) | |
| } ), e.items.push( { | |
| name: M.I18N.getMessage( "Anonymous_statistics" ), | |
| level: 0, | |
| id: "statistics_enabled", | |
| option: !0, | |
| checkbox: !0, | |
| enabled: !!We.values.statistics_enabled, | |
| validation: { | |
| image: "info", | |
| opacity: .9, | |
| msg: M.I18N.getMessage( "Allow_Tampermonkey_to_collect_anonymous_statistics_via_Google_Analytics" ), | |
| url: "https://www.tampermonkey.net/privacy.php#extension" | |
| } | |
| } ), e.items.push( { | |
| name: M.I18N.getMessage( "Debug_scripts" ), | |
| level: 100, | |
| id: "debug", | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.debug, | |
| desc: "" | |
| } ), e.items.push( { | |
| name: M.I18N.getMessage( "Show_fixed_source" ), | |
| level: 100, | |
| id: "showFixedSrc", | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.showFixedSrc, | |
| desc: "" | |
| } ), e.items.push( { | |
| name: M.I18N.getMessage( "LogLevel" ), | |
| id: "logLevel", | |
| level: 0, | |
| option: !0, | |
| select: [].concat( Ne.RUNTIME.SAFARI ? [ { | |
| name: M.I18N.getMessage( "Verbose" ), | |
| value: 90 | |
| } ] : [] ).concat( [ { | |
| name: M.I18N.getMessage( "Debug" ), | |
| value: G.VERBOSE | |
| }, { | |
| name: M.I18N.getMessage( "Info" ), | |
| value: G.DEBUG | |
| }, { | |
| name: M.I18N.getMessage( "Warning" ), | |
| value: G.WARN | |
| }, { | |
| name: M.I18N.getMessage( "Error" ), | |
| value: G.ERROR | |
| } ] ), | |
| value: We.values.logLevel, | |
| desc: "" | |
| } ), m = { | |
| id: "script_sync", | |
| name: M.I18N.getMessage( "Script_Sync" ), | |
| sub_menu_item: !0, | |
| level: 50, | |
| need_save: !0, | |
| items: [] | |
| }, m.items.push( { | |
| name: M.I18N.getMessage( "Enable_Script_Sync" ), | |
| id: "sync_enabled", | |
| level: 50, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.sync_enabled, | |
| desc: M.I18N.getMessage( "Synchronize_your_scripts_across_browsers_and_operation_systems" ) | |
| } ); | |
| const v = ( () => { | |
| const e = [], | |
| t = { | |
| reset_sync: !0, | |
| cloud_url: !1, | |
| cloud_user: !1, | |
| cloud_pass: !1 | |
| }; | |
| return rea.storage.sync.supported && e.push( { | |
| name: M.I18N.getMessage( "Browser_Sync" ), | |
| value: Ae.b.eCHROMESYNC, | |
| enable: t | |
| } ), e.push( { | |
| name: M.I18N.getMessage( "Google_Drive" ), | |
| value: Ae.b.eGDRIVE, | |
| enable: t | |
| } ), | |
| Ne.RUNTIME.CHROME && Ne.RUNTIME.BROWSER_VERSION < 37 || Ne.RUNTIME.SAFARI && Ne.RUNTIME.BROWSER_VERSION < 8 || Ne.RUNTIME.DOLPHIN ? G.logger.info( "Script Sync: no Dropbox support due to missing SHA-256 capabilities" ) : e.push( { | |
| name: M.I18N.getMessage( "Dropbox" ), | |
| value: Ae.b.eDROPBOX, | |
| enable: t | |
| } ), e.push( { | |
| name: M.I18N.getMessage( "OneDrive" ), | |
| value: Ae.b.eONEDRIVE, | |
| enable: t | |
| } ), Ne.RUNTIME.SAFARI || ( e.push( { | |
| name: M.I18N.getMessage( "Yandex_Disk" ), | |
| value: Ae.b.eYANDEX, | |
| enable: t | |
| } ), e.push( { | |
| name: M.I18N.getMessage( "WebDAV" ), | |
| value: Ae.b.eWEBDAV, | |
| enable: { | |
| reset_sync: !0, | |
| cloud_url: !0, | |
| cloud_user: !0, | |
| cloud_pass: !0 | |
| } | |
| } ) ), e | |
| } )(); | |
| if ( m.items.push( { | |
| name: M.I18N.getMessage( "Sync_Type" ), | |
| id: "sync_type", | |
| enabler: !0, | |
| level: 50, | |
| option: !0, | |
| select: v, | |
| value: We.values.sync_type | |
| } ), m.items.push( { | |
| name: M.I18N.getMessage( "URL" ), | |
| id: "cloud_url", | |
| enabledBy: "sync_type", | |
| level: 50, | |
| option: !0, | |
| text: !0, | |
| width: 2, | |
| value: We.values.cloud_url | |
| } ), m.items.push( { | |
| name: M.I18N.getMessage( "Login" ), | |
| id: "cloud_user", | |
| enabledBy: "sync_type", | |
| level: 50, | |
| option: !0, | |
| text: !0, | |
| width: 2, | |
| value: We.values.cloud_user | |
| } ), m.items.push( { | |
| name: M.I18N.getMessage( "Password" ), | |
| id: "cloud_pass", | |
| enabledBy: "sync_type", | |
| level: 50, | |
| option: !0, | |
| text: !0, | |
| password: !0, | |
| width: 2, | |
| value: We.values.cloud_pass | |
| } ), m.items.push( { | |
| name: M.I18N.getMessage( "Sync_Reset" ), | |
| id: "reset_sync", | |
| enabledBy: "sync_type", | |
| level: 80, | |
| button: !0, | |
| reload: !0, | |
| value: 0, | |
| warning: M.I18N.getMessage( "This_will_remove_all_remote_data_from_sync_Ok_" ) | |
| } ), a = { | |
| id: "appearance", | |
| name: M.I18N.getMessage( "Appearance" ), | |
| sub_menu_item: !0, | |
| need_save: !0, | |
| items: [], | |
| warning: M.I18N.getMessage( "A_reload_is_required" ), | |
| reload: !0 | |
| }, a.items.push( { | |
| name: M.I18N.getMessage( "Layout" ), | |
| id: "layout", | |
| level: 0, | |
| option: !0, | |
| select: x.a.getLayouts(), | |
| value: We.values.layout, | |
| desc: "" | |
| } ), a.items.push( { | |
| name: M.I18N.getMessage( "Custom_CSS" ), | |
| id: "layout_user_css", | |
| level: 100, | |
| option: !0, | |
| input: !0, | |
| value: We.values.layout_user_css, | |
| desc: M.I18N.getMessage( "You_can_add_your_custom_CSS_rules_here_" ) | |
| } ), R = {}, "off" == We.values.notification_showUpdate && ( R = { | |
| image: "critical", | |
| msg: M.I18N.getMessage( "Are_you_sure_that_you_don_t_want_to_be_notified_of_updates_" ) | |
| } ), a.items.push( { | |
| name: M.I18N.getMessage( "Update_Notification" ), | |
| id: "notification_showUpdate", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| }, { | |
| name: M.I18N.getMessage( "Show_notification" ), | |
| value: "notification" | |
| }, { | |
| name: M.I18N.getMessage( "Open_changelog" ), | |
| value: "changelog" | |
| } ], | |
| value: We.values.notification_showUpdate, | |
| validation: R | |
| } ), a.items.push( { | |
| name: M.I18N.getMessage( "Favicon_Service" ), | |
| id: "favicon_service", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Google" ), | |
| value: "google" | |
| }, { | |
| name: M.I18N.getMessage( "DuckDuckGo" ), | |
| value: "duckduckgo" | |
| }, { | |
| name: M.I18N.getMessage( "Native" ), | |
| value: "native", | |
| warning: M.I18N.getMessage( "Warning_unsafe_site_warnings_might_appear_" ) | |
| } ], | |
| value: We.values.favicon_service | |
| } ), i = { | |
| id: "action_menu", | |
| name: M.I18N.getMessage( "Action_Menu" ), | |
| sub_menu_item: !0, | |
| need_save: !0, | |
| items: [], | |
| level: 50 | |
| }, i.items.push( { | |
| name: M.I18N.getMessage( "Hide_disabled_scripts" ), | |
| id: "action_menu_scripts_hide_disabled", | |
| level: 100, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.action_menu_scripts_hide_disabled, | |
| desc: "" | |
| } ), i.items.push( { | |
| name: M.I18N.getMessage( "Columns" ), | |
| id: "action_menu_columns", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "1" ), | |
| value: "1" | |
| }, { | |
| name: M.I18N.getMessage( "2" ), | |
| value: "2" | |
| }, { | |
| name: M.I18N.getMessage( "3" ), | |
| value: "3" | |
| } ], | |
| value: We.values.action_menu_columns | |
| } ), i.items.push( { | |
| name: M.I18N.getMessage( "Script_order" ), | |
| id: "action_menu_scripts_sort", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Auto" ), | |
| value: "auto" | |
| }, { | |
| name: M.I18N.getMessage( "Position_" ), | |
| value: "position" | |
| }, { | |
| name: M.I18N.getMessage( "Name" ), | |
| value: "name" | |
| }, { | |
| name: M.I18N.getMessage( "Enabled" ), | |
| value: "enabled" | |
| } ], | |
| value: We.values.action_menu_scripts_sort | |
| } ), i.items.push( { | |
| name: M.I18N.getMessage( "Icon_badge_info" ), | |
| id: "appearance_badges", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| }, { | |
| name: M.I18N.getMessage( "Running_scripts" ), | |
| value: "running" | |
| }, { | |
| name: M.I18N.getMessage( "Unique_running_scripts" ), | |
| value: "running_unique" | |
| } ], | |
| value: We.values.appearance_badges | |
| } ), ( Ne.RUNTIME.CHROME || Ne.RUNTIME.FIREFOX ) && i.items.push( { | |
| name: M.I18N.getMessage( "Icon_badge_color" ), | |
| id: "appearance_badge_color", | |
| level: 100, | |
| color: !0, | |
| value: We.values.appearance_badge_color | |
| } ), Ne.RUNTIME.FIREFOX && i.items.push( { | |
| name: M.I18N.getMessage( "Icon_badge_text_color" ), | |
| id: "appearance_badge_text_color", | |
| level: 100, | |
| color: !0, | |
| value: We.values.appearance_badge_text_color | |
| } ), A = { | |
| id: "context_menu", | |
| name: M.I18N.getMessage( "Context_Menu" ), | |
| sub_menu_item: !0, | |
| items: [], | |
| level: 50 | |
| }, A.items.push( { | |
| name: M.I18N.getMessage( "Enable_context_menu" ), | |
| id: "context_menu_enabled", | |
| level: 50, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.context_menu_enabled, | |
| desc: "" | |
| } ), A.items.push( { | |
| name: M.I18N.getMessage( "Scripts_activated_by_context_menu" ), | |
| id: "context_menu_scripts", | |
| level: 50, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.context_menu_scripts, | |
| desc: "" | |
| } ), A.items.push( { | |
| name: M.I18N.getMessage( "Script_menu_commands" ), | |
| id: "context_menu_commands", | |
| level: 50, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.context_menu_commands, | |
| desc: "" | |
| } ), We.values.userscript_search_url && ( n = { | |
| id: "userscript_search", | |
| name: M.I18N.getMessage( "Userscript_Search" ), | |
| sub_menu_item: !0, | |
| level: 0, | |
| items: [], | |
| reload: !0 | |
| }, n.items.push( { | |
| name: M.I18N.getMessage( "Userscript_search_integration_mode" ), | |
| id: "userscript_search_mode", | |
| level: 0, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| }, { | |
| name: M.I18N.getMessage( "On_Click" ), | |
| value: "click" | |
| }, { | |
| name: M.I18N.getMessage( "On_Action_Menu" ), | |
| value: "action_menu" | |
| }, { | |
| name: M.I18N.getMessage( "Add_to_icon_badge_text" ), | |
| value: "badge" | |
| } ], | |
| value: We.values.userscript_search_mode, | |
| validation: { | |
| image: "info", | |
| opacity: .9, | |
| msg: M.I18N.getMessage( "In_order_to_search_for_userscripts__0on_action_menu0__and__0icon_badge_number0__automatically_transfer_the_tab_s_url_to_the_search_website__0on_click0_opens_the_search_page_on_click_Please_click_at_this_icon_to_open_the_privacy_policy_", M.I18N.getMessage( "Add_to_icon_badge_text" ), M.I18N.getMessage( "On_Action_Menu" ), M.I18N.getMessage( "On_Click" ) ), | |
| url: Ge() | |
| } | |
| } ) ), r = { | |
| id: "editor", | |
| name: M.I18N.getMessage( "Editor" ), | |
| sub_menu_item: !0, | |
| level: 20, | |
| need_save: !0, | |
| items: [], | |
| warning: M.I18N.getMessage( "A_reload_is_required" ), | |
| reload: !0 | |
| }, r.items.push( { | |
| name: M.I18N.getMessage( "Enable_Editor" ), | |
| id: "editor_enabled", | |
| level: 100, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.editor_enabled, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Theme" ), | |
| id: "editor_theme", | |
| level: 50, | |
| option: !0, | |
| select: x.a.getEditorThemes(), | |
| value: We.values.editor_theme | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Font_Size" ), | |
| id: "editor_fontSize", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: "50%", | |
| value: 50 | |
| }, { | |
| name: "70%", | |
| value: 70 | |
| }, { | |
| name: "80%", | |
| value: 80 | |
| }, { | |
| name: "90%", | |
| value: 90 | |
| }, { | |
| name: "100%", | |
| value: 100 | |
| }, { | |
| name: "110%", | |
| value: 110 | |
| }, { | |
| name: "120%", | |
| value: 120 | |
| }, { | |
| name: "150%", | |
| value: 150 | |
| } ], | |
| value: We.values.editor_fontSize | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Key_Mapping" ), | |
| id: "editor_keyMap", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Windows" ), | |
| value: "windows" | |
| }, { | |
| name: M.I18N.getMessage( "Sublime" ), | |
| value: "sublime" | |
| }, { | |
| name: M.I18N.getMessage( "Emacs" ), | |
| value: "emacs" | |
| }, { | |
| name: M.I18N.getMessage( "Vim" ), | |
| value: "vim" | |
| } ], | |
| value: We.values.editor_keyMap | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Indentation_Width" ), | |
| id: "editor_indentUnit", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "1" ), | |
| value: 1 | |
| }, { | |
| name: M.I18N.getMessage( "2" ), | |
| value: 2 | |
| }, { | |
| name: M.I18N.getMessage( "3" ), | |
| value: 3 | |
| }, { | |
| name: M.I18N.getMessage( "4" ), | |
| value: 4 | |
| }, { | |
| name: M.I18N.getMessage( "5" ), | |
| value: 5 | |
| }, { | |
| name: M.I18N.getMessage( "6" ), | |
| value: 6 | |
| }, { | |
| name: M.I18N.getMessage( "7" ), | |
| value: 7 | |
| }, { | |
| name: M.I18N.getMessage( "8" ), | |
| value: 8 | |
| }, { | |
| name: M.I18N.getMessage( "9" ), | |
| value: 9 | |
| }, { | |
| name: M.I18N.getMessage( "10" ), | |
| value: 10 | |
| }, { | |
| name: M.I18N.getMessage( "11" ), | |
| value: 11 | |
| } ], | |
| value: We.values.editor_indentUnit, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Tab_Size" ), | |
| id: "editor_tabSize", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "1" ), | |
| value: 1 | |
| }, { | |
| name: M.I18N.getMessage( "2" ), | |
| value: 2 | |
| }, { | |
| name: M.I18N.getMessage( "3" ), | |
| value: 3 | |
| }, { | |
| name: M.I18N.getMessage( "4" ), | |
| value: 4 | |
| }, { | |
| name: M.I18N.getMessage( "5" ), | |
| value: 5 | |
| }, { | |
| name: M.I18N.getMessage( "6" ), | |
| value: 6 | |
| }, { | |
| name: M.I18N.getMessage( "7" ), | |
| value: 7 | |
| }, { | |
| name: M.I18N.getMessage( "8" ), | |
| value: 8 | |
| }, { | |
| name: M.I18N.getMessage( "9" ), | |
| value: 9 | |
| }, { | |
| name: M.I18N.getMessage( "10" ), | |
| value: 10 | |
| }, { | |
| name: M.I18N.getMessage( "11" ), | |
| value: 11 | |
| } ], | |
| value: We.values.editor_tabSize, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Indent_with" ), | |
| id: "editor_indentWithTabs", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Tabs" ), | |
| value: "tabs" | |
| }, { | |
| name: M.I18N.getMessage( "Spaces" ), | |
| value: "spaces" | |
| } ], | |
| value: We.values.editor_indentWithTabs, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "TabMode" ), | |
| id: "editor_tabMode", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Classic" ), | |
| value: "classic" | |
| }, { | |
| name: M.I18N.getMessage( "Smart" ), | |
| value: "smart" | |
| }, { | |
| name: M.I18N.getMessage( "Indent" ), | |
| value: "indent" | |
| } ], | |
| value: We.values.editor_tabMode, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Highlight_selection_matches" ), | |
| id: "editor_highlightSelectionMatches", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Cursor" ), | |
| value: "cursor" | |
| }, { | |
| name: M.I18N.getMessage( "On" ), | |
| value: "on" | |
| }, { | |
| name: M.I18N.getMessage( "Off" ), | |
| value: "off" | |
| } ], | |
| value: We.values.editor_highlightSelectionMatches, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Line_break" ), | |
| id: "editor_lineWrapping", | |
| level: 50, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.editor_lineWrapping, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Reindent_on_typing" ), | |
| id: "editor_electricChars", | |
| level: 50, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.editor_electricChars, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Enable_autoSave" ), | |
| id: "editor_autoSave", | |
| level: 20, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.editor_autoSave, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Enable_easySave" ), | |
| id: "editor_easySave", | |
| level: 20, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.editor_easySave, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Highlight_trailing_whitespace" ), | |
| id: "editor_highlightTrailingWhitespace", | |
| level: 50, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.editor_highlightTrailingWhitespace, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Trim_trailing_whitespace_from_modified_lines" ), | |
| id: "editor_trimTrailingSpacesFromModifiedLines", | |
| level: 50, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.editor_trimTrailingSpacesFromModifiedLines, | |
| desc: "" | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Auto_syntax_check_on_typing" ), | |
| id: "editor_autoLint", | |
| level: 50, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.editor_autoLint, | |
| desc: M.I18N.getMessage( "Enable_this_option_to_automatically_check_the_code_on_typing_" ) | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Auto_syntax_check_max_length" ), | |
| id: "editor_autoLintMaxLen", | |
| level: 50, | |
| option: !0, | |
| text: !0, | |
| value: We.values.editor_autoLintMaxLen, | |
| desc: M.I18N.getMessage( "Check_only_scripts_up_to_this_size_automatically_" ) | |
| } ), r.items.push( { | |
| name: M.I18N.getMessage( "Custom_Linter_Config" ), | |
| id: "editor_linter_config", | |
| level: 100, | |
| option: !0, | |
| input: !0, | |
| json: !0, | |
| value: We.values.editor_linter_config, | |
| validation: { | |
| image: "info", | |
| opacity: .9, | |
| msg: M.I18N.getMessage( "You_can_add_your_custom_linter_config_here_" ), | |
| url: "https://eslint.org/docs/user-guide/configuring" | |
| } | |
| } ), o = { | |
| id: "script_update", | |
| name: M.I18N.getMessage( "Script_Update" ), | |
| sub_menu_item: !0, | |
| level: 0, | |
| items: [] | |
| }, o.items.push( { | |
| name: M.I18N.getMessage( "Check_disabled_scripts" ), | |
| id: "scriptUpdateCheckDisabled", | |
| level: 0, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.scriptUpdateCheckDisabled, | |
| desc: "" | |
| } ), o.items.push( { | |
| name: M.I18N.getMessage( "Dont_ask_me_for_simple_script_updates" ), | |
| id: "notification_silentScriptUpdate", | |
| level: 80, | |
| option: !0, | |
| checkbox: !0, | |
| enabled: We.values.notification_silentScriptUpdate, | |
| desc: "" | |
| } ), o.items.push( { | |
| name: M.I18N.getMessage( "Check_interval" ), | |
| id: "scriptUpdateCheckPeriod", | |
| level: 0, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Never" ), | |
| value: 0 | |
| }, { | |
| name: M.I18N.getMessage( "Every_6_Hours" ), | |
| value: 216e5 | |
| }, { | |
| name: M.I18N.getMessage( "Every_12_Hour" ), | |
| value: 432e5 | |
| }, { | |
| name: M.I18N.getMessage( "Every_Day" ), | |
| value: 864e5 | |
| }, { | |
| name: M.I18N.getMessage( "Every_Week" ), | |
| value: 6048e5 | |
| } ], | |
| value: We.values.scriptUpdateCheckPeriod, | |
| desc: "" | |
| } ), o.items.push( { | |
| name: M.I18N.getMessage( "Hide_notification_after" ), | |
| id: "scriptUpdateHideNotificationAfter", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Never" ), | |
| value: 0 | |
| }, { | |
| name: M.I18N.getMessage( "15_Seconds" ), | |
| value: 15e3 | |
| }, { | |
| name: M.I18N.getMessage( "30_Seconds" ), | |
| value: 3e4 | |
| }, { | |
| name: M.I18N.getMessage( "1_Minute" ), | |
| value: 6e4 | |
| }, { | |
| name: M.I18N.getMessage( "5_Minutes" ), | |
| value: 3e5 | |
| }, { | |
| name: M.I18N.getMessage( "1_Hour" ), | |
| value: 36e5 | |
| } ], | |
| value: We.values.scriptUpdateHideNotificationAfter, | |
| desc: "" | |
| } ), s = { | |
| id: "externals", | |
| name: M.I18N.getMessage( "Externals" ), | |
| sub_menu_item: !0, | |
| level: 0, | |
| items: [] | |
| }, | |
| s.items.push( { | |
| name: M.I18N.getMessage( "Update_interval" ), | |
| id: "external_update_interval", | |
| level: 0, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Always" ), | |
| value: 1 | |
| }, { | |
| name: M.I18N.getMessage( "Every_Day" ), | |
| value: 864e5 | |
| }, { | |
| name: M.I18N.getMessage( "Every_Week" ), | |
| value: 6048e5 | |
| }, { | |
| name: M.I18N.getMessage( "Every_Month" ), | |
| value: 2592e6 | |
| }, { | |
| name: M.I18N.getMessage( "Never" ), | |
| value: 0 | |
| } ], | |
| value: We.values.external_update_interval, | |
| desc: "" | |
| } ), l = { | |
| id: "security", | |
| name: M.I18N.getMessage( "Security" ), | |
| sub_menu_item: !0, | |
| need_save: !0, | |
| level: 50, | |
| items: [] | |
| }, Ne.OPTIONS.HAS_CSP && ( l.items.push( { | |
| name: M.I18N.getMessage( "Add_TM_to_CSP" ), | |
| id: "webrequest_fixCSP", | |
| level: 80, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Remove__possibly_unsecure_" ), | |
| value: "remove" | |
| }, { | |
| name: M.I18N.getMessage( "Yes" ), | |
| value: "yes" | |
| }, { | |
| name: M.I18N.getMessage( "No" ), | |
| value: "no" | |
| } ], | |
| value: We.values.webrequest_fixCSP, | |
| desc: M.I18N.getMessage( "Tampermonkey_might_not_be_able_to_provide_access_to_the_unsafe_context_when_this_is_disabled" ) | |
| } ), l.items.push( { | |
| name: M.I18N.getMessage( "Allow_headers_to_be_modified_by_scripts" ), | |
| id: "webrequest_modHeaders", | |
| level: 80, | |
| option: !0, | |
| reload: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Yes" ), | |
| value: "yes" | |
| }, { | |
| name: M.I18N.getMessage( "Auto" ), | |
| value: "auto" | |
| }, { | |
| name: M.I18N.getMessage( "No" ), | |
| value: "no" | |
| } ], | |
| value: We.values.webrequest_modHeaders, | |
| warning: M.I18N.getMessage( "Tampermonkey_needs_to_be_restarted_to_make_this_change_apply_Do_you_want_to_continue_" ), | |
| desc: "" | |
| } ) ), Ne.RUNTIME.ALLOWS_FILE_SCHEME_ACCESS && l.items.push( { | |
| name: M.I18N.getMessage( "Script_local_files_access" ), | |
| id: "script_file_access", | |
| level: 80, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "All_local_files" ), | |
| value: "all" | |
| }, { | |
| name: M.I18N.getMessage( "require_and_resource" ), | |
| value: "externals" | |
| }, { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| } ], | |
| value: We.values.script_file_access | |
| } ), l.items.push( { | |
| name: M.I18N.getMessage( "Allow_communication_with_cooperate_pages" ), | |
| id: "external_connect", | |
| level: 80, | |
| option: !0, | |
| reload: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Tampermonkey_and_script_version" ), | |
| value: "all" | |
| }, { | |
| name: M.I18N.getMessage( "Tampermonkey_version" ), | |
| value: "version" | |
| }, { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| } ], | |
| value: We.values.external_connect, | |
| desc: M.I18N.getMessage( "This_option_allows_the_Tampermonkey_homepage_and_some_script_hosting_pages_to_determine_the_Tampermonkey_version_and_whether_a_script_is_installed_" ) | |
| } ), l.items.push( { | |
| name: M.I18N.getMessage( "Subresource_Integrity" ), | |
| id: "require_sri_mode", | |
| level: 80, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "ignore" | |
| }, { | |
| name: M.I18N.getMessage( "Validate_if_supported" ), | |
| value: "supported" | |
| }, { | |
| name: M.I18N.getMessage( "Validate_if_given" ), | |
| value: "given" | |
| }, { | |
| name: M.I18N.getMessage( "Enforce" ), | |
| value: "enforce" | |
| } ], | |
| value: We.values.require_sri_mode, | |
| desc: M.I18N.getMessage( "Script_authors_can_secure_external_resources_by_adding_a_SRI_hash_to_the_URL_" ) | |
| } ), l.items.push( { | |
| name: M.I18N.getMessage( "connect_mode" ), | |
| id: "connect_mode", | |
| level: 50, | |
| option: !0, | |
| select: ( We.values.configMode >= 80 || [ "off", "casual" ].includes( We.values.connect_mode ) ? [ { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| }, { | |
| name: M.I18N.getMessage( "Casual" ), | |
| value: "casual" | |
| } ] : [] ).concat( [ { | |
| name: M.I18N.getMessage( "Ask_if_unknown" ), | |
| value: "ask" | |
| }, { | |
| name: M.I18N.getMessage( "Strict" ), | |
| value: "strict" | |
| }, { | |
| name: M.I18N.getMessage( "Always_ask" ), | |
| value: "paranoid" | |
| } ] ), | |
| value: We.values.connect_mode, | |
| desc: "" | |
| } ), | |
| Ne.RUNTIME.INCOGNITO_MODE && !rea.extension.inIncognitoContext && ( R = "temporary" == We.values.incognito_mode ? {} : { | |
| image: "critical", | |
| msg: "Permanent mode is still a BETA feature!" | |
| }, l.items.push( { | |
| name: M.I18N.getMessage( "Store_data_in_incognito_mode" ), | |
| id: "incognito_mode", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Temporary" ), | |
| value: "temporary" | |
| }, { | |
| name: M.I18N.getMessage( "Permanent" ), | |
| value: "permanent" | |
| } ], | |
| value: We.values.incognito_mode, | |
| validation: R | |
| } ) ), l.items.push( { | |
| name: M.I18N.getMessage( "Page_Filter_Mode" ), | |
| id: "page_filter_mode", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| }, { | |
| name: M.I18N.getMessage( "Blacklist" ), | |
| value: "black" | |
| }, { | |
| name: M.I18N.getMessage( "Whitelist" ), | |
| value: "white" | |
| }, { | |
| name: M.I18N.getMessage( "Both" ), | |
| value: "black+white" | |
| } ], | |
| value: We.values.page_filter_mode, | |
| desc: "" | |
| } ), l.items.push( { | |
| name: M.I18N.getMessage( "Whitelisted_Pages" ), | |
| id: "page_whitelist", | |
| level: 50, | |
| option: !0, | |
| input: !0, | |
| array: !0, | |
| value: We.values.page_whitelist, | |
| desc: "" | |
| } ), | |
| l.items.push( { | |
| name: M.I18N.getMessage( "Blacklisted_Pages" ), | |
| id: "forbiddenPages", | |
| level: 50, | |
| option: !0, | |
| input: !0, | |
| array: !0, | |
| value: We.values.forbiddenPages, | |
| desc: "" | |
| } ), c = { | |
| id: "blackcheck", | |
| name: M.I18N.getMessage( "BlackCheck" ), | |
| sub_menu_item: !0, | |
| need_save: !0, | |
| level: 50, | |
| items: [] | |
| }, c.items.push( { | |
| name: M.I18N.getMessage( "Script_Blacklist_Source" ), | |
| id: "script_blacklist_type", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| }, { | |
| name: M.I18N.getMessage( "Server_And_Manual" ), | |
| value: "server" | |
| }, { | |
| name: M.I18N.getMessage( "Only_Manual" ), | |
| value: "only_manual" | |
| } ], | |
| value: We.values.script_blacklist_type | |
| } ), c.items.push( { | |
| name: M.I18N.getMessage( "Blacklist_Severity" ), | |
| id: "script_blacklist_severity", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "severity_1" ), | |
| value: 1 | |
| }, { | |
| name: M.I18N.getMessage( "severity_2" ), | |
| value: 2 | |
| }, { | |
| name: M.I18N.getMessage( "severity_3" ), | |
| value: 3 | |
| }, { | |
| name: M.I18N.getMessage( "severity_4" ), | |
| value: 4 | |
| }, { | |
| name: M.I18N.getMessage( "severity_5" ), | |
| value: 5 | |
| }, { | |
| name: M.I18N.getMessage( "severity_6" ), | |
| value: 6 | |
| }, { | |
| name: M.I18N.getMessage( "severity_7" ), | |
| value: 7 | |
| }, { | |
| name: M.I18N.getMessage( "severity_8" ), | |
| value: 8 | |
| }, { | |
| name: M.I18N.getMessage( "severity_9" ), | |
| value: 9 | |
| }, { | |
| name: M.I18N.getMessage( "severity_10" ), | |
| value: ze.SEVERITY_MAX | |
| } ], | |
| value: We.values.script_blacklist_severity | |
| } ), c.items.push( { | |
| name: M.I18N.getMessage( "Manual_Script_Blacklist" ), | |
| id: "require_blacklist", | |
| level: 50, | |
| option: !0, | |
| input: !0, | |
| array: !0, | |
| value: We.values.require_blacklist, | |
| desc: "" | |
| } ), Ne.OPTIONS.CAN_DOWNLOAD ) { | |
| let e = !1; | |
| R = {}, | |
| [ "exe", "sh", "crx", "com", "bat", "scr" ].map( e => "name." + e ).forEach( t => { | |
| e |= ne.is_whitelisted( t ) | |
| } ), e && ( R = { | |
| image: "critical", | |
| msg: M.I18N.getMessage( "Your_whitelist_seems_to_include_executable_files_This_means_your_userscripts_may_download_malware_or_spyware_to_your_harddisk_" ) | |
| } ), h = { | |
| id: "downloads", | |
| name: M.I18N.getMessage( "Downloads" ) + " BETA", | |
| sub_menu_item: !0, | |
| need_save: !0, | |
| level: 50, | |
| items: [] | |
| }, h.items.push( { | |
| name: M.I18N.getMessage( "Download_Mode" ), | |
| id: "downloads_mode", | |
| level: 50, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Default" ), | |
| value: ne.staticVars.DEFAULT | |
| }, { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: ne.staticVars.OFF | |
| }, { | |
| name: M.I18N.getMessage( "Native" ), | |
| value: ne.staticVars.NATIVE | |
| }, { | |
| name: M.I18N.getMessage( "Browser_API" ), | |
| value: rea.downloads.supported ? ne.staticVars.CHROME : null | |
| } ].filter( e => e.value ), | |
| value: We.values.downloads_mode, | |
| desc: M.I18N.getMessage( "The_Browser_API_mode_requires_a_special_permission_" ) | |
| } ), h.items.push( { | |
| name: M.I18N.getMessage( "Whitelisted_File_Extensions" ), | |
| id: "downloads_extension_whitelist", | |
| level: 50, | |
| option: !0, | |
| input: !0, | |
| array: !0, | |
| value: We.values.downloads_extension_whitelist, | |
| desc: M.I18N.getMessage( "Only_files_with_these_extensions_can_be_saved_to_the_harddisk_Be_careful_to_not_allow_file_extensions_that_represent_executables_at_your_operating_system_" ), | |
| validation: R | |
| } ) | |
| } | |
| return p = { | |
| id: "experimental", | |
| name: M.I18N.getMessage( "Experimental" ), | |
| sub_menu_item: !0, | |
| level: 80, | |
| items: [] | |
| }, Ne.RUNTIME.FAST_EXEC_SUPPORT && p.items.push( { | |
| name: M.I18N.getMessage( "Inject_Mode" ), | |
| id: "runtime_inject_mode", | |
| level: 80, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Default" ), | |
| value: "default" | |
| }, { | |
| name: M.I18N.getMessage( "Instant" ), | |
| value: "instant" | |
| }, { | |
| name: M.I18N.getMessage( "Normal" ), | |
| value: "normal" | |
| } ], | |
| value: We.values.runtime_inject_mode | |
| } ), p.items.push( { | |
| name: M.I18N.getMessage( "strict_mode" ), | |
| id: "runtime_strict_mode", | |
| level: 80, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Default" ), | |
| value: "byscript" | |
| }, { | |
| name: M.I18N.getMessage( "Always" ), | |
| value: "on" | |
| }, { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| } ], | |
| value: We.values.runtime_strict_mode | |
| } ), p.items.push( { | |
| name: M.I18N.getMessage( "top_level_await" ), | |
| id: "runtime_top_level_await", | |
| level: 80, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Default" ), | |
| value: "default" | |
| }, { | |
| name: M.I18N.getMessage( "Enabled" ), | |
| value: "on" | |
| }, { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "off" | |
| } ], | |
| value: We.values.runtime_top_level_await | |
| } ), rea.webRequest.filterResponseData && Ne.OPTIONS.HAS_CSP && p.items.push( { | |
| name: M.I18N.getMessage( "Add_Tampermonkey_to_the_site_s_content_csp" ), | |
| id: "webrequest_fixContentCSP", | |
| level: 80, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Yes" ), | |
| value: "yes" | |
| }, { | |
| name: M.I18N.getMessage( "No" ), | |
| value: "no" | |
| } ], | |
| value: We.values.webrequest_fixContentCSP, | |
| warning: "Warning: enabling this option is may break pages!" | |
| } ), g = { | |
| id: "userscripts", | |
| name: M.I18N.getMessage( "Userscripts" ), | |
| sub_menu_item: !0, | |
| need_save: !0, | |
| level: 80, | |
| items: [] | |
| }, g.items.push( { | |
| name: M.I18N.getMessage( "Script_URL_detection" ), | |
| id: "scriptUrlDetection", | |
| level: 80, | |
| option: !0, | |
| select: [ { | |
| name: M.I18N.getMessage( "Auto" ), | |
| value: "auto" | |
| }, { | |
| name: M.I18N.getMessage( "Disabled" ), | |
| value: "manual" | |
| } ], | |
| value: We.values.scriptUrlDetection | |
| } ), g.items.push( { | |
| name: M.I18N.getMessage( "New_script_template_" ), | |
| id: "script_templates", | |
| level: 80, | |
| option: !0, | |
| input: !0, | |
| array: !0, | |
| named: !0, | |
| value: We.values.script_templates | |
| } ), f = { | |
| id: "reset", | |
| name: M.I18N.getMessage( "Reset_Section" ), | |
| sub_menu_item: !0, | |
| level: 50, | |
| items: [] | |
| }, f.items.push( { | |
| name: M.I18N.getMessage( "Restart_Tampermonkey" ), | |
| id: "reset_simple", | |
| level: 50, | |
| button: !0, | |
| reload: !0, | |
| value: 0, | |
| warning: M.I18N.getMessage( "This_will_restart_Tampermonkey_Ok_" ) | |
| } ), f.items.push( { | |
| name: M.I18N.getMessage( "Factory_Reset" ), | |
| id: "reset_factory", | |
| level: 80, | |
| button: !0, | |
| reload: !0, | |
| value: 0, | |
| warning: M.I18N.getMessage( "This_will_remove_all_scripts_and_reset_all_settings_Ok_" ) | |
| } ), Ue && f.items.push( { | |
| name: "Install Tests", | |
| id: "install_tests", | |
| level: 80, | |
| button: !0, | |
| reload: !1, | |
| ignore: !0, | |
| value: 0, | |
| warning: "This will install a lot of test scripts!" | |
| } ), [ e, a, i, A, n, o, s, u, m, t, d, r, l, c, h, g, p, f ].filter( e => !!e ) | |
| }; | |
| var mt = { | |
| create: ( e, t ) => { | |
| e = e || "", t = t || {}; | |
| const r = e => o.Deferred.onebyone( e ).fail( () => { | |
| G.logger.warn( "tree: wait failed!" ) | |
| } ).then( e => e.reduce( ( e, t ) => e.concat( t ), [] ).filter( e => e ) ), | |
| n = ( e, r ) => { | |
| const n = e.replace( /\.$/, "" ).split( "." ); | |
| let a = s; | |
| for ( ; n.length; ) { | |
| const s = n.shift(); | |
| if ( !a[ s ] ) return G.logger.warn( "tree: unable to find", e, t ), () => o.Deferred.Pledge( [] ); | |
| if ( "function" == typeof a[ s ] ) return () => a[ s ]( t, !r ); | |
| a = a[ s ], n.length || n.unshift( "root" ) | |
| } | |
| return G.logger.warn( "tree: unable to find", e, t ), () => o.Deferred.Pledge( [] ) | |
| }; | |
| var s = { | |
| actions: { | |
| root: function ( e ) { | |
| const s = Object( o.Deferred )(); | |
| return rea.tabs.getSelected( null, o => { | |
| o && o.id >= 0 ? t.tab = o : e.tabId && ( t.tab = { | |
| id: e.tabId, | |
| url: null | |
| } ); | |
| const a = r( [ n( "actions.general" ), n( "actions.scripts" ), n( "actions.commands" ) ] ); | |
| s.consume( a ) | |
| } ), s.promise() | |
| }, | |
| general: function () { | |
| const e = t.tab, | |
| r = e ? e.url : null, | |
| n = r && r.length > 4 && "" == r.substr( 0, 4 ).replace( /file|http/, "" ) ? r : "", | |
| s = [], | |
| a = { | |
| name: "enabled", | |
| id: "enabled", | |
| sub_menu_item: !0, | |
| pos: "top", | |
| items: [], | |
| tabId: e ? e.id : null | |
| }; | |
| let i; | |
| a.items.push( { | |
| name: M.I18N.getMessage( "Enabled" ), | |
| display: We.values.enabled ? null : "greyed", | |
| id: "enabled", | |
| button: !0, | |
| reload: !0, | |
| enabler: !0 | |
| } ), a.items = a.items.concat( rt.actionStatus().map( e => ( { | |
| options: e, | |
| globalhint: !0 | |
| } ) ) ), s.push( a ), !Xe( r, !0 ) || ( i = Xe( r ) ) && "manual" != We.values.scriptUrlDetection || a.items.push( { | |
| name: i ? M.I18N.getMessage( "Install_this_script" ) : M.I18N.getMessage( "Try_to_install_as_script" ), | |
| image: "script_download", | |
| id: "installFromUrl", | |
| data: r, | |
| button: !0, | |
| reload: !0 | |
| } ); | |
| const A = { | |
| name: "about", | |
| id: "about", | |
| sub_menu_item: !0, | |
| pos: "bottom", | |
| items: [] | |
| }; | |
| A.items.push( { | |
| name: M.I18N.getMessage( "Dashboard" ), | |
| image: "utilities", | |
| url: rea.extension.getURL( "options.html" ) + "#" + [ "url=" + Z.a.Base64.encode( n ), "nav=dashboard" ].join( "&" ), | |
| url_alt: rea.extension.getURL( "options.html" ) + "#" + [ "filter=" + encodeURIComponent( e.url ), "url=" + Z.a.Base64.encode( n ), "nav=dashboard" ].join( "&" ), | |
| newtab: !0 | |
| } ); | |
| const l = "version=" + rea.extension.manifest.version + "&ext=" + rea.runtime.short_id; | |
| return A.items.push( { | |
| image: "about", | |
| id: "about", | |
| urls: [ { | |
| name: " " + M.I18N.getMessage( "Help" ), | |
| url: "https://www.tampermonkey.net/faq.php?" + l, | |
| newtab: !0 | |
| }, { | |
| name: " " + M.I18N.getMessage( "Changelog" ), | |
| url: "https://www.tampermonkey.net/changelog.php?" + l, | |
| newtab: !0 | |
| }, { | |
| social: !0, | |
| newtab: !0 | |
| } ] | |
| } ), s.push( A ), o.Deferred.Pledge( s ) | |
| }, | |
| scripts: { | |
| root: function ( e ) { | |
| const r = t.tab, | |
| n = r ? r.url : null, | |
| s = [], | |
| a = n ? T.default.parse( n ) : null, | |
| i = a && [ "http:", "https:", "file:" ].includes( a.protocol ) ? T.default.woHash( a ) : ""; | |
| let A; | |
| const l = { | |
| name: "scripts", | |
| id: "scripts", | |
| sub_menu_item: !0, | |
| pos: "center", | |
| items: [] | |
| }, | |
| c = {}, | |
| u = {}, | |
| d = {}; | |
| let g = {}; | |
| const p = {}, | |
| m = a ? Ne.REQUESTS.INTERNAL_PAGE_PROTOCOLS.includes( a.protocol ) : null; | |
| let f; | |
| r && [ ot.getUniqueScriptsForTab( r ), ot.getScriptHistoryForTab( r ) ].forEach( ( e, t ) => { | |
| let r; | |
| Object.keys( e ).forEach( n => { | |
| const s = e[ n ]; | |
| if ( t ) { | |
| if ( c[ n ] = s.urls, u[ n ] = s.count, d[ n ] = s.all_time, !( r = g[ n ] ) ) { | |
| const e = at.getByUid( n ); | |
| e.script && e.cond && !e.script.deleted ? g[ n ] = r = e.script : g[ n ] = r = { | |
| uuid: n, | |
| name: M.I18N.getMessage( "This_script_was_deleted" ), | |
| enabled: !0, | |
| deleted: !0 | |
| } | |
| } | |
| p[ n ] = "a" + r.name.toLowerCase() + r.position | |
| } else g[ n ] = r = s.script, p[ n ] = "z" + r.name.toLowerCase() + r.position | |
| } ) | |
| } ), f = "position" == We.values.action_menu_scripts_sort ? ( e, t ) => e.position - t.position : "name" == We.values.action_menu_scripts_sort ? ( e, t ) => e.name.toLowerCase() < t.name.toLowerCase() ? -1 : e.name.toLowerCase() > t.name.toLowerCase() ? 1 : 0 : "enabled" == We.values.action_menu_scripts_sort ? ( e, t ) => 1e4 * ( e.enabled ? 0 : 1 ) + e.position - ( 1e4 * ( t.enabled ? 0 : 1 ) + t.position ) : ( e, t ) => p[ e.uuid ].localeCompare( p[ t.uuid ] ), g = Object.values( g ).sort( f ); | |
| let h = ht( [].concat( g ), { | |
| active_urls: c, | |
| active_counts: u, | |
| all_time_active_counts: d | |
| } ); | |
| const R = r ? ft( r.id ) : {}; | |
| We.values.action_menu_scripts_hide_disabled && ( h = h.filter( e => e.enabled || u[ e.uuid ] ) ), h.forEach( e => { | |
| let t; | |
| ( t = R[ e.uuid ] ) && ( e.menu_cmds = t ) | |
| } ), !We.values.action_menu_scripts_hide_disabled && Math.min( We.values.action_menu_columns, ( e ? e.available_columns : null ) || 99 ) > 2 ? ( A = { | |
| name: "scripts_right", | |
| id: "scripts_right", | |
| sub_menu_item: !0, | |
| pos: "right", | |
| items: [] | |
| }, h.forEach( e => { | |
| ( e.enabled || u[ e.uuid ] ? l : A ).items.push( e ) | |
| } ), s.push( l ), | |
| A.items.length && s.push( A ) ) : ( A = l, l.items = l.items.concat( h ), s.push( l ) ), We.values.enabled && !h.length && n && ( m ? l.items.push( { | |
| name: M.I18N.getMessage( "Tampermonkey_has_no_access_to_this_page" ), | |
| image: "no_script", | |
| class: "disabled" | |
| } ) : qe.isAllowed( n ) ? l.items.push( { | |
| name: M.I18N.getMessage( "No_script_is_running" ), | |
| image: "no_script", | |
| class: "disabled" | |
| } ) : l.items.push( { | |
| name: M.I18N.getMessage( "This_page_is_blacklisted_at_the_security_settings" ), | |
| image: "critical", | |
| class: "disabled" | |
| } ) ); | |
| const v = M.I18N.getLocale(); | |
| if ( We.values.enabled ) { | |
| let e; | |
| h.length ? ( e = { | |
| name: "scripts_new", | |
| id: "scripts_new", | |
| sub_menu_item: !0, | |
| pos: "center", | |
| items: [] | |
| }, s.push( e ) ) : e = l; | |
| const t = !!We.values.userscript_search_url, | |
| r = We.values.userscript_search_mode; | |
| t && i && "click" == r ? e.items.push( { | |
| name: M.I18N.getMessage( "Search_for_userscripts_for_this_tab" ), | |
| image: "script_search", | |
| data: { | |
| url: i | |
| }, | |
| id: "script_search", | |
| button: !0 | |
| } ) : t && i && [ "action_menu", "badge" ].includes( r ) ? e.items.push( { | |
| name: M.I18N.getMessage( "Searching_for_userscripts_for_this_tab" ), | |
| image: "script_search", | |
| data: { | |
| url: i | |
| }, | |
| id: "script_search", | |
| class: "disabled", | |
| partial: !0, | |
| referrer: "actions.script_search" | |
| } ) : e.items.push( { | |
| name: M.I18N.getMessage( "Get_new_scripts___" ), | |
| image: "script_search", | |
| url: "https://www.tampermonkey.net/scripts.php" + ( v ? "?locale=" + v : "" ), | |
| newtab: !0 | |
| } ), e.items.push( { | |
| name: M.I18N.getMessage( "Add_new_script___" ), | |
| image: "script_add", | |
| url: rea.extension.getURL( "options.html" ) + "#nav=new-user-script" + ( m ? "" : "&url=" + Z.a.Base64.encode( i ) ), | |
| newtab: !0 | |
| } ) | |
| } | |
| return o.Deferred.Pledge( s ) | |
| } | |
| }, | |
| script_search: { | |
| root: async e => { | |
| let t, r, n; | |
| return t = e.url ? await Me( e.url ) : { | |
| count: 0 | |
| }, t.error || !t.url ? ( r = M.I18N.getMessage( "Search_for_userscripts_for_this_tab" ), n = { | |
| url: e.url | |
| } ) : ( r = t.count ? M.I18N.getMessage( "Found_0count0_available_scripts", t.count ) : M.I18N.getMessage( "No_available_scripts" ), n = { | |
| result_url: t.url | |
| } ), [ { | |
| name: r, | |
| data: n, | |
| button: !0, | |
| image: "script_search", | |
| id: "script_search" | |
| } ] | |
| } | |
| }, | |
| commands: function () { | |
| const e = [], | |
| r = M.I18N.getLocale(), | |
| n = { | |
| name: "commands", | |
| id: "commands", | |
| sub_menu_item: !0, | |
| pos: "left", | |
| items: [] | |
| }, | |
| s = { | |
| name: M.I18N.getMessage( "Utilities" ), | |
| id: "commands", | |
| sub_menu_item: !0, | |
| more_menu: !0, | |
| pos: "left", | |
| items: [] | |
| }; | |
| if ( s.items.push( { | |
| name: M.I18N.getMessage( "Check_for_userscripts_updates" ), | |
| id: "run_script_updates", | |
| button: !0, | |
| image: "update" | |
| } ), We.values.configMode >= 80 && s.items.push( { | |
| name: M.I18N.getMessage( "Report_a_bug" ), | |
| image: "bug", | |
| url: "https://www.tampermonkey.net/bug", | |
| newtab: !0 | |
| } ), We.values.configMode >= 50 ) { | |
| let e, r, n, o; | |
| [ "black", "black+white" ].includes( We.values.page_filter_mode ) && ( e = t.tab ) && ( r = e.url ) && ( n = T.default.parse( r ) ) && !Ne.REQUESTS.INTERNAL_PAGE_PROTOCOLS.includes( n.protocol ) && ( o = n.hostname ) && qe.isAllowed( r ) && s.items.push( { | |
| name: M.I18N.getMessage( "Blacklist_0domain0", o ), | |
| image: "no", | |
| button: !0, | |
| id: "blacklist_page", | |
| data: { | |
| domain: o | |
| } | |
| } ) | |
| } | |
| return Ne.RUNTIME.SAFARI || n.items.push( { | |
| name: M.I18N.getMessage( "Please_consider_a_contribution" ), | |
| image: "contrib", | |
| url: "https://www.tampermonkey.net/contrib.php?src=a" + rea.runtime.short_id + ( r ? "&locale=" + r : "" ), | |
| newtab: !0 | |
| } ), n.items.push( s ), e.push( n ), o.Deferred.Pledge( e ) | |
| } | |
| }, | |
| options: { | |
| root: function () { | |
| return r( [ n( "options.general" ), n( "options.verification" ), n( "options.scripts" ), n( "options.settings" ), n( "options.trash" ) ] ) | |
| }, | |
| general: function () { | |
| let e, t = []; | |
| return rea.extension.inIncognitoContext && "temporary" == We.values.incognito_mode ? t.push( { | |
| globalhint: !0, | |
| options: { | |
| id: "incognito", | |
| image: "critical", | |
| text: M.I18N.getMessage( "All_modifications_are_only_kept_until_this_incognito_session_is_closed_" ) | |
| } | |
| } ) : ( e = rt.optionsStatus().map( e => ( { | |
| options: e, | |
| globalhint: !0 | |
| } ) ) ) && e.length ? t = t.concat( e ) : ( e = yt.updateAvailable() ) && t.push( { | |
| globalhint: !0, | |
| options: { | |
| id: "extensionupdate", | |
| image: "info", | |
| class: "information", | |
| text: M.I18N.getMessage( "0name0_0version0_is_available__Please_re_start_your_browser_to_update_", rea.extension.manifest.name, e ) | |
| } | |
| } ), o.Deferred.Pledge( t ) | |
| }, | |
| verification: function () { | |
| const e = []; | |
| return Ce.getWarnings().forEach( t => { | |
| e.push( { | |
| globalhint: !0, | |
| options: { | |
| key: t.key, | |
| id: t.id, | |
| image: "critical", | |
| class: "warning", | |
| text: t.text, | |
| title: t.description, | |
| info_url: t.url | |
| } | |
| } ) | |
| } ), o.Deferred.Pledge( e ) | |
| }, | |
| scripts: { | |
| root: function ( e, t ) { | |
| const s = Object( o.Deferred )(), | |
| a = { | |
| name: M.I18N.getMessage( "Installed_userscripts" ), | |
| main_menu_item: !0, | |
| id: "dashboard" | |
| }; | |
| return ( e.complete || !t ? r( [ "options.scripts.userscripts", "options.scripts.new" ].map( e => n( e ) ) ) : ( a.referrer = "options.scripts", a.partial = !0, | |
| r( [ n( "options.scripts.new" ) ] ) ) ).done( e => { | |
| a.items = e, s.resolve( [ a ] ) | |
| } ).fail( s.reject ), s.promise() | |
| }, | |
| new: function () { | |
| const e = []; | |
| return e.push( { | |
| name: M.I18N.getMessage( "New_userscript" ), | |
| id: null, | |
| image: "script_add", | |
| icon: x.a.images.origin( "unknown" ), | |
| nnew: !0, | |
| uuid: "new-user-script", | |
| position: -1, | |
| positionof: Ne.RUNTIME.MAX_SCRIPTS, | |
| enabled: !0, | |
| userscript: !0 | |
| } ), o.Deferred.Pledge( e ) | |
| }, | |
| userscripts: { | |
| root: function ( e, t ) { | |
| const r = e.complete || !t ? null : "options.scripts.userscripts", | |
| n = ot.determineScriptsToRun( null ).filter( e => !e.deleted ), | |
| s = ht( n, { | |
| options_page: !0, | |
| referrer: r | |
| } ), | |
| a = s.length, | |
| i = M.I18N.getLocale(); | |
| return s.push( { | |
| name: M.I18N.getMessage( "No_script_is_installed" ), | |
| image: "info", | |
| class: "disabled", | |
| visible: !a | |
| } ), s.push( { | |
| name: M.I18N.getMessage( "Get_some_scripts___" ), | |
| image: "edit_add", | |
| url: "https://www.tampermonkey.net/scripts.php" + ( i ? "?locale=" + i : "" ), | |
| newtab: !0, | |
| visible: !a | |
| } ), o.Deferred.Pledge( s ) | |
| }, | |
| matches: function ( e ) { | |
| let t, r = e.filter; | |
| if ( !r ) return o.Deferred.Pledge( [] ); | |
| const n = /\/(.*)\/(.*)/.exec( r.code ), | |
| s = new RegExp( n[ 1 ], n[ 2 ] ); | |
| if ( e.uuid ) { | |
| const r = at.getByUid( e.uuid ); | |
| r.script && r.cond && ( t = [ r.script ] ) | |
| } else t = ot.determineScriptsToRun( null ).filter( e => !e.deleted ); | |
| if ( t ) { | |
| const e = t.map( e => -1 != e.textContent.search( s ) ? e.uuid : null ).filter( e => e ); | |
| return o.Deferred.Pledge( e ) | |
| } | |
| return o.Deferred.Pledge( [] ) | |
| }, | |
| source: function ( e ) { | |
| if ( !e.uuid ) return o.Deferred.Pledge( [] ); | |
| const t = at.getByUid( e.uuid ); | |
| if ( t.script && t.cond ) { | |
| let e; | |
| return e = We.values.showFixedSrc ? ae.mkCompat( t.script.textContent, t.script, "off" != We.values.runtime_strict_mode ) : t.script.textContent, o.Deferred.Pledge( [ e ] ) | |
| } | |
| return G.logger.warn( "tree: unable to process ", t ), o.Deferred.Breach() | |
| }, | |
| storage: function ( e ) { | |
| return e.uuid ? o.Deferred.Pledge( [ at.getStorageByUid( e.uuid ).data ] ) : o.Deferred.Pledge( [] ) | |
| }, | |
| external: function ( e ) { | |
| if ( !e.uuid ) return o.Deferred.Pledge( [] ); | |
| const t = at.getByUid( e.uuid ); | |
| if ( t.script && t.cond ) { | |
| let r; | |
| return [].concat( t.script.requires ).concat( t.script.resources ).some( t => { | |
| const n = t.url || T.default.sanitize( t.unsafe_url, t.abs_url ); | |
| if ( n != e.url ) return; | |
| const s = et.getElement( e.uuid, n ); | |
| return s && s.data && s.data.content ? ( r = s.data.content, !0 ) : void 0 | |
| } ), o.Deferred.Pledge( [ r ] ) | |
| } | |
| return G.logger.warn( "tree: unable to process ", t ), o.Deferred.Breach() | |
| } | |
| } | |
| }, | |
| trash: ( () => { | |
| const e = ot.determineScriptsToRun( null ).filter( e => e.deleted ); | |
| return { | |
| root: function ( t, s ) { | |
| const a = Object( o.Deferred )(), | |
| i = { | |
| name: M.I18N.getMessage( "Trash" ), | |
| main_menu_item: !0, | |
| hidden: !e.length, | |
| id: "trash" | |
| }; | |
| return ( t.complete || !s ? r( [ "options.trash.userscripts" ].map( e => n( e ) ) ) : ( i.referrer = "options.trash", i.partial = !0, o.Deferred.Pledge( [] ) ) ).done( e => { | |
| i.items = e, a.resolve( [ i ] ) | |
| } ).fail( a.reject ), a.promise() | |
| }, | |
| userscripts: { | |
| root: function ( t, r ) { | |
| const n = t.complete || !r ? null : "options.trash.userscripts", | |
| s = ht( e, { | |
| options_page: !0, | |
| referrer: n | |
| } ); | |
| return o.Deferred.Pledge( s ) | |
| } | |
| } | |
| } | |
| } )(), | |
| settings: function ( e, t ) { | |
| const r = Object( o.Deferred )(), | |
| n = { | |
| name: M.I18N.getMessage( "Settings" ), | |
| main_menu_item: !0, | |
| id: "settings", | |
| selected_default: !0 | |
| }; | |
| return ( e.complete || !t ? o.Deferred.Pledge( pt() ) : ( n.referrer = "options.settings", o.Deferred.Pledge() ) ).done( e => { | |
| n.items = e, r.resolve( [ n ] ) | |
| } ).fail( r.reject ), r.promise() | |
| } | |
| } | |
| }; | |
| return G.logger.debug( "tree: loading", e, t ), n( e, !0 )() | |
| }, | |
| level: e => e.replace( /\.$/, "" ).split( "." ).length | |
| }, | |
| ft = e => { | |
| const t = {}, | |
| r = null == e || null == e ? gt.list() : gt.listByTabId( e ); | |
| for ( const e in r ) { | |
| if ( !r.hasOwnProperty( e ) ) continue; | |
| const n = r[ e ]; | |
| ( t[ n.uuid ] = t[ n.uuid ] || [] ).push( { | |
| name: n.name, | |
| uuid: n.uuid, | |
| id: n.menuId, | |
| accessKey: n.accessKey, | |
| image: "menu_cmd", | |
| menucmd: !0 | |
| } ) | |
| } | |
| return t | |
| }, | |
| ht = ( e, t ) => { | |
| const r = []; | |
| t = t || {}; | |
| const n = Object( ie.createScript )(); | |
| return [ "author", "copyright" ].forEach( e => { | |
| n[ e ] = !1 | |
| } ), Object.keys( e ).forEach( s => { | |
| const o = e[ s ]; | |
| let a; | |
| if ( t.options_page ) { | |
| a = {}; | |
| const e = [ "textContent", "requires", "resources" ]; | |
| Object.keys( n ).forEach( t => { | |
| e.includes( t ) || ( Object( A.toType )( n[ t ] ), a[ t ] = o[ t ] ) | |
| } ), t.referrer ? ( a.referrer = t.referrer, | |
| a.length = o.textContent.length ) : a.code = o.textContent, [ "requires", "resources" ].forEach( e => { | |
| a[ e ] = o[ e ].map( r => { | |
| const n = r.url || T.default.sanitize( r.unsafe_url, r.abs_url ), | |
| s = et.getElement( o.uuid, n ); | |
| let a, i, A, l, c = 0, | |
| u = null, | |
| d = null; | |
| return s && s.data && ( s.data.content && ( l = s.data.content, c = l.length ), d = s.data.sri, u = s.ts, a = s.modified, A = s.data.meta || "text/plain", i = "requires" == e || /text\/.*|application\/(?:x-)?(?:java|ecma)script/.test( A ) ), { | |
| display_url: r.url || r.unsafe_url, | |
| abs_url: r.abs_url, | |
| unsafe_url: r.unsafe_url, | |
| url: n, | |
| data: { | |
| length: c, | |
| content: t.externals ? l : void 0 | |
| }, | |
| sri: d, | |
| ts: u, | |
| mimetype: A, | |
| editable: i, | |
| modified: a | |
| } | |
| } ) | |
| } ), a.origin = ot.determineOrigin( o ), a.contexter = ot.isContexter( o ), a.temp_connects = $e.getSessionConnects( o.uuid ); | |
| const r = at.getStorageByUid( o.uuid ); | |
| a.storage_key_count = Object.keys( r.data ).length, a.remote_url = Ye.getSyncRemoteUrl( o ), a.deleted = o.deleted, a.lastUpdated = o.lastUpdated | |
| } else { | |
| const e = ot.determineOrigin( o ), | |
| r = t.active_urls || {}, | |
| n = t.active_counts || {}, | |
| s = t.all_time_active_counts || {}; | |
| a = { | |
| name: o.name, | |
| name_i18n: o.name_i18n, | |
| uuid: o.uuid, | |
| system: o.system, | |
| support: !!o.supportURL || e && !!e.issue_url, | |
| abuse: e && !!e.abuse_url, | |
| active_urls: r[ o.uuid ], | |
| active_count: n[ o.uuid ], | |
| all_time_active_count: s[ o.uuid ], | |
| referrer: t.referrer, | |
| contexter: ot.isContexter( o ), | |
| enabled: o.enabled, | |
| position: o.position, | |
| deleted: o.deleted | |
| } | |
| } | |
| o.evilness && ( o.evilness == ze.SEVERITY_FOISTED_SCRIPT ? a.foisted = M.I18N.getMessage( "The_origin_of_this_script_cant_be_determined_" ) : o.evilness >= Math.min( ze.SEVERITY_MAX, We.values.script_blacklist_severity ) && ( a.blacklisted = M.I18N.getMessage( "This_script_is_blacklisted_" ) ) ), o.evilness && ( a.warnings = ze.getWarningsFor( ot.determineSourceURL( o ) ) ), a.file_url = o.downloadURL || o.fileURL, a.positionof = e.length, a.userscript = !0, o.icon64 || o.icon || ( a.icon64 = x.a.images.origin( "unknown" ) ), | |
| o.options && Object.keys( n.options ).forEach( e => { | |
| a[ e ] = o.options[ e ] | |
| } ), r.push( a ) | |
| } ), r | |
| }, | |
| Rt = { | |
| run: function ( e, t ) { | |
| let r = 1; | |
| const n = () => { | |
| 0 == --r && ( t && t(), rea.page.reload() ) | |
| }; | |
| if ( "config" == e ) { | |
| const e = c.a.listValues(); | |
| Object.keys( e ).forEach( t => { | |
| const s = e[ t ]; - 1 == s.indexOf( Ne.CONSTANTS.PREFIX.SCRIPT ) && -1 == s.indexOf( Ne.CONSTANTS.PREFIX.COND ) && -1 == s.indexOf( Ne.CONSTANTS.PREFIX.STORE ) && -1 == s.indexOf( Ne.CONSTANTS.PREFIX.META ) && ( r++, c.a.deleteValue( s ).always( n ) ) | |
| } ) | |
| } else "factory" == e && ( r++, ne.remove_permission().done( n ), | |
| r++, c.a.factoryReset().always( n ) ); | |
| n() | |
| }, | |
| reset: function ( e ) { | |
| Rt.run( null, e ) | |
| }, | |
| factoryReset: function ( e ) { | |
| Rt.run( "factory", e ) | |
| }, | |
| configReset: function ( e ) { | |
| Rt.run( "config", e ) | |
| } | |
| }, | |
| vt = ( () => { | |
| const e = () => { | |
| rea.runtime.lastError && rea.runtime.lastError | |
| }, | |
| t = { | |
| init: function () { | |
| t.setIcon(); | |
| let e = We.values.appearance_badge_color || "#ee3131"; | |
| "#" !== e[ 0 ] && ( e = "#" + e ), rea.browserAction.setBadgeBackgroundColor( { | |
| color: e | |
| } ), e = We.values.appearance_badge_text_color || "#ffffff", "#" !== e[ 0 ] && ( e = "#" + e ), rea.browserAction.setBadgeTextColor( { | |
| color: e | |
| } ) | |
| }, | |
| setIcon: t => { | |
| let r, n, s, o = null, | |
| a = !1, | |
| i = !1; | |
| void 0 === t || Qe.get.empty( t ) || ( a = Qe.get.blocker( t ), i = Qe.get.forbidden( t ) ), i ? ( s = "_forbidden", o = M.I18N.getMessage( "At_least_one_part_of_this_page_is_listed_at_the_forbidden_pages_setting_" ) ) : a ? ( s = "_blocker", o = M.I18N.getMessage( "Some_scripts_might_be_blocked_by_the_javascript_settings_for_this_page_or_a_script_blocker_" ) ) : s = We.values.enabled && void 0 !== t ? "" : "_grey", G.logger.debug( "badge: set icon " + s ), r = { | |
| path: rea.extension.getURL( "images/icon" + s + ".png" ) | |
| }, n = { | |
| title: o || rea.extension.manifest.name | |
| }, null != t && ( r.tabId = t, n.tabId = t ); | |
| try { | |
| rea.browserAction.setIcon( r, e ), rea.browserAction.setTitle( n ) | |
| } catch ( e ) { | |
| G.logger.warn( "bg: ERROR while setIcon! " + e.message ) | |
| } | |
| }, | |
| setBadge: e => { | |
| let t = ""; | |
| if ( "off" == We.values.appearance_badges ? t = "" : "running" == We.values.appearance_badges ? e && !Qe.get.empty( e ) && ( t = Qe.get.stats( e ).running || "" ) : "running_unique" == We.values.appearance_badges && e && !Qe.get.empty( e ) && ( t = Qe.get.stats( e, !0 ).unique || "" ), We.values.userscript_search_url && "badge" == We.values.userscript_search_mode ) { | |
| let r = Qe.get.stats( e ).searched; | |
| r > 0 && ( t > 999 ? r = "" : ( t > 99 || `${t}+${r}`.length > 4 ) && ( r = "+" ), t = `${t}+${r}` ) | |
| } | |
| G.logger.debug( "badge: set " + t ), rea.browserAction.setBadgeText( { | |
| text: t.toString(), | |
| tabId: e | |
| } ) | |
| } | |
| }; | |
| return t | |
| } )(), | |
| bt = ( () => { | |
| const e = 12096e5; | |
| let t = null; | |
| const r = { | |
| init: function () { | |
| let n; | |
| t = c.a.getValue( Ne.CONSTANTS.STORAGE.BEGGING, null ); | |
| const s = Date.now(); | |
| t ? ( n = c.a.getValue( Ne.CONSTANTS.STORAGE.LAST_START, 0 ) ) && s - n > e && ( t.later = { | |
| type: "after_pause", | |
| ts: s | |
| }, r.save() ) : ( t = { | |
| first_run: { | |
| type: "from_init", | |
| ts: s | |
| } | |
| }, r.save() ) | |
| }, | |
| save: function () { | |
| c.a.setValue( Ne.CONSTANTS.STORAGE.BEGGING, t ) | |
| }, | |
| needed: function () { | |
| const r = Date.now(), | |
| n = !t.first_run || t.first_run.ts + e < r, | |
| s = !t.hide, | |
| o = !t.contributed, | |
| a = !t.later || t.later.ts + e < r; | |
| if ( !Ne.RUNTIME.SAFARI && !Ne.RUNTIME.DOLPHIN && n && s && o && a ) return t.later ? "l" : "i" | |
| }, | |
| clicked: function ( e, t, r ) { | |
| i.a.tG( "clicked", e, t + r ) | |
| }, | |
| dialog: { | |
| shown: function ( e ) { | |
| const n = Date.now(); | |
| t.dialog = { | |
| ts: n, | |
| extra: e | |
| }, r.save(), i.a.tG( "dialog" ) | |
| } | |
| }, | |
| button: ( () => { | |
| const e = {}; | |
| return [ "contributed", "later", "hide" ].forEach( n => { | |
| e[ n ] = ( e, s ) => { | |
| const o = Date.now(); | |
| t[ n ] = { | |
| ts: o, | |
| type: e, | |
| extra: s | |
| }, r.save(), i.a.tG( "button", n ) | |
| } | |
| } ), e | |
| } )() | |
| }; | |
| return r | |
| } )(), | |
| wt = ( () => { | |
| const e = {}, | |
| t = {}, | |
| r = ( "TM_" + Object( A.createUUID )().substr( 0, 5 ) ).toLowerCase(), | |
| n = [ "content-security-policy", "x-content-security-policy", "x-webkit-csp" ], | |
| s = "feature-policy", | |
| o = rea.webRequest.extraHeaderNeeded, | |
| a = [], | |
| i = e => { | |
| const t = e.split( "," ).map( e => { | |
| let t, r, n, s, o; | |
| const a = e.split( ";" ); | |
| let i, A; | |
| return a.forEach( ( e, t ) => { | |
| 0 === e.search( /^\s*script-src / ) ? r = t : 0 === e.search( /^\s*default-src / ) ? n = t : 0 === e.search( /^\s*img-src / ) && ( s = t ) | |
| } ), void 0 !== n && void 0 === r && ( t = !0, | |
| a.push( a[ n ].replace( /default-src /, "script-src " ) ), r = a.length - 1 ), void 0 !== n && void 0 === s && ( t = !0, a.push( a[ n ].replace( /default-src /, "img-src " ) ), s = a.length - 1 ), void 0 !== s && ( A = !1, i = a[ s ], -1 == i.search( /'data:'/ ) && ( A = !0, i = i.replace( /img-src /, "img-src data: " ) ), -1 != i.search( /'none'/ ) && ( A = !0, i = i.replace( / 'none'/, "" ) ), A && ( a[ s ] = i, t = !0 ) ), void 0 !== r && ( A = !1, i = a[ r ], -1 == i.search( /'unsafe-eval'/ ) && ( A = !0, i = i.replace( /script-src /, "script-src 'unsafe-eval' " ) ), -1 != i.search( /'none'/ ) && ( A = !0, | |
| i = i.replace( / 'none'/, "" ) ), Ne.RUNTIME.FIREFOX && ( -1 == i.search( /'unsafe-inline'/ ) && ( A = o = !0, i = i.replace( /script-src /, "script-src 'unsafe-inline' " ) ), -1 == i.search( /'strict-dynamic'/ ) && -1 != i.search( / '(nonce|sha[0-9]+)-[^\']+'/ ) && ( A = !0, i = i.replace( / '(nonce|sha[0-9]+)-[^\']+'/g, " *" ) ) ), A && ( a[ r ] = i, t = !0 ) ), void 0 !== n && ( A = !1, i = a[ n ], o && -1 != i.search( / 'self'/ ) && ( A = !0, a[ n ] = i.replace( /default-src /, "default-src blob: data: " ) ), A && ( t = !0 ) ), t ? a.filter( e => e ).join( ";" ) : null | |
| } ).filter( e => e ).join( "," ); | |
| return "" === t ? null : t | |
| }, | |
| l = e => { | |
| if ( ( e => { | |
| let t; | |
| return Ne.RUNTIME.CHROME && Ne.RUNTIME.BROWSER_VERSION >= 63 ? t = e.initiator : Ne.RUNTIME.FIREFOX && ( t = e.originUrl ), t && 0 !== ( t + "/" ).indexOf( rea.extension.getURL( "/" ) ) ? t : null | |
| } )( e ) ) return; | |
| const n = []; | |
| let s, o, a = e.requestHeaders || []; | |
| const i = {}, | |
| A = new RegExp( "^" + r ); | |
| return a = a.filter( r => !r.name || 0 != r.name.search( A ) || ( o = r.name.replace( A, "" ), i[ o.toLowerCase() ] = !0, "internal" == o ? t[ e.requestId ] = r.value : r.value && n.push( { | |
| name: o, | |
| value: Z.a.decodeS( r.value ) | |
| } ), void( s = !0 ) ) ), s ? { | |
| requestHeaders: a.filter( e => !e.name || !i[ e.name.toLowerCase() ] ).concat( n ) | |
| } : void 0 | |
| }, | |
| c = e => { | |
| if ( kt.late ) | |
| if ( "main_frame" == e.type ) { | |
| if ( Qe.events.reset( e.tabId, !0 ), e.tabId > 0 && "POST" != e.method && "auto" == We.values.scriptUrlDetection && Xe( e.url ) ) return ot.installFromUrl( e.url, {}, { | |
| silent_fail: !0 | |
| } ).fail( t => { | |
| G.logger.info( "webRequest: user script detected @ " + e.url + " was invalid", t ? t.messages : "" ), rea.tabs.update( e.tabId, { | |
| url: e.url + "#bypass=true" | |
| }, () => {} ) | |
| } ).done( () => { | |
| Ne.RUNTIME.EDGE && rea.tabs.query( { | |
| windowType: "normal" | |
| }, t => { | |
| t.forEach( t => { | |
| t.id === e.tabId && rea.tabs.update( t.id, { | |
| url: t.url | |
| }, () => {} ) | |
| } ) | |
| } ) | |
| } ), Ne.RUNTIME.EDGE ? { | |
| cancel: !0 | |
| } : { | |
| redirectUrl: "javascript:history.back()" | |
| } | |
| } else { | |
| let t, r; | |
| if ( ( t = Qe.get.requests( e.tabId, e.frameId ) ) && ( r = ( ( e, t ) => { | |
| let r = {}; | |
| const n = e.url; | |
| return Object.keys( t ).forEach( e => { | |
| const s = t[ e ]; | |
| Object( A.each )( s.rules, ( e, t ) => { | |
| let o, a, i; | |
| if ( !( o = e.selector ) || !( a = e.action ) ) return; | |
| const A = s.id + "/" + t; | |
| if ( ( i = Be.get( A ) ) || ( i = ot.regexify( { | |
| inc: o.include, | |
| match: o.match, | |
| exc: o.exclude | |
| } ), | |
| Be.set( A, i ) ), ot.validUrl( n, i ) ) { | |
| if ( a.cancel ) return G.logger.log( "webRequest: request was canceled by script " + s.uuid, n, e, s ), s.callback && s.callback( { | |
| type: "cancel", | |
| details: { | |
| rule: e, | |
| url: n | |
| } | |
| } ), r = { | |
| cancel: !0 | |
| }, !1; | |
| if ( a.redirect ) { | |
| let t, o, i, A; | |
| a.redirect.url ? t = a.redirect.url : ( o = a.redirect.from ) && ( i = a.redirect.to ) && ( A = n.match( o, i ) ) && ( A.shift(), t = i, A.concat( [ "", "", "" ] ).forEach( ( e, r ) => { | |
| t = t.replace( "$" + ( r + 1 ), e || "" ) | |
| } ) ); | |
| const l = r => { | |
| G.logger.warn( "webRequest: error while request redirect by script " + s.uuid, n, e, s ), | |
| s.callback && s.callback( { | |
| type: "redirect", | |
| message: "error", | |
| details: { | |
| description: r, | |
| rule: e, | |
| url: n, | |
| redirect_url: t | |
| } | |
| } ) | |
| }; | |
| if ( !t ) return void l( "unable to determine the redirect URL" ); | |
| t = T.default.woHash( t ), qe.isAllowed( t ) ? ot.scriptWillRun( s.uuid, t ) ? ( G.logger.log( "webRequest: request was redirected by script " + s.uuid, n, t, e, s ), s.callback && s.callback( { | |
| type: "redirect", | |
| details: { | |
| rule: e, | |
| url: n, | |
| redirect_url: t | |
| } | |
| } ), | |
| r.redirectUrl = t ) : l( "the redirect URL needs to be included by the scripts @include or @match tag" ) : l( "the redirect URL is filtered by the security settings" ) | |
| } | |
| } | |
| } ) | |
| } ), r | |
| } )( e, t ) ) ) return r | |
| } | |
| else kt.registerLateCallback( () => { | |
| c( e ) | |
| } ) | |
| }, | |
| u = ( r, o ) => { | |
| if ( !kt.late ) return void kt.registerLateCallback( () => { | |
| u( r, !0 ) | |
| } ); | |
| let a, A, l, c, d = r.responseHeaders || []; | |
| if ( "xmlhttprequest" == r.type ) { | |
| let n, s; | |
| if ( t[ r.requestId ] ) return Ne.XMLHTTPREQUEST.COOKIE_PASSTHROUGH || d.forEach( e => { | |
| e.name && e.value && e.name.toLowerCase().includes( "set-cookie" ) && ( d.push( { | |
| name: "tm-setcookie" + rea.runtime.short_id.toLowerCase(), | |
| value: e.value | |
| } ), s = !0 ) | |
| } ), ( n = e[ r.requestId ] ) && ( d.push( { | |
| name: "tm-finalurl" + rea.runtime.short_id.toLowerCase(), | |
| value: n | |
| } ), s = !0 ), s ? { | |
| responseHeaders: d | |
| } : void 0; | |
| if ( !Ne.RUNTIME.FIREFOX || -1 !== r.parentFrameId || -1 !== r.tabId || !d.some( e => e.name && e.value && "content-type" === e.name.toLowerCase() && -1 != e.value.toLowerCase().indexOf( "text/html" ) ) ) return; | |
| G.logger.log( "webRequest: service worker cache request detected", r ) | |
| } | |
| const g = Ne.OPTIONS.HAS_CSP && "remove" == We.values.webrequest_fixCSP, | |
| p = g || Ne.OPTIONS.HAS_CSP && "yes" == We.values.webrequest_fixCSP, | |
| m = p && Ne.RUNTIME.CHROME && Ne.RUNTIME.BROWSER_VERSION >= 60; | |
| if ( d.some( e => { | |
| if ( !e.name ) return; | |
| const t = e.name.toLowerCase(); | |
| return A |= "location" == t, p && ( l |= n.includes( t ) ), m && ( c |= t == s ), A | |
| } ), A ) return; | |
| let f, h; | |
| if ( "xmlhttprequest" == r.type ) { | |
| const { | |
| runners: e, | |
| contexters: t | |
| } = Pe( r.frameId, r.url ); | |
| f = e.length + t.length | |
| } else f = Qe.events.response( r.tabId, r.frameId, r.url ); | |
| if ( f && ( l || c ) && d.forEach( ( e, t ) => { | |
| if ( !e.name || !e.value ) return; | |
| const r = e.name.toLowerCase(); | |
| if ( n.includes( r ) ) { | |
| let r; | |
| g ? ( a = !0, d[ t ] = { | |
| name: e.name, | |
| value: void 0 | |
| } ) : ( r = i( e.value ) ) && ( a = !0, Ne.RUNTIME.FIREFOX ? ( d[ t ] = { | |
| name: e.name, | |
| value: void 0 | |
| }, e.name !== n[ 1 ] && d.push( { | |
| name: n[ 1 ], | |
| value: r | |
| } ) ) : d[ t ] = { | |
| name: e.name, | |
| value: r | |
| } ) | |
| } | |
| if ( r == s ) { | |
| let r; | |
| ( r = ( e => { | |
| let t, r; | |
| const n = e.split( ";" ); | |
| let s, o; | |
| return n.forEach( ( e, t ) => { | |
| 0 === e.search( /^\s*sync-xhr / ) && ( r = t ) | |
| } ), void 0 !== r && ( o = !1, | |
| s = n[ r ], -1 != s.search( /'none'/ ) && ( o = !0, s = s.replace( / 'none'/, " *" ) ), o && ( n[ r ] = s, t = !0 ) ), t ? n.join( ";" ) : null | |
| } )( e.value ) ) && ( a = !0, d[ t ] = { | |
| name: e.name, | |
| value: r | |
| } ) | |
| } | |
| } ), Ne.RUNTIME.FAST_EXEC_SUPPORT && [ "instant" ].includes( We.values.runtime_inject_mode ) && ( !Ne.RUNTIME.FIREFOX || r.cookieStoreId === rea.cookies.DEFAULT_STORE_ID ) && ( h = Qe.events.run( r.tabId, r.frameId, null, r.url ) ) ) { | |
| const e = T.default.parse( r.url ), | |
| t = e.pathname + e.search, | |
| n = "TM_" + rea.runtime.short_id + Z.a.Base64.encode( t.length + t ).substr( 0, 255 ).replace( /[#=\/]/g, "_" ) + Date.now(), | |
| s = Ve( h, r.url ), | |
| o = JSON.stringify( s ), | |
| i = new Blob( [ o ], { | |
| type: "binary/octet-stream" | |
| } ), | |
| A = URL.createObjectURL( i ); | |
| Qe.set.objurl( r.tabId, r.frameId, A ), d.push( { | |
| name: "set-cookie", | |
| value: n + "=" + window.encodeURIComponent( A ) + "; max-age=15;" | |
| } ), a = !0 | |
| } | |
| if ( f && !o && rea.webRequest.filterResponseData && Ne.OPTIONS.HAS_CSP && [ "yes", "remove" ].includes( We.values.webrequest_fixCSP ) && "yes" == We.values.webrequest_fixContentCSP && [ "main_frame", "sub_frame" ].includes( r.type ) ) { | |
| let e; | |
| if ( d.some( t => { | |
| if ( t.name && t.value ) return "content-type" == t.name.toLowerCase() && "text/html" == t.value.split( ";" )[ 0 ].toLowerCase().trim() ? ( e = !0, !0 ) : void 0 | |
| } ), e ) { | |
| let e = rea.webRequest.filterResponseData( r.requestId ); | |
| e.ondata = t => { | |
| const r = new TextDecoder( "x-user-defined" ).decode( t.data, { | |
| stream: !0 | |
| } ), | |
| s = new RegExp( '(<head>[\\s\\S]*)(<meta[^>]+http-equiv="(?:' + n.join( "|" ) + ')"[^>]*>)([\\s\\S]*?<\\/head>)', "i" ); | |
| let o; | |
| const a = r.replace( s, ( e, t, r, n ) => { | |
| const s = new RegExp( '(content=")([^">]+)(")' ); | |
| return t + r.replace( s, ( e, t, r, n ) => { | |
| let s; | |
| return ( s = i( r || "" ) ) && ( o = !0 ), t + ( s || r ) + n | |
| } ) + n | |
| } ); | |
| o ? e.write( Z.a.str2abSync( a ) ) : e.write( t.data ), e.disconnect(), e = null | |
| }, e.onstop = () => { | |
| e && e.disconnect() | |
| } | |
| } | |
| } | |
| return a ? ( Ne.RUNTIME.FIREFOX && ( d = d.filter( e => "cache-control" != e.name.toLowerCase() ), d.push( { | |
| name: "cache-control", | |
| value: "no-cache, no-store, must-revalidate" | |
| } ) ), d = d.filter( e => void 0 !== e.value ), { | |
| responseHeaders: d | |
| } ) : void 0 | |
| }, | |
| d = r => { | |
| e[ r.requestId ] = r.redirectUrl, t[ r.requestId ] && a.forEach( e => e( { | |
| url: r.redirectUrl | |
| } ) ) | |
| }, | |
| g = r => { | |
| kt.late ? "xmlhttprequest" == r.type ? ( delete t[ r.requestId ], delete e[ r.requestId ] ) : r.fromCache && Qe.events.response( r.tabId, r.frameId, r.url ) : kt.registerLateCallback( () => { | |
| g( r ) | |
| } ) | |
| }, | |
| p = r => { | |
| "xmlhttprequest" == r.type ? ( delete t[ r.requestId ], | |
| delete e[ r.requestId ] ) : Qe.events.reset( r.tabId, !0 ) | |
| }; | |
| return { | |
| getPrefix: function () { | |
| return r | |
| }, | |
| init: function ( e ) { | |
| try { | |
| let t; | |
| t = Ne.RUNTIME.EDGE ? [ "http://*/*", "https://*/*" ] : [ "http://*/*", "https://*/*", "ftp://*/*", "file:///*" ].concat( Ne.RUNTIME.WEBREQUEST_WEBSOCKET ? [ "ws://*/*", "wss://*/*" ] : [] ), e ? ( rea.webRequest.onBeforeRequest.addListener( c, { | |
| urls: t, | |
| types: [ "main_frame", "sub_frame", "script", "xmlhttprequest" ].concat( Ne.RUNTIME.WEBREQUEST_WEBSOCKET ? [ "websocket" ] : [] ) | |
| }, [ "blocking" ] ), | |
| rea.webRequest.onHeadersReceived.addListener( u, { | |
| urls: t, | |
| types: [ "main_frame", "sub_frame", "xmlhttprequest" ] | |
| }, [ "blocking", "responseHeaders" ].concat( o ? [ "extraHeaders" ] : [] ) ), Ne.RUNTIME.WEBREQUEST_XHR_SUPPORT && rea.webRequest.onBeforeRedirect.addListener( d, { | |
| urls: t, | |
| types: [ "xmlhttprequest" ] | |
| }, [] ), rea.webRequest.onResponseStarted.addListener( g, { | |
| urls: t, | |
| types: [ "main_frame", "sub_frame", "xmlhttprequest" ] | |
| }, [] ), rea.webRequest.onErrorOccurred.addListener( p, { | |
| urls: t, | |
| types: [ "main_frame", "xmlhttprequest" ] | |
| } ) ) : Ne.RUNTIME.WEBREQUEST_XHR_SUPPORT && "no" != We.values.webrequest_modHeaders && rea.webRequest.onBeforeSendHeaders.addListener( l, { | |
| urls: t, | |
| types: [ "xmlhttprequest" ] | |
| }, [ "blocking", "requestHeaders" ].concat( o ? [ "extraHeaders" ] : [] ) ), rea.webRequest.handlerBehaviorChanged() | |
| } catch ( e ) { | |
| G.logger.warn( "webRequest: error initializings", e.message ) | |
| } | |
| }, | |
| addRedirectListener: e => a.push( e ), | |
| scripts: { | |
| set: function ( e, t, r, n, s ) { | |
| const o = []; | |
| n.forEach( e => { | |
| const t = "string" == typeof e.selector ? { | |
| include: [ e.selector ] | |
| } : e.selector; | |
| [ "include", "match", "exclude" ].forEach( t => { | |
| "string" == typeof e.selector[ t ] && ( e.selector[ t ] = [ e.selector[ t ] ] ) | |
| } ); | |
| let r = e.action; | |
| if ( "string" == typeof r ) { | |
| const e = r; | |
| r = {}, r[ e ] = !0 | |
| } | |
| "string" == typeof e.action.redirect && ( e.action.redirect = { | |
| url: e.action.redirect | |
| } ), o.push( { | |
| selector: t, | |
| action: r | |
| } ) | |
| } ), Qe.set.requests( e, t, r, { | |
| id: r + "@" + e + ":" + t + "#" + Date.now(), | |
| rules: o, | |
| uuid: r, | |
| callback: s | |
| } ) | |
| } | |
| } | |
| } | |
| } )(), | |
| kt = { | |
| late: !1, | |
| callbacks: [], | |
| init: function () {}, | |
| registerLateCallback: function ( e ) { | |
| G.logger.debug( "toea: register callback" ), | |
| kt.callbacks.push( e ) | |
| }, | |
| ensureLate: function ( e ) { | |
| kt.late ? e() : kt.registerLateCallback( e ) | |
| }, | |
| setReady: function () { | |
| G.logger.debug( "toea: run " + kt.callbacks.length + " callbacks" ), kt.late = !0; | |
| for ( let e = 0; e < kt.callbacks.length; e++ ) kt.callbacks[ e ](); | |
| kt.callbacks = [] | |
| } | |
| }; | |
| const _t = ( () => { | |
| let e = !1, | |
| t = null; | |
| const r = () => { | |
| e || ( G.logger.debug( "Unloader.onbeforeunload()" ), t && t(), e = !0 ) | |
| }; | |
| return { | |
| init: function ( e ) { | |
| t = e, window.addEventListener( "beforeunload", r, !1 ) | |
| } | |
| } | |
| } )(); | |
| var yt = ( () => { | |
| let e = null; | |
| const t = { | |
| newV: rea.extension.manifest.version, | |
| oldV: null, | |
| first_run: !1, | |
| active: !1 | |
| }, | |
| r = () => { | |
| if ( !kt.late ) return void kt.registerLateCallback( r ); | |
| let e, n = "version=" + t.newV + "&ext=" + rea.runtime.short_id + "&updated=true"; | |
| if ( t.first_run ? ( e = "https://www.tampermonkey.net/installed.php?" + n, t.active = !0 ) : ( n += "&old=" + t.oldV, e = "https://www.tampermonkey.net/changelog.php?" + n ), | |
| "off" == We.values.notification_showUpdate ); | |
| else if ( "notification" == We.values.notification_showUpdate ) u.Notify.showUpdate( M.I18N.getMessage( "Updated_to__0version0", t.newV ), M.I18N.getMessage( "Click_here_to_see_the_recent_changes" ), x.a.images.brand( "tampermonkey" ), t => { | |
| if ( t.clicked ) { | |
| const t = { | |
| url: e | |
| }; | |
| rea.tabs.create( t, () => {} ) | |
| } | |
| } ); | |
| else if ( "changelog" == We.values.notification_showUpdate ) { | |
| t.active || ( e += "&intr=true" ), t.active = !0; | |
| const r = { | |
| url: e, | |
| active: t.active | |
| }; | |
| rea.tabs.create( r, () => {} ) | |
| } | |
| }, | |
| n = ( () => { | |
| const e = Object( o.Deferred )(), | |
| t = () => { | |
| const t = Date.now(), | |
| r = c.a.getValue( Ne.CONSTANTS.STORAGE.LAST_START, 0 ), | |
| n = Math.round( ( t - r ) / 1e3 ), | |
| s = n <= Ne.MISC.DISTURBANCE_ALLOWED; | |
| G.logger.log( "upd: restart?", s, "(", n, "seconds ago)" ), e.resolve( s ) | |
| }; | |
| return kt.late ? t() : kt.registerLateCallback( t ), e.promise() | |
| } )(), | |
| s = () => { | |
| let e = !1, | |
| s = !1; | |
| ( () => { | |
| let e, t = null; | |
| const r = Object( o.Deferred )(), | |
| n = () => { | |
| e && ( e = null, r.resolve( !!t ) ) | |
| }; | |
| return e = window.setTimeout( n, 300 ), rea.idle.queryState( Ne.MISC.IDLE_TIMEOUT, e => { | |
| t = "active" == e, n() | |
| } ), | |
| r.promise() | |
| } )().then( e => ( s = e, n ) ).then( t => { | |
| e = t | |
| } ).always( () => { | |
| t.active = !s || e, r(), i = !0 | |
| } ) | |
| }; | |
| let a = null; | |
| var i = !1; | |
| const A = { | |
| scheduleNotification: function ( e, r ) { | |
| i || ( t.oldV = e, t.first_run |= r, a && window.clearTimeout( a ), a = window.setTimeout( s, 1e3 ) ) | |
| }, | |
| updateAvailable: function () { | |
| return e | |
| }, | |
| onInstalled: function () { | |
| A.scheduleNotification( null, !0 ) | |
| }, | |
| onUpdated: function ( e ) { | |
| A.scheduleNotification( e, !1 ) | |
| }, | |
| onUpdateAvailable: t => { | |
| G.logger.info( "An update to version", t.version, "is available" ), e = t.version, window.setTimeout( () => { | |
| u.Notify.show( M.I18N.getMessage( "Update" ), M.I18N.getMessage( "0name0_0version0_is_available__Please_re_start_your_browser_to_update_", rea.extension.manifest.name, t.version ), x.a.images.brand( "tampermonkey" ), { | |
| timeout: 6e4 | |
| } ) | |
| }, 864e5 ) | |
| } | |
| }; | |
| return kt.registerLateCallback( () => { | |
| c.a.setValue( Ne.CONSTANTS.STORAGE.LAST_START, Date.now() ) | |
| } ), A | |
| } )(); | |
| const Et = e => { | |
| ( () => { | |
| const t = Object( o.Deferred )(); | |
| return "activate" == e ? ( rea.browserAction.openPopup(), t.resolve() ) : "toggle-enable" == e ? ( We.values.enabled = !We.values.enabled, | |
| t.resolve() ) : rea.tabs.getSelected( null, r => { | |
| let n; | |
| "open-dashboard" == e ? n = rea.extension.getURL( "options.html" ) + "#nav=dashboard" : "open-dashboard-with-running-scripts" == e ? n = rea.extension.getURL( "options.html" ) + "#nav=dashboard&filter=" + encodeURIComponent( r.url ) : "open-new-script" == e && ( n = rea.extension.getURL( "options.html" ) + "#url=" + Z.a.Base64.encode( r.url ) + "&nav=new-user-script" ), t.resolve( n ? { | |
| url: n, | |
| active: !0, | |
| parent: r | |
| } : null ) | |
| } ), t.promise() | |
| } )().then( e => { | |
| e && rea.tabs.create( e ) | |
| } ) | |
| }; | |
| var It = ( () => { | |
| const e = {}; | |
| let t; | |
| const r = ( { | |
| tabId: t, | |
| frameId: r, | |
| url: n | |
| } ) => { | |
| const s = e[ t ]; | |
| s && s.forEach( e => { | |
| e( { | |
| tabId: t, | |
| frameId: r, | |
| url: n | |
| } ) | |
| } ) | |
| }; | |
| return { | |
| addListener: ( n, s ) => { | |
| e[ n ] = e[ n ] || [], e[ n ].push( s ), !t && Object.keys( e ).length && ( rea.webNavigation.supported && rea.webNavigation.onUrlUpdated && rea.webNavigation.onUrlUpdated.addListener( r ), t = !0 ) | |
| }, | |
| removeListener: ( t, r ) => { | |
| let n; | |
| const s = e[ t ]; | |
| s && ( n = s.indexOf( r ) ) > -1 && s.splice( n, 1 ), 0 === s.length && delete e[ t ] | |
| }, | |
| removeListeners: t => { | |
| delete e[ t ] | |
| } | |
| } | |
| } )(), | |
| xt = ( () => { | |
| const e = [], | |
| t = e => { | |
| kt.late ? Qe.events.active( e.tabId, e.windowId ) : window.setTimeout( () => { | |
| t( e ) | |
| }, 100 ) | |
| }, | |
| r = ( t, n, s ) => { | |
| if ( !kt.late ) return void window.setTimeout( () => { | |
| r( t, n, s ) | |
| }, 100 ); | |
| const o = s.pendingUrl || s.url; | |
| "auto" == We.values.scriptUrlDetection && Xe( o ) && ot.installFromUrl( o, {}, { | |
| silent_fail: !0 | |
| } ), o ? "loading" == n.status ? Qe.events.loading( s.id, 0, o ) : "complete" == n.status && Qe.events.complete( s.id, 0, o ) : G.logger.warn( "tabUpdates: no tab url set! ", s ), e.forEach( e => { | |
| e( { | |
| reason: "updated", | |
| status: n.status | |
| }, s ) | |
| } ) | |
| }, | |
| n = t => { | |
| je[ t ] && ( je[ t ].onClose(), delete je[ t ] ), Qe.events.remove( t ), e.forEach( e => { | |
| e( { | |
| reason: "removed" | |
| }, { | |
| id: t | |
| } ) | |
| } ) | |
| }, | |
| s = ( t, r ) => { | |
| n( r ), vt.setIcon( t ), vt.setBadge( t ), e.forEach( e => { | |
| e( { | |
| reason: "replaced" | |
| }, t ) | |
| } ) | |
| }, | |
| o = t => { | |
| kt.late ? ( Qe.events.commited( t.tabId, t.frameId, t.url ), 0 === t.frameId && e.forEach( e => { | |
| e( { | |
| reason: "commited" | |
| }, { | |
| url: t.url, | |
| id: t.tabId | |
| } ) | |
| } ) ) : window.setTimeout( () => { | |
| o( t ) | |
| }, 100 ) | |
| }, | |
| a = { | |
| init: function () { | |
| rea.tabs.onUpdated.addListener( r ), rea.tabs.onRemoved.addListener( n ), rea.tabs.onReplaced.addListener( s ), | |
| rea.tabs.onActivated.addListener( t ), rea.webNavigation.supported && rea.webNavigation.onCommitted.addListener( o ) | |
| }, | |
| openAndWatch: function ( e, t ) { | |
| let r = null; | |
| const n = ( e, s ) => { | |
| null !== r && s.id === r && ( [ "updated", "commited" ].includes( e.reason ) ? t( s ) : "removed" == e.reason && ( a.removeListener( n ), t() ) ) | |
| }; | |
| return rea.tabs.create( e, e => { | |
| r = e.id, t( e ) | |
| } ), a.addListener( n ), { | |
| cancel: function () { | |
| a.removeListener( n ), null !== r && rea.tabs.remove( r, () => { | |
| const e = rea.runtime.lastError; | |
| e ? G.logger.warn( "tab.close", e.message ) : r = null | |
| } ) | |
| } | |
| } | |
| }, | |
| addListener: function ( t ) { | |
| e.push( t ) | |
| }, | |
| removeListener: function ( t ) { | |
| let r; | |
| e && ( r = e.indexOf( t ) ) > -1 && e.splice( r, 1 ) | |
| } | |
| }; | |
| return a | |
| } )(), | |
| Tt = () => { | |
| const e = "temporary" == We.values.incognito_mode && rea.extension.inIncognitoContext; | |
| c.a.setTemporary( e ), e && ( We.values.sync_enabled = !1, We.values.scriptUpdateCheckPeriod = 0, We.values.sync_type = 0, We.values.statistics_enabled = !1 ) | |
| }; | |
| const Mt = ( () => { | |
| const e = "tm_content", | |
| t = async () => { | |
| [ "instant" ].includes( We.values.runtime_inject_mode ) ? await ( async () => { | |
| await new s.a( e => { | |
| rea.declarativeContent.onPageChanged.removeRules( void 0, e ) | |
| } ) | |
| } )() : await ( async () => { | |
| await new s.a( t => { | |
| rea.declarativeContent.onPageChanged.getRules( [ e ], async r => { | |
| if ( r.length ) return t(); | |
| rea.declarativeContent.onPageChanged.addRules( [ { | |
| id: e, | |
| conditions: [ new rea.declarativeContent.PageStateMatcher( { | |
| pageUrl: { | |
| urlContains: "://" | |
| } | |
| } ) ], | |
| actions: [ new rea.declarativeContent.RequestContentScript( { | |
| js: rea.extension.manifest.content_scripts[ 0 ].js | |
| } ) ] | |
| } ], t ) | |
| } ) | |
| } ) | |
| } )() | |
| }; | |
| return { | |
| init: () => { | |
| rea.declarativeContent.supported && ( t(), We.addChangeListener( "runtime_inject_mode", t ) ) | |
| } | |
| } | |
| } )(); | |
| let St; | |
| ( window.init = async () => { | |
| M.I18N.init(), kt.init(), wt.init( !0 ), xt.init(), St = Object( Ae.a )( xt ), ut.init(), rea.commands.supported && rea.commands.onCommand.addListener( Et ), rea.runtime.setUninstallURL( "https://www.tampermonkey.net/uninstall.php?ext=" + rea.runtime.short_id ), _t.init( () => { | |
| Ye.finalize() | |
| } ), Object( ie.init )( ae ), rea.browserAction.setIcon( { | |
| path: rea.extension.getURL( "images/icon_grey.png" ) | |
| } ), | |
| rea.browserAction.setPopup( { | |
| popup: "action.html" | |
| } ), rea.browserAction.setTitle( { | |
| title: "Tampermonkey" | |
| } ), rea.runtime.onUpdateAvailable.addListener( yt.onUpdateAvailable ), rea.runtime.onInstalled.addListener( e => { | |
| G.logger.log( "bg: onInstalled", e ), e || ( e = { | |
| reason: "mandatory_argument_is_not_set" | |
| } ), "install" == e.reason ? lt() : "update" == e.reason && ct( e.previousVersion ), kt.ensureLate( () => { | |
| "install" == e.reason ? yt.onInstalled() : "update" == e.reason && yt.onUpdated( e.previousVersion ) | |
| } ) | |
| } ), await c.a.init(), await Le(), | |
| await it(), await We.init(), window.cfgo = We, Tt(), ( () => { | |
| if ( G.logger.set( We.values.logLevel ), M.I18N.setLocale( We.values.i18n ), We.values.userscript_search_url ) { | |
| const e = () => { | |
| Te( Je, { | |
| url: [ "dhdg", "gcal", "fire", "iikm", "mfdh" ].includes( rea.runtime.short_id ) ? Oe : We.values.userscript_search_url, | |
| mode: We.values.userscript_search_mode | |
| } ) | |
| }; | |
| We.addChangeListener( "userscript_search_mode", e ), e() | |
| } | |
| const e = Ne.RUNTIME.WEBREQUEST_XHR_SUPPORT && "no" != We.values.webrequest_modHeaders; | |
| N.default.setConfig( { | |
| prefix: e ? wt.getPrefix() : null, | |
| mozAnon: Ne.RUNTIME.FIREFOX | |
| } ), Je.init(), i.a.init( "bg", We.values.statistics_enabled, { | |
| trackView: !0, | |
| version: rea.extension.manifest.version, | |
| started: Ze | |
| } ), Qe.listeners.add.onReset( ( e, t ) => { | |
| gt.clearByTabId( e ), at.removeStorageListeners( { | |
| tabid: e | |
| }, !1 ), t || vt.setIcon( e ) | |
| } ); | |
| const t = e => { | |
| e >= 0 && rea.tabs.get( e, t => { | |
| !rea.runtime.lastError && t && ( vt.setIcon( e ), vt.setBadge( e ) ) | |
| } ) | |
| }; | |
| Qe.listeners.add.onCommited( t ), Qe.listeners.add.onCompleted( t ), Qe.listeners.add.onReset( $e.purgeAppeals ), | |
| Qe.listeners.add.onRemoved( $e.purgeAppeals ), Qe.listeners.add.onRemoved( He.cleanTab ), Ye.init().done( e => { | |
| e && Ye.sync() | |
| } ), qe.init(), ze.init(), at.init(); | |
| const r = () => { | |
| ne.set_mode( We.values.downloads_mode ), ne.set_whitelist( We.values.downloads_extension_whitelist ) | |
| }; | |
| r(), ne.config_changed_listener = r, S.SRI.init(), wt.init(), ve.init( { | |
| onclick: ( { | |
| id: e, | |
| frameId: t, | |
| tabId: r, | |
| url: n, | |
| isMenuCommand: s | |
| } ) => { | |
| if ( s ) { | |
| const t = gt.getById( e ); | |
| t ? t.response( { | |
| run: !0, | |
| menuId: t.menuId | |
| } ) : G.logger.warn( "bg: Error: unable to find MC id " + t.menuId ) | |
| } else { | |
| const s = at.getByUid( e ); | |
| if ( !s || !s.script ) return void G.logger.log( "ctxm: unable to find script " + e ); | |
| const a = s.script; | |
| if ( a.deleted ) return; | |
| tt.bundle( { | |
| url: n || "<unknown>" | |
| }, a, !0 ).then( e => { | |
| const s = Object( o.Deferred )(), | |
| a = {}; | |
| return e.method = "executeScript", void 0 !== t ? e.frameId = a.frameId = t : n ? e.url = T.default.woHash( n ) : e.topframe = !0, rea.tabs.sendMessage( r, e, a, s.resolve ), s.promise() | |
| } ) | |
| } | |
| } | |
| } ), bt.init(), st.init() | |
| } )(), | |
| We.addChangeListener( [ "sync_enabled", "sync_type", "cloud_url", "cloud_user", "cloud_pass" ], Ye.configChangeListener ), We.addChangeListener( "logLevel", () => { | |
| G.logger.set( We.values.logLevel ) | |
| } ), We.addChangeListener( "i18n", () => { | |
| M.I18N.setLocale( We.values.i18n ) | |
| } ), We.addChangeListener( "incognito_mode", () => { | |
| Tt() | |
| } ), We.addChangeListener( "statistics_enabled", () => { | |
| i.a.setEnabled( We.values.statistics_enabled, !0 ) | |
| } ), We.addChangeListener( "context_menu_enabled", () => { | |
| We.values.context_menu_enabled || ve.update( { | |
| contexters: [], | |
| commands: [] | |
| } ) | |
| } ), We.addChangeListener( [ "require_blacklist", "script_blacklist_server", "script_blacklist_type" ], ot.blackCheckAll ), We.addChangeListener( [ "downloads_extension_whitelist", "downloads_mode" ], ne.config_changed_listener ), We.addChangeListener( "webrequest_modHeaders", ( e, t, r, n ) => { | |
| n.done( window.setTimeout( Rt.reset, 1 ) ) | |
| } ), We.addChangeListener( [ "appearance_badge_color", "appearance_badge_text_color" ], vt.init ), vt.init(), Mt.init(), window.setTimeout( () => { | |
| st.check(), ot.clean() | |
| }, 1e4 ), | |
| await At(), G.logger.log( "bg: listeners registered!" ), kt.setReady() | |
| } )() | |
| } ] ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment